From bf83db8bbcc09b692db2c5b002319e2f75e7f675 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 2 Jan 2025 00:02:25 +0400 Subject: [PATCH 01/64] refactor: Basic use of patcher v22 instruction filters --- gradle/libs.versions.toml | 4 +-- patches/api/patches.api | 8 ++++- patches/build.gradle.kts | 6 ++++ .../detection/signature/Fingerprints.kt | 2 +- .../misc/mapping/ResourceMappingPatch.kt | 33 ++++++++++++++++++ .../patches/shared/misc/spoof/Fingerprints.kt | 4 +++ .../misc/spoof/SpoofVideoStreamsPatch.kt | 28 +++++++-------- .../spotify/lite/ondemand/Fingerprints.kt | 2 +- .../interaction/seekbar/Fingerprints.kt | 5 ++- .../youtube/layout/formfactor/Fingerprints.kt | 34 +++---------------- .../youtube/layout/hide/time/Fingerprints.kt | 4 +-- .../youtube/layout/miniplayer/Fingerprints.kt | 13 +++---- .../layout/miniplayer/MiniplayerPatch.kt | 29 +++++----------- .../layout/player/fullscreen/Fingerprints.kt | 10 +++--- .../OpenVideosFullscreenHookPatch.kt | 10 +++--- .../kotlin/app/revanced/util/BytecodeUtils.kt | 4 +++ 16 files changed, 107 insertions(+), 89 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index af87b2376d..6147fd1330 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,8 +1,8 @@ [versions] -revanced-patcher = "21.0.0" +revanced-patcher = "22.0.0" # Tracking https://github.com/google/smali/issues/64. #noinspection GradleDependency -smali = "3.0.5" +smali = "3.0.8" gson = "2.11.0" # 8.3.0 causes java verifier error: https://github.com/ReVanced/revanced-patches/issues/2818. #noinspection GradleDependency diff --git a/patches/api/patches.api b/patches/api/patches.api index 92ca7f9469..64c2ae6efc 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -596,6 +596,13 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceElement { public fun toString ()Ljava/lang/String; } +public final class app/revanced/patches/shared/misc/mapping/ResourceMappingFilter : app/revanced/patcher/InstructionFilter { + public fun (Ljava/lang/String;Ljava/lang/String;I)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun getMaxInstructionsBefore ()I + public fun matches (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Z +} + public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { public static final fun get (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)J public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; @@ -1155,7 +1162,6 @@ public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPa public final class app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatchKt { public static final fun getFloatyBarButtonTopMargin ()J - public static final fun getMiniplayerMaxSize ()J public static final fun getMiniplayerPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getModernMiniplayerClose ()J public static final fun getModernMiniplayerExpand ()J diff --git a/patches/build.gradle.kts b/patches/build.gradle.kts index 459d50a0ce..8dc648b00d 100644 --- a/patches/build.gradle.kts +++ b/patches/build.gradle.kts @@ -12,6 +12,12 @@ patches { } } +repositories { + mavenLocal() + gradlePluginPortal() + google() +} + dependencies { // Used by JsonGenerator. implementation(libs.gson) diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt index 75912318ba..40f105525c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val verifySignatureFingerprint = fingerprint(fuzzyPatternScanThreshold = 2) { +internal val verifySignatureFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("Landroid/app/Activity;") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index 8a9e499ddb..9c8dd1ef45 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -1,7 +1,14 @@ package app.revanced.patches.shared.misc.mapping +import app.revanced.patcher.InstructionFilter +import app.revanced.patcher.InstructionFilter.Companion.METHOD_MAX_INSTRUCTIONS +import app.revanced.patcher.LiteralFilter import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.resourcePatch +import com.android.tools.smali.dexlib2.iface.ClassDef +import com.android.tools.smali.dexlib2.iface.Method +import com.android.tools.smali.dexlib2.iface.instruction.Instruction +import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction import org.w3c.dom.Element import java.util.* import java.util.concurrent.Executors @@ -11,6 +18,32 @@ import java.util.concurrent.TimeUnit lateinit var resourceMappings: List private set +/** + * Identical to [LiteralFilter] except uses the literal resource value. + */ +class ResourceMappingFilter( + private val type: String, + private val name: String, + override val maxInstructionsBefore: Int = METHOD_MAX_INSTRUCTIONS, +) : InstructionFilter { + + private val resourceId by lazy { + resourceMappings[ + type, + name, + ] + } + + override fun matches( + classDef: ClassDef, + method: Method, + instruction: Instruction, + methodIndex: Int + ): Boolean { + return (instruction as? WideLiteralInstruction)?.wideLiteral == resourceId + } +} + val resourceMappingPatch = resourcePatch { val resourceMappings = Collections.synchronizedList(mutableListOf()) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index 164d67b1ad..77e953bb56 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -1,5 +1,6 @@ package app.revanced.patches.shared.misc.spoof +import app.revanced.patcher.MethodFilter import app.revanced.patcher.fingerprint import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags @@ -36,6 +37,9 @@ internal val buildPlayerRequestURIFingerprint = fingerprint { internal val buildRequestFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Lorg/chromium/net/UrlRequest;") + instructions( + MethodFilter(methodName = "newUrlRequestBuilder") + ) custom { methodDef, _ -> // Different targets have slightly different parameters diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index c6628f5cbd..cb4541df20 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -22,7 +22,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter @@ -85,21 +84,20 @@ fun spoofVideoStreamsPatch( // region Get replacement streams at player requests. - buildRequestFingerprint.method.apply { - val newRequestBuilderIndex = indexOfFirstInstructionOrThrow { - opcode == Opcode.INVOKE_VIRTUAL && - getReference()?.name == "newUrlRequestBuilder" - } - val urlRegister = getInstruction(newRequestBuilderIndex).registerD - val freeRegister = getInstruction(newRequestBuilderIndex + 1).registerA + buildRequestFingerprint.let { + it.method.apply { + val builderIndex = it.filterMatch.first().index + val urlRegister = getInstruction(builderIndex).registerD + val freeRegister = getInstruction(builderIndex + 1).registerA - addInstructions( - newRequestBuilderIndex, - """ - move-object v$freeRegister, p1 - invoke-static { v$urlRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V - """, - ) + addInstructions( + builderIndex, + """ + move-object v$freeRegister, p1 + invoke-static { v$urlRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V + """ + ) + } } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/Fingerprints.kt index 365235bee0..e2d29b55c2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.spotify.lite.ondemand import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint -internal val onDemandFingerprint = fingerprint(fuzzyPatternScanThreshold = 2) { +internal val onDemandFingerprint = fingerprint { returns("L") parameters() opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt index 968ba89db3..02a2887e70 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.interaction.seekbar +import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction @@ -128,5 +129,7 @@ internal val fullscreenSeekbarThumbnailsQualityFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() - literal { 45399684L } + instructions ( + LiteralFilter(45399684L) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt index d1f1535ebf..6e70948b14 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt @@ -1,12 +1,8 @@ package app.revanced.patches.youtube.layout.formfactor +import app.revanced.patcher.FieldFilter import app.revanced.patcher.fingerprint -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.FieldReference internal val formFactorEnumConstructorFingerprint = fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) @@ -22,28 +18,8 @@ internal val createPlayerRequestBodyWithModelFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() - opcodes(Opcode.OR_INT_LIT16) - custom { method, _ -> - method.indexOfModelInstruction() >= 0 && - method.indexOfReleaseInstruction() >= 0 - } + instructions( + FieldFilter("Landroid/os/Build${'$'}VERSION;", "RELEASE", "Ljava/lang/String;"), + FieldFilter("Landroid/os/Build;", "MODEL", "Ljava/lang/String;"), + ) } - -private fun Method.indexOfModelInstruction() = - indexOfFirstInstruction { - val reference = getReference() - - reference?.definingClass == "Landroid/os/Build;" && - reference.name == "MODEL" && - reference.type == "Ljava/lang/String;" - } - -internal fun Method.indexOfReleaseInstruction(): Int = - indexOfFirstInstruction { - val reference = getReference() - - reference?.definingClass == "Landroid/os/Build${'$'}VERSION;" && - reference.name == "RELEASE" && - reference.type == "Ljava/lang/String;" - } - diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt index d109c6455f..32660133ab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt @@ -4,9 +4,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint -internal val timeCounterFingerprint = fingerprint( - fuzzyPatternScanThreshold = 1, -) { +internal val timeCounterFingerprint = fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 5a2f47239f..46542a5303 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -2,8 +2,9 @@ package app.revanced.patches.youtube.layout.miniplayer +import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction +import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -116,11 +117,11 @@ internal val miniplayerModernViewParentFingerprint = fingerprint { internal val miniplayerMinimumSizeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - custom { method, _ -> - method.containsLiteralInstruction(192) && - method.containsLiteralInstruction(128) && - method.containsLiteralInstruction(miniplayerMaxSize) - } + instructions( + ResourceMappingFilter("dimen", "miniplayer_max_size"), + LiteralFilter(192), + LiteralFilter(128) + ) } internal val miniplayerOverrideFingerprint = fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index d989d41d00..46f5d01c98 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -26,7 +26,6 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference @@ -54,8 +53,6 @@ var modernMiniplayerForwardButton = -1L private set var playerOverlays = -1L private set -var miniplayerMaxSize = -1L - private set private val miniplayerResourcePatch = resourcePatch { dependsOn( @@ -119,13 +116,6 @@ private val miniplayerResourcePatch = resourcePatch { "yt_outline_x_white_24", ] } - - if (is_19_26_or_greater) { - miniplayerMaxSize = resourceMappings[ - "dimen", - "miniplayer_max_size", - ] - } } } } @@ -396,7 +386,6 @@ val miniplayerPatch = bytecodePatch( MINIPLAYER_INITIAL_SIZE_FEATURE_KEY, ) val targetIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.LONG_TO_INT) - val register = getInstruction(targetIndex).registerA addInstructions( @@ -409,16 +398,16 @@ val miniplayerPatch = bytecodePatch( } // Override a minimum size constant. - miniplayerMinimumSizeFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow { - opcode == Opcode.CONST_16 && (this as NarrowLiteralInstruction).narrowLiteral == 192 + miniplayerMinimumSizeFingerprint.let { + it.method.apply { + val index = it.filterMatch[1].index + val register = getInstruction(index).registerA + + // Smaller sizes can be used, but the miniplayer will always start in size 170 if set any smaller. + // The 170 initial limit probably could be patched to allow even smaller initial sizes, + // but 170 is already half the horizontal space and smaller does not seem useful. + replaceInstruction(index, "const/16 v$register, 170") } - val register = getInstruction(index).registerA - - // Smaller sizes can be used, but the miniplayer will always start in size 170 if set any smaller. - // The 170 initial limit probably could be patched to allow even smaller initial sizes, - // but 170 is already half the horizontal space and smaller does not seem useful. - replaceInstruction(index, "const/16 v$register, 170") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt index 096ed695da..4739867459 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt @@ -1,18 +1,16 @@ package app.revanced.patches.youtube.layout.player.fullscreen +import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags -internal const val OPEN_VIDEOS_FULLSCREEN_PORTRAIT_FEATURE_FLAG = 45666112L - internal val openVideosFullscreenPortraitFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "Lj\$/util/Optional;") - literal { - OPEN_VIDEOS_FULLSCREEN_PORTRAIT_FEATURE_FLAG - } + instructions( + LiteralFilter(45666112L) + ) } /** diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt index 24896be997..944b54b4e5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt @@ -24,9 +24,11 @@ internal val openVideosFullscreenHookPatch = bytecodePatch { return@execute } - openVideosFullscreenPortraitFingerprint.method.insertFeatureFlagBooleanOverride( - OPEN_VIDEOS_FULLSCREEN_PORTRAIT_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->openVideoFullscreenPortrait(Z)Z" - ) + openVideosFullscreenPortraitFingerprint.let { + it.method.insertFeatureFlagBooleanOverride( + it.filterMatch.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->openVideoFullscreenPortrait(Z)Z" + ) + } } } diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index 8e5a85056a..d183bca2ba 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -405,6 +405,10 @@ fun Method.findInstructionIndicesReversedOrThrow(opcode: Opcode): List { internal fun MutableMethod.insertFeatureFlagBooleanOverride(literal: Long, extensionsMethod: String) { val literalIndex = indexOfFirstLiteralInstructionOrThrow(literal) + insertFeatureFlagBooleanOverride(literalIndex, extensionsMethod) +} + +internal fun MutableMethod.insertFeatureFlagBooleanOverride(literalIndex: Int, extensionsMethod: String) { val index = indexOfFirstInstructionOrThrow(literalIndex, Opcode.MOVE_RESULT) val register = getInstruction(index).registerA From 6111bca28f6ffda293be66ddf6921b7e1a513371 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 2 Jan 2025 10:30:35 +0100 Subject: [PATCH 02/64] refactor --- .../patches/components/ShortsFilter.java | 11 --- patches/api/patches.api | 3 +- .../misc/mapping/ResourceMappingPatch.kt | 12 +-- .../layout/buttons/navigation/Fingerprints.kt | 42 +++++----- .../navigation/NavigationButtonsPatch.kt | 58 ++++++------- .../layout/buttons/overlay/Fingerprints.kt | 12 +-- .../overlay/HidePlayerOverlayButtonsPatch.kt | 41 +++------- .../layout/hide/shorts/Fingerprints.kt | 20 ++--- .../hide/shorts/HideShortsComponentsPatch.kt | 81 ++++--------------- .../youtube/misc/navigation/Fingerprints.kt | 33 ++++---- .../misc/navigation/NavigationBarHookPatch.kt | 70 +++++----------- .../youtube/video/videoid/Fingerprints.kt | 47 ++++++----- .../youtube/video/videoid/VideoIdPatch.kt | 36 ++++----- 13 files changed, 178 insertions(+), 288 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java index 3a57fb8361..b7495e5e43 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java @@ -373,17 +373,6 @@ private static boolean shouldHideShortsFeedItems() { }; } - /** - * Injection point. Only used if patching older than 19.03. - * This hook may be obsolete even for old versions - * as they now use a litho layout like newer versions. - */ - public static void hideShortsShelf(final View shortsShelfView) { - if (shouldHideShortsFeedItems()) { - Utils.hideViewByLayoutParams(shortsShelfView); - } - } - public static int getSoundButtonSize(int original) { if (Settings.HIDE_SHORTS_SOUND_BUTTON.get()) { return 0; diff --git a/patches/api/patches.api b/patches/api/patches.api index 64c2ae6efc..0593e1f628 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -599,8 +599,7 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceElement { public final class app/revanced/patches/shared/misc/mapping/ResourceMappingFilter : app/revanced/patcher/InstructionFilter { public fun (Ljava/lang/String;Ljava/lang/String;I)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getMaxInstructionsBefore ()I - public fun matches (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Z + public fun matches (Lapp/revanced/patcher/patch/BytecodePatchContext;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Z } public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index 9c8dd1ef45..8c9159788c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -1,16 +1,16 @@ package app.revanced.patches.shared.misc.mapping import app.revanced.patcher.InstructionFilter -import app.revanced.patcher.InstructionFilter.Companion.METHOD_MAX_INSTRUCTIONS import app.revanced.patcher.LiteralFilter +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.resourcePatch -import com.android.tools.smali.dexlib2.iface.ClassDef import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.Instruction import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction import org.w3c.dom.Element -import java.util.* +import java.lang.Runtime +import java.util.Collections import java.util.concurrent.Executors import java.util.concurrent.TimeUnit @@ -24,8 +24,8 @@ lateinit var resourceMappings: List class ResourceMappingFilter( private val type: String, private val name: String, - override val maxInstructionsBefore: Int = METHOD_MAX_INSTRUCTIONS, -) : InstructionFilter { + maxInstructionsBefore: Int = METHOD_MAX_INSTRUCTIONS, +) : InstructionFilter(maxInstructionsBefore) { private val resourceId by lazy { resourceMappings[ @@ -34,8 +34,8 @@ class ResourceMappingFilter( ] } + context(BytecodePatchContext) override fun matches( - classDef: ClassDef, method: Method, instruction: Instruction, methodIndex: Int diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt index a4e65eb28b..d2d5cb1539 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt @@ -1,14 +1,15 @@ package app.revanced.patches.youtube.layout.buttons.navigation -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags +import app.revanced.patcher.LastInstructionFilter +import app.revanced.patcher.LiteralFilter +import app.revanced.patcher.MethodFilter +import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint -import app.revanced.util.literal - -internal const val ANDROID_AUTOMOTIVE_STRING = "Android Automotive" +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode internal val addCreateButtonViewFingerprint = fingerprint { - strings("Android Wear", ANDROID_AUTOMOTIVE_STRING) + strings("Android Automotive", "Android Wear") } internal val createPivotBarFingerprint = fingerprint { @@ -19,35 +20,38 @@ internal val createPivotBarFingerprint = fingerprint { "Landroid/widget/TextView;", "Ljava/lang/CharSequence;", ) - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.RETURN_VOID, + instructions( + MethodFilter(definingClass = "Landroid/widget/TextView;", methodName = "setText"), + LastInstructionFilter(OpcodeFilter(Opcode.RETURN_VOID)) ) } -internal const val TRANSLUCENT_NAVIGATION_STATUS_BAR_FEATURE_FLAG = 45400535L - internal val translucentNavigationStatusBarFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") - literal { TRANSLUCENT_NAVIGATION_STATUS_BAR_FEATURE_FLAG } + instructions( + LiteralFilter(45400535L) + ) } -internal const val TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG = 45630927L - +/** + * YouTube nav buttons. + */ internal val translucentNavigationButtonsFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") - literal { TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG } + instructions( + LiteralFilter(45630927L) + ) } /** - * The device on screen back/home/recent buttons. + * Device on screen back/home/recent buttons. */ -internal const val TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG = 45632194L - internal val translucentNavigationButtonsSystemFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") - literal { TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG } + instructions( + LiteralFilter(45632194L) + ) } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index 1a0dc6665e..e2a26c49c8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -16,12 +16,9 @@ import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.insertFeatureFlagBooleanOverride import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/NavigationButtonsPatch;" @@ -80,9 +77,7 @@ val navigationButtonsPatch = bytecodePatch( // Switch create with notifications button. addCreateButtonViewFingerprint.method.apply { - val stringIndex = addCreateButtonViewFingerprint.stringMatches!!.find { match -> - match.string == ANDROID_AUTOMOTIVE_STRING - }!!.index + val stringIndex = addCreateButtonViewFingerprint.stringMatches.first().index val conditionalCheckIndex = stringIndex - 1 val conditionRegister = @@ -98,18 +93,17 @@ val navigationButtonsPatch = bytecodePatch( } // Hide navigation button labels. - createPivotBarFingerprint.method.apply { - val setTextIndex = indexOfFirstInstructionOrThrow { - getReference()?.name == "setText" + createPivotBarFingerprint.let { + it.method.apply { + val setTextIndex = it.filterMatch.first().index + val targetRegister = getInstruction(setTextIndex).registerC + + addInstruction( + setTextIndex, + "invoke-static { v$targetRegister }, " + + "$EXTENSION_CLASS_DESCRIPTOR->hideNavigationButtonLabels(Landroid/widget/TextView;)V", + ) } - - val targetRegister = getInstruction(setTextIndex).registerC - - addInstruction( - setTextIndex, - "invoke-static { v$targetRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->hideNavigationButtonLabels(Landroid/widget/TextView;)V", - ) } // Hook navigation button created, in order to hide them. @@ -118,20 +112,26 @@ val navigationButtonsPatch = bytecodePatch( // Force on/off translucent effect on status bar and navigation buttons. if (is_19_25_or_greater) { - translucentNavigationStatusBarFeatureFlagFingerprint.method.insertFeatureFlagBooleanOverride( - TRANSLUCENT_NAVIGATION_STATUS_BAR_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationStatusBar(Z)Z", - ) + translucentNavigationStatusBarFeatureFlagFingerprint.let { + it.method.insertFeatureFlagBooleanOverride( + it.filterMatch.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationStatusBar(Z)Z", + ) + } - translucentNavigationButtonsFeatureFlagFingerprint.method.insertFeatureFlagBooleanOverride( - TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", - ) + translucentNavigationButtonsFeatureFlagFingerprint.let { + it.method.insertFeatureFlagBooleanOverride( + it.filterMatch.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", + ) + } - translucentNavigationButtonsSystemFeatureFlagFingerprint.method.insertFeatureFlagBooleanOverride( - TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", - ) + translucentNavigationButtonsSystemFeatureFlagFingerprint.let { + it.method.insertFeatureFlagBooleanOverride( + it.filterMatch.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt index 323603b507..df938f3541 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt @@ -1,17 +1,19 @@ package app.revanced.patches.youtube.layout.buttons.overlay +import app.revanced.patcher.MethodFilter import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction +import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter import com.android.tools.smali.dexlib2.AccessFlags internal val playerControlsPreviousNextOverlayTouchFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") strings("1.0x") - custom { methodDef, _ -> - methodDef.containsLiteralInstruction(playerControlPreviousButtonTouchArea) && - methodDef.containsLiteralInstruction(playerControlNextButtonTouchArea) - } + instructions( + ResourceMappingFilter("id", "player_control_previous_button_touch_area"), + ResourceMappingFilter("id", "player_control_next_button_touch_area"), + MethodFilter(parameters = listOf("Landroid/view/View;", "I")) + ) } internal val mediaRouteButtonFingerprint = fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt index 75d250f2d2..b3b911e5cb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt @@ -5,13 +5,9 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get -import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen @@ -24,20 +20,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal var playerControlPreviousButtonTouchArea = -1L - private set -internal var playerControlNextButtonTouchArea = -1L - private set - -private val hidePlayerOverlayButtonsResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - playerControlPreviousButtonTouchArea = resourceMappings["id", "player_control_previous_button_touch_area"] - playerControlNextButtonTouchArea = resourceMappings["id", "player_control_next_button_touch_area"] - } -} - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch;" @@ -49,7 +31,6 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, - hidePlayerOverlayButtonsResourcePatch, ) compatibleWith( @@ -78,21 +59,17 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( // region Hide player next/previous button. - playerControlsPreviousNextOverlayTouchFingerprint.method.apply { - val resourceIndex = indexOfFirstLiteralInstructionOrThrow(playerControlPreviousButtonTouchArea) + playerControlsPreviousNextOverlayTouchFingerprint.let { + it.method.apply { + val insertIndex = it.filterMatch.last().index + val viewRegister = getInstruction(insertIndex).registerC - val insertIndex = indexOfFirstInstructionOrThrow(resourceIndex) { - opcode == Opcode.INVOKE_STATIC && - getReference()?.parameterTypes?.firstOrNull() == "Landroid/view/View;" + addInstruction( + insertIndex, + "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR" + + "->hidePreviousNextButtons(Landroid/view/View;)V", + ) } - - val viewRegister = getInstruction(insertIndex).registerC - - addInstruction( - insertIndex, - "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR" + - "->hidePreviousNextButtons(Landroid/view/View;)V", - ) } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt index 5a2a2ac644..4a6f651204 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt @@ -1,7 +1,9 @@ package app.revanced.patches.youtube.layout.hide.shorts +import app.revanced.patcher.MethodFilter +import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -22,18 +24,18 @@ internal val shortsBottomBarContainerFingerprint = fingerprint { returns("V") parameters("Landroid/view/View;", "Landroid/os/Bundle;") strings("r_pfvc") - literal { bottomBarContainer } + instructions( + ResourceMappingFilter("id", "bottom_bar_container"), + MethodFilter(methodName = "getHeight"), + OpcodeFilter(Opcode.MOVE_RESULT) + ) } internal val createShortsButtonsFingerprint = fingerprint { returns("V") - literal { reelPlayerRightCellButtonHeight } -} - -internal val reelConstructorFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - opcodes(Opcode.INVOKE_VIRTUAL) - literal { reelMultipleItemShelfId } + instructions( + ResourceMappingFilter("dimen", "reel_player_right_cell_button_height") + ) } internal val renderBottomNavigationBarFingerprint = fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index fb0cfe999b..6847239214 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -18,7 +18,6 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch -import app.revanced.patches.youtube.misc.playservice.is_19_03_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_41_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen @@ -27,17 +26,9 @@ import app.revanced.util.* import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal var reelMultipleItemShelfId = -1L - private set -internal var reelPlayerRightCellButtonHeight = -1L - private set -internal var bottomBarContainer = -1L - private set -internal var reelPlayerRightPivotV2Size = -1L - private set +private var reelPlayerRightPivotV2Size = -1L internal val hideShortsAppShortcutOption = booleanOption( key = "hideShortsAppShortcut", @@ -141,27 +132,10 @@ private val hideShortsComponentsResourcePatch = resourcePatch { } } - reelPlayerRightCellButtonHeight = resourceMappings[ - "dimen", - "reel_player_right_cell_button_height", - ] - - bottomBarContainer = resourceMappings[ - "id", - "bottom_bar_container", - ] - reelPlayerRightPivotV2Size = resourceMappings[ "dimen", "reel_player_right_pivot_v2_size", ] - - if (!is_19_03_or_greater) { - reelMultipleItemShelfId = resourceMappings[ - "dimen", - "reel_player_right_cell_button_height", - ] - } } } @@ -199,25 +173,6 @@ val hideShortsComponentsPatch = bytecodePatch( hideShortsWidgetOption() execute { - // region Hide the Shorts shelf. - - // This patch point is not present in 19.03.x and greater. - if (!is_19_03_or_greater && reelConstructorFingerprint.methodOrNull != null) { - reelConstructorFingerprint.method.apply { - val insertIndex = reelConstructorFingerprint.patternMatch!!.startIndex + 2 - val viewRegister = getInstruction(insertIndex).registerA - - injectHideViewCall( - insertIndex, - viewRegister, - FILTER_CLASS_DESCRIPTOR, - "hideShortsShelf", - ) - } - } - - // endregion - // region Hide the Shorts buttons in older versions of YouTube. // Some Shorts buttons are views, hide them by setting their visibility to GONE. @@ -256,7 +211,7 @@ val hideShortsComponentsPatch = bytecodePatch( setPivotBarVisibilityParentFingerprint.originalClassDef, ).let { result -> result.method.apply { - val insertIndex = result.patternMatch!!.endIndex + val insertIndex = result.patternMatch.endIndex val viewRegister = getInstruction(insertIndex - 1).registerA addInstruction( insertIndex, @@ -279,22 +234,19 @@ val hideShortsComponentsPatch = bytecodePatch( ) // Hide the bottom bar container of the Shorts player. - shortsBottomBarContainerFingerprint.method.apply { - val resourceIndex = indexOfFirstLiteralInstruction(bottomBarContainer) - - val targetIndex = indexOfFirstInstructionOrThrow(resourceIndex) { - getReference()?.name == "getHeight" - } + 1 - - val heightRegister = getInstruction(targetIndex).registerA - - addInstructions( - targetIndex + 1, - """ - invoke-static { v$heightRegister }, $FILTER_CLASS_DESCRIPTOR->getNavigationBarHeight(I)I - move-result v$heightRegister - """, - ) + shortsBottomBarContainerFingerprint.let { + it.method.apply { + val targetIndex = it.filterMatch.last().index + val heightRegister = getInstruction(targetIndex).registerA + + addInstructions( + targetIndex + 1, + """ + invoke-static { v$heightRegister }, $FILTER_CLASS_DESCRIPTOR->getNavigationBarHeight(I)I + move-result v$heightRegister + """ + ) + } } // endregion @@ -306,8 +258,7 @@ private enum class ShortsButtons(private val resourceName: String, private val m DISLIKE("reel_dyn_dislike", "hideDislikeButton"), COMMENTS("reel_dyn_comment", "hideShortsCommentsButton"), REMIX("reel_dyn_remix", "hideShortsRemixButton"), - SHARE("reel_dyn_share", "hideShortsShareButton"), - ; + SHARE("reel_dyn_share", "hideShortsShareButton"); fun injectHideCall(method: MutableMethod) { val referencedIndex = method.indexOfFirstResourceIdOrThrow(resourceName) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt index c64cf75940..c3fec3a2a8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt @@ -1,19 +1,18 @@ package app.revanced.patches.youtube.misc.navigation +import app.revanced.patcher.MethodFilter import app.revanced.patcher.fingerprint +import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter import app.revanced.patches.youtube.layout.buttons.navigation.navigationButtonsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.MethodReference internal val actionBarSearchResultsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") - literal { actionBarSearchResultsViewMicId } + instructions( + ResourceMappingFilter("layout", "action_bar_search_results_view_mic"), + MethodFilter(methodName = "setLayoutDirection") + ) } /** @@ -22,7 +21,9 @@ internal val actionBarSearchResultsFingerprint = fingerprint { internal val initializeButtonsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") - literal { imageOnlyTabResourceId } + instructions( + ResourceMappingFilter("layout", "image_only_tab") + ) } internal val mainActivityOnBackPressedFingerprint = fingerprint { @@ -87,17 +88,15 @@ internal val pivotBarButtonsCreateResourceViewFingerprint = fingerprint { } } -internal fun indexOfSetViewSelectedInstruction(method: Method) = method.indexOfFirstInstruction { - opcode == Opcode.INVOKE_VIRTUAL && getReference()?.name == "setSelected" -} - internal val pivotBarButtonsViewSetSelectedFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "Z") + instructions( + MethodFilter(methodName = "setSelected") + ) custom { method, _ -> - indexOfSetViewSelectedInstruction(method) >= 0 && - method.definingClass == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" + method.definingClass == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" } } @@ -113,7 +112,7 @@ internal val imageEnumConstructorFingerprint = fingerprint { internal val setEnumMapFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - literal { - ytFillBellId - } + instructions( + ResourceMappingFilter("drawable", "yt_fill_bell_black_24") + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt index 902567eb89..309b0a0048 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt @@ -6,18 +6,13 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.misc.mapping.get -import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_35_or_greater import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.Instruction @@ -26,23 +21,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.util.MethodUtil -internal var imageOnlyTabResourceId = -1L - private set -internal var actionBarSearchResultsViewMicId = -1L - private set -internal var ytFillBellId = -1L - private set - -private val navigationBarHookResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - imageOnlyTabResourceId = resourceMappings["layout", "image_only_tab"] - actionBarSearchResultsViewMicId = resourceMappings["layout", "action_bar_search_results_view_mic"] - ytFillBellId = resourceMappings["drawable", "yt_fill_bell_black_24"] - } -} - internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/shared/NavigationBar;" internal const val EXTENSION_NAVIGATION_BUTTON_DESCRIPTOR = @@ -53,7 +31,6 @@ lateinit var hookNavigationButtonCreated: (String) -> Unit val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navigation or search bar.") { dependsOn( sharedExtensionPatch, - navigationBarHookResourcePatch, playerTypeHookPatch, // Required to detect the search bar in all situations. ) @@ -99,17 +76,19 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig } } - pivotBarButtonsViewSetSelectedFingerprint.method.apply { - val index = indexOfSetViewSelectedInstruction(this) - val instruction = getInstruction(index) - val viewRegister = instruction.registerC - val isSelectedRegister = instruction.registerD + pivotBarButtonsViewSetSelectedFingerprint.let { + it.method.apply { + val index = it.filterMatch.first().index + val instruction = getInstruction(index) + val viewRegister = instruction.registerC + val isSelectedRegister = instruction.registerD - addInstruction( - index + 1, - "invoke-static { v$viewRegister, v$isSelectedRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->navigationTabSelected(Landroid/view/View;Z)V", - ) + addInstruction( + index + 1, + "invoke-static { v$viewRegister, v$isSelectedRegister }, " + + "$EXTENSION_CLASS_DESCRIPTOR->navigationTabSelected(Landroid/view/View;Z)V", + ) + } } // Hook onto back button pressed. Needed to fix race problem with @@ -125,22 +104,17 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig // Two different layouts are used at the hooked code. // Insert before the first ViewGroup method call after inflating, // so this works regardless which layout is used. - actionBarSearchResultsFingerprint.method.apply { - val searchBarResourceId = indexOfFirstLiteralInstructionOrThrow( - actionBarSearchResultsViewMicId, - ) + actionBarSearchResultsFingerprint.let { + it.method.apply { + val instructionIndex = it.filterMatch.last().index + val viewRegister = getInstruction(instructionIndex).registerC - val instructionIndex = indexOfFirstInstructionOrThrow(searchBarResourceId) { - opcode == Opcode.INVOKE_VIRTUAL && getReference()?.name == "setLayoutDirection" + addInstruction( + instructionIndex, + "invoke-static { v$viewRegister }, " + + "$EXTENSION_CLASS_DESCRIPTOR->searchBarResultsViewLoaded(Landroid/view/View;)V", + ) } - - val viewRegister = getInstruction(instructionIndex).registerC - - addInstruction( - instructionIndex, - "invoke-static { v$viewRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->searchBarResultsViewLoaded(Landroid/view/View;)V", - ) } hookNavigationButtonCreated = { extensionClassDescriptor -> @@ -155,7 +129,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig // Fix YT bug of notification tab missing the filled icon. if (is_19_35_or_greater) { val cairoNotificationEnumReference = with(imageEnumConstructorFingerprint) { - val stringIndex = stringMatches!!.first().index + val stringIndex = stringMatches.first().index val cairoNotificationEnumIndex = method.indexOfFirstInstructionOrThrow(stringIndex) { opcode == Opcode.SPUT_OBJECT } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index 6d4a3c6cb8..82b17a3eb2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -1,5 +1,7 @@ package app.revanced.patches.youtube.video.videoid +import app.revanced.patcher.MethodFilter +import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags @@ -9,42 +11,39 @@ internal val videoIdFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") - opcodes( - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, + instructions( + MethodFilter( + definingClass = "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;", + returnType = "Ljava/lang/String;" + ), + OpcodeFilter(Opcode.MOVE_RESULT_OBJECT), + OpcodeFilter(Opcode.IGET_OBJECT), + OpcodeFilter(Opcode.INVOKE_INTERFACE), ) - custom { method, _ -> - method.indexOfPlayerResponseModelString() >= 0 - } } internal val videoIdBackgroundPlayFingerprint = fingerprint { accessFlags(AccessFlags.DECLARED_SYNCHRONIZED, AccessFlags.FINAL, AccessFlags.PUBLIC) returns("V") parameters("L") - opcodes( - Opcode.IF_EQZ, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.MONITOR_EXIT, - Opcode.RETURN_VOID, - Opcode.MONITOR_EXIT, - Opcode.RETURN_VOID + instructions( + MethodFilter( + definingClass = "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;", + returnType = "Ljava/lang/String;" + ), + OpcodeFilter(Opcode.MOVE_RESULT_OBJECT), + OpcodeFilter(Opcode.IPUT_OBJECT), + OpcodeFilter(Opcode.MONITOR_EXIT), + OpcodeFilter(Opcode.RETURN_VOID), + OpcodeFilter(Opcode.MONITOR_EXIT), + OpcodeFilter(Opcode.RETURN_VOID) ) // The target snippet of code is buried in a huge switch block and the target method // has been changed many times by YT which makes identifying it more difficult than usual. custom { method, classDef -> - // Access flags changed in 19.36 - AccessFlags.FINAL.isSet(method.accessFlags) && - AccessFlags.DECLARED_SYNCHRONIZED.isSet(method.accessFlags) && - classDef.methods.count() == 17 && - method.implementation != null && - method.indexOfPlayerResponseModelString() >= 0 + classDef.methods.count() == 17 && + method.implementation != null } - } internal val videoIdParentFingerprint = fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt index 6d69381cd3..4ff003beca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt @@ -9,11 +9,7 @@ import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.video.playerresponse.Hook import app.revanced.patches.youtube.video.playerresponse.addPlayerResponseMethodHook import app.revanced.patches.youtube.video.playerresponse.playerResponseMethodHookPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference /** * Hooks the new video id when the video changes. @@ -96,24 +92,22 @@ val videoIdPatch = bytecodePatch( ) execute { - videoIdFingerprint.match(videoIdParentFingerprint.originalClassDef).method.apply { - videoIdMethod = this - val index = indexOfPlayerResponseModelString() - videoIdRegister = getInstruction(index + 1).registerA - videoIdInsertIndex = index + 2 + videoIdFingerprint.match(videoIdParentFingerprint.originalClassDef).let { + it.method.apply { + videoIdMethod = this + val index = it.filterMatches!!.first().index + videoIdRegister = getInstruction(index + 1).registerA + videoIdInsertIndex = index + 2 + } } - videoIdBackgroundPlayFingerprint.method.apply { - backgroundPlaybackMethod = this - val index = indexOfPlayerResponseModelString() - backgroundPlaybackVideoIdRegister = getInstruction(index + 1).registerA - backgroundPlaybackInsertIndex = index + 2 + videoIdBackgroundPlayFingerprint.let { + it.method.apply { + backgroundPlaybackMethod = this + val index = it.filterMatch.first().index + backgroundPlaybackVideoIdRegister = getInstruction(index + 1).registerA + backgroundPlaybackInsertIndex = index + 2 + } } } -} - -internal fun Method.indexOfPlayerResponseModelString() = indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" && - reference.returnType == "Ljava/lang/String;" -} +} \ No newline at end of file From f9767e1ec176c640ec4451abfe8f32703c3e2942 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:01:20 +0100 Subject: [PATCH 03/64] refactor --- patches/api/patches.api | 9 ------ .../patches/shared/misc/spoof/Fingerprints.kt | 10 +++---- .../misc/spoof/SpoofVideoStreamsPatch.kt | 18 ++++++------ .../youtube/layout/miniplayer/Fingerprints.kt | 4 ++- .../layout/miniplayer/MiniplayerPatch.kt | 28 +++++++------------ .../youtube/layout/seekbar/Fingerprints.kt | 11 +++++--- .../layout/seekbar/SeekbarColorPatch.kt | 13 +++++---- .../fix/cairo/DisableCairoSettingsPatch.kt | 20 ++++++------- .../youtube/misc/fix/cairo/Fingerprints.kt | 11 +++++--- 9 files changed, 58 insertions(+), 66 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 0593e1f628..0602b5ec82 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1160,16 +1160,7 @@ public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPa } public final class app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatchKt { - public static final fun getFloatyBarButtonTopMargin ()J public static final fun getMiniplayerPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getModernMiniplayerClose ()J - public static final fun getModernMiniplayerExpand ()J - public static final fun getModernMiniplayerForwardButton ()J - public static final fun getModernMiniplayerRewindButton ()J - public static final fun getPlayerOverlays ()J - public static final fun getScrimOverlay ()J - public static final fun getYtOutlinePictureInPictureWhite24 ()J - public static final fun getYtOutlineXWhite24 ()J } public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index 77e953bb56..1d5a980c0e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -1,8 +1,8 @@ package app.revanced.patches.shared.misc.spoof +import app.revanced.patcher.LiteralFilter import app.revanced.patcher.MethodFilter import app.revanced.patcher.fingerprint -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -116,14 +116,12 @@ internal val buildMediaDataSourceFingerprint = fingerprint { ) } -internal const val HLS_CURRENT_TIME_FEATURE_FLAG = 45355374L - internal val hlsCurrentTimeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Z", "L") - literal { - HLS_CURRENT_TIME_FEATURE_FLAG - } + instructions( + LiteralFilter(45355374L) + ) } internal val nerdsStatsVideoFormatBuilderFingerprint = fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index cb4541df20..83176f2680 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -48,7 +48,7 @@ fun spoofVideoStreamsPatch( // region Block /initplayback requests to fall back to /get_watch requests. - val moveUriStringIndex = buildInitPlaybackRequestFingerprint.patternMatch!!.startIndex + val moveUriStringIndex = buildInitPlaybackRequestFingerprint.patternMatch.startIndex buildInitPlaybackRequestFingerprint.method.apply { val targetRegister = getInstruction(moveUriStringIndex).registerA @@ -66,7 +66,7 @@ fun spoofVideoStreamsPatch( // region Block /get_watch requests to fall back to /player requests. - val invokeToStringIndex = buildPlayerRequestURIFingerprint.patternMatch!!.startIndex + val invokeToStringIndex = buildPlayerRequestURIFingerprint.patternMatch.startIndex buildPlayerRequestURIFingerprint.method.apply { val uriRegister = getInstruction(invokeToStringIndex).registerC @@ -107,7 +107,7 @@ fun spoofVideoStreamsPatch( createStreamingDataFingerprint.method.apply { val setStreamDataMethodName = "patch_setStreamingData" val resultMethodType = createStreamingDataFingerprint.classDef.type - val videoDetailsIndex = createStreamingDataFingerprint.patternMatch!!.endIndex + val videoDetailsIndex = createStreamingDataFingerprint.patternMatch.endIndex val videoDetailsRegister = getInstruction(videoDetailsIndex).registerA val videoDetailsClass = getInstruction(videoDetailsIndex).getReference()!!.type @@ -118,7 +118,7 @@ fun spoofVideoStreamsPatch( ) val protobufClass = protobufClassParseByteBufferFingerprint.method.definingClass - val setStreamingDataIndex = createStreamingDataFingerprint.patternMatch!!.startIndex + val setStreamingDataIndex = createStreamingDataFingerprint.patternMatch.startIndex val playerProtoClass = getInstruction(setStreamingDataIndex + 1) .getReference()!!.definingClass @@ -229,10 +229,12 @@ fun spoofVideoStreamsPatch( // region Fix iOS livestream current time. - hlsCurrentTimeFingerprint.method.insertFeatureFlagBooleanOverride( - HLS_CURRENT_TIME_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->fixHLSCurrentTime(Z)Z" - ) + hlsCurrentTimeFingerprint.let { + it.method.insertFeatureFlagBooleanOverride( + it.filterMatch.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->fixHLSCurrentTime(Z)Z" + ) + } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 46542a5303..8c358fa1a9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -13,7 +13,9 @@ internal val miniplayerDimensionsCalculatorParentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") - literal { floatyBarButtonTopMargin } + instructions( + ResourceMappingFilter("dimen", "floaty_bar_button_top_margin") + ) } /** diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 46f5d01c98..7f13b9c9b5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -33,25 +33,22 @@ import com.android.tools.smali.dexlib2.iface.reference.TypeReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter -var floatyBarButtonTopMargin = -1L - private set - // Only available in 19.15 and upwards. -var ytOutlineXWhite24 = -1L +internal var ytOutlineXWhite24 = -1L private set -var ytOutlinePictureInPictureWhite24 = -1L +internal var ytOutlinePictureInPictureWhite24 = -1L private set -var scrimOverlay = -1L +internal var scrimOverlay = -1L private set -var modernMiniplayerClose = -1L +internal var modernMiniplayerClose = -1L private set -var modernMiniplayerExpand = -1L +internal var modernMiniplayerExpand = -1L private set -var modernMiniplayerRewindButton = -1L +internal var modernMiniplayerRewindButton = -1L private set -var modernMiniplayerForwardButton = -1L +internal var modernMiniplayerForwardButton = -1L private set -var playerOverlays = -1L +internal var playerOverlays = -1L private set private val miniplayerResourcePatch = resourcePatch { @@ -61,11 +58,6 @@ private val miniplayerResourcePatch = resourcePatch { ) execute { - floatyBarButtonTopMargin = resourceMappings[ - "dimen", - "floaty_bar_button_top_margin", - ] - scrimOverlay = resourceMappings[ "id", "scrim_overlay", @@ -329,13 +321,13 @@ val miniplayerPatch = bytecodePatch( // endregion // region Legacy tablet miniplayer hooks. - val appNameStringIndex = miniplayerOverrideFingerprint.stringMatches!!.first().index + 2 + val appNameStringIndex = miniplayerOverrideFingerprint.stringMatches.first().index + 2 navigate(miniplayerOverrideFingerprint.originalMethod).to(appNameStringIndex).stop().apply { findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride(index) } } miniplayerResponseModelSizeCheckFingerprint.let { - it.method.insertLegacyTabletMiniplayerOverride(it.patternMatch!!.endIndex) + it.method.insertLegacyTabletMiniplayerOverride(it.patternMatch.endIndex) } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index ec9fd440cb..db9c3a8f5f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.layout.seekbar +import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint import app.revanced.util.containsLiteralInstruction import app.revanced.util.literal @@ -10,7 +11,9 @@ internal val fullscreenSeekbarThumbnailsFingerprint = fingerprint { returns("Z") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() - literal { 45398577 } + instructions( + LiteralFilter(45398577) + ) } internal val playerSeekbarColorFingerprint = fingerprint { @@ -34,13 +37,13 @@ internal val shortsSeekbarColorFingerprint = fingerprint { literal { reelTimeBarPlayedColorId } } -internal const val PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG = 45617850L - internal val playerSeekbarGradientConfigFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() - literal { PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG } + instructions( + LiteralFilter(45617850L) + ) } internal val lithoLinearGradientFingerprint = fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index a9f347ad08..cfca4095a6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -182,6 +182,7 @@ val seekbarColorPatch = bytecodePatch( sharedExtensionPatch, lithoColorHookPatch, seekbarColorResourcePatch, + resourceMappingPatch, ) execute { @@ -207,7 +208,7 @@ val seekbarColorPatch = bytecodePatch( } setSeekbarClickedColorFingerprint.originalMethod.let { - val setColorMethodIndex = setSeekbarClickedColorFingerprint.patternMatch!!.startIndex + 1 + val setColorMethodIndex = setSeekbarClickedColorFingerprint.patternMatch.startIndex + 1 navigate(it).to(setColorMethodIndex).stop().apply { val colorRegister = getInstruction(0).registerA @@ -229,10 +230,12 @@ val seekbarColorPatch = bytecodePatch( // 19.25+ changes - playerSeekbarGradientConfigFingerprint.method.insertFeatureFlagBooleanOverride( - PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->playerSeekbarGradientEnabled(Z)Z" - ) + playerSeekbarGradientConfigFingerprint.let { + it.method.insertFeatureFlagBooleanOverride( + it.filterMatch.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->playerSeekbarGradientEnabled(Z)Z" + ) + } lithoLinearGradientFingerprint.method.addInstruction( 0, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt index cd058ca590..5226cf2f0b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt @@ -6,9 +6,6 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.youtube.misc.backgroundplayback.backgroundPlaybackPatch import app.revanced.patches.youtube.misc.playservice.is_19_04_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction internal val disableCairoSettingsPatch = bytecodePatch( @@ -33,15 +30,16 @@ internal val disableCairoSettingsPatch = bytecodePatch( * Screenshots of the Cairo Fragment: * uYouPlus#1468. */ - cairoFragmentConfigFingerprint.method.apply { - val literalIndex = indexOfFirstLiteralInstructionOrThrow(CAIRO_CONFIG_LITERAL_VALUE) - val resultIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.MOVE_RESULT) - val register = getInstruction(resultIndex).registerA + cairoFragmentConfigFingerprint.let{ + it.method.apply { + val resultIndex = it.filterMatch.last().index + val register = getInstruction(resultIndex).registerA - addInstruction( - resultIndex + 1, - "const/16 v$register, 0x0", - ) + addInstruction( + resultIndex + 1, + "const/16 v$register, 0x0", + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/Fingerprints.kt index 5272adc07d..8445879127 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/Fingerprints.kt @@ -1,8 +1,10 @@ package app.revanced.patches.youtube.misc.fix.cairo +import app.revanced.patcher.LiteralFilter +import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode /** * Added in YouTube v19.04.38. @@ -10,10 +12,11 @@ import com.android.tools.smali.dexlib2.AccessFlags * When this value is true, Cairo Fragment is used. * In this case, some of the patches may be broken, so set this value to FALSE. */ -internal const val CAIRO_CONFIG_LITERAL_VALUE = 45532100L - internal val cairoFragmentConfigFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") - literal { CAIRO_CONFIG_LITERAL_VALUE } + instructions( + LiteralFilter(45532100L), + OpcodeFilter(Opcode.MOVE_RESULT, 10) + ) } From 96e60a4916317faa942cf73efe1131d9880eb930 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:06:20 +0100 Subject: [PATCH 04/64] fix: add missing dependency used by fingerprints --- .../layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt | 2 ++ .../patches/youtube/misc/navigation/NavigationBarHookPatch.kt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt index b3b911e5cb..bac6b11b43 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt @@ -8,6 +8,7 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen @@ -31,6 +32,7 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, + resourceMappingPatch // Used by fingerprints ) compatibleWith( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt index 309b0a0048..b36a4d4e19 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt @@ -7,6 +7,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod +import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_35_or_greater @@ -32,6 +33,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig dependsOn( sharedExtensionPatch, playerTypeHookPatch, // Required to detect the search bar in all situations. + resourceMappingPatch // Used by fingerprints ) execute { From cfce280652128307a0467308559dd952564fc26c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 3 Jan 2025 11:11:32 +0100 Subject: [PATCH 05/64] refactor: use 'by' semantic --- .../revanced/patches/amazon/Fingerprints.kt | 2 +- .../backdrops/misc/pro/Fingerprints.kt | 2 +- .../bandcamp/limitations/Fingerprints.kt | 2 +- .../cieid/restrictions/root/Fingerprints.kt | 2 +- .../patches/duolingo/ad/Fingerprints.kt | 2 +- .../patches/duolingo/debug/Fingerprints.kt | 2 +- .../facebook/ads/mainfeed/Fingerprints.kt | 6 +- .../facebook/ads/story/Fingerprints.kt | 4 +- .../detection/bootloader/Fingerprints.kt | 4 +- .../detection/root/Fingerprints.kt | 2 +- .../googlenews/customtabs/Fingerprints.kt | 2 +- .../googlenews/misc/gms/Fingerprints.kt | 2 +- .../misc/features/Fingerprints.kt | 2 +- .../googlephotos/misc/gms/Fingerprints.kt | 2 +- .../misc/preferences/Fingerprints.kt | 2 +- .../restrictions/Fingerprints.kt | 2 +- .../patches/hexeditor/ad/Fingerprints.kt | 2 +- .../iconpackstudio/misc/pro/Fingerprints.kt | 2 +- .../idaustria/detection/root/Fingerprints.kt | 6 +- .../detection/signature/Fingerprints.kt | 2 +- .../patches/inshorts/ad/Fingerprints.kt | 2 +- .../patches/instagram/ads/Fingerprints.kt | 2 +- .../patches/irplus/ad/Fingerprints.kt | 2 +- .../lightroom/misc/login/Fingerprints.kt | 2 +- .../lightroom/misc/premium/Fingerprints.kt | 2 +- .../detection/license/Fingerprints.kt | 2 +- .../detection/signature/Fingerprints.kt | 2 +- .../memegenerator/misc/pro/Fingerprints.kt | 2 +- .../patches/messenger/inbox/Fingerprints.kt | 4 +- .../messenger/inputfield/Fingerprints.kt | 4 +- .../mifitness/misc/locale/Fingerprints.kt | 2 +- .../mifitness/misc/login/Fingerprints.kt | 2 +- .../patches/music/ad/video/Fingerprints.kt | 2 +- .../audio/exclusiveaudio/Fingerprints.kt | 2 +- .../permanentrepeat/Fingerprints.kt | 2 +- .../permanentshuffle/Fingerprints.kt | 2 +- .../layout/compactheader/Fingerprints.kt | 2 +- .../music/layout/premium/Fingerprints.kt | 4 +- .../layout/upgradebutton/Fingerprints.kt | 2 +- .../music/misc/androidauto/Fingerprints.kt | 2 +- .../misc/backgroundplayback/Fingerprints.kt | 4 +- .../patches/music/misc/gms/Fingerprints.kt | 2 +- .../patches/music/misc/spoof/Fingerprints.kt | 8 +-- .../myexpenses/misc/pro/Fingerprints.kt | 2 +- .../patches/myfitnesspal/ads/Fingerprints.kt | 4 +- .../nfctoolsse/misc/pro/Fingerprints.kt | 2 +- .../patches/nyx/misc/pro/Fingerprints.kt | 2 +- .../misc/fix/crash/Fingerprints.kt | 2 +- .../detection/deviceid/Fingerprints.kt | 2 +- .../detection/signature/Fingerprints.kt | 2 +- .../photomath/misc/annoyances/Fingerprints.kt | 2 +- .../misc/unlock/bookpoint/Fingerprints.kt | 2 +- .../misc/unlock/plus/Fingerprints.kt | 2 +- .../patches/piccomafr/misc/Fingerprints.kt | 2 +- .../piccomafr/tracking/Fingerprints.kt | 6 +- .../patches/pixiv/ads/Fingerprints.kt | 2 +- .../purchasereminder/Fingerprints.kt | 2 +- .../reddit/ad/comments/Fingerprints.kt | 2 +- .../patches/reddit/ad/general/Fingerprints.kt | 4 +- .../baconreader/api/Fingerprints.kt | 6 +- .../boostforreddit/ads/Fingerprints.kt | 4 +- .../boostforreddit/api/Fingerprints.kt | 4 +- .../fix/downloads/Fingerprints.kt | 2 +- .../boostforreddit/fix/slink/Fingerprints.kt | 4 +- .../infinityforreddit/api/Fingerprints.kt | 2 +- .../subscription/Fingerprints.kt | 4 +- .../joeyforreddit/ads/Fingerprints.kt | 2 +- .../joeyforreddit/api/Fingerprints.kt | 4 +- .../detection/piracy/Fingerprints.kt | 2 +- .../redditisfun/api/Fingerprints.kt | 6 +- .../relayforreddit/api/Fingerprints.kt | 12 ++-- .../customclients/slide/api/Fingerprints.kt | 2 +- .../customclients/sync/ads/Fingerprints.kt | 2 +- .../sync/detection/piracy/Fingerprints.kt | 2 +- .../annoyances/startup/Fingerprints.kt | 2 +- .../sync/syncforreddit/api/Fingerprints.kt | 8 +-- .../syncforreddit/fix/slink/Fingerprints.kt | 4 +- .../syncforreddit/fix/user/Fingerprints.kt | 12 ++-- .../syncforreddit/fix/video/Fingerprints.kt | 2 +- .../disablescreenshotpopup/Fingerprints.kt | 2 +- .../reddit/layout/premiumicon/Fingerprints.kt | 2 +- .../reddit/misc/tracking/url/Fingerprints.kt | 2 +- .../detection/root/Fingerprints.kt | 2 +- .../revanced/patches/shared/Fingerprints.kt | 4 +- .../shared/misc/checks/Fingerprints.kt | 4 +- .../shared/misc/extension/Fingerprints.kt | 2 +- .../misc/extension/SharedExtensionPatch.kt | 9 ++- .../misc/fix/verticalscroll/Fingerprints.kt | 2 +- .../patches/shared/misc/gms/Fingerprints.kt | 6 +- .../patches/shared/misc/spoof/Fingerprints.kt | 18 +++--- .../functionality/filesize/Fingerprints.kt | 2 +- .../patches/songpal/badge/Fingerprints.kt | 4 +- .../patches/soundcloud/ad/Fingerprints.kt | 4 +- .../soundcloud/analytics/Fingerprints.kt | 2 +- .../soundcloud/offlinesync/Fingerprints.kt | 4 +- .../patches/soundcloud/shared/Fingerprints.kt | 2 +- .../spotify/lite/ondemand/Fingerprints.kt | 2 +- .../patches/spotify/navbar/Fingerprints.kt | 2 +- .../strava/subscription/Fingerprints.kt | 2 +- .../patches/strava/upselling/Fingerprints.kt | 2 +- .../swissid/integritycheck/Fingerprints.kt | 2 +- .../ticktick/misc/themeunlock/Fingerprints.kt | 4 +- .../patches/tiktok/feedfilter/Fingerprints.kt | 2 +- .../interaction/cleardisplay/Fingerprints.kt | 2 +- .../interaction/downloads/Fingerprints.kt | 8 +-- .../interaction/seekbar/Fingerprints.kt | 4 +- .../tiktok/interaction/speed/Fingerprints.kt | 4 +- .../login/disablerequirement/Fingerprints.kt | 4 +- .../misc/login/fixgoogle/Fingerprints.kt | 4 +- .../tiktok/misc/settings/Fingerprints.kt | 10 ++-- .../patches/tiktok/shared/Fingerprints.kt | 4 +- .../revanced/patches/trakt/Fingerprints.kt | 6 +- .../tudortmund/lockscreen/Fingerprints.kt | 2 +- .../annoyances/notifications/Fingerprints.kt | 2 +- .../tumblr/annoyances/popups/Fingerprints.kt | 2 +- .../tumblr/featureflags/Fingerprints.kt | 2 +- .../patches/tumblr/fixes/Fingerprints.kt | 4 +- .../tumblr/timelinefilter/Fingerprints.kt | 6 +- .../patches/twitch/ad/audio/Fingerprints.kt | 2 +- .../twitch/ad/embedded/Fingerprints.kt | 2 +- .../patches/twitch/ad/video/Fingerprints.kt | 6 +- .../twitch/chat/antidelete/Fingerprints.kt | 6 +- .../twitch/chat/autoclaim/Fingerprints.kt | 2 +- .../patches/twitch/debug/Fingerprints.kt | 6 +- .../twitch/misc/settings/Fingerprints.kt | 8 +-- .../interaction/downloads/Fingerprints.kt | 6 +- .../twitter/layout/viewcount/Fingerprints.kt | 2 +- .../twitter/misc/hook/json/Fingerprints.kt | 6 +- .../twitter/misc/links/Fingerprints.kt | 10 ++-- .../patches/vsco/misc/pro/Fingerprints.kt | 2 +- .../misc/firebasegetcert/Fingerprints.kt | 4 +- .../warnwetter/misc/promocode/Fingerprints.kt | 2 +- .../patches/willhaben/ads/Fingerprints.kt | 4 +- .../windyapp/misc/unlockpro/Fingerprints.kt | 2 +- .../youtube/ad/getpremium/Fingerprints.kt | 2 +- .../patches/youtube/ad/video/Fingerprints.kt | 2 +- .../interaction/dialog/Fingerprints.kt | 2 +- .../interaction/downloads/Fingerprints.kt | 2 +- .../interaction/seekbar/Fingerprints.kt | 20 +++---- .../interaction/swipecontrols/Fingerprints.kt | 4 +- .../layout/autocaptions/Fingerprints.kt | 4 +- .../layout/buttons/navigation/Fingerprints.kt | 10 ++-- .../layout/buttons/overlay/Fingerprints.kt | 4 +- .../youtube/layout/formfactor/Fingerprints.kt | 4 +- .../hide/endscreencards/Fingerprints.kt | 6 +- .../fullscreenambientmode/Fingerprints.kt | 2 +- .../layout/hide/general/Fingerprints.kt | 22 ++++---- .../layout/hide/infocards/Fingerprints.kt | 6 +- .../layout/hide/shorts/Fingerprints.kt | 14 ++--- .../suggestedvideoendscreen/Fingerprints.kt | 2 +- .../youtube/layout/hide/time/Fingerprints.kt | 2 +- .../youtube/layout/miniplayer/Fingerprints.kt | 32 +++++------ .../layout/panels/popup/Fingerprints.kt | 2 +- .../layout/player/fullscreen/Fingerprints.kt | 4 +- .../layout/player/overlay/Fingerprints.kt | 2 +- .../returnyoutubedislike/Fingerprints.kt | 26 ++++----- .../youtube/layout/searchbar/Fingerprints.kt | 4 +- .../youtube/layout/seekbar/Fingerprints.kt | 14 ++--- .../layout/shortsautoplay/Fingerprints.kt | 4 +- .../layout/shortsplayer/Fingerprints.kt | 6 +- .../layout/sponsorblock/Fingerprints.kt | 38 ++++++++----- .../layout/sponsorblock/SponsorBlockPatch.kt | 55 +++++++------------ .../layout/spoofappversion/Fingerprints.kt | 2 +- .../youtube/layout/startpage/Fingerprints.kt | 4 +- .../layout/startupshortsreset/Fingerprints.kt | 4 +- .../youtube/layout/theme/Fingerprints.kt | 8 +-- .../misc/backgroundplayback/Fingerprints.kt | 10 ++-- .../youtube/misc/debugging/Fingerprints.kt | 10 ++-- .../misc/dimensions/spoof/Fingerprints.kt | 2 +- .../fix/backtoexitgesture/Fingerprints.kt | 8 +-- .../youtube/misc/fix/cairo/Fingerprints.kt | 2 +- .../misc/fix/playbackspeed/Fingerprints.kt | 2 +- .../youtube/misc/imageurlhook/Fingerprints.kt | 12 ++-- .../youtube/misc/links/Fingerprints.kt | 8 +-- .../youtube/misc/litho/filter/Fingerprints.kt | 14 ++--- .../youtube/misc/navigation/Fingerprints.kt | 22 ++++---- .../misc/playercontrols/Fingerprints.kt | 16 +++--- .../youtube/misc/playertype/Fingerprints.kt | 4 +- .../youtube/misc/privacy/Fingerprints.kt | 6 +- .../recyclerviewtree/hook/Fingerprints.kt | 2 +- .../youtube/misc/settings/Fingerprints.kt | 4 +- .../youtube/misc/zoomhaptics/Fingerprints.kt | 2 +- .../patches/youtube/shared/Fingerprints.kt | 20 +++---- .../youtube/video/audio/Fingerprints.kt | 6 +- .../youtube/video/information/Fingerprints.kt | 22 ++++---- .../video/playerresponse/Fingerprints.kt | 4 +- .../youtube/video/quality/Fingerprints.kt | 6 +- .../video/speed/custom/Fingerprints.kt | 10 ++-- .../video/speed/remember/Fingerprints.kt | 2 +- .../youtube/video/videoid/Fingerprints.kt | 6 +- .../video/videoqualitymenu/Fingerprints.kt | 4 +- .../yuka/misc/unlockpremium/Fingerprints.kt | 4 +- 192 files changed, 491 insertions(+), 489 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt index 1339149f43..35d31a5f9e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.amazon import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val deepLinkingFingerprint = fingerprint { +internal val deepLinkingFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE) returns("Z") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt index bbe71e8c78..1b42a34033 100644 --- a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.backdrops.misc.pro import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val proUnlockFingerprint = fingerprint { +internal val proUnlockFingerprint by fingerprint { opcodes( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt index 96bbab5ccc..c645943a05 100644 --- a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.bandcamp.limitations import app.revanced.patcher.fingerprint -internal val handlePlaybackLimitsFingerprint = fingerprint { +internal val handlePlaybackLimitsFingerprint by fingerprint { strings("play limits processing track", "found play_count") } diff --git a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt index 387b0a0be8..6f9c9c2c63 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.cieid.restrictions.root import app.revanced.patcher.fingerprint -internal val checkRootFingerprint = fingerprint { +internal val checkRootFingerprint by fingerprint { custom { method, _ -> method.name == "onResume" && method.definingClass == "Lit/ipzs/cieid/BaseActivity;" } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt index 59b0644d98..7a45d8fa5a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val initializeMonetizationDebugSettingsFingerprint = fingerprint { +internal val initializeMonetizationDebugSettingsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") parameters( diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt index 543e40b434..2319ed2da0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt @@ -11,7 +11,7 @@ import com.android.tools.smali.dexlib2.Opcode * - `isDebug`: compares "release" with "debug" <-- we want to force this to `true` */ -internal val initializeBuildConfigProviderFingerprint = fingerprint { +internal val initializeBuildConfigProviderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") opcodes(Opcode.IPUT_BOOLEAN) diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt index e84a448baa..396f44ff05 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val baseModelMapperFingerprint = fingerprint { +internal val baseModelMapperFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Lcom/facebook/graphql/modelutil/BaseModelWithTree;") parameters("Ljava/lang/Class", "I", "I") @@ -17,7 +17,7 @@ internal val baseModelMapperFingerprint = fingerprint { ) } -internal val getSponsoredDataModelTemplateFingerprint = fingerprint { +internal val getSponsoredDataModelTemplateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() @@ -33,7 +33,7 @@ internal val getSponsoredDataModelTemplateFingerprint = fingerprint { } } -internal val getStoryVisibilityFingerprint = fingerprint { +internal val getStoryVisibilityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt index 293d7ee82f..0a93699f01 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt @@ -3,11 +3,11 @@ package app.revanced.patches.facebook.ads.story import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.iface.value.StringEncodedValue -internal val adsInsertionFingerprint = fieldFingerprint( +internal val adsInsertionFingerprint by fieldFingerprint( fieldValue = "AdBucketDataSourceUtil\$attemptAdsInsertion\$1", ) -internal val fetchMoreAdsFingerprint = fieldFingerprint( +internal val fetchMoreAdsFingerprint by fieldFingerprint( fieldValue = "AdBucketDataSourceUtil\$attemptFetchMoreAds\$1", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt index 4c8ee1c541..2347d1143d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt @@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#isBootStateOk (3.0.1) -internal val bootStateFingerprint = fingerprint { +internal val bootStateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") opcodes( @@ -30,7 +30,7 @@ internal val bootStateFingerprint = fingerprint { } // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#createKey (3.0.1) -internal val createKeyFingerprint = fingerprint { +internal val createKeyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") strings("attestation", "SHA-256", "random", "EC", "AndroidKeyStore") diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt index fec7f1249f..7460461e43 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt @@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.RootDetection#isRooted (3.0.1) -internal val rootDetectionFingerprint = fingerprint { +internal val rootDetectionFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt index 8880c010e9..387d1cbf61 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val launchCustomTabFingerprint = fingerprint { +internal val launchCustomTabFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.IPUT_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt index 6ddeb3e07f..e23ac4bc48 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.googlenews.misc.gms import app.revanced.patcher.fingerprint -internal val magazinesActivityOnCreateFingerprint = fingerprint { +internal val magazinesActivityOnCreateFingerprint by fingerprint { custom { methodDef, classDef -> methodDef.name == "onCreate" && classDef.endsWith("/StartActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt index 95f2a3dba7..bd63a4a409 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.googlephotos.misc.features import app.revanced.patcher.fingerprint -internal val initializeFeaturesEnumFingerprint = fingerprint { +internal val initializeFeaturesEnumFingerprint by fingerprint { strings("com.google.android.apps.photos.NEXUS_PRELOAD") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt index f47c1a3d94..cbd720730a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.googlephotos.misc.gms import app.revanced.patcher.fingerprint -internal val homeActivityOnCreateFingerprint = fingerprint { +internal val homeActivityOnCreateFingerprint by fingerprint { custom { methodDef, classDef -> methodDef.name == "onCreate" && classDef.endsWith("/HomeActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt index 54c20a7f8c..712a352a15 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.googlephotos.misc.preferences import app.revanced.patcher.fingerprint -internal val backupPreferencesFingerprint = fingerprint { +internal val backupPreferencesFingerprint by fingerprint { returns("Lcom/google/android/apps/photos/backup/data/BackupPreferences;") strings("backup_prefs_had_backup_only_when_charging_enabled") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt index 62e1e5f16b..431ea6c26c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.googlerecorder.restrictions import app.revanced.patcher.fingerprint -internal val onApplicationCreateFingerprint = fingerprint { +internal val onApplicationCreateFingerprint by fingerprint { strings("com.google.android.feature.PIXEL_2017_EXPERIENCE") custom { method, classDef -> if (method.name != "onCreate") return@custom false diff --git a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt index 2fa2c5b851..bed5ce6300 100644 --- a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.hexeditor.ad import app.revanced.patcher.fingerprint -internal val primaryAdsFingerprint = fingerprint { +internal val primaryAdsFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("PreferencesHelper;") && method.name == "isAdsDisabled" } diff --git a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt index 84db554572..fe15366f40 100644 --- a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.iconpackstudio.misc.pro import app.revanced.patcher.fingerprint -internal val checkProFingerprint = fingerprint { +internal val checkProFingerprint by fingerprint { returns("Z") custom { _, classDef -> classDef.endsWith("IPSPurchaseRepository;") } } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/Fingerprints.kt index 38f814f6d4..48c0f31ff1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.idaustria.detection.root import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val attestationSupportedCheckFingerprint = fingerprint { +internal val attestationSupportedCheckFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") custom { method, classDef -> @@ -12,7 +12,7 @@ internal val attestationSupportedCheckFingerprint = fingerprint { } } -internal val bootloaderCheckFingerprint = fingerprint { +internal val bootloaderCheckFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") custom { method, classDef -> @@ -21,7 +21,7 @@ internal val bootloaderCheckFingerprint = fingerprint { } } -internal val rootCheckFingerprint = fingerprint { +internal val rootCheckFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt index 61cd9605f1..23e2a12edd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.idaustria.detection.signature import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val spoofSignatureFingerprint = fingerprint { +internal val spoofSignatureFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt index 573bd72e35..151718de57 100644 --- a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.inshorts.ad import app.revanced.patcher.fingerprint -internal val inshortsAdsFingerprint = fingerprint { +internal val inshortsAdsFingerprint by fingerprint { returns("V") strings("GoogleAdLoader", "exception in requestAd") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/ads/Fingerprints.kt index 65d0527297..1bd1777e82 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.instagram.ads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val adInjectorFingerprint = fingerprint { +internal val adInjectorFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE) returns("Z") parameters("L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt index 30242b8d94..ceb65afeb6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.irplus.ad import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val irplusAdsFingerprint = fingerprint { +internal val irplusAdsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") parameters("L", "Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt index 6345541e14..aefb36de6f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isLoggedInFingerprint = fingerprint { +internal val isLoggedInFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) returns("Z") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt index 5a00dc68c1..3d001bb99f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val hasPurchasedFingerprint = fingerprint { +internal val hasPurchasedFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Z") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt index 0dfbf5cdab..3914e00b12 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val licenseValidationFingerprint = fingerprint { +internal val licenseValidationFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("Landroid/content/Context;") diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt index 40f105525c..396e7267d4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val verifySignatureFingerprint = fingerprint { +internal val verifySignatureFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("Landroid/app/Activity;") diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt index 1f16bb10ec..f6faf995af 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isFreeVersionFingerprint = fingerprint { +internal val isFreeVersionFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/Boolean;") parameters("Landroid/content/Context;") diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt index a2fa6329c1..814922824b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt @@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.value.StringEncodedValue -internal val createInboxSubTabsFingerprint = fingerprint { +internal val createInboxSubTabsFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) opcodes( @@ -22,7 +22,7 @@ internal val createInboxSubTabsFingerprint = fingerprint { } } -internal val loadInboxAdsFingerprint = fingerprint { +internal val loadInboxAdsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("V") strings( diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/Fingerprints.kt index 75fd54f7da..a2ca3c0597 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.dexbacked.value.DexBackedStringEncodedValue -internal val sendTypingIndicatorFingerprint = fingerprint { +internal val sendTypingIndicatorFingerprint by fingerprint { returns("V") parameters() custom { method, classDef -> @@ -16,7 +16,7 @@ internal val sendTypingIndicatorFingerprint = fingerprint { } } -internal val switchMessengeInputEmojiButtonFingerprint = fingerprint { +internal val switchMessengeInputEmojiButtonFingerprint by fingerprint { returns("V") parameters("L", "Z") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt index 14105f762a..021e320fcb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.mifitness.misc.locale import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val syncBluetoothLanguageFingerprint = fingerprint { +internal val syncBluetoothLanguageFingerprint by fingerprint { opcodes(Opcode.MOVE_RESULT_OBJECT) custom { method, _ -> method.name == "syncBluetoothLanguage" && diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt index e3eee24991..d3083e8fb9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.mifitness.misc.login import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val xiaomiAccountManagerConstructorFingerprint = fingerprint { +internal val xiaomiAccountManagerConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) parameters("Landroid/content/Context;", "Z") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt index 6ce0519ada..202a2d8897 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.ad.video import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val showVideoAdsParentFingerprint = fingerprint { +internal val showVideoAdsParentFingerprint by fingerprint { opcodes( Opcode.MOVE_RESULT_OBJECT, Opcode.INVOKE_VIRTUAL, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/Fingerprints.kt index 02a978f0fc..ce73ce8db8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val allowExclusiveAudioPlaybackFingerprint = fingerprint { +internal val allowExclusiveAudioPlaybackFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt index 13820d29d8..4ede1cadc3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val repeatTrackFingerprint = fingerprint { +internal val repeatTrackFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt index f2169744fe..78ed24b762 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val disableShuffleFingerprint = fingerprint { +internal val disableShuffleFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt index 234078c2a6..196df7f731 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val constructCategoryBarFingerprint = fingerprint { +internal val constructCategoryBarFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") parameters("Landroid/content/Context;", "L", "L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt index 29558ab4be..42dbc6bcbe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val hideGetPremiumFingerprint = fingerprint { +internal val hideGetPremiumFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -16,7 +16,7 @@ internal val hideGetPremiumFingerprint = fingerprint { strings("FEmusic_history", "FEmusic_offline") } -internal val membershipSettingsFingerprint = fingerprint { +internal val membershipSettingsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/CharSequence;") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt index f3c96dc44a..a25436faa3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val pivotBarConstructorFingerprint = fingerprint { +internal val pivotBarConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") parameters("L", "Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt index 957f055b68..2c5a02b6e7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.misc.androidauto import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val checkCertificateFingerprint = fingerprint { +internal val checkCertificateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters("Ljava/lang/String;") diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt index e1cf24e1a2..7e408aaa91 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val backgroundPlaybackDisableFingerprint = fingerprint { +internal val backgroundPlaybackDisableFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L") @@ -21,7 +21,7 @@ internal val backgroundPlaybackDisableFingerprint = fingerprint { ) } -internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { +internal val kidsBackgroundPlaybackPolicyControllerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "L", "Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt index 7131e143df..9ad55f01d6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.misc.gms import app.revanced.patcher.fingerprint -internal val musicActivityOnCreateFingerprint = fingerprint { +internal val musicActivityOnCreateFingerprint by fingerprint { returns("V") parameters("Landroid/os/Bundle;") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt index abf19cc958..22cf63b849 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val playerRequestConstructorFingerprint = fingerprint { +internal val playerRequestConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) strings("player") } @@ -12,7 +12,7 @@ internal val playerRequestConstructorFingerprint = fingerprint { /** * Matches using the class found in [playerRequestConstructorFingerprint]. */ -internal val createPlayerRequestBodyFingerprint = fingerprint { +internal val createPlayerRequestBodyFingerprint by fingerprint { parameters("L") returns("V") opcodes( @@ -26,7 +26,7 @@ internal val createPlayerRequestBodyFingerprint = fingerprint { /** * Used to get a reference to other clientInfo fields. */ -internal val setClientInfoFieldsFingerprint = fingerprint { +internal val setClientInfoFieldsFingerprint by fingerprint { returns("L") strings("Google Inc.") } @@ -34,6 +34,6 @@ internal val setClientInfoFieldsFingerprint = fingerprint { /** * Used to get a reference to the clientInfo and clientInfo.clientVersion field. */ -internal val setClientInfoClientVersionFingerprint = fingerprint { +internal val setClientInfoClientVersionFingerprint by fingerprint { strings("10.29") } diff --git a/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt index 6bc4c21e5c..a118f681a4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.myexpenses.misc.pro import app.revanced.patcher.fingerprint -internal val isEnabledFingerprint = fingerprint { +internal val isEnabledFingerprint by fingerprint { returns("Z") strings("feature", "feature.licenceStatus") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt index 160e2db274..6afea3462f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt @@ -3,14 +3,14 @@ package app.revanced.patches.myfitnesspal.ads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val isPremiumUseCaseImplFingerprint = fingerprint { +internal val isPremiumUseCaseImplFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) custom { method, classDef -> classDef.endsWith("IsPremiumUseCaseImpl;") && method.name == "doWork" } } -internal val mainActivityNavigateToNativePremiumUpsellFingerprint = fingerprint { +internal val mainActivityNavigateToNativePremiumUpsellFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt index f4f5d48c02..bf070df088 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.nfctoolsse.misc.pro import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isLicenseRegisteredFingerprint = fingerprint { +internal val isLicenseRegisteredFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") strings("kLicenseCheck") diff --git a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt index e2bffa451a..85b5bddb30 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.nyx.misc.pro import app.revanced.patcher.fingerprint -internal val checkProFingerprint = fingerprint { +internal val checkProFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("BillingManager;") && method.name == "isProVersion" } diff --git a/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt index 69463c510d..56fcf73d74 100644 --- a/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.openinghours.misc.fix.crash import app.revanced.patcher.fingerprint -internal val setPlaceFingerprint = fingerprint { +internal val setPlaceFingerprint by fingerprint { returns("V") parameters("Lde/simon/openinghours/models/Place;") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt index 90c0bbb919..d37351f8e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.photomath.detection.deviceid import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint -internal val getDeviceIdFingerprint = fingerprint { +internal val getDeviceIdFingerprint by fingerprint { returns("Ljava/lang/String;") parameters() opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt index 5d7a20783f..1750b88a04 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.photomath.detection.signature import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint -internal val checkSignatureFingerprint = fingerprint { +internal val checkSignatureFingerprint by fingerprint { opcodes( Opcode.CONST_STRING, Opcode.INVOKE_STATIC, diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt index 301f2f9a52..694573b433 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val hideUpdatePopupFingerprint = fingerprint { +internal val hideUpdatePopupFingerprint by fingerprint { accessFlags(AccessFlags.FINAL, AccessFlags.PUBLIC) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt index 6722f4223e..d0565792d5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.photomath.misc.unlock.bookpoint import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isBookpointEnabledFingerprint = fingerprint { +internal val isBookpointEnabledFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt index f6c282cbd4..bc153d400c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.photomath.misc.unlock.plus import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isPlusUnlockedFingerprint = fingerprint{ +internal val isPlusUnlockedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") strings("genius") diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt index 8c2d579ef5..199cd01af7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.piccomafr.misc import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val getAndroidIdFingerprint = fingerprint { +internal val getAndroidIdFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("Landroid/content/Context;") diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt index 794f21bcb6..fba2bf2375 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt @@ -3,19 +3,19 @@ package app.revanced.patches.piccomafr.tracking import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val appMeasurementFingerprint = fingerprint { +internal val appMeasurementFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") strings("config/app/", "Fetching remote configuration") } -internal val facebookSDKFingerprint = fingerprint { +internal val facebookSDKFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) returns("V") strings("instagram.com", "facebook.com") } -internal val firebaseInstallFingerprint = fingerprint { +internal val firebaseInstallFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE) strings( "https://%s/%s/%s", diff --git a/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt index 3e2addaa06..825a834b62 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.pixiv.ads import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val shouldShowAdsFingerprint = fingerprint { +internal val shouldShowAdsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") custom { methodDef, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt index a4d2c9e221..d63bbce862 100644 --- a/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.rar.misc.annoyances.purchasereminder import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val showReminderFingerprint = fingerprint { +internal val showReminderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("V") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt index c99df5707a..91ea04763e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.ad.comments import app.revanced.patcher.fingerprint -internal val hideCommentAdsFingerprint = fingerprint { +internal val hideCommentAdsFingerprint by fingerprint { strings( "link", // CommentPageRepository is not returning a link object diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt index e7dd789123..93310ce7e9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt @@ -3,14 +3,14 @@ package app.revanced.patches.reddit.ad.general import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val adPostFingerprint = fingerprint { +internal val adPostFingerprint by fingerprint { returns("V") // "children" are present throughout multiple versions strings("children") custom { _, classDef -> classDef.endsWith("Listing;") } } -internal val newAdPostFingerprint = fingerprint { +internal val newAdPostFingerprint by fingerprint { opcodes(Opcode.INVOKE_VIRTUAL) strings("chain", "feedElement") custom { _, classDef -> classDef.sourceFile == "AdElementConverter.kt" } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt index bb87c21148..b3c0a957b8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.reddit.customclients.baconreader.api import app.revanced.patcher.fingerprint -internal val getAuthorizationUrlFingerprint = fingerprint { +internal val getAuthorizationUrlFingerprint by fingerprint { strings("client_id=zACVn0dSFGdWqQ") } -internal val getClientIdFingerprint = fingerprint { +internal val getClientIdFingerprint by fingerprint { strings("client_id=zACVn0dSFGdWqQ") custom { method, classDef -> if (!classDef.endsWith("RedditOAuth;")) return@custom false @@ -14,6 +14,6 @@ internal val getClientIdFingerprint = fingerprint { } } -internal val requestTokenFingerprint = fingerprint { +internal val requestTokenFingerprint by fingerprint { strings("zACVn0dSFGdWqQ", "kDm2tYpu9DqyWFFyPlNcXGEni4k") // App ID and secret. } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt index 618e2f1456..3462a91942 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.reddit.customclients.boostforreddit.ads import app.revanced.patcher.fingerprint -internal val maxMediationFingerprint = fingerprint { +internal val maxMediationFingerprint by fingerprint { strings("MaxMediation: Attempting to initialize SDK") } -internal val admobMediationFingerprint = fingerprint { +internal val admobMediationFingerprint by fingerprint { strings("AdmobMediation: Attempting to initialize SDK") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt index cc06fd3968..a6d4543043 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt @@ -2,11 +2,11 @@ package app.revanced.patches.reddit.customclients.boostforreddit.api import app.revanced.patcher.fingerprint -internal val buildUserAgentFingerprint = fingerprint { +internal val buildUserAgentFingerprint by fingerprint { strings("%s:%s:%s (by /u/%s)") } -internal val getClientIdFingerprint = fingerprint { +internal val getClientIdFingerprint by fingerprint { custom { method, classDef -> if (!classDef.endsWith("Credentials;")) return@custom false diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt index a2b1530b8b..f7a3ea815b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.reddit.customclients.boostforreddit.fix.downloads import app.revanced.patcher.fingerprint -internal val downloadAudioFingerprint = fingerprint { +internal val downloadAudioFingerprint by fingerprint { strings("/DASH_audio.mp4", "/audio") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt index 665dba5a40..e690af53d9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt @@ -3,14 +3,14 @@ package app.revanced.patches.reddit.customclients.boostforreddit.fix.slink import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val getOAuthAccessTokenFingerprint = fingerprint { +internal val getOAuthAccessTokenFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Ljava/lang/String") strings("access_token") custom { method, _ -> method.definingClass == "Lnet/dean/jraw/http/oauth/OAuthData;" } } -internal val handleNavigationFingerprint = fingerprint { +internal val handleNavigationFingerprint by fingerprint { strings( "android.intent.action.SEARCH", "subscription", diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt index 4bce1362c2..0d7f124f61 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.reddit.customclients.infinityforreddit.api import app.revanced.patcher.fingerprint -internal val apiUtilsFingerprint = fingerprint { +internal val apiUtilsFingerprint by fingerprint { strings("native-lib") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt index 36fe062796..f2845f12dc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt @@ -3,11 +3,11 @@ package app.revanced.patches.reddit.customclients.infinityforreddit.subscription import app.revanced.patcher.fingerprint import app.revanced.util.literal -internal val billingClientOnServiceConnectedFingerprint = fingerprint { +internal val billingClientOnServiceConnectedFingerprint by fingerprint { strings("Billing service connected") } -internal val startSubscriptionActivityFingerprint = fingerprint { +internal val startSubscriptionActivityFingerprint by fingerprint { literal { // Intent start flag only used in the subscription activity 0x10008000 diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt index 465faf1200..e136d57ec7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.reddit.customclients.joeyforreddit.ads import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isAdFreeUserFingerprint = fingerprint { +internal val isAdFreeUserFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") strings("AD_FREE_USER") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt index e6c591748c..c6c5c0abb7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val authUtilityUserAgentFingerprint = fingerprint { +internal val authUtilityUserAgentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") opcodes(Opcode.APUT_OBJECT) @@ -13,7 +13,7 @@ internal val authUtilityUserAgentFingerprint = fingerprint { } } -internal val getClientIdFingerprint = fingerprint { +internal val getClientIdFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt index 76343a5309..d8ae7417a7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val piracyDetectionFingerprint = fingerprint { +internal val piracyDetectionFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt index 5b3029094f..a976c7b50d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt @@ -8,15 +8,15 @@ internal fun baseClientIdFingerprint(string: String) = fingerprint { strings("yyOCBp.RHJhDKd", string) } -internal val basicAuthorizationFingerprint = baseClientIdFingerprint( +internal val basicAuthorizationFingerprint by baseClientIdFingerprint( string = "fJOxVwBUyo*=f: if (!classDef.endsWith("Credentials;")) return@custom false diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt index e055493bdd..0290c185be 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.reddit.customclients.sync.ads import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isAdsEnabledFingerprint = fingerprint { +internal val isAdsEnabledFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") strings("SyncIapHelper") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt index e83e914d75..46a98af1af 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt @@ -7,7 +7,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.Reference -internal val piracyDetectionFingerprint = fingerprint { +internal val piracyDetectionFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt index 21c788a89c..0e243f97c1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.annoyances. import app.revanced.patcher.fingerprint -internal val mainActivityOnCreateFingerprint = fingerprint { +internal val mainActivityOnCreateFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("MainActivity;") && method.name == "onCreate" } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt index c7902b1f4d..41e7d5f928 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt @@ -2,18 +2,18 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.api import app.revanced.patcher.fingerprint -internal val getAuthorizationStringFingerprint = fingerprint { +internal val getAuthorizationStringFingerprint by fingerprint { strings("authorize.compact?client_id") } -internal val getBearerTokenFingerprint = fingerprint { +internal val getBearerTokenFingerprint by fingerprint { strings("Basic") } -internal val getUserAgentFingerprint = fingerprint { +internal val getUserAgentFingerprint by fingerprint { strings("android:com.laurencedawson.reddit_sync") } -internal val imgurImageAPIFingerprint = fingerprint { +internal val imgurImageAPIFingerprint by fingerprint { strings("https://imgur-apiv3.p.rapidapi.com/3/image") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt index f7287fcc39..641a3e99e1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt @@ -2,11 +2,11 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.slink import app.revanced.patcher.fingerprint -internal val linkHelperOpenLinkFingerprint = fingerprint { +internal val linkHelperOpenLinkFingerprint by fingerprint { strings("Link title: ") } -internal val setAuthorizationHeaderFingerprint = fingerprint { +internal val setAuthorizationHeaderFingerprint by fingerprint { returns("Ljava/util/HashMap;") strings("Authorization", "bearer ") custom { method, _ -> method.definingClass == "Lcom/laurencedawson/reddit_sync/singleton/a;" } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt index 4bac74de77..94a9adb2ba 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt @@ -9,28 +9,28 @@ internal fun userEndpointFingerprint(source: String, accessFlags: Set diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt index 2eac1cbe26..803192a909 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.layout.premiumicon import app.revanced.patcher.fingerprint -internal val hasPremiumIconAccessFingerprint = fingerprint { +internal val hasPremiumIconAccessFingerprint by fingerprint { returns("Z") custom { method, classDef -> classDef.endsWith("MyAccount;") && method.name == "isPremiumSubscriber" diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt index 3381fd2bb2..b861b79408 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.misc.tracking.url import app.revanced.patcher.fingerprint -internal val shareLinkFormatterFingerprint = fingerprint { +internal val shareLinkFormatterFingerprint by fingerprint { custom { _, classDef -> classDef.startsWith("Lcom/reddit/sharing/") && classDef.sourceFile == "UrlUtil.kt" } diff --git a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt index f7efe3103f..f1b352b037 100644 --- a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.serviceportalbund.detection.root import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val rootDetectionFingerprint = fingerprint { +internal val rootDetectionFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") custom { _, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt index df927dd4a7..2dbaf6e8f4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.shared import app.revanced.patcher.fingerprint -internal val castContextFetchFingerprint = fingerprint { +internal val castContextFetchFingerprint by fingerprint { strings("Error fetching CastContext.") } -internal val primeMethodFingerprint = fingerprint { +internal val primeMethodFingerprint by fingerprint { strings("com.google.android.GoogleCamera", "com.android.vending") } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt index 0eabd2f547..b63e5c04ad 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.shared.misc.checks import app.revanced.patcher.fingerprint -internal val patchInfoFingerprint = fingerprint { +internal val patchInfoFingerprint by fingerprint { custom { _, classDef -> classDef.type == "Lapp/revanced/extension/shared/checks/PatchInfo;" } } -internal val patchInfoBuildFingerprint = fingerprint { +internal val patchInfoBuildFingerprint by fingerprint { custom { _, classDef -> classDef.type == "Lapp/revanced/extension/shared/checks/PatchInfo\$Build;" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt index 58cc5082f1..b61a6763da 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.shared.misc.extension import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val revancedUtilsPatchesVersionFingerprint = fingerprint { +internal val revancedUtilsPatchesVersionFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt index 5233f186f1..16640edaca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt @@ -4,7 +4,6 @@ import app.revanced.patcher.Fingerprint import app.revanced.patcher.FingerprintBuilder import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch @@ -113,4 +112,10 @@ fun extensionHook( insertIndexResolver: ((Method) -> Int) = { 0 }, contextRegisterResolver: (Method) -> String = { "p0" }, fingerprintBuilderBlock: FingerprintBuilder.() -> Unit, -) = ExtensionHook(fingerprint(block = fingerprintBuilderBlock), insertIndexResolver, contextRegisterResolver) +) = ExtensionHook( + FingerprintBuilder("extension").also { + it.fingerprintBuilderBlock() + }.build(), + insertIndexResolver, + contextRegisterResolver +) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt index 80d041ada8..8b784b2db6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val canScrollVerticallyFingerprint = fingerprint { +internal val canScrollVerticallyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt index b5f613d541..03658d9c95 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt @@ -5,13 +5,13 @@ import com.android.tools.smali.dexlib2.AccessFlags const val GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME = "getGmsCoreVendorGroupId" -internal val gmsCoreSupportFingerprint = fingerprint { +internal val gmsCoreSupportFingerprint by fingerprint { custom { _, classDef -> classDef.endsWith("GmsCoreSupport;") } } -internal val googlePlayUtilityFingerprint = fingerprint { +internal val googlePlayUtilityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("I") parameters("L", "I") @@ -22,7 +22,7 @@ internal val googlePlayUtilityFingerprint = fingerprint { ) } -internal val serviceCheckFingerprint = fingerprint { +internal val serviceCheckFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("V") parameters("L", "I") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index 1d5a980c0e..9217884505 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -6,7 +6,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val buildInitPlaybackRequestFingerprint = fingerprint { +internal val buildInitPlaybackRequestFingerprint by fingerprint { returns("Lorg/chromium/net/UrlRequest\$Builder;") opcodes( Opcode.MOVE_RESULT_OBJECT, @@ -18,7 +18,7 @@ internal val buildInitPlaybackRequestFingerprint = fingerprint { ) } -internal val buildPlayerRequestURIFingerprint = fingerprint { +internal val buildPlayerRequestURIFingerprint by fingerprint { returns("Ljava/lang/String;") opcodes( Opcode.INVOKE_VIRTUAL, // Register holds player request URI. @@ -34,7 +34,7 @@ internal val buildPlayerRequestURIFingerprint = fingerprint { ) } -internal val buildRequestFingerprint = fingerprint { +internal val buildRequestFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Lorg/chromium/net/UrlRequest;") instructions( @@ -68,7 +68,7 @@ internal val buildRequestFingerprint = fingerprint { } } -internal val protobufClassParseByteBufferFingerprint = fingerprint { +internal val protobufClassParseByteBufferFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.STATIC) returns("L") parameters("L", "Ljava/nio/ByteBuffer;") @@ -81,7 +81,7 @@ internal val protobufClassParseByteBufferFingerprint = fingerprint { custom { method, _ -> method.name == "parseFrom" } } -internal val createStreamingDataFingerprint = fingerprint { +internal val createStreamingDataFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") parameters("L") @@ -99,7 +99,7 @@ internal val createStreamingDataFingerprint = fingerprint { } } -internal val buildMediaDataSourceFingerprint = fingerprint { +internal val buildMediaDataSourceFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") parameters( @@ -116,7 +116,7 @@ internal val buildMediaDataSourceFingerprint = fingerprint { ) } -internal val hlsCurrentTimeFingerprint = fingerprint { +internal val hlsCurrentTimeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Z", "L") instructions( @@ -124,14 +124,14 @@ internal val hlsCurrentTimeFingerprint = fingerprint { ) } -internal val nerdsStatsVideoFormatBuilderFingerprint = fingerprint { +internal val nerdsStatsVideoFormatBuilderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters("L") strings("codecs=\"") } -internal val patchIncludedExtensionMethodFingerprint = fingerprint { +internal val patchIncludedExtensionMethodFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt index 0e81d7e592..3b03634434 100644 --- a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.solidexplorer2.functionality.filesize import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val onReadyFingerprint = fingerprint { +internal val onReadyFingerprint by fingerprint { opcodes( Opcode.CONST_WIDE_32, // Constant storing the 2MB limit Opcode.CMP_LONG, diff --git a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/Fingerprints.kt index c52174f2c5..48ef210a78 100644 --- a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/Fingerprints.kt @@ -8,7 +8,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.reference.ImmutableMethodReference // Located @ ub.i0.h#p (9.5.0) -internal val createTabsFingerprint = fingerprint { +internal val createTabsFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE) returns("Ljava/util/List;") custom { method, _ -> @@ -26,7 +26,7 @@ internal val createTabsFingerprint = fingerprint { } // Located @ com.sony.songpal.mdr.vim.activity.MdrRemoteBaseActivity.e#run (9.5.0) -internal val showNotificationFingerprint = fingerprint { +internal val showNotificationFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt index 28780ea578..d345a8a76f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val interceptFingerprint = fingerprint { +internal val interceptFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("L") parameters("L") @@ -16,7 +16,7 @@ internal val interceptFingerprint = fingerprint { strings("SC-Mob-UserPlan", "Configuration") } -internal val userConsumerPlanConstructorFingerprint = fingerprint { +internal val userConsumerPlanConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") parameters( diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt index 2954b4d99c..1b18832b71 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.soundcloud.analytics import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val createTrackingApiFingerprint = fingerprint { +internal val createTrackingApiFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("L") custom { methodDef, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt index 688fe36044..fe2aab19a5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val downloadOperationsURLBuilderFingerprint = fingerprint { +internal val downloadOperationsURLBuilderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String") parameters("L", "L") @@ -15,7 +15,7 @@ internal val downloadOperationsURLBuilderFingerprint = fingerprint { ) } -internal val downloadOperationsHeaderVerificationFingerprint = fingerprint { +internal val downloadOperationsHeaderVerificationFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt index 3a50ae407e..87a8305442 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val featureConstructorFingerprint = fingerprint { +internal val featureConstructorFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Ljava/lang/String;", "Z", "Ljava/util/List;") diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/Fingerprints.kt index e2d29b55c2..e2f70ff1de 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.spotify.lite.ondemand import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint -internal val onDemandFingerprint = fingerprint { +internal val onDemandFingerprint by fingerprint { returns("L") parameters() opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/Fingerprints.kt index 761e322060..7197bd14c9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags -internal val addNavBarItemFingerprint = fingerprint { +internal val addNavBarItemFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") literal { showBottomNavigationItemsTextId } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt index 0458f45d3e..58047cc4cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.strava.subscription import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val getSubscribedFingerprint = fingerprint { +internal val getSubscribedFingerprint by fingerprint { opcodes(Opcode.IGET_BOOLEAN) custom { method, classDef -> classDef.endsWith("/SubscriptionDetailResponse;") && method.name == "getSubscribed" diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt index 1204a36f21..134c108692 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.strava.upselling import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val getModulesFingerprint = fingerprint { +internal val getModulesFingerprint by fingerprint { opcodes(Opcode.IGET_OBJECT) custom { method, classDef -> classDef.endsWith("/GenericLayoutEntry;") && method.name == "getModules" diff --git a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt index 0efa845fbe..6e55bd5f41 100644 --- a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.swissid.integritycheck import app.revanced.patcher.fingerprint -internal val checkIntegrityFingerprint = fingerprint { +internal val checkIntegrityFingerprint by fingerprint { returns("V") parameters("Lcom/swisssign/deviceintegrity/model/DeviceIntegrityResult;") strings("it", "result") diff --git a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt index 4bd688de49..e198d21b18 100644 --- a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt @@ -2,13 +2,13 @@ package app.revanced.patches.ticktick.misc.themeunlock import app.revanced.patcher.fingerprint -internal val checkLockedThemesFingerprint = fingerprint { +internal val checkLockedThemesFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("Theme;") && method.name == "isLockedTheme" } } -internal val setThemeFingerprint = fingerprint { +internal val setThemeFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("ThemePreviewActivity;") && method.name == "lambda\$updateUserBtn\$1" } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt index 4f899661eb..f097734703 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.tiktok.feedfilter import app.revanced.patcher.fingerprint -internal val feedApiServiceLIZFingerprint = fingerprint { +internal val feedApiServiceLIZFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/FeedApiService;") && method.name == "fetchFeedList" } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt index eb28683743..43aab883c0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.tiktok.interaction.cleardisplay import app.revanced.patcher.fingerprint -internal val onClearDisplayEventFingerprint = fingerprint { +internal val onClearDisplayEventFingerprint by fingerprint { custom { method, classDef -> // Internally the feature is called "Clear mode". classDef.endsWith("/ClearModePanelComponent;") && method.name == "onClearModeEvent" diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt index 160b49c158..5ab0efbbb6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.tiktok.interaction.downloads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val aclCommonShareFingerprint = fingerprint { +internal val aclCommonShareFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") custom { method, classDef -> @@ -12,7 +12,7 @@ internal val aclCommonShareFingerprint = fingerprint { } } -internal val aclCommonShare2Fingerprint = fingerprint { +internal val aclCommonShare2Fingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") custom { method, classDef -> @@ -21,7 +21,7 @@ internal val aclCommonShare2Fingerprint = fingerprint { } } -internal val aclCommonShare3Fingerprint = fingerprint { +internal val aclCommonShare3Fingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") custom { method, classDef -> @@ -30,7 +30,7 @@ internal val aclCommonShare3Fingerprint = fingerprint { } } -internal val downloadUriFingerprint = fingerprint { +internal val downloadUriFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Landroid/net/Uri;") parameters( diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt index ce372ea421..66fef7177f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.tiktok.interaction.seekbar import app.revanced.patcher.fingerprint -internal val setSeekBarShowTypeFingerprint = fingerprint { +internal val setSeekBarShowTypeFingerprint by fingerprint { strings("seekbar show type change, change to:") } -internal val shouldShowSeekBarFingerprint = fingerprint { +internal val shouldShowSeekBarFingerprint by fingerprint { strings("can not show seekbar, state: 1, not in resume") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt index 221036bb96..ab224a1cca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt @@ -3,13 +3,13 @@ package app.revanced.patches.tiktok.interaction.speed import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val getSpeedFingerprint = fingerprint { +internal val getSpeedFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/BaseListFragmentPanel;") && method.name == "onFeedSpeedSelectedEvent" } } -internal val setSpeedFingerprint = fingerprint { +internal val setSpeedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("V") parameters("Ljava/lang/String;", "Lcom/ss/android/ugc/aweme/feed/model/Aweme;", "F") diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt index 929ef86729..439f63862b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt @@ -2,14 +2,14 @@ package app.revanced.patches.tiktok.misc.login.disablerequirement import app.revanced.patcher.fingerprint -internal val mandatoryLoginServiceFingerprint = fingerprint { +internal val mandatoryLoginServiceFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/MandatoryLoginService;") && method.name == "enableForcedLogin" } } -internal val mandatoryLoginService2Fingerprint = fingerprint { +internal val mandatoryLoginService2Fingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/MandatoryLoginService;") && method.name == "shouldShowForcedLogin" diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt index a40f5251f5..19d045db01 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.tiktok.misc.login.fixgoogle import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val googleAuthAvailableFingerprint = fingerprint { +internal val googleAuthAvailableFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -12,7 +12,7 @@ internal val googleAuthAvailableFingerprint = fingerprint { } } -internal val googleOneTapAuthAvailableFingerprint = fingerprint { +internal val googleOneTapAuthAvailableFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/Fingerprints.kt index d1c4d6de68..4317948c41 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/Fingerprints.kt @@ -2,32 +2,32 @@ package app.revanced.patches.tiktok.misc.settings import app.revanced.patcher.fingerprint -internal val addSettingsEntryFingerprint = fingerprint { +internal val addSettingsEntryFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/SettingNewVersionFragment;") && method.name == "initUnitManger" } } -internal val adPersonalizationActivityOnCreateFingerprint = fingerprint { +internal val adPersonalizationActivityOnCreateFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/AdPersonalizationActivity;") && method.name == "onCreate" } } -internal val settingsEntryFingerprint = fingerprint { +internal val settingsEntryFingerprint by fingerprint { strings("pls pass item or extends the EventUnit") } -internal val settingsEntryInfoFingerprint = fingerprint { +internal val settingsEntryInfoFingerprint by fingerprint { strings( "ExposeItem(title=", ", icon=", ) } -internal val settingsStatusLoadFingerprint = fingerprint { +internal val settingsStatusLoadFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("Lapp/revanced/extension/tiktok/settings/SettingsStatus;") && method.name == "load" diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/shared/Fingerprints.kt index 3e98d213e5..508d469645 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/shared/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getEnterFromFingerprint = fingerprint { +internal val getEnterFromFingerprint by fingerprint { returns("Ljava/lang/String;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Z") @@ -22,7 +22,7 @@ internal val getEnterFromFingerprint = fingerprint { } } -internal val onRenderFirstFrameFingerprint = fingerprint { +internal val onRenderFirstFrameFingerprint by fingerprint { strings("method_enable_viewpager_preload_duration") custom { _, classDef -> classDef.endsWith("/BaseListFragmentPanel;") diff --git a/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt index 4a02c62215..0d985d88c7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.trakt import app.revanced.patcher.fingerprint -internal val isVIPEPFingerprint = fingerprint { +internal val isVIPEPFingerprint by fingerprint { custom { method, classDef -> if (!classDef.endsWith("RemoteUser;")) return@custom false @@ -10,7 +10,7 @@ internal val isVIPEPFingerprint = fingerprint { } } -internal val isVIPFingerprint = fingerprint { +internal val isVIPFingerprint by fingerprint { custom { method, classDef -> if (!classDef.endsWith("RemoteUser;")) return@custom false @@ -18,7 +18,7 @@ internal val isVIPFingerprint = fingerprint { } } -internal val remoteUserFingerprint = fingerprint { +internal val remoteUserFingerprint by fingerprint { custom { _, classDef -> classDef.endsWith("RemoteUser;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt index 12ffa15c15..0cd634ee1b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.tudortmund.lockscreen import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val brightnessFingerprint = fingerprint { +internal val brightnessFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt index 67e051a7ba..525f5a5e74 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt @@ -6,6 +6,6 @@ import app.revanced.patcher.fingerprint // It shows whenever you visit a certain blog for the second time and disables itself // if it was shown a total of 3 times (stored in app storage). // This targets the BlogNotifyCtaDialog.isEnabled() method to let it always return false. -internal val isBlogNotifyEnabledFingerprint = fingerprint { +internal val isBlogNotifyEnabledFingerprint by fingerprint { strings("isEnabled --> ", "blog_notify_enabled") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt index 7d00f2f1bd..2be1a3cefb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint // This method is responsible for loading and displaying the visual Layout of the Gift Message Popup. -internal val showGiftMessagePopupFingerprint = fingerprint { +internal val showGiftMessagePopupFingerprint by fingerprint { accessFlags(AccessFlags.FINAL, AccessFlags.PUBLIC) returns("V") strings("activity", "anchorView", "textMessage") diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/Fingerprints.kt index e24ca2884a..742a8fd4d2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/Fingerprints.kt @@ -13,7 +13,7 @@ import app.revanced.patcher.fingerprint // Some features seem to be very old and never removed, though, such as Google Login. // The startIndex of the opcode pattern is at the start of the function after the arg null check. // we want to insert our instructions there. -internal val getFeatureValueFingerprint = fingerprint { +internal val getFeatureValueFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("L", "Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/Fingerprints.kt index 11616fcc92..8d9f4cfd3d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/Fingerprints.kt @@ -6,7 +6,7 @@ import app.revanced.patcher.fingerprint // Fingerprint for the addQueryParam method from retrofit2 // https://github.com/square/retrofit/blob/trunk/retrofit/src/main/java/retrofit2/RequestBuilder.java#L186 // Injecting here allows modifying dynamically set query parameters -internal val addQueryParamFingerprint = fingerprint { +internal val addQueryParamFingerprint by fingerprint { parameters("Ljava/lang/String;", "Ljava/lang/String;", "Z") strings("Malformed URL. Base: ", ", Relative: ") } @@ -14,7 +14,7 @@ internal val addQueryParamFingerprint = fingerprint { // Fingerprint for the parseHttpMethodAndPath method from retrofit2 // https://github.com/square/retrofit/blob/ebf87b10997e2136af4d335276fa950221852c64/retrofit/src/main/java/retrofit2/RequestFactory.java#L270-L302 // Injecting here allows modifying the path/query params of API endpoints defined via annotations -internal val httpPathParserFingerprint = fingerprint { +internal val httpPathParserFingerprint by fingerprint { opcodes( Opcode.IPUT_OBJECT, Opcode.IPUT_BOOLEAN, diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/Fingerprints.kt index b8ed3bfc4e..75be30004a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/Fingerprints.kt @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.Opcode // This is the constructor of the PostsResponse class. // The same applies here as with the TimelineConstructorFingerprint. -internal val postsResponseConstructorFingerprint = fingerprint { +internal val postsResponseConstructorFingerprint by fingerprint { accessFlags(AccessFlags.CONSTRUCTOR, AccessFlags.PUBLIC) custom { method, classDef -> classDef.endsWith("/PostsResponse;") && method.parameters.size == 4 } } @@ -14,7 +14,7 @@ internal val postsResponseConstructorFingerprint = fingerprint { // This is the constructor of the Timeline class. // It receives the List as an argument with a @Json annotation, so this should be the first time // that the List is exposed in non-library code. -internal val timelineConstructorFingerprint = fingerprint { +internal val timelineConstructorFingerprint by fingerprint { strings("timelineObjectsList") custom { method, classDef -> classDef.endsWith("/Timeline;") && method.parameters[0].type == "Ljava/util/List;" @@ -24,7 +24,7 @@ internal val timelineConstructorFingerprint = fingerprint { // This fingerprints the extension TimelineFilterPatch.filterTimeline method. // The opcode fingerprint is searching for // if ("BLOCKED_OBJECT_DUMMY".equals(elementType)) iterator.remove(); -internal val timelineFilterExtensionFingerprint = fingerprint { +internal val timelineFilterExtensionFingerprint by fingerprint { opcodes( Opcode.CONST_STRING, // "BLOCKED_OBJECT_DUMMY" Opcode.INVOKE_VIRTUAL, // HashSet.add(^) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt index 21e9cb6d2a..3bae02166c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitch.ad.audio import app.revanced.patcher.fingerprint -internal val audioAdsPresenterPlayFingerprint = fingerprint { +internal val audioAdsPresenterPlayFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("AudioAdsPlayerPresenter;") && method.name == "playAd" } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt index 3e9853bd61..209f91d2b2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitch.ad.embedded import app.revanced.patcher.fingerprint -internal val createsUsherClientFingerprint = fingerprint { +internal val createsUsherClientFingerprint by fingerprint { custom { method, _ -> method.name == "buildOkHttpClient" && method.definingClass.endsWith("Ltv/twitch/android/network/OkHttpClientFactory;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt index d03449733f..4bd8abb2a0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitch.ad.video import app.revanced.patcher.fingerprint -internal val checkAdEligibilityLambdaFingerprint = fingerprint { +internal val checkAdEligibilityLambdaFingerprint by fingerprint { returns("Lio/reactivex/Single;") parameters("L") custom { method, _ -> @@ -11,7 +11,7 @@ internal val checkAdEligibilityLambdaFingerprint = fingerprint { } } -internal val contentConfigShowAdsFingerprint = fingerprint { +internal val contentConfigShowAdsFingerprint by fingerprint { returns("Z") parameters() custom { method, _ -> @@ -19,7 +19,7 @@ internal val contentConfigShowAdsFingerprint = fingerprint { } } -internal val getReadyToShowAdFingerprint = fingerprint { +internal val getReadyToShowAdFingerprint by fingerprint { returns("Ltv/twitch/android/core/mvp/presenter/StateAndAction;") parameters("L", "L") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt index 21da99a5bb..84fc079f35 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt @@ -3,13 +3,13 @@ package app.revanced.patches.twitch.chat.antidelete import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val chatUtilCreateDeletedSpanFingerprint = fingerprint { +internal val chatUtilCreateDeletedSpanFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("ChatUtil\$Companion;") && method.name == "createDeletedSpanFromChatMessageSpan" } } -internal val deletedMessageClickableSpanCtorFingerprint = fingerprint { +internal val deletedMessageClickableSpanCtorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") custom { _, classDef -> @@ -17,7 +17,7 @@ internal val deletedMessageClickableSpanCtorFingerprint = fingerprint { } } -internal val setHasModAccessFingerprint = fingerprint { +internal val setHasModAccessFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("DeletedMessageClickableSpan;") && method.name == "setHasModAccess" } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt index 80abc9ac41..59986152c0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitch.chat.autoclaim import app.revanced.patcher.fingerprint -internal val communityPointsButtonViewDelegateFingerprint = fingerprint { +internal val communityPointsButtonViewDelegateFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("CommunityPointsButtonViewDelegate;") && method.name == "showClaimAvailable" diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt index 665180c19b..49a8601f26 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt @@ -2,19 +2,19 @@ package app.revanced.patches.twitch.debug import app.revanced.patcher.fingerprint -internal val isDebugConfigEnabledFingerprint = fingerprint { +internal val isDebugConfigEnabledFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/BuildConfigUtil;") && method.name == "isDebugConfigEnabled" } } -internal val isOmVerificationEnabledFingerprint = fingerprint { +internal val isOmVerificationEnabledFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/BuildConfigUtil;") && method.name == "isOmVerificationEnabled" } } -internal val shouldShowDebugOptionsFingerprint = fingerprint { +internal val shouldShowDebugOptionsFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/BuildConfigUtil;") && method.name == "shouldShowDebugOptions" } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt index 43d5bb39bf..f39c762e94 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.twitch.misc.settings import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val menuGroupsOnClickFingerprint = fingerprint { +internal val menuGroupsOnClickFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC, AccessFlags.FINAL) returns("V") parameters("L", "L", "L") @@ -13,21 +13,21 @@ internal val menuGroupsOnClickFingerprint = fingerprint { } } -internal val menuGroupsUpdatedFingerprint = fingerprint { +internal val menuGroupsUpdatedFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/SettingsMenuPresenter\$Event\$MenuGroupsUpdated;") && method.name == "" } } -internal val settingsActivityOnCreateFingerprint = fingerprint { +internal val settingsActivityOnCreateFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/SettingsActivity;") && method.name == "onCreate" } } -internal val settingsMenuItemEnumFingerprint = fingerprint { +internal val settingsMenuItemEnumFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/SettingsMenuItem;") && method.name == "" } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt index dc100acb10..3381365f59 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val buildMediaOptionsSheetFingerprint = fingerprint { +internal val buildMediaOptionsSheetFingerprint by fingerprint { opcodes( Opcode.IF_EQ, Opcode.SGET_OBJECT, @@ -14,13 +14,13 @@ internal val buildMediaOptionsSheetFingerprint = fingerprint { strings("mediaEntity", "media_options_sheet") } -internal val constructMediaOptionsSheetFingerprint = fingerprint { +internal val constructMediaOptionsSheetFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") strings("captionsState") } -internal val showDownloadVideoUpsellBottomSheetFingerprint = fingerprint { +internal val showDownloadVideoUpsellBottomSheetFingerprint by fingerprint { returns("Z") strings("mediaEntity", "url") opcodes(Opcode.IF_EQZ) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt index 625b6f0bb7..199ef49c2a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitter.layout.viewcount import app.revanced.patcher.fingerprint -internal val viewCountsEnabledFingerprint = fingerprint { +internal val viewCountsEnabledFingerprint by fingerprint { returns("Z") strings("view_counts_public_visibility_enabled") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt index 337aeb5670..1158df15d5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.twitter.misc.hook.json import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val jsonHookPatchFingerprint = fingerprint { +internal val jsonHookPatchFingerprint by fingerprint { opcodes( Opcode.INVOKE_INTERFACE, // Add dummy hook to hooks list. // Add hooks to the hooks list. @@ -12,7 +12,7 @@ internal val jsonHookPatchFingerprint = fingerprint { custom { method, _ -> method.name == "" } } -internal val jsonInputStreamFingerprint = fingerprint { +internal val jsonInputStreamFingerprint by fingerprint { custom { method, _ -> if (method.parameterTypes.isEmpty()) { false @@ -22,6 +22,6 @@ internal val jsonInputStreamFingerprint = fingerprint { } } -internal val loganSquareFingerprint = fingerprint { +internal val loganSquareFingerprint by fingerprint { custom { _, classDef -> classDef.endsWith("LoganSquare;") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt index 0d5d0e6f80..abbf40e890 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt @@ -4,28 +4,28 @@ import app.revanced.patcher.fingerprint import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags -internal val openLinkFingerprint = fingerprint { +internal val openLinkFingerprint by fingerprint { returns("V") parameters("Landroid/content/Context;", "Landroid/content/Intent;", "Landroid/os/Bundle;") } -internal val sanitizeSharingLinksFingerprint = fingerprint { +internal val sanitizeSharingLinksFingerprint by fingerprint { returns("Ljava/lang/String;") strings("", "shareParam", "sessionToken") } // Returns a shareable link string based on a tweet ID and a username. -internal val linkBuilderFingerprint = fingerprint { +internal val linkBuilderFingerprint by fingerprint { strings("/%1\$s/status/%2\$d") } // Gets Resource string for share link view available by pressing "Share via" button. -internal val linkResourceGetterFingerprint = fingerprint { +internal val linkResourceGetterFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Landroid/content/res/Resources;") literal { tweetShareLinkTemplateId } } -internal val linkSharingDomainFingerprint = fingerprint { +internal val linkSharingDomainFingerprint by fingerprint { strings("https://fxtwitter.com") } diff --git a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt index 0809324c7f..e0d6679c7f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.vsco.misc.pro import app.revanced.patcher.fingerprint -internal val revCatSubscriptionFingerprint = fingerprint { +internal val revCatSubscriptionFingerprint by fingerprint { returns("V") strings("use_debug_subscription_settings") custom { _, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt index 6eb7bd176b..03ff60e0c0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.warnwetter.misc.firebasegetcert import app.revanced.patcher.fingerprint -internal val getMessagingCertFingerprint = fingerprint { +internal val getMessagingCertFingerprint by fingerprint { returns("Ljava/lang/String;") strings( "ContentValues", @@ -11,7 +11,7 @@ internal val getMessagingCertFingerprint = fingerprint { ) } -internal val getRegistrationCertFingerprint = fingerprint { +internal val getRegistrationCertFingerprint by fingerprint { returns("Ljava/lang/String;") strings( "FirebaseRemoteConfig", diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt index d33880de70..0249856381 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.warnwetter.misc.promocode import app.revanced.patcher.fingerprint -internal val promoCodeUnlockFingerprint = fingerprint { +internal val promoCodeUnlockFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("PromoTokenVerification;") && method.name == "isValid" } diff --git a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt index e326c26825..19fdb02d85 100644 --- a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.willhaben.ads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val adResolverFingerprint = fingerprint { +internal val adResolverFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L", "L") @@ -15,7 +15,7 @@ internal val adResolverFingerprint = fingerprint { ) } -internal val whAdViewInjectorFingerprint = fingerprint { +internal val whAdViewInjectorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L", "L", "Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt index f199f127c7..997c0ec00c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.windyapp.misc.unlockpro import app.revanced.patcher.fingerprint -internal val checkProFingerprint = fingerprint { +internal val checkProFingerprint by fingerprint { returns("I") custom { method, classDef -> classDef.endsWith("RawUserData;") && method.name == "isPro" diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt index 7629d1760d..284567fec7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getPremiumViewFingerprint = fingerprint { +internal val getPremiumViewFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters("I", "I") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt index 91cc0e8dfa..bbed5305ee 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.ad.video import app.revanced.patcher.fingerprint -internal val loadVideoAdsFingerprint = fingerprint { +internal val loadVideoAdsFingerprint by fingerprint { strings( "TriggerBundle doesn't have the required metadata specified by the trigger ", "Tried to enter slot with no assigned slotAdapter", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt index b252875901..4e010f2ada 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val createDialogFingerprint = fingerprint { +internal val createDialogFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED) returns("V") parameters("L", "L", "Ljava/lang/String;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt index f10fc8e834..19fc38f02e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.interaction.downloads import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val offlineVideoEndpointFingerprint = fingerprint { +internal val offlineVideoEndpointFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt index 02a2887e70..fd957739ce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt @@ -9,7 +9,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.StringReference -internal val swipingUpGestureParentFingerprint = fingerprint { +internal val swipingUpGestureParentFingerprint by fingerprint { returns("Z") parameters() literal { 45379021 } @@ -18,7 +18,7 @@ internal val swipingUpGestureParentFingerprint = fingerprint { /** * Resolves using the class found in [swipingUpGestureParentFingerprint]. */ -internal val showSwipingUpGuideFingerprint = fingerprint { +internal val showSwipingUpGuideFingerprint by fingerprint { accessFlags(AccessFlags.FINAL) returns("Z") parameters() @@ -28,20 +28,20 @@ internal val showSwipingUpGuideFingerprint = fingerprint { /** * Resolves using the class found in [swipingUpGestureParentFingerprint]. */ -internal val allowSwipingUpGestureFingerprint = fingerprint { +internal val allowSwipingUpGestureFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") } -internal val disableFastForwardLegacyFingerprint = fingerprint { +internal val disableFastForwardLegacyFingerprint by fingerprint { returns("Z") parameters() opcodes(Opcode.MOVE_RESULT) literal { 45411330 } } -internal val disableFastForwardGestureFingerprint = fingerprint { +internal val disableFastForwardGestureFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -56,7 +56,7 @@ internal val disableFastForwardGestureFingerprint = fingerprint { } } -internal val disableFastForwardNoticeFingerprint = fingerprint { +internal val disableFastForwardNoticeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -75,7 +75,7 @@ internal val disableFastForwardNoticeFingerprint = fingerprint { } } -internal val onTouchEventHandlerFingerprint = fingerprint { +internal val onTouchEventHandlerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.PUBLIC) returns("Z") parameters("L") @@ -98,7 +98,7 @@ internal val onTouchEventHandlerFingerprint = fingerprint { custom { method, _ -> method.name == "onTouchEvent" } } -internal val seekbarTappingFingerprint = fingerprint { +internal val seekbarTappingFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters("L") @@ -112,7 +112,7 @@ internal val seekbarTappingFingerprint = fingerprint { literal { Integer.MAX_VALUE.toLong() } } -internal val slideToSeekFingerprint = fingerprint { +internal val slideToSeekFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;", "F") @@ -125,7 +125,7 @@ internal val slideToSeekFingerprint = fingerprint { literal { 67108864 } } -internal val fullscreenSeekbarThumbnailsQualityFingerprint = fingerprint { +internal val fullscreenSeekbarThumbnailsQualityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt index e1161ea13d..f28f16482f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags -internal val swipeControlsHostActivityFingerprint = fingerprint { +internal val swipeControlsHostActivityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters() custom { method, _ -> @@ -14,7 +14,7 @@ internal val swipeControlsHostActivityFingerprint = fingerprint { internal const val SWIPE_CHANGE_VIDEO_FEATURE_FLAG = 45631116L -internal val swipeChangeVideoFingerprint = fingerprint { +internal val swipeChangeVideoFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("L") literal { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt index 3e1c156291..c279f2ff7d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val startVideoInformerFingerprint = fingerprint { +internal val startVideoInformerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") opcodes( @@ -14,7 +14,7 @@ internal val startVideoInformerFingerprint = fingerprint { strings("pc") } -internal val subtitleTrackFingerprint = fingerprint { +internal val subtitleTrackFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt index d2d5cb1539..98fa73db03 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt @@ -8,11 +8,11 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val addCreateButtonViewFingerprint = fingerprint { +internal val addCreateButtonViewFingerprint by fingerprint { strings("Android Automotive", "Android Wear") } -internal val createPivotBarFingerprint = fingerprint { +internal val createPivotBarFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") parameters( @@ -26,7 +26,7 @@ internal val createPivotBarFingerprint = fingerprint { ) } -internal val translucentNavigationStatusBarFeatureFlagFingerprint = fingerprint { +internal val translucentNavigationStatusBarFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( @@ -37,7 +37,7 @@ internal val translucentNavigationStatusBarFeatureFlagFingerprint = fingerprint /** * YouTube nav buttons. */ -internal val translucentNavigationButtonsFeatureFlagFingerprint = fingerprint { +internal val translucentNavigationButtonsFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( @@ -48,7 +48,7 @@ internal val translucentNavigationButtonsFeatureFlagFingerprint = fingerprint { /** * Device on screen back/home/recent buttons. */ -internal val translucentNavigationButtonsSystemFeatureFlagFingerprint = fingerprint { +internal val translucentNavigationButtonsSystemFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt index df938f3541..02adf24216 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter import com.android.tools.smali.dexlib2.AccessFlags -internal val playerControlsPreviousNextOverlayTouchFingerprint = fingerprint { +internal val playerControlsPreviousNextOverlayTouchFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") strings("1.0x") @@ -16,7 +16,7 @@ internal val playerControlsPreviousNextOverlayTouchFingerprint = fingerprint { ) } -internal val mediaRouteButtonFingerprint = fingerprint { +internal val mediaRouteButtonFingerprint by fingerprint { parameters("I") custom { methodDef, _ -> methodDef.definingClass.endsWith("/MediaRouteButton;") && methodDef.name == "setVisibility" diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt index 6e70948b14..c8a907fcea 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.FieldFilter import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val formFactorEnumConstructorFingerprint = fingerprint { +internal val formFactorEnumConstructorFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "UNKNOWN_FORM_FACTOR", @@ -14,7 +14,7 @@ internal val formFactorEnumConstructorFingerprint = fingerprint { ) } -internal val createPlayerRequestBodyWithModelFingerprint = fingerprint { +internal val createPlayerRequestBodyWithModelFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt index 59d859e800..8161256923 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.util.literal import com.android.tools.smali.dexlib2.Opcode -internal val layoutCircleFingerprint = fingerprint { +internal val layoutCircleFingerprint by fingerprint { returns("Landroid/view/View;") opcodes( Opcode.CONST, @@ -16,7 +16,7 @@ internal val layoutCircleFingerprint = fingerprint { literal { layoutCircle } } -internal val layoutIconFingerprint = fingerprint { +internal val layoutIconFingerprint by fingerprint { returns("Landroid/view/View;") opcodes( Opcode.INVOKE_VIRTUAL, @@ -27,7 +27,7 @@ internal val layoutIconFingerprint = fingerprint { literal { layoutIcon } } -internal val layoutVideoFingerprint = fingerprint { +internal val layoutVideoFingerprint by fingerprint { returns("Landroid/view/View;") opcodes( Opcode.CONST, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt index b619020878..fff4d86218 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.layout.hide.fullscreenambientmode import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val setFullScreenBackgroundColorFingerprint = fingerprint { +internal val setFullScreenBackgroundColorFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) parameters("Z", "I", "I", "I", "I") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 463e4cdc6d..2a5abaa9ef 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -5,7 +5,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val hideShowMoreButtonFingerprint = fingerprint { +internal val hideShowMoreButtonFingerprint by fingerprint { opcodes( Opcode.CONST, Opcode.CONST_4, @@ -15,7 +15,7 @@ internal val hideShowMoreButtonFingerprint = fingerprint { literal { expandButtonDownId } } -internal val parseElementFromBufferFingerprint = fingerprint { +internal val parseElementFromBufferFingerprint by fingerprint { parameters("L", "L", "[B", "L", "L") opcodes( Opcode.IGET_OBJECT, @@ -25,26 +25,26 @@ internal val parseElementFromBufferFingerprint = fingerprint { strings("Failed to parse Element") // String is a partial match. } -internal val playerOverlayFingerprint = fingerprint { +internal val playerOverlayFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") strings("player_overlay_in_video_programming") } -internal val showWatermarkFingerprint = fingerprint { +internal val showWatermarkFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L") } -internal val yoodlesImageViewFingerprint = fingerprint { +internal val yoodlesImageViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") parameters("L", "L") literal { youTubeLogo } } -internal val crowdfundingBoxFingerprint = fingerprint { +internal val crowdfundingBoxFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.INVOKE_VIRTUAL, @@ -54,7 +54,7 @@ internal val crowdfundingBoxFingerprint = fingerprint { literal { crowdfundingBoxId } } -internal val albumCardsFingerprint = fingerprint { +internal val albumCardsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.MOVE_RESULT_OBJECT, @@ -67,7 +67,7 @@ internal val albumCardsFingerprint = fingerprint { literal { albumCardId } } -internal val filterBarHeightFingerprint = fingerprint { +internal val filterBarHeightFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") opcodes( @@ -79,7 +79,7 @@ internal val filterBarHeightFingerprint = fingerprint { literal { filterBarHeightId } } -internal val relatedChipCloudFingerprint = fingerprint { +internal val relatedChipCloudFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") opcodes( @@ -90,7 +90,7 @@ internal val relatedChipCloudFingerprint = fingerprint { literal { relatedChipCloudMarginId } } -internal val searchResultsChipBarFingerprint = fingerprint { +internal val searchResultsChipBarFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") opcodes( @@ -103,7 +103,7 @@ internal val searchResultsChipBarFingerprint = fingerprint { literal { barContainerHeightId } } -internal val showFloatingMicrophoneButtonFingerprint = fingerprint { +internal val showFloatingMicrophoneButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt index 5088472a1b..c158243759 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt @@ -5,20 +5,20 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val infocardsIncognitoFingerprint = fingerprint { +internal val infocardsIncognitoFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/Boolean;") parameters("L", "J") strings("vibrator") } -internal val infocardsIncognitoParentFingerprint = fingerprint { +internal val infocardsIncognitoParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") strings("player_overlay_info_card_teaser") } -internal val infocardsMethodCallFingerprint = fingerprint { +internal val infocardsMethodCallFingerprint by fingerprint { opcodes( Opcode.INVOKE_VIRTUAL, Opcode.IGET_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt index 4a6f651204..71a2f1544e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt @@ -7,7 +7,7 @@ import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val legacyRenderBottomNavigationBarParentFingerprint = fingerprint { +internal val legacyRenderBottomNavigationBarParentFingerprint by fingerprint { parameters( "I", "I", @@ -19,7 +19,7 @@ internal val legacyRenderBottomNavigationBarParentFingerprint = fingerprint { strings("aa") } -internal val shortsBottomBarContainerFingerprint = fingerprint { +internal val shortsBottomBarContainerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;", "Landroid/os/Bundle;") @@ -31,14 +31,14 @@ internal val shortsBottomBarContainerFingerprint = fingerprint { ) } -internal val createShortsButtonsFingerprint = fingerprint { +internal val createShortsButtonsFingerprint by fingerprint { returns("V") instructions( ResourceMappingFilter("dimen", "reel_player_right_cell_button_height") ) } -internal val renderBottomNavigationBarFingerprint = fingerprint { +internal val renderBottomNavigationBarFingerprint by fingerprint { returns("V") parameters("Ljava/lang/String;") opcodes( @@ -59,7 +59,7 @@ internal val renderBottomNavigationBarFingerprint = fingerprint { * Identical to [legacyRenderBottomNavigationBarParentFingerprint] * except this has an extra parameter. */ -internal val renderBottomNavigationBarParentFingerprint = fingerprint { +internal val renderBottomNavigationBarParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters( "I", @@ -73,7 +73,7 @@ internal val renderBottomNavigationBarParentFingerprint = fingerprint { strings("aa") } -internal val setPivotBarVisibilityFingerprint = fingerprint { +internal val setPivotBarVisibilityFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Z") @@ -83,7 +83,7 @@ internal val setPivotBarVisibilityFingerprint = fingerprint { ) } -internal val setPivotBarVisibilityParentFingerprint = fingerprint { +internal val setPivotBarVisibilityParentFingerprint by fingerprint { parameters("Z") strings("FEnotifications_inbox") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/Fingerprints.kt index 78efc0680c..7734a80462 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/Fingerprints.kt @@ -5,7 +5,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val createEndScreenViewFingerprint = fingerprint { +internal val createEndScreenViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") parameters("Landroid/content/Context;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt index 32660133ab..2708fdb0bf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint -internal val timeCounterFingerprint = fingerprint { +internal val timeCounterFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 8c358fa1a9..549ecdf505 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -9,7 +9,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val miniplayerDimensionsCalculatorParentFingerprint = fingerprint { +internal val miniplayerDimensionsCalculatorParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") @@ -21,7 +21,7 @@ internal val miniplayerDimensionsCalculatorParentFingerprint = fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernAddViewListenerFingerprint = fingerprint { +internal val miniplayerModernAddViewListenerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;") @@ -31,7 +31,7 @@ internal val miniplayerModernAddViewListenerFingerprint = fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernCloseButtonFingerprint = fingerprint { +internal val miniplayerModernCloseButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() @@ -48,13 +48,13 @@ internal const val MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY = 45652224L internal const val MINIPLAYER_INITIAL_SIZE_FEATURE_KEY = 45640023L internal const val MINIPLAYER_DISABLED_FEATURE_KEY = 45657015L -internal val miniplayerModernConstructorFingerprint = fingerprint { +internal val miniplayerModernConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("L") literal { 45623000L } } -internal val miniplayerOnCloseHandlerFingerprint = fingerprint { +internal val miniplayerOnCloseHandlerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") literal { MINIPLAYER_DISABLED_FEATURE_KEY } @@ -63,7 +63,7 @@ internal val miniplayerOnCloseHandlerFingerprint = fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernExpandButtonFingerprint = fingerprint { +internal val miniplayerModernExpandButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() @@ -73,7 +73,7 @@ internal val miniplayerModernExpandButtonFingerprint = fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernExpandCloseDrawablesFingerprint = fingerprint { +internal val miniplayerModernExpandCloseDrawablesFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") @@ -83,7 +83,7 @@ internal val miniplayerModernExpandCloseDrawablesFingerprint = fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernForwardButtonFingerprint = fingerprint { +internal val miniplayerModernForwardButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() @@ -93,7 +93,7 @@ internal val miniplayerModernForwardButtonFingerprint = fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernOverlayViewFingerprint = fingerprint { +internal val miniplayerModernOverlayViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -103,21 +103,21 @@ internal val miniplayerModernOverlayViewFingerprint = fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernRewindButtonFingerprint = fingerprint { +internal val miniplayerModernRewindButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() literal { modernMiniplayerRewindButton } } -internal val miniplayerModernViewParentFingerprint = fingerprint { +internal val miniplayerModernViewParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() strings("player_overlay_modern_mini_player_controls") } -internal val miniplayerMinimumSizeFingerprint = fingerprint { +internal val miniplayerMinimumSizeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( ResourceMappingFilter("dimen", "miniplayer_max_size"), @@ -126,19 +126,19 @@ internal val miniplayerMinimumSizeFingerprint = fingerprint { ) } -internal val miniplayerOverrideFingerprint = fingerprint { +internal val miniplayerOverrideFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") strings("appName") } -internal val miniplayerOverrideNoContextFingerprint = fingerprint { +internal val miniplayerOverrideNoContextFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Z") opcodes(Opcode.IGET_BOOLEAN) // Anchor to insert the instruction. } -internal val miniplayerResponseModelSizeCheckFingerprint = fingerprint { +internal val miniplayerResponseModelSizeCheckFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("Ljava/lang/Object;", "Ljava/lang/Object;") @@ -155,7 +155,7 @@ internal val miniplayerResponseModelSizeCheckFingerprint = fingerprint { internal const val YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME = "Lcom/google/android/apps/youtube/app/common/player/overlay/YouTubePlayerOverlaysLayout;" -internal val playerOverlaysLayoutFingerprint = fingerprint { +internal val playerOverlaysLayoutFingerprint by fingerprint { custom { method, _ -> method.definingClass == YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt index 0c31cc83bd..7ac0ce2a11 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.layout.panels.popup import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val engagementPanelControllerFingerprint = fingerprint { +internal val engagementPanelControllerFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("L") strings( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt index 4739867459..bee674206b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val openVideosFullscreenPortraitFingerprint = fingerprint { +internal val openVideosFullscreenPortraitFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "Lj\$/util/Optional;") @@ -16,7 +16,7 @@ internal val openVideosFullscreenPortraitFingerprint = fingerprint { /** * Used to enable opening regular videos fullscreen. */ -internal val openVideosFullscreenHookPatchExtensionFingerprint = fingerprint { +internal val openVideosFullscreenHookPatchExtensionFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt index 7269868402..b2bfd80aae 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt @@ -5,7 +5,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val createPlayerOverviewFingerprint = fingerprint { +internal val createPlayerOverviewFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt index 2dd73ecc4c..747ec7bc40 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val conversionContextFingerprint = fingerprint { +internal val conversionContextFingerprint by fingerprint { returns("Ljava/lang/String;") parameters() strings( @@ -16,22 +16,22 @@ internal val conversionContextFingerprint = fingerprint { ) } -internal val dislikeFingerprint = fingerprint { +internal val dislikeFingerprint by fingerprint { returns("V") strings("like/dislike") } -internal val likeFingerprint = fingerprint { +internal val likeFingerprint by fingerprint { returns("V") strings("like/like") } -internal val removeLikeFingerprint = fingerprint { +internal val removeLikeFingerprint by fingerprint { returns("V") strings("like/removelike") } -internal val rollingNumberMeasureAnimatedTextFingerprint = fingerprint { +internal val rollingNumberMeasureAnimatedTextFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Lj\$/util/Optional;") parameters("L", "Ljava/lang/String;", "L") @@ -52,7 +52,7 @@ internal val rollingNumberMeasureAnimatedTextFingerprint = fingerprint { /** * Matches to class found in [rollingNumberMeasureStaticLabelParentFingerprint]. */ -internal val rollingNumberMeasureStaticLabelFingerprint = fingerprint { +internal val rollingNumberMeasureStaticLabelFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("F") parameters("Ljava/lang/String;") @@ -64,14 +64,14 @@ internal val rollingNumberMeasureStaticLabelFingerprint = fingerprint { ) } -internal val rollingNumberMeasureStaticLabelParentFingerprint = fingerprint { +internal val rollingNumberMeasureStaticLabelParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() strings("RollingNumberFontProperties{paint=") } -internal val rollingNumberSetterFingerprint = fingerprint { +internal val rollingNumberSetterFingerprint by fingerprint { opcodes( Opcode.INVOKE_DIRECT, Opcode.IGET_OBJECT, @@ -80,7 +80,7 @@ internal val rollingNumberSetterFingerprint = fingerprint { strings("RollingNumberType required properties missing! Need") } -internal val rollingNumberTextViewFingerprint = fingerprint { +internal val rollingNumberTextViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "F", "F") @@ -98,7 +98,7 @@ internal val rollingNumberTextViewFingerprint = fingerprint { } } -internal val shortsTextViewFingerprint = fingerprint { +internal val shortsTextViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L") @@ -112,12 +112,12 @@ internal val shortsTextViewFingerprint = fingerprint { ) } -internal val textComponentConstructorFingerprint = fingerprint { +internal val textComponentConstructorFingerprint by fingerprint { accessFlags(AccessFlags.CONSTRUCTOR, AccessFlags.PRIVATE) strings("TextComponent") } -internal val textComponentDataFingerprint = fingerprint { +internal val textComponentDataFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("L", "L") strings("text") @@ -129,7 +129,7 @@ internal val textComponentDataFingerprint = fingerprint { /** * Matches against the same class found in [textComponentConstructorFingerprint]. */ -internal val textComponentLookupFingerprint = fingerprint { +internal val textComponentLookupFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt index 69fc26daeb..9fe5712d84 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val createSearchSuggestionsFingerprint = fingerprint { +internal val createSearchSuggestionsFingerprint by fingerprint { opcodes( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT, @@ -13,7 +13,7 @@ internal val createSearchSuggestionsFingerprint = fingerprint { strings("ss_rds") } -internal val setWordmarkHeaderFingerprint = fingerprint { +internal val setWordmarkHeaderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/widget/ImageView;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index db9c3a8f5f..25dfeff76d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -7,7 +7,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val fullscreenSeekbarThumbnailsFingerprint = fingerprint { +internal val fullscreenSeekbarThumbnailsFingerprint by fingerprint { returns("Z") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() @@ -16,7 +16,7 @@ internal val fullscreenSeekbarThumbnailsFingerprint = fingerprint { ) } -internal val playerSeekbarColorFingerprint = fingerprint { +internal val playerSeekbarColorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) custom { method, _ -> method.containsLiteralInstruction(inlineTimeBarColorizedBarPlayedColorDarkId) && @@ -24,7 +24,7 @@ internal val playerSeekbarColorFingerprint = fingerprint { } } -internal val setSeekbarClickedColorFingerprint = fingerprint { +internal val setSeekbarClickedColorFingerprint by fingerprint { opcodes(Opcode.CONST_HIGH16) strings("YOUTUBE", "PREROLL", "POSTROLL") custom { _, classDef -> @@ -32,12 +32,12 @@ internal val setSeekbarClickedColorFingerprint = fingerprint { } } -internal val shortsSeekbarColorFingerprint = fingerprint { +internal val shortsSeekbarColorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) literal { reelTimeBarPlayedColorId } } -internal val playerSeekbarGradientConfigFingerprint = fingerprint { +internal val playerSeekbarGradientConfigFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -46,7 +46,7 @@ internal val playerSeekbarGradientConfigFingerprint = fingerprint { ) } -internal val lithoLinearGradientFingerprint = fingerprint { +internal val lithoLinearGradientFingerprint by fingerprint { accessFlags(AccessFlags.STATIC) returns("Landroid/graphics/LinearGradient;") parameters("F", "F", "F", "F", "[I", "[F") @@ -54,7 +54,7 @@ internal val lithoLinearGradientFingerprint = fingerprint { internal const val launchScreenLayoutTypeLotteFeatureFlag = 268507948L -internal val launchScreenLayoutTypeFingerprint = fingerprint { +internal val launchScreenLayoutTypeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt index cd48868f57..42e239dc0e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val reelEnumConstructorFingerprint = fingerprint { +internal val reelEnumConstructorFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) opcodes(Opcode.RETURN_VOID) strings( @@ -15,7 +15,7 @@ internal val reelEnumConstructorFingerprint = fingerprint { ) } -internal val reelPlaybackRepeatFingerprint = fingerprint { +internal val reelPlaybackRepeatFingerprint by fingerprint { returns("V") parameters("L") strings("YoutubePlayerState is in throwing an Error.") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt index 961ddef023..56c56119e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt @@ -8,7 +8,7 @@ import com.android.tools.smali.dexlib2.AccessFlags * Purpose of this method is not clear, and it's only used to identify * the obfuscated name of the videoId() method in PlaybackStartDescriptor. */ -internal val playbackStartFeatureFlagFingerprint = fingerprint { +internal val playbackStartFeatureFlagFingerprint by fingerprint { returns("Z") parameters( "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;", @@ -19,7 +19,7 @@ internal val playbackStartFeatureFlagFingerprint = fingerprint { } // Pre 19.25 -internal val shortsPlaybackIntentLegacyFingerprint = fingerprint { +internal val shortsPlaybackIntentLegacyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters( @@ -38,7 +38,7 @@ internal val shortsPlaybackIntentLegacyFingerprint = fingerprint { ) } -internal val shortsPlaybackIntentFingerprint = fingerprint { +internal val shortsPlaybackIntentFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt index 612ceb6c8f..421b608596 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt @@ -1,12 +1,14 @@ package app.revanced.patches.youtube.layout.sponsorblock import app.revanced.patcher.fingerprint +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionReversed import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val appendTimeFingerprint = fingerprint { +internal val appendTimeFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;") @@ -29,7 +31,7 @@ internal val appendTimeFingerprint = fingerprint { ) } -internal val controlsOverlayFingerprint = fingerprint { +internal val controlsOverlayFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) parameters() @@ -47,18 +49,26 @@ internal val controlsOverlayFingerprint = fingerprint { ) } -internal val rectangleFieldInvalidatorFingerprint = fingerprint { +internal val rectangleFieldInvalidatorFingerprint by fingerprint { returns("V") - custom { method, _ -> - val instructions = method.implementation?.instructions!! - val instructionCount = instructions.count() - - // the method has definitely more than 5 instructions - if (instructionCount < 5) return@custom false - - val referenceInstruction = instructions.elementAt(instructionCount - 2) // the second to last instruction - val reference = ((referenceInstruction as? ReferenceInstruction)?.reference as? MethodReference) + parameters() + custom { method, _ -> + indexOfInvalidateInstruction(method) >= 0 + } +} - reference?.parameterTypes?.size == 1 && reference.name == "invalidate" // the reference is the invalidate(..) method +internal val segmentPlaybackControllerFingerprint by fingerprint { + returns("V") + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + parameters("Ljava/lang/Object;") + opcodes(Opcode.CONST_STRING) + custom { method, _ -> + method.definingClass == EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR + && method.name == "setSponsorBarRect" } } + +internal fun indexOfInvalidateInstruction(method: Method) = + method.indexOfFirstInstructionReversed { + getReference()?.name == "invalidate" + } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index cb1fcd9352..cae76cf498 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -3,12 +3,9 @@ package app.revanced.patches.youtube.layout.sponsorblock import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.mapping.resourceMappingPatch @@ -30,7 +27,6 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.* import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.iface.reference.StringReference private val sponsorBlockResourcePatch = resourcePatch { dependsOn( @@ -84,7 +80,7 @@ private val sponsorBlockResourcePatch = resourcePatch { } } -private const val EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR = +internal const val EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/sponsorblock/SegmentPlaybackController;" private const val EXTENSION_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButtonController;" @@ -210,35 +206,26 @@ val sponsorBlockPatch = bytecodePatch( } // Set seekbar draw rectangle. - rectangleFieldInvalidatorFingerprint.match(seekbarOnDrawFingerprint.originalClassDef).method.apply { - val fieldIndex = instructions.count() - 3 - val fieldReference = getInstruction(fieldIndex).reference as FieldReference - - // replace the "replaceMeWith*" strings - proxy(classes.first { it.type.endsWith("SegmentPlaybackController;") }) - .mutableClass - .methods - .find { it.name == "setSponsorBarRect" } - ?.let { method -> - fun MutableMethod.replaceStringInstruction(index: Int, instruction: Instruction, with: String) { - val register = (instruction as OneRegisterInstruction).registerA - this.replaceInstruction( - index, - "const-string v$register, \"$with\"", - ) - } - for ((index, it) in method.instructions.withIndex()) { - if (it.opcode.ordinal != Opcode.CONST_STRING.ordinal) continue - - when (((it as ReferenceInstruction).reference as StringReference).string) { - "replaceMeWithsetSponsorBarRect" -> method.replaceStringInstruction( - index, - it, - fieldReference.name, - ) - } - } - } ?: throw PatchException("Could not find the method which contains the replaceMeWith* strings") + rectangleFieldInvalidatorFingerprint.match(seekbarFingerprint.originalClassDef).method.apply { + val invalidateIndex = indexOfInvalidateInstruction(this) + val rectangleIndex = indexOfFirstInstructionReversedOrThrow(invalidateIndex + 1) { + getReference()?.type == "Landroid/graphics/Rect;" + } + val rectangleFieldName = + (getInstruction(rectangleIndex).reference as FieldReference).name + + segmentPlaybackControllerFingerprint.let { + it.method.apply { + val replaceIndex = it.patternMatch.startIndex + val replaceRegister = + getInstruction(replaceIndex).registerA + + replaceInstruction( + replaceIndex, + "const-string v$replaceRegister, \"$rectangleFieldName\"" + ) + } + } } // The vote and create segment buttons automatically change their visibility when appropriate, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt index 969d90e024..81cd832210 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val spoofAppVersionFingerprint = fingerprint { +internal val spoofAppVersionFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt index 0220840203..c70616e382 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt @@ -3,12 +3,12 @@ package app.revanced.patches.youtube.layout.startpage import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val intentActionFingerprint = fingerprint { +internal val intentActionFingerprint by fingerprint { parameters("Landroid/content/Intent;") strings("has_handled_intent") } -internal val browseIdFingerprint = fingerprint { +internal val browseIdFingerprint by fingerprint { returns("Lcom/google/android/apps/youtube/app/common/ui/navigation/PaneDescriptor;") parameters() opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt index 1ae9ce7fe6..11a2700f25 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags -internal val userWasInShortsFingerprint = fingerprint { +internal val userWasInShortsFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Ljava/lang/Object;") @@ -14,7 +14,7 @@ internal val userWasInShortsFingerprint = fingerprint { /** * 18.15.40+ */ -internal val userWasInShortsConfigFingerprint = fingerprint { +internal val userWasInShortsConfigFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") literal { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt index 9ed098a1bf..3adbccbd4d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt @@ -5,7 +5,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val lithoThemeFingerprint = fingerprint { +internal val lithoThemeFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters("Landroid/graphics/Rect;") @@ -31,7 +31,7 @@ internal val lithoThemeFingerprint = fingerprint { } } -internal val themeHelperDarkColorFingerprint = fingerprint { +internal val themeHelperDarkColorFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() @@ -41,7 +41,7 @@ internal val themeHelperDarkColorFingerprint = fingerprint { } } -internal val themeHelperLightColorFingerprint = fingerprint { +internal val themeHelperLightColorFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() @@ -51,6 +51,6 @@ internal val themeHelperLightColorFingerprint = fingerprint { } } -internal val useGradientLoadingScreenFingerprint = fingerprint { +internal val useGradientLoadingScreenFingerprint by fingerprint { literal { GRADIENT_LOADING_SCREEN_AB_CONSTANT } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt index b12c8157c6..bfbbf0d56e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt @@ -5,7 +5,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val backgroundPlaybackManagerFingerprint = fingerprint { +internal val backgroundPlaybackManagerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L") @@ -38,7 +38,7 @@ internal val backgroundPlaybackManagerFingerprint = fingerprint { ) } -internal val backgroundPlaybackSettingsFingerprint = fingerprint { +internal val backgroundPlaybackSettingsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() @@ -54,7 +54,7 @@ internal val backgroundPlaybackSettingsFingerprint = fingerprint { literal { prefBackgroundAndOfflineCategoryId } } -internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { +internal val kidsBackgroundPlaybackPolicyControllerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "L", "L") @@ -71,14 +71,14 @@ internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { literal { 5 } } -internal val backgroundPlaybackManagerShortsFingerprint = fingerprint { +internal val backgroundPlaybackManagerShortsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L") literal { 151635310 } } -internal val shortsBackgroundPlaybackFeatureFlagFingerprint = fingerprint { +internal val shortsBackgroundPlaybackFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt index fe3f75eb11..3e976140ec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt @@ -3,32 +3,32 @@ package app.revanced.patches.youtube.misc.debugging import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val experimentalFeatureFlagParentFingerprint = fingerprint { +internal val experimentalFeatureFlagParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L", "J", "[B") strings("Unable to parse proto typed experiment flag: ") } -internal val experimentalBooleanFeatureFlagFingerprint = fingerprint { +internal val experimentalBooleanFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters("J", "Z") } -internal val experimentalDoubleFeatureFlagFingerprint = fingerprint { +internal val experimentalDoubleFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("D") parameters("J", "D") } -internal val experimentalLongFeatureFlagFingerprint = fingerprint { +internal val experimentalLongFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("J") parameters("J", "J") } -internal val experimentalStringFeatureFlagFingerprint = fingerprint { +internal val experimentalStringFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("J", "Ljava/lang/String;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt index 4f99a4cf54..a777267184 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.misc.dimensions.spoof import app.revanced.patcher.fingerprint -internal val deviceDimensionsModelToStringFingerprint = fingerprint { +internal val deviceDimensionsModelToStringFingerprint by fingerprint { returns("L") strings("minh.", ";maxh.") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt index fe8f4684a2..17b0e48565 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val onBackPressedFingerprint = fingerprint { +internal val onBackPressedFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) opcodes(Opcode.RETURN_VOID) @@ -15,7 +15,7 @@ internal val onBackPressedFingerprint = fingerprint { } } -internal val scrollPositionFingerprint = fingerprint { +internal val scrollPositionFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters("L") @@ -27,7 +27,7 @@ internal val scrollPositionFingerprint = fingerprint { strings("scroll_position") } -internal val recyclerViewTopScrollingFingerprint = fingerprint { +internal val recyclerViewTopScrollingFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -51,7 +51,7 @@ internal val recyclerViewTopScrollingFingerprint = fingerprint { ) } -internal val recyclerViewTopScrollingParentFingerprint = fingerprint { +internal val recyclerViewTopScrollingParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("L", "L", "Landroid/view/ViewGroup;", "Landroid/view/ViewGroup;") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/Fingerprints.kt index 8445879127..c44b37aff2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/Fingerprints.kt @@ -12,7 +12,7 @@ import com.android.tools.smali.dexlib2.Opcode * When this value is true, Cairo Fragment is used. * In this case, some of the patches may be broken, so set this value to FALSE. */ -internal val cairoFragmentConfigFingerprint = fingerprint { +internal val cairoFragmentConfigFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/Fingerprints.kt index d5a255ca5f..9ae70b23be 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/Fingerprints.kt @@ -12,7 +12,7 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference * This method is usually used to set the initial speed (1.0x) when playback starts from the feed. * For some reason, in the latest YouTube, it is invoked even after the video has already started. */ -internal val playbackSpeedInFeedsFingerprint = fingerprint { +internal val playbackSpeedInFeedsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt index fcd5298acf..818d7c0d05 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.misc.imageurlhook import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val onFailureFingerprint = fingerprint { +internal val onFailureFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters( @@ -17,7 +17,7 @@ internal val onFailureFingerprint = fingerprint { } // Acts as a parent fingerprint. -internal val onResponseStartedFingerprint = fingerprint { +internal val onResponseStartedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") @@ -32,7 +32,7 @@ internal val onResponseStartedFingerprint = fingerprint { } } -internal val onSucceededFingerprint = fingerprint { +internal val onSucceededFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") @@ -43,7 +43,7 @@ internal val onSucceededFingerprint = fingerprint { internal const val CRONET_URL_REQUEST_CLASS_DESCRIPTOR = "Lorg/chromium/net/impl/CronetUrlRequest;" -internal val requestFingerprint = fingerprint { +internal val requestFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") custom { _, classDef -> @@ -51,12 +51,12 @@ internal val requestFingerprint = fingerprint { } } -internal val messageDigestImageUrlFingerprint = fingerprint { +internal val messageDigestImageUrlFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Ljava/lang/String;", "L") } -internal val messageDigestImageUrlParentFingerprint = fingerprint { +internal val messageDigestImageUrlParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt index 73f6fae75b..2ed7defeaa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt @@ -7,7 +7,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * Target 19.33+ */ -internal val abUriParserFingerprint = fingerprint { +internal val abUriParserFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/Object") parameters("Ljava/lang/Object") @@ -20,7 +20,7 @@ internal val abUriParserFingerprint = fingerprint { } } -internal val abUriParserLegacyFingerprint = fingerprint { +internal val abUriParserLegacyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/Object") parameters("Ljava/lang/Object") @@ -50,7 +50,7 @@ internal val abUriParserLegacyFingerprint = fingerprint { /** * Target 19.33+ */ -internal val httpUriParserFingerprint = fingerprint { +internal val httpUriParserFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Landroid/net/Uri") parameters("Ljava/lang/String") @@ -60,7 +60,7 @@ internal val httpUriParserFingerprint = fingerprint { } } -internal val httpUriParserLegacyFingerprint = fingerprint { +internal val httpUriParserLegacyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Landroid/net/Uri") parameters("Ljava/lang/String") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt index ac158ee120..a826313b06 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt @@ -9,11 +9,11 @@ import com.android.tools.smali.dexlib2.Opcode * In 19.17 and earlier, this resolves to the same method as [readComponentIdentifierFingerprint]. * In 19.18+ this resolves to a different method. */ -internal val componentContextParserFingerprint = fingerprint { +internal val componentContextParserFingerprint by fingerprint { strings("Component was not found %s because it was removed due to duplicate converter bindings.") } -internal val lithoFilterFingerprint = fingerprint { +internal val lithoFilterFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) returns("V") custom { _, classDef -> @@ -21,7 +21,7 @@ internal val lithoFilterFingerprint = fingerprint { } } -internal val protobufBufferReferenceFingerprint = fingerprint { +internal val protobufBufferReferenceFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "Ljava/nio/ByteBuffer;") @@ -37,11 +37,11 @@ internal val protobufBufferReferenceFingerprint = fingerprint { * In 19.17 and earlier, this resolves to the same method as [componentContextParserFingerprint]. * In 19.18+ this resolves to a different method. */ -internal val readComponentIdentifierFingerprint = fingerprint { +internal val readComponentIdentifierFingerprint by fingerprint { strings("Number of bits must be positive") } -internal val emptyComponentFingerprint = fingerprint { +internal val emptyComponentFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) parameters() strings("EmptyComponent") @@ -50,14 +50,14 @@ internal val emptyComponentFingerprint = fingerprint { } } -internal val lithoComponentNameUpbFeatureFlagFingerprint = fingerprint { +internal val lithoComponentNameUpbFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() literal { 45631264L } } -internal val lithoConverterBufferUpbFeatureFlagFingerprint = fingerprint { +internal val lithoConverterBufferUpbFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt index c3fec3a2a8..7a10ceb03e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt @@ -6,7 +6,7 @@ import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter import app.revanced.patches.youtube.layout.buttons.navigation.navigationButtonsPatch import com.android.tools.smali.dexlib2.AccessFlags -internal val actionBarSearchResultsFingerprint = fingerprint { +internal val actionBarSearchResultsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") instructions( @@ -18,7 +18,7 @@ internal val actionBarSearchResultsFingerprint = fingerprint { /** * Matches to the class found in [pivotBarConstructorFingerprint]. */ -internal val initializeButtonsFingerprint = fingerprint { +internal val initializeButtonsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( @@ -26,7 +26,7 @@ internal val initializeButtonsFingerprint = fingerprint { ) } -internal val mainActivityOnBackPressedFingerprint = fingerprint { +internal val mainActivityOnBackPressedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -43,7 +43,7 @@ internal val mainActivityOnBackPressedFingerprint = fingerprint { * Extension method, used for callback into to other patches. * Specifically, [navigationButtonsPatch]. */ -internal val navigationBarHookCallbackFingerprint = fingerprint { +internal val navigationBarHookCallbackFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("V") parameters(EXTENSION_NAVIGATION_BUTTON_DESCRIPTOR, "Landroid/view/View;") @@ -56,7 +56,7 @@ internal val navigationBarHookCallbackFingerprint = fingerprint { /** * Matches to the Enum class that looks up ordinal -> instance. */ -internal val navigationEnumFingerprint = fingerprint { +internal val navigationEnumFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "PIVOT_HOME", @@ -69,7 +69,7 @@ internal val navigationEnumFingerprint = fingerprint { ) } -internal val pivotBarButtonsCreateDrawableViewFingerprint = fingerprint { +internal val pivotBarButtonsCreateDrawableViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") custom { method, _ -> @@ -79,7 +79,7 @@ internal val pivotBarButtonsCreateDrawableViewFingerprint = fingerprint { } } -internal val pivotBarButtonsCreateResourceViewFingerprint = fingerprint { +internal val pivotBarButtonsCreateResourceViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") parameters("L", "Z", "I", "L") @@ -88,7 +88,7 @@ internal val pivotBarButtonsCreateResourceViewFingerprint = fingerprint { } } -internal val pivotBarButtonsViewSetSelectedFingerprint = fingerprint { +internal val pivotBarButtonsViewSetSelectedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "Z") @@ -100,17 +100,17 @@ internal val pivotBarButtonsViewSetSelectedFingerprint = fingerprint { } } -internal val pivotBarConstructorFingerprint = fingerprint { +internal val pivotBarConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) strings("com.google.android.apps.youtube.app.endpoint.flags") } -internal val imageEnumConstructorFingerprint = fingerprint { +internal val imageEnumConstructorFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings("TAB_ACTIVITY_CAIRO") } -internal val setEnumMapFingerprint = fingerprint { +internal val setEnumMapFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( ResourceMappingFilter("drawable", "yt_fill_bell_black_24") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt index 95dbd54ecb..b288259fe3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt @@ -5,14 +5,14 @@ import app.revanced.util.containsLiteralInstruction import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags -internal val playerTopControlsInflateFingerprint = fingerprint { +internal val playerTopControlsInflateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() literal { controlsLayoutStub } } -internal val playerControlsExtensionHookListenersExistFingerprint = fingerprint { +internal val playerControlsExtensionHookListenersExistFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Z") parameters() @@ -22,7 +22,7 @@ internal val playerControlsExtensionHookListenersExistFingerprint = fingerprint } } -internal val playerControlsExtensionHookFingerprint = fingerprint { +internal val playerControlsExtensionHookFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("V") parameters("Z") @@ -32,13 +32,13 @@ internal val playerControlsExtensionHookFingerprint = fingerprint { } } -internal val playerBottomControlsInflateFingerprint = fingerprint { +internal val playerBottomControlsInflateFingerprint by fingerprint { returns("Ljava/lang/Object;") parameters() literal { bottomUiContainerResourceId } } -internal val overlayViewInflateFingerprint = fingerprint { +internal val overlayViewInflateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;") @@ -51,20 +51,20 @@ internal val overlayViewInflateFingerprint = fingerprint { /** * Resolves to the class found in [playerTopControlsInflateFingerprint]. */ -internal val controlsOverlayVisibilityFingerprint = fingerprint { +internal val controlsOverlayVisibilityFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Z", "Z") } -internal val playerBottomControlsExploderFeatureFlagFingerprint = fingerprint { +internal val playerBottomControlsExploderFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() literal { 45643739L } } -internal val playerTopControlsExperimentalLayoutFeatureFlagFingerprint = fingerprint { +internal val playerTopControlsExperimentalLayoutFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt index 2faae3acc4..4aa4f1df01 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val playerTypeFingerprint = fingerprint { +internal val playerTypeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") @@ -15,7 +15,7 @@ internal val playerTypeFingerprint = fingerprint { custom { _, classDef -> classDef.endsWith("/YouTubePlayerOverlaysLayout;") } } -internal val videoStateFingerprint = fingerprint { +internal val videoStateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/Fingerprints.kt index 72734bba70..7e9e67a285 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val copyTextFingerprint = fingerprint { +internal val copyTextFingerprint by fingerprint { returns("V") parameters("L", "Ljava/util/Map;") opcodes( @@ -21,7 +21,7 @@ internal val copyTextFingerprint = fingerprint { strings("text/plain") } -internal val systemShareSheetFingerprint = fingerprint { +internal val systemShareSheetFingerprint by fingerprint { returns("V") parameters("L", "Ljava/util/Map;") opcodes( @@ -31,7 +31,7 @@ internal val systemShareSheetFingerprint = fingerprint { strings("YTShare_Logging_Share_Intent_Endpoint_Byte_Array") } -internal val youtubeShareSheetFingerprint = fingerprint { +internal val youtubeShareSheetFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "Ljava/util/Map;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt index 09aa7bf4cd..88b2e9f3da 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val recyclerViewTreeObserverFingerprint = fingerprint { +internal val recyclerViewTreeObserverFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt index 42298d82f2..4a4c4d59ce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt @@ -5,7 +5,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val licenseActivityOnCreateFingerprint = fingerprint { +internal val licenseActivityOnCreateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") @@ -14,7 +14,7 @@ internal val licenseActivityOnCreateFingerprint = fingerprint { } } -internal val setThemeFingerprint = fingerprint { +internal val setThemeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/Fingerprints.kt index 65cb707693..8224bb5e5a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.youtube.misc.zoomhaptics import app.revanced.patcher.fingerprint -internal val zoomHapticsFingerprint = fingerprint { +internal val zoomHapticsFingerprint by fingerprint { strings("Failed to haptics vibrate for video zoom") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index a242d6fad9..cdbc51c97a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val autoRepeatFingerprint = fingerprint { +internal val autoRepeatFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -13,7 +13,7 @@ internal val autoRepeatFingerprint = fingerprint { } } -internal val autoRepeatParentFingerprint = fingerprint { +internal val autoRepeatParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") strings( @@ -22,14 +22,14 @@ internal val autoRepeatParentFingerprint = fingerprint { ) } -internal val layoutConstructorFingerprint = fingerprint { +internal val layoutConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() strings("1.0x") } -internal val mainActivityFingerprint = fingerprint { +internal val mainActivityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters() custom { _, classDef -> @@ -38,7 +38,7 @@ internal val mainActivityFingerprint = fingerprint { } } -internal val mainActivityOnCreateFingerprint = fingerprint { +internal val mainActivityOnCreateFingerprint by fingerprint { returns("V") parameters("Landroid/os/Bundle;") custom { method, classDef -> @@ -51,7 +51,7 @@ internal val mainActivityOnCreateFingerprint = fingerprint { } } -internal val rollingNumberTextViewAnimationUpdateFingerprint = fingerprint { +internal val rollingNumberTextViewAnimationUpdateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/graphics/Bitmap;") @@ -77,16 +77,16 @@ internal val rollingNumberTextViewAnimationUpdateFingerprint = fingerprint { } } -internal val seekbarFingerprint = fingerprint { +internal val seekbarFingerprint by fingerprint { returns("V") strings("timed_markers_width") } -internal val seekbarOnDrawFingerprint = fingerprint { +internal val seekbarOnDrawFingerprint by fingerprint { custom { method, _ -> method.name == "onDraw" } } -internal val subtitleButtonControllerFingerprint = fingerprint { +internal val subtitleButtonControllerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lcom/google/android/libraries/youtube/player/subtitles/model/SubtitleTrack;") @@ -103,7 +103,7 @@ internal val subtitleButtonControllerFingerprint = fingerprint { ) } -internal val newVideoQualityChangedFingerprint = fingerprint { +internal val newVideoQualityChangedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt index a338ea6b7d..8756039d08 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt @@ -3,20 +3,20 @@ package app.revanced.patches.youtube.video.audio import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val streamingModelBuilderFingerprint = fingerprint { +internal val streamingModelBuilderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") strings("vprng") } -internal val menuItemAudioTrackFingerprint = fingerprint { +internal val menuItemAudioTrackFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("L") returns("V") strings("menu_item_audio_track") } -internal val audioStreamingTypeSelector = fingerprint { +internal val audioStreamingTypeSelector by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("L") strings("raw") // String is not unique diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt index d0c961c9d4..913fb59911 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt @@ -7,12 +7,12 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.FieldReference -internal val createVideoPlayerSeekbarFingerprint = fingerprint { +internal val createVideoPlayerSeekbarFingerprint by fingerprint { returns("V") strings("timed_markers_width") } -internal val onPlaybackSpeedItemClickFingerprint = fingerprint { +internal val onPlaybackSpeedItemClickFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L", "I", "J") @@ -25,23 +25,23 @@ internal val onPlaybackSpeedItemClickFingerprint = fingerprint { } } -internal val playerControllerSetTimeReferenceFingerprint = fingerprint { +internal val playerControllerSetTimeReferenceFingerprint by fingerprint { opcodes(Opcode.INVOKE_DIRECT_RANGE, Opcode.IGET_OBJECT) strings("Media progress reported outside media playback: ") } -internal val playerInitFingerprint = fingerprint { +internal val playerInitFingerprint by fingerprint { strings("playVideo called on player response with no videoStreamingData.") } /** * Matched using class found in [playerInitFingerprint]. */ -internal val seekFingerprint = fingerprint { +internal val seekFingerprint by fingerprint { strings("Attempting to seek during an ad") } -internal val videoLengthFingerprint = fingerprint { +internal val videoLengthFingerprint by fingerprint { opcodes( Opcode.MOVE_RESULT_WIDE, Opcode.CMP_LONG, @@ -61,7 +61,7 @@ internal val videoLengthFingerprint = fingerprint { /** * Matches using class found in [mdxPlayerDirectorSetVideoStageFingerprint]. */ -internal val mdxSeekFingerprint = fingerprint { +internal val mdxSeekFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters("J", "L") @@ -78,14 +78,14 @@ internal val mdxSeekFingerprint = fingerprint { } } -internal val mdxPlayerDirectorSetVideoStageFingerprint = fingerprint { +internal val mdxPlayerDirectorSetVideoStageFingerprint by fingerprint { strings("MdxDirector setVideoStage ad should be null when videoStage is not an Ad state ") } /** * Matches using class found in [mdxPlayerDirectorSetVideoStageFingerprint]. */ -internal val mdxSeekRelativeFingerprint = fingerprint { +internal val mdxSeekRelativeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) // Return type is boolean up to 19.39, and void with 19.39+. parameters("J", "L") @@ -99,7 +99,7 @@ internal val mdxSeekRelativeFingerprint = fingerprint { /** * Matches using class found in [playerInitFingerprint]. */ -internal val seekRelativeFingerprint = fingerprint { +internal val seekRelativeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) // Return type is boolean up to 19.39, and void with 19.39+. parameters("J", "L") @@ -112,7 +112,7 @@ internal val seekRelativeFingerprint = fingerprint { /** * Resolves with the class found in [newVideoQualityChangedFingerprint]. */ -internal val playbackSpeedMenuSpeedChangedFingerprint = fingerprint { +internal val playbackSpeedMenuSpeedChangedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt index 603329de7d..d5658dc306 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.AccessFlags /** * For targets 19.25 and later. */ -internal val playerParameterBuilderFingerprint = fingerprint { +internal val playerParameterBuilderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( @@ -31,7 +31,7 @@ internal val playerParameterBuilderFingerprint = fingerprint { /** * For targets 19.24 and earlier. */ -internal val playerParameterBuilderLegacyFingerprint = fingerprint { +internal val playerParameterBuilderLegacyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt index e33674a389..757fc887ef 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt @@ -7,7 +7,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * Matches with the class found in [videoQualitySetterFingerprint]. */ -internal val setQualityByIndexMethodClassFieldReferenceFingerprint = fingerprint { +internal val setQualityByIndexMethodClassFieldReferenceFingerprint by fingerprint { returns("V") parameters("L") opcodes( @@ -17,12 +17,12 @@ internal val setQualityByIndexMethodClassFieldReferenceFingerprint = fingerprint ) } -internal val videoQualityItemOnClickParentFingerprint = fingerprint { +internal val videoQualityItemOnClickParentFingerprint by fingerprint { returns("V") strings("VIDEO_QUALITIES_MENU_BOTTOM_SHEET_FRAGMENT") } -internal val videoQualitySetterFingerprint = fingerprint { +internal val videoQualitySetterFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("[L", "I", "Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index d3aa805d8c..9428d40f76 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -5,20 +5,20 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getOldPlaybackSpeedsFingerprint = fingerprint { +internal val getOldPlaybackSpeedsFingerprint by fingerprint { parameters("[L", "I") strings("menu_item_playback_speed") } -internal val showOldPlaybackSpeedMenuFingerprint = fingerprint { +internal val showOldPlaybackSpeedMenuFingerprint by fingerprint { literal { speedUnavailableId } } -internal val showOldPlaybackSpeedMenuExtensionFingerprint = fingerprint { +internal val showOldPlaybackSpeedMenuExtensionFingerprint by fingerprint { custom { method, _ -> method.name == "showOldPlaybackSpeedMenu" } } -internal val speedArrayGeneratorFingerprint = fingerprint { +internal val speedArrayGeneratorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("[L") parameters("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;") @@ -33,7 +33,7 @@ internal val speedArrayGeneratorFingerprint = fingerprint { strings("0.0#") } -internal val speedLimiterFingerprint = fingerprint { +internal val speedLimiterFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("F") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt index 3924588b42..7d7afa9f40 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.video.speed.remember import app.revanced.patcher.fingerprint -internal val initializePlaybackSpeedValuesFingerprint = fingerprint { +internal val initializePlaybackSpeedValuesFingerprint by fingerprint { parameters("[L", "I") strings("menu_item_playback_speed") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index 82b17a3eb2..275304bbe9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -7,7 +7,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val videoIdFingerprint = fingerprint { +internal val videoIdFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") @@ -22,7 +22,7 @@ internal val videoIdFingerprint = fingerprint { ) } -internal val videoIdBackgroundPlayFingerprint = fingerprint { +internal val videoIdBackgroundPlayFingerprint by fingerprint { accessFlags(AccessFlags.DECLARED_SYNCHRONIZED, AccessFlags.FINAL, AccessFlags.PUBLIC) returns("V") parameters("L") @@ -46,7 +46,7 @@ internal val videoIdBackgroundPlayFingerprint = fingerprint { } } -internal val videoIdParentFingerprint = fingerprint { +internal val videoIdParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("[L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/Fingerprints.kt index 7f5469da33..1367bf682c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/Fingerprints.kt @@ -5,7 +5,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val videoQualityMenuOptionsFingerprint = fingerprint { +internal val videoQualityMenuOptionsFingerprint by fingerprint { accessFlags(AccessFlags.STATIC) returns("[L") parameters("Landroid/content/Context", "L", "L") @@ -19,7 +19,7 @@ internal val videoQualityMenuOptionsFingerprint = fingerprint { literal { videoQualityQuickMenuAdvancedMenuDescription } } -internal val videoQualityMenuViewInflateFingerprint = fingerprint { +internal val videoQualityMenuViewInflateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L", "L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt index af38f28f4d..e22b839570 100644 --- a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isPremiumFingerprint = fingerprint { +internal val isPremiumFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") opcodes( @@ -13,7 +13,7 @@ internal val isPremiumFingerprint = fingerprint { ) } -internal val yukaUserConstructorFingerprint = fingerprint { +internal val yukaUserConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") strings("premiumProvider") From 2d1f7ff9b78768ec47496290ac224b5d432b865c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 3 Jan 2025 13:35:51 +0100 Subject: [PATCH 06/64] Allow using a fingerprint result inside another fingerprint --- .../misc/mapping/ResourceMappingPatch.kt | 2 +- .../youtube/misc/playertype/Fingerprints.kt | 30 +++++++++++++++---- .../misc/playertype/PlayerTypeHookPatch.kt | 19 +++++++----- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index 8c9159788c..f607091239 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -34,8 +34,8 @@ class ResourceMappingFilter( ] } - context(BytecodePatchContext) override fun matches( + context: BytecodePatchContext, method: Method, instruction: Instruction, methodIndex: Int diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt index 4aa4f1df01..ace852d206 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt @@ -1,6 +1,9 @@ package app.revanced.patches.youtube.misc.playertype +import app.revanced.patcher.FieldFilter +import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -15,14 +18,31 @@ internal val playerTypeFingerprint by fingerprint { custom { _, classDef -> classDef.endsWith("/YouTubePlayerOverlaysLayout;") } } +internal val videoStateEnumFingerprint by fingerprint { + accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) + parameters() + strings( + "NEW", + "PLAYING", + "PAUSED", + "RECOVERABLE_ERROR", + "UNRECOVERABLE_ERROR", + "ENDED" + ) +} + internal val videoStateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;") - opcodes( - Opcode.CONST_4, - Opcode.IF_EQZ, - Opcode.IF_EQZ, - Opcode.IGET_OBJECT, // obfuscated parameter field name + instructions( + LiteralFilter(1), + LiteralFilter(0), + // Obfuscated parameter field name. + FieldFilter( + definingClass = { "Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;"}, + type = { context: BytecodePatchContext -> with(context) { videoStateEnumFingerprint.originalClassDef.type } }, + maxInstructionsBefore = 5 + ) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt index e021928a8b..e1de131cce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt @@ -20,17 +20,20 @@ val playerTypeHookPatch = bytecodePatch( "invoke-static {p1}, $EXTENSION_CLASS_DESCRIPTOR->setPlayerType(Ljava/lang/Enum;)V", ) - videoStateFingerprint.method.apply { - val endIndex = videoStateFingerprint.patternMatch!!.endIndex - val videoStateFieldName = getInstruction(endIndex).reference + videoStateFingerprint.let { + it.method.apply { + val videoStateFieldName = getInstruction( + it.filterMatch.last().index + ).reference - addInstructions( - 0, - """ + addInstructions( + 0, + """ iget-object v0, p1, $videoStateFieldName # copy VideoState parameter field invoke-static {v0}, $EXTENSION_CLASS_DESCRIPTOR->setVideoState(Ljava/lang/Enum;)V - """, - ) + """ + ) + } } } } From 5c3fb65010549b5eced8f6f537dea88144fb7f9d Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 3 Jan 2025 15:57:39 +0100 Subject: [PATCH 07/64] refactor --- .../patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt | 4 ++-- .../layout/buttons/navigation/NavigationButtonsPatch.kt | 8 ++++---- .../buttons/overlay/HidePlayerOverlayButtonsPatch.kt | 2 +- .../layout/hide/shorts/HideShortsComponentsPatch.kt | 2 +- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 2 +- .../player/fullscreen/OpenVideosFullscreenHookPatch.kt | 2 +- .../patches/youtube/layout/seekbar/SeekbarColorPatch.kt | 2 +- .../youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt | 2 +- .../youtube/misc/navigation/NavigationBarHookPatch.kt | 4 ++-- .../youtube/misc/playertype/PlayerTypeHookPatch.kt | 2 +- .../patches/youtube/video/videoid/VideoIdPatch.kt | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index 83176f2680..2e5db5aa1a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -86,7 +86,7 @@ fun spoofVideoStreamsPatch( buildRequestFingerprint.let { it.method.apply { - val builderIndex = it.filterMatch.first().index + val builderIndex = it.filterMatches.first().index val urlRegister = getInstruction(builderIndex).registerD val freeRegister = getInstruction(builderIndex + 1).registerA @@ -231,7 +231,7 @@ fun spoofVideoStreamsPatch( hlsCurrentTimeFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatch.first().index, + it.filterMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->fixHLSCurrentTime(Z)Z" ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index e2a26c49c8..9a27669b44 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -95,7 +95,7 @@ val navigationButtonsPatch = bytecodePatch( // Hide navigation button labels. createPivotBarFingerprint.let { it.method.apply { - val setTextIndex = it.filterMatch.first().index + val setTextIndex = it.filterMatches.first().index val targetRegister = getInstruction(setTextIndex).registerC addInstruction( @@ -114,21 +114,21 @@ val navigationButtonsPatch = bytecodePatch( if (is_19_25_or_greater) { translucentNavigationStatusBarFeatureFlagFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatch.first().index, + it.filterMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationStatusBar(Z)Z", ) } translucentNavigationButtonsFeatureFlagFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatch.first().index, + it.filterMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", ) } translucentNavigationButtonsSystemFeatureFlagFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatch.first().index, + it.filterMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt index bac6b11b43..6a275dbab1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt @@ -63,7 +63,7 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( playerControlsPreviousNextOverlayTouchFingerprint.let { it.method.apply { - val insertIndex = it.filterMatch.last().index + val insertIndex = it.filterMatches.last().index val viewRegister = getInstruction(insertIndex).registerC addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 6847239214..6b77b2ebb9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -236,7 +236,7 @@ val hideShortsComponentsPatch = bytecodePatch( // Hide the bottom bar container of the Shorts player. shortsBottomBarContainerFingerprint.let { it.method.apply { - val targetIndex = it.filterMatch.last().index + val targetIndex = it.filterMatches.last().index val heightRegister = getInstruction(targetIndex).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 7f13b9c9b5..3ea37a6eb1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -392,7 +392,7 @@ val miniplayerPatch = bytecodePatch( // Override a minimum size constant. miniplayerMinimumSizeFingerprint.let { it.method.apply { - val index = it.filterMatch[1].index + val index = it.filterMatches[1].index val register = getInstruction(index).registerA // Smaller sizes can be used, but the miniplayer will always start in size 170 if set any smaller. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt index 944b54b4e5..0603a6a8dc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt @@ -26,7 +26,7 @@ internal val openVideosFullscreenHookPatch = bytecodePatch { openVideosFullscreenPortraitFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatch.first().index, + it.filterMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->openVideoFullscreenPortrait(Z)Z" ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index cfca4095a6..8b877d446b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -232,7 +232,7 @@ val seekbarColorPatch = bytecodePatch( playerSeekbarGradientConfigFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatch.first().index, + it.filterMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->playerSeekbarGradientEnabled(Z)Z" ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt index 5226cf2f0b..1021efeed1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt @@ -32,7 +32,7 @@ internal val disableCairoSettingsPatch = bytecodePatch( */ cairoFragmentConfigFingerprint.let{ it.method.apply { - val resultIndex = it.filterMatch.last().index + val resultIndex = it.filterMatches.last().index val register = getInstruction(resultIndex).registerA addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt index b36a4d4e19..f363901871 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt @@ -80,7 +80,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig pivotBarButtonsViewSetSelectedFingerprint.let { it.method.apply { - val index = it.filterMatch.first().index + val index = it.filterMatches.first().index val instruction = getInstruction(index) val viewRegister = instruction.registerC val isSelectedRegister = instruction.registerD @@ -108,7 +108,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig // so this works regardless which layout is used. actionBarSearchResultsFingerprint.let { it.method.apply { - val instructionIndex = it.filterMatch.last().index + val instructionIndex = it.filterMatches.last().index val viewRegister = getInstruction(instructionIndex).registerC addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt index e1de131cce..9ec8a44333 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt @@ -23,7 +23,7 @@ val playerTypeHookPatch = bytecodePatch( videoStateFingerprint.let { it.method.apply { val videoStateFieldName = getInstruction( - it.filterMatch.last().index + it.filterMatches.last().index ).reference addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt index 4ff003beca..c5a24db458 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt @@ -104,7 +104,7 @@ val videoIdPatch = bytecodePatch( videoIdBackgroundPlayFingerprint.let { it.method.apply { backgroundPlaybackMethod = this - val index = it.filterMatch.first().index + val index = it.filterMatches.first().index backgroundPlaybackVideoIdRegister = getInstruction(index + 1).registerA backgroundPlaybackInsertIndex = index + 2 } From 3db75665e27ceda8a4ded5e088ee78a67fe98db7 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:32:40 +0100 Subject: [PATCH 08/64] use non deprecated method --- .../patches/backdrops/misc/pro/ProUnlockPatch.kt | 4 ++-- .../revanced/patches/duolingo/ad/DisableAdsPatch.kt | 2 +- .../patches/duolingo/debug/EnableDebugMenuPatch.kt | 2 +- .../facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt | 2 +- .../googlenews/customtabs/EnableCustomTabsPatch.kt | 2 +- .../inputfield/DisableSwitchingEmojiToStickerPatch.kt | 2 +- .../mifitness/misc/locale/ForceEnglishLocalePatch.kt | 2 +- .../revanced/patches/music/ad/video/HideVideoAds.kt | 2 +- .../permanentrepeat/PermanentRepeatPatch.kt | 2 +- .../music/layout/compactheader/HideCategoryBar.kt | 2 +- .../music/layout/premium/HideGetPremiumPatch.kt | 2 +- .../layout/upgradebutton/RemoveUpgradeButtonPatch.kt | 4 ++-- .../patches/music/misc/spoof/SpoofClientPatch.kt | 4 ++-- .../detection/signature/SignatureDetectionPatch.kt | 2 +- .../relayforreddit/api/SpoofClientPatch.kt | 2 +- .../misc/fix/verticalscroll/VerticalScrollPatch.kt | 2 +- .../shared/misc/spoof/SpoofVideoStreamsPatch.kt | 2 +- .../functionality/filesize/RemoveFileSizeLimitPatch.kt | 2 +- .../app/revanced/patches/soundcloud/ad/HideAdsPatch.kt | 2 +- .../patches/spotify/lite/ondemand/OnDemandPatch.kt | 2 +- .../strava/subscription/UnlockSubscriptionPatch.kt | 2 +- .../upselling/DisableSubscriptionSuggestionsPatch.kt | 2 +- .../tumblr/featureflags/OverrideFeatureFlagsPatch.kt | 2 +- .../patches/tumblr/fixes/FixOldVersionsPatch.kt | 2 +- .../timelinefilter/FilterTimelineObjectsPatch.kt | 2 +- .../patches/twitter/misc/hook/json/JsonHookPatch.kt | 4 ++-- .../youtube/ad/getpremium/HideGetPremiumPatch.kt | 2 +- .../interaction/seekbar/EnableSeekbarTappingPatch.kt | 2 +- .../interaction/seekbar/EnableSlideToSeekPatch.kt | 6 +++--- .../hide/endscreencards/HideEndscreenCardsPatch.kt | 2 +- .../layout/hide/general/HideLayoutComponentsPatch.kt | 10 +++++----- .../layout/hide/infocards/HideInfoCardsPatch.kt | 2 +- .../DisableSuggestedVideoEndScreenPatch.kt | 2 +- .../returnyoutubedislike/ReturnYouTubeDislikePatch.kt | 6 +++--- .../youtube/layout/searchbar/WideSearchbarPatch.kt | 2 +- .../layout/shortsautoplay/ShortsAutoplayPatch.kt | 2 +- .../youtube/layout/sponsorblock/SponsorBlockPatch.kt | 4 ++-- .../layout/spoofappversion/SpoofAppVersionPatch.kt | 2 +- .../youtube/layout/theme/LithoColorHookPatch.kt | 2 +- .../fix/backtoexitgesture/FixBackToExitGesturePatch.kt | 6 +++--- .../recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt | 2 +- .../youtube/video/information/VideoInformationPatch.kt | 6 +++--- .../youtube/video/quality/RememberVideoQualityPatch.kt | 2 +- .../patches/youtube/video/videoid/VideoIdPatch.kt | 2 +- .../RestoreOldVideoQualityMenuPatch.kt | 2 +- 45 files changed, 62 insertions(+), 62 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt index 70bbcd9fdf..b84d8dc2c1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt @@ -12,12 +12,12 @@ val proUnlockPatch = bytecodePatch( compatibleWith("com.backdrops.wallpapers") execute { - val registerIndex = proUnlockFingerprint.patternMatch!!.endIndex - 1 + val registerIndex = proUnlockFingerprint.filterMatches.last().index - 1 proUnlockFingerprint.method.apply { val register = getInstruction(registerIndex).registerA addInstruction( - proUnlockFingerprint.patternMatch!!.endIndex, + proUnlockFingerprint.filterMatches.last().index, "const/4 v$register, 0x1", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt index a5c56ddb05..0b4b8809a6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt @@ -20,7 +20,7 @@ val disableAdsPatch = bytecodePatch( // // MonetizationDebugSettings seems to be the most general setting to work fine. initializeMonetizationDebugSettingsFingerprint.method.apply { - val insertIndex = initializeMonetizationDebugSettingsFingerprint.patternMatch!!.startIndex + val insertIndex = initializeMonetizationDebugSettingsFingerprint.filterMatches.first().index val register = getInstruction(insertIndex).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt index 833f9dd7da..8f20a0cae3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt @@ -14,7 +14,7 @@ val enableDebugMenuPatch = bytecodePatch( execute { initializeBuildConfigProviderFingerprint.method.apply { - val insertIndex = initializeBuildConfigProviderFingerprint.patternMatch!!.startIndex + val insertIndex = initializeBuildConfigProviderFingerprint.filterMatches.first().index val register = getInstruction(insertIndex).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt index a5a596d3ee..f6ef051e85 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt @@ -67,7 +67,7 @@ val hideSponsoredStoriesPatch = bytecodePatch( // Check if the parameter type is GraphQLStory and if sponsoredDataModelGetter returns a non-null value. // If so, hide the story by setting the visibility to StoryVisibility.GONE. getStoryVisibilityFingerprint.method.addInstructionsWithLabels( - getStoryVisibilityFingerprint.patternMatch!!.startIndex, + getStoryVisibilityFingerprint.filterMatches.first().index, """ instance-of v0, p0, $graphQlStoryClassDescriptor if-eqz v0, :resume_normal diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt index ee7997a54e..b22fea718a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt @@ -14,7 +14,7 @@ val enableCustomTabsPatch = bytecodePatch( execute { launchCustomTabFingerprint.method.apply { - val checkIndex = launchCustomTabFingerprint.patternMatch!!.endIndex + 1 + val checkIndex = launchCustomTabFingerprint.filterMatches.last().index + 1 val register = getInstruction(checkIndex).registerA replaceInstruction(checkIndex, "const/4 v$register, 0x1") diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt index 19f5c12515..c5c6732177 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt @@ -14,7 +14,7 @@ val disableSwitchingEmojiToStickerPatch = bytecodePatch( execute { switchMessengeInputEmojiButtonFingerprint.method.apply { - val setStringIndex = switchMessengeInputEmojiButtonFingerprint.patternMatch!!.startIndex + 2 + val setStringIndex = switchMessengeInputEmojiButtonFingerprint.filterMatches.first().index + 2 val targetRegister = getInstruction(setStringIndex).registerA replaceInstruction(setStringIndex, "const-string v$targetRegister, \"expression\"") diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt index a2a53cabaf..f2ef00b104 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt @@ -17,7 +17,7 @@ val forceEnglishLocalePatch = bytecodePatch( execute { syncBluetoothLanguageFingerprint.method.apply { - val resolvePhoneLocaleInstruction = syncBluetoothLanguageFingerprint.patternMatch!!.startIndex + val resolvePhoneLocaleInstruction = syncBluetoothLanguageFingerprint.filterMatches.first().index val registerIndexToUpdate = getInstruction(resolvePhoneLocaleInstruction).registerA replaceInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt index 27c9812569..df147b47ea 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt @@ -12,7 +12,7 @@ val hideVideoAdsPatch = bytecodePatch( execute { navigate(showVideoAdsParentFingerprint.originalMethod) - .to(showVideoAdsParentFingerprint.patternMatch!!.startIndex + 1) + .to(showVideoAdsParentFingerprint.filterMatches.first().index + 1) .stop() .addInstruction(0, "const/4 p1, 0x0") } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt index c6617664fc..4fa57ab422 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt @@ -15,7 +15,7 @@ val permanentRepeatPatch = bytecodePatch( execute { - val startIndex = repeatTrackFingerprint.patternMatch!!.endIndex + val startIndex = repeatTrackFingerprint.filterMatches.last().index val repeatIndex = startIndex + 1 repeatTrackFingerprint.method.apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt index b0021b966f..f112ba071d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt @@ -15,7 +15,7 @@ val hideCategoryBar = bytecodePatch( execute { constructCategoryBarFingerprint.method.apply { - val insertIndex = constructCategoryBarFingerprint.patternMatch!!.startIndex + val insertIndex = constructCategoryBarFingerprint.filterMatches.first().index val register = getInstruction(insertIndex - 1).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt index 23965cea43..e1b962229d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt @@ -15,7 +15,7 @@ val hideGetPremiumPatch = bytecodePatch( execute { hideGetPremiumFingerprint.method.apply { - val insertIndex = hideGetPremiumFingerprint.patternMatch!!.endIndex + val insertIndex = hideGetPremiumFingerprint.filterMatches.last().index val setVisibilityInstruction = getInstruction(insertIndex) val getPremiumViewRegister = setVisibilityInstruction.registerC diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/RemoveUpgradeButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/RemoveUpgradeButtonPatch.kt index 22878b05f5..38c76a6793 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/RemoveUpgradeButtonPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/RemoveUpgradeButtonPatch.kt @@ -23,7 +23,7 @@ val removeUpgradeButtonPatch = bytecodePatch( execute { pivotBarConstructorFingerprint.method.apply { val pivotBarElementFieldReference = - getInstruction(pivotBarConstructorFingerprint.patternMatch!!.endIndex - 1) + getInstruction(pivotBarConstructorFingerprint.filterMatches.last().index - 1) .getReference() val register = getInstruction(0).registerC @@ -37,7 +37,7 @@ val removeUpgradeButtonPatch = bytecodePatch( iput-object v0, v$register, $pivotBarElementFieldReference """.toInstructions().toMutableList() - val endIndex = pivotBarConstructorFingerprint.patternMatch!!.endIndex + val endIndex = pivotBarConstructorFingerprint.filterMatches.last().index // Replace the instruction to retain the label at given index. replaceInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt index a8f8933ac0..ad03ded018 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt @@ -39,7 +39,7 @@ val spoofClientPatch = bytecodePatch( val createPlayerRequestBodyMatch = createPlayerRequestBodyFingerprint.match(playerRequestClass) val clientInfoContainerClass = createPlayerRequestBodyMatch.method - .getInstruction(createPlayerRequestBodyMatch.patternMatch!!.startIndex) + .getInstruction(createPlayerRequestBodyMatch.filterMatches.first().index) .getReference()!!.type val clientInfoField = setClientInfoClientVersionFingerprint.method.instructions.first { @@ -96,7 +96,7 @@ val spoofClientPatch = bytecodePatch( } createPlayerRequestBodyMatch.method.apply { - val checkCastIndex = createPlayerRequestBodyMatch.patternMatch!!.startIndex + val checkCastIndex = createPlayerRequestBodyMatch.filterMatches.first().index val clientInfoContainerRegister = getInstruction(checkCastIndex).registerA addInstruction(checkCastIndex + 1, "invoke-static {v$clientInfoContainerRegister}, $spoofClientInfoMethod") diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt index 00b47e5161..fc5f4a6ab3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt @@ -10,7 +10,7 @@ val signatureDetectionPatch = bytecodePatch( ) { execute { - val replacementIndex = checkSignatureFingerprint.patternMatch!!.endIndex + val replacementIndex = checkSignatureFingerprint.filterMatches.last().index val checkRegister = checkSignatureFingerprint.method.getInstruction(replacementIndex).registerA checkSignatureFingerprint.method.replaceInstruction(replacementIndex, "const/4 v$checkRegister, 0x1") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt index 854b7cfa5b..f35bb9137e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt @@ -45,7 +45,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "dbrady://relay") { setRemoteConfigFingerprint.method.addInstructions(0, "return-void") // Prevent OAuth login being disabled remotely. - val checkIsOAuthRequestIndex = redditCheckDisableAPIFingerprint.patternMatch!!.startIndex + val checkIsOAuthRequestIndex = redditCheckDisableAPIFingerprint.filterMatches.first().index redditCheckDisableAPIFingerprint.method.apply { val returnNextChain = getInstruction(checkIsOAuthRequestIndex).target diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt index a01839c100..f395b82566 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt @@ -11,7 +11,7 @@ val verticalScrollPatch = bytecodePatch( execute { canScrollVerticallyFingerprint.method.apply { - val moveResultIndex = canScrollVerticallyFingerprint.patternMatch!!.endIndex + val moveResultIndex = canScrollVerticallyFingerprint.filterMatches.last().index val moveResultRegister = getInstruction(moveResultIndex).registerA val insertIndex = moveResultIndex + 1 diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index 2e5db5aa1a..a15b8aada9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -48,7 +48,7 @@ fun spoofVideoStreamsPatch( // region Block /initplayback requests to fall back to /get_watch requests. - val moveUriStringIndex = buildInitPlaybackRequestFingerprint.patternMatch.startIndex + val moveUriStringIndex = buildInitPlaybackRequestFingerprint.filterMatches.first().index buildInitPlaybackRequestFingerprint.method.apply { val targetRegister = getInstruction(moveUriStringIndex).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt index 7ef5093015..f0931b75d9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt @@ -14,7 +14,7 @@ val removeFileSizeLimitPatch = bytecodePatch( execute { onReadyFingerprint.method.apply { - val cmpIndex = onReadyFingerprint.patternMatch!!.startIndex + 1 + val cmpIndex = onReadyFingerprint.filterMatches.first().index + 1 val cmpResultRegister = getInstruction(cmpIndex).registerA replaceInstruction(cmpIndex, "const/4 v$cmpResultRegister, 0x0") diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt index 3e56ed7275..c0f06c9c51 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt @@ -54,7 +54,7 @@ val hideAdsPatch = bytecodePatch( // Prevent verification of an HTTP header containing the user's current plan, which would contradict the previous patch. - val conditionIndex = interceptFingerprint.patternMatch!!.endIndex + 1 + val conditionIndex = interceptFingerprint.filterMatches.last().index + 1 interceptFingerprint.method.addInstruction( conditionIndex, "return-object p1", diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt index 6444ff7fb5..2c9ec0f498 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt @@ -14,7 +14,7 @@ val onDemandPatch = bytecodePatch( // Spoof a premium account onDemandFingerprint.method.addInstruction( - onDemandFingerprint.patternMatch!!.endIndex - 1, + onDemandFingerprint.filterMatches.last().index - 1, "const/4 v0, 0x2", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt index e59660472d..d2889cd223 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt @@ -12,7 +12,7 @@ val unlockSubscriptionPatch = bytecodePatch( execute { getSubscribedFingerprint.method.replaceInstruction( - getSubscribedFingerprint.patternMatch!!.startIndex, + getSubscribedFingerprint.filterMatches.first().index, "const/4 v0, 0x1", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt index 73246fa216..795694f2d5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt @@ -52,7 +52,7 @@ val disableSubscriptionSuggestionsPatch = bytecodePatch( }, ) - val getModulesIndex = getModulesFingerprint.patternMatch!!.startIndex + val getModulesIndex = getModulesFingerprint.filterMatches.first().index with(originalMethod) { removeInstruction(getModulesIndex) addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt index c2da658aad..0bef2c3630 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt @@ -69,7 +69,7 @@ val overrideFeatureFlagsPatch = bytecodePatch( // This is equivalent to // String forcedValue = getValueOverride(feature) // if (forcedValue != null) return forcedValue - val getFeatureIndex = getFeatureValueFingerprint.patternMatch!!.startIndex + val getFeatureIndex = getFeatureValueFingerprint.filterMatches.first().index getFeatureValueFingerprint.method.addInstructionsWithLabels( getFeatureIndex, """ diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt index dbe75d5f8b..03b1500783 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt @@ -21,7 +21,7 @@ val fixOldVersionsPatch = bytecodePatch( // Remove the live query parameters from the path when it's specified via a @METHOD annotation. for (liveQueryParameter in liveQueryParameters) { httpPathParserFingerprint.method.addInstructions( - httpPathParserFingerprint.patternMatch!!.endIndex + 1, + httpPathParserFingerprint.filterMatches.last().index + 1, """ # urlPath = urlPath.replace(liveQueryParameter, "") const-string p1, "$liveQueryParameter" diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt index c4ab799e85..b11acb9adf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt @@ -24,7 +24,7 @@ val filterTimelineObjectsPatch = bytecodePatch( dependsOn(sharedExtensionPatch) execute { - val filterInsertIndex = timelineFilterExtensionFingerprint.patternMatch!!.startIndex + val filterInsertIndex = timelineFilterExtensionFingerprint.filterMatches.first().index timelineFilterExtensionFingerprint.method.apply { val addInstruction = getInstruction(filterInsertIndex + 1) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt index 56785cae4c..3a80c60777 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt @@ -22,7 +22,7 @@ fun addJsonHook( jsonHookPatchFingerprint.method.apply { // Insert hooks right before calling buildList. - val insertIndex = jsonHookPatchFingerprint.patternMatch!!.endIndex + val insertIndex = jsonHookPatchFingerprint.filterMatches.last().index addInstructions( insertIndex, @@ -77,7 +77,7 @@ val jsonHookPatch = bytecodePatch( finalize { // Remove hooks.add(dummyHook). jsonHookPatchFingerprint.method.apply { - val addDummyHookIndex = jsonHookPatchFingerprint.patternMatch!!.endIndex - 2 + val addDummyHookIndex = jsonHookPatchFingerprint.filterMatches.last().index - 2 removeInstructions(addDummyHookIndex, 2) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt index b0b2af45b6..e775fb3ec6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt @@ -45,7 +45,7 @@ val hideGetPremiumPatch = bytecodePatch( ) getPremiumViewFingerprint.method.apply { - val startIndex = getPremiumViewFingerprint.patternMatch!!.startIndex + val startIndex = getPremiumViewFingerprint.filterMatches.first().index val measuredWidthRegister = getInstruction(startIndex).registerA val measuredHeightInstruction = getInstruction(startIndex + 1) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index 4aaaead456..1830644c85 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -56,7 +56,7 @@ val enableSeekbarTappingPatch = bytecodePatch( put("O", getReference(patternMatch.endIndex)) } - val insertIndex = seekbarTappingFingerprint.patternMatch!!.endIndex - 1 + val insertIndex = seekbarTappingFingerprint.filterMatches.last().index - 1 seekbarTappingFingerprint.method.apply { val thisInstanceRegister = getInstruction(insertIndex - 1).registerC diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index 3bb10d5576..f5d34999e5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -59,7 +59,7 @@ val enableSlideToSeekPatch = bytecodePatch( // Restore the behaviour to slide to seek. - val checkIndex = slideToSeekFingerprint.patternMatch!!.startIndex + val checkIndex = slideToSeekFingerprint.filterMatches.first().index val checkReference = slideToSeekFingerprint.method.getInstruction(checkIndex) .getReference()!! @@ -93,7 +93,7 @@ val enableSlideToSeekPatch = bytecodePatch( disableFastForwardNoticeFingerprint, ).forEach { fingerprint -> fingerprint.method.apply { - val targetIndex = fingerprint.patternMatch!!.endIndex + val targetIndex = fingerprint.filterMatches.last().index val targetRegister = getInstruction(targetIndex).registerA addInstructions( @@ -107,7 +107,7 @@ val enableSlideToSeekPatch = bytecodePatch( } } else { disableFastForwardLegacyFingerprint.method.apply { - val insertIndex = disableFastForwardLegacyFingerprint.patternMatch!!.endIndex + 1 + val insertIndex = disableFastForwardLegacyFingerprint.filterMatches.last().index + 1 val targetRegister = getInstruction(insertIndex).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt index 4f56633177..baa372e872 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt @@ -75,7 +75,7 @@ val hideEndscreenCardsPatch = bytecodePatch( layoutVideoFingerprint, ).forEach { fingerprint -> fingerprint.method.apply { - val insertIndex = fingerprint.patternMatch!!.endIndex + 1 + val insertIndex = fingerprint.filterMatches.last().index + 1 val viewRegister = getInstruction(insertIndex - 1).registerA addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 7591304209..d66a3d204c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -248,7 +248,7 @@ val hideLayoutComponentsPatch = bytecodePatch( // region Mix playlists parseElementFromBufferFingerprint.method.apply { - val startIndex = parseElementFromBufferFingerprint.patternMatch!!.startIndex + val startIndex = parseElementFromBufferFingerprint.filterMatches.first().index // Target code is a mess with a lot of register moves. // There is no simple way to find a free register for all versions so this is hard coded. val freeRegister = if (is_19_47_or_greater) 6 else 0 @@ -296,7 +296,7 @@ val hideLayoutComponentsPatch = bytecodePatch( // region Show more button hideShowMoreButtonFingerprint.method.apply { - val moveRegisterIndex = hideShowMoreButtonFingerprint.patternMatch!!.endIndex + val moveRegisterIndex = hideShowMoreButtonFingerprint.filterMatches.last().index val viewRegister = getInstruction(moveRegisterIndex).registerA val insertIndex = moveRegisterIndex + 1 @@ -312,7 +312,7 @@ val hideLayoutComponentsPatch = bytecodePatch( // region crowdfunding box crowdfundingBoxFingerprint.let { it.method.apply { - val insertIndex = it.patternMatch!!.endIndex + val insertIndex = it.filterMatches.last().index val objectRegister = getInstruction(insertIndex).registerA addInstruction( @@ -329,7 +329,7 @@ val hideLayoutComponentsPatch = bytecodePatch( albumCardsFingerprint.let { it.method.apply { - val checkCastAnchorIndex = it.patternMatch!!.endIndex + val checkCastAnchorIndex = it.filterMatches.last().index val insertIndex = checkCastAnchorIndex + 1 val register = getInstruction(checkCastAnchorIndex).registerA @@ -347,7 +347,7 @@ val hideLayoutComponentsPatch = bytecodePatch( showFloatingMicrophoneButtonFingerprint.let { it.method.apply { - val startIndex = it.patternMatch!!.startIndex + val startIndex = it.filterMatches.first().index val register = getInstruction(startIndex).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index 2197bf69db..052c8206f0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -85,7 +85,7 @@ val hideInfoCardsPatch = bytecodePatch( val hideInfoCardsCallMethod = infocardsMethodCallFingerprint.method - val invokeInterfaceIndex = infocardsMethodCallFingerprint.patternMatch!!.endIndex + val invokeInterfaceIndex = infocardsMethodCallFingerprint.filterMatches.last().index val toggleRegister = infocardsMethodCallFingerprint.method.implementation!!.registerCount - 1 hideInfoCardsCallMethod.addInstructionsWithLabels( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt index b9c488c00f..e70a99b7e5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt @@ -68,7 +68,7 @@ val disableSuggestedVideoEndScreenPatch = bytecodePatch( execute { createEndScreenViewFingerprint.method.apply { - val addOnClickEventListenerIndex = createEndScreenViewFingerprint.patternMatch!!.endIndex - 1 + val addOnClickEventListenerIndex = createEndScreenViewFingerprint.filterMatches.last().index - 1 val viewRegister = getInstruction(addOnClickEventListenerIndex).registerC addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 68afe01e40..fc083a80d7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -172,7 +172,7 @@ val returnYouTubeDislikePatch = bytecodePatch( // region Hook for non-litho Short videos. shortsTextViewFingerprint.method.apply { - val insertIndex = shortsTextViewFingerprint.patternMatch!!.endIndex + 1 + val insertIndex = shortsTextViewFingerprint.filterMatches.last().index + 1 // If the field is true, the TextView is for a dislike button. val isDisLikesBooleanInstruction = instructions.first { instruction -> @@ -229,7 +229,7 @@ val returnYouTubeDislikePatch = bytecodePatch( // Do this last to allow patching old unsupported versions (if the user really wants), // On older unsupported version this will fail to match and throw an exception, // but everything will still work correctly anyway. - val dislikesIndex = rollingNumberSetterFingerprint.patternMatch!!.endIndex + val dislikesIndex = rollingNumberSetterFingerprint.filterMatches.last().index rollingNumberSetterFingerprint.method.apply { val insertIndex = 1 @@ -279,7 +279,7 @@ val returnYouTubeDislikePatch = bytecodePatch( rollingNumberMeasureStaticLabelFingerprint.match( rollingNumberMeasureStaticLabelParentFingerprint.originalClassDef, ).let { - val measureTextIndex = it.patternMatch!!.startIndex + 1 + val measureTextIndex = it.filterMatches.first().index + 1 it.method.apply { val freeRegister = getInstruction(0).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt index 5eaf7c83b1..448185867b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt @@ -76,7 +76,7 @@ val wideSearchbarPatch = bytecodePatch( mapOf( setWordmarkHeaderFingerprint to 1, - createSearchSuggestionsFingerprint to createSearchSuggestionsFingerprint.patternMatch!!.startIndex, + createSearchSuggestionsFingerprint to createSearchSuggestionsFingerprint.filterMatches.first().index, ).forEach { (fingerprint, callIndex) -> walkMutable(callIndex, fingerprint).injectSearchBarHook() } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt index 98d4ca6524..bf3a1e1aaa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt @@ -67,7 +67,7 @@ val shortsAutoplayPatch = bytecodePatch( val reelEnumClass = reelEnumConstructorFingerprint.originalClassDef.type reelEnumConstructorFingerprint.method.apply { - val insertIndex = reelEnumConstructorFingerprint.patternMatch!!.startIndex + val insertIndex = reelEnumConstructorFingerprint.filterMatches.first().index addInstructions( insertIndex, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index cae76cf498..1f3bfbb7cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -177,7 +177,7 @@ val sponsorBlockPatch = bytecodePatch( injectVisibilityCheckCall(EXTENSION_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR) // Append the new time to the player layout. - val appendTimePatternScanStartIndex = appendTimeFingerprint.patternMatch!!.startIndex + val appendTimePatternScanStartIndex = appendTimeFingerprint.filterMatches.first().index appendTimeFingerprint.method.apply { val register = getInstruction(appendTimePatternScanStartIndex + 1).registerA @@ -195,7 +195,7 @@ val sponsorBlockPatch = bytecodePatch( // Initialize the SponsorBlock view. controlsOverlayFingerprint.match(layoutConstructorFingerprint.originalClassDef).let { - val startIndex = it.patternMatch!!.startIndex + val startIndex = it.filterMatches.first().index it.method.apply { val frameLayoutRegister = (getInstruction(startIndex + 2) as OneRegisterInstruction).registerA addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index 5eccd583d6..029220e354 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -64,7 +64,7 @@ val spoofAppVersionPatch = bytecodePatch( } ) - val insertIndex = spoofAppVersionFingerprint.patternMatch!!.startIndex + 1 + val insertIndex = spoofAppVersionFingerprint.filterMatches.first().index + 1 val buildOverrideNameRegister = spoofAppVersionFingerprint.method.getInstruction(insertIndex - 1).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt index fdab6c4b8b..0e1ca1d67c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt @@ -12,7 +12,7 @@ val lithoColorHookPatch = bytecodePatch( execute { - var insertionIndex = lithoThemeFingerprint.patternMatch!!.endIndex - 1 + var insertionIndex = lithoThemeFingerprint.filterMatches.last().index - 1 lithoColorOverrideHook = { targetMethodClass, targetMethodName -> lithoThemeFingerprint.method.addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt index 3154b36681..a02e556f8b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt @@ -17,14 +17,14 @@ internal val fixBackToExitGesturePatch = bytecodePatch( recyclerViewTopScrollingFingerprint.match(recyclerViewTopScrollingParentFingerprint.originalClassDef) .let { it.method.addInstruction( - it.patternMatch!!.endIndex, + it.filterMatches.last().index, "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V" ) } scrollPositionFingerprint.let { navigate(it.originalMethod) - .to(it.patternMatch!!.startIndex + 1) + .to(it.filterMatches.first().index + 1) .stop().apply { val index = indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_VIRTUAL && getReference()?.definingClass == @@ -41,7 +41,7 @@ internal val fixBackToExitGesturePatch = bytecodePatch( onBackPressedFingerprint.let { it.method.addInstruction( - it.patternMatch!!.endIndex, + it.filterMatches.last().index, "invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->onBackPressed(Landroid/app/Activity;)V" ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt index 86588df099..fb91c31486 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt @@ -13,7 +13,7 @@ val recyclerViewTreeHookPatch = bytecodePatch { execute { recyclerViewTreeObserverFingerprint.method.apply { - val insertIndex = recyclerViewTreeObserverFingerprint.patternMatch!!.startIndex + 1 + val insertIndex = recyclerViewTreeObserverFingerprint.filterMatches.first().index + 1 val recyclerViewParameter = 2 addRecyclerViewTreeHook = { classDescriptor -> diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index a22934d1ca..2463ceb740 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -125,12 +125,12 @@ val videoInformationPatch = bytecodePatch( val videoLengthMethodMatch = videoLengthFingerprint.match(originalClassDef) videoLengthMethodMatch.method.apply { - val videoLengthRegisterIndex = videoLengthMethodMatch.patternMatch!!.endIndex - 2 + val videoLengthRegisterIndex = videoLengthMethodMatch.filterMatches.last().index - 2 val videoLengthRegister = getInstruction(videoLengthRegisterIndex).registerA val dummyRegisterForLong = videoLengthRegister + 1 // required for long values since they are wide addInstruction( - videoLengthMethodMatch.patternMatch!!.endIndex, + videoLengthMethodMatch.filterMatches.last().index, "invoke-static {v$videoLengthRegister, v$dummyRegisterForLong}, " + "$EXTENSION_CLASS_DESCRIPTOR->setVideoLength(J)V", ) @@ -159,7 +159,7 @@ val videoInformationPatch = bytecodePatch( * Set the video time method */ timeMethod = navigate(playerControllerSetTimeReferenceFingerprint.originalMethod) - .to(playerControllerSetTimeReferenceFingerprint.patternMatch!!.startIndex) + .to(playerControllerSetTimeReferenceFingerprint.filterMatches.first().index) .stop() /* diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index 3a4abc3b54..02c12e4732 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -133,7 +133,7 @@ val rememberVideoQualityPatch = bytecodePatch( // Remember video quality if not using old layout menu. newVideoQualityChangedFingerprint.method.apply { - val index = newVideoQualityChangedFingerprint.patternMatch!!.startIndex + val index = newVideoQualityChangedFingerprint.filterMatches.first().index val qualityRegister = getInstruction(index).registerA addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt index c5a24db458..9bf382f9a7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt @@ -95,7 +95,7 @@ val videoIdPatch = bytecodePatch( videoIdFingerprint.match(videoIdParentFingerprint.originalClassDef).let { it.method.apply { videoIdMethod = this - val index = it.filterMatches!!.first().index + val index = it.filterMatches.first().index videoIdRegister = getInstruction(index + 1).registerA videoIdInsertIndex = index + 2 } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt index fefe03a69a..937316c3b7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt @@ -92,7 +92,7 @@ val restoreOldVideoQualityMenuPatch = bytecodePatch( // and for the Shorts quality flyout on newer app versions. videoQualityMenuViewInflateFingerprint.method.apply { - val checkCastIndex = videoQualityMenuViewInflateFingerprint.patternMatch!!.endIndex + val checkCastIndex = videoQualityMenuViewInflateFingerprint.filterMatches.last().index val listViewRegister = getInstruction(checkCastIndex).registerA addInstruction( From f3b86029150d7a1d16344826d37d0009e7156f63 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 3 Jan 2025 22:00:19 +0100 Subject: [PATCH 09/64] Simplify --- patches/api/patches.api | 2 +- .../patches/shared/misc/mapping/ResourceMappingPatch.kt | 2 -- .../app/revanced/patches/twitch/ad/shared/util/AdPatch.kt | 8 ++++---- .../patches/youtube/misc/playertype/Fingerprints.kt | 5 ++--- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 0602b5ec82..eb4cc5f36d 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -599,7 +599,7 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceElement { public final class app/revanced/patches/shared/misc/mapping/ResourceMappingFilter : app/revanced/patcher/InstructionFilter { public fun (Ljava/lang/String;Ljava/lang/String;I)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun matches (Lapp/revanced/patcher/patch/BytecodePatchContext;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Z + public fun matches (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Z } public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index f607091239..8cdd21a680 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -2,7 +2,6 @@ package app.revanced.patches.shared.misc.mapping import app.revanced.patcher.InstructionFilter import app.revanced.patcher.LiteralFilter -import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.resourcePatch import com.android.tools.smali.dexlib2.iface.Method @@ -35,7 +34,6 @@ class ResourceMappingFilter( } override fun matches( - context: BytecodePatchContext, method: Method, instruction: Instruction, methodIndex: Int diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt index 48ecefba8e..da97b9d41c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt @@ -3,7 +3,7 @@ package app.revanced.patches.twitch.ad.shared.util import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatchBuilder -import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.patch.BytecodePatchContext.classBy import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.smali.ExternalLabel @@ -12,7 +12,7 @@ fun adPatch( skipLabelName: String, block: BytecodePatchBuilder.( createConditionInstructions: (register: String) -> String, - blockMethods: BytecodePatchContext.( + blockMethods: ( clazz: String, methodNames: Set, returnMethod: ReturnMethod, @@ -25,7 +25,7 @@ fun adPatch( if-eqz $register, :$skipLabelName """ - fun BytecodePatchContext.blockMethods( + fun blockMethods( classDefType: String, methodNames: Set, returnMethod: ReturnMethod, @@ -57,7 +57,7 @@ fun adPatch( true } - block(::createConditionInstructions, BytecodePatchContext::blockMethods) + block(::createConditionInstructions, ::blockMethods) } class ReturnMethod(val returnType: Char, val value: String) { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt index ace852d206..e424b5b656 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt @@ -3,7 +3,6 @@ package app.revanced.patches.youtube.misc.playertype import app.revanced.patcher.FieldFilter import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint -import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -40,8 +39,8 @@ internal val videoStateFingerprint by fingerprint { LiteralFilter(0), // Obfuscated parameter field name. FieldFilter( - definingClass = { "Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;"}, - type = { context: BytecodePatchContext -> with(context) { videoStateEnumFingerprint.originalClassDef.type } }, + definingClass = { "Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;" }, + type = { videoStateEnumFingerprint.originalClassDef.type }, maxInstructionsBefore = 5 ) ) From d2fbbf548ae4faee753722e4b97334478c0f21de Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 3 Jan 2025 22:59:13 +0100 Subject: [PATCH 10/64] refactor: Simplify with class (parent) fingerprint --- ...oreHiddenBackUpWhileChargingTogglePatch.kt | 2 +- .../restrictions/RemoveDeviceRestrictions.kt | 2 +- .../patches/music/misc/spoof/Fingerprints.kt | 1 + .../music/misc/spoof/SpoofClientPatch.kt | 29 ++++++++++--------- .../baconreader/api/SpoofClientPatch.kt | 2 +- .../FixAudioMissingInDownloadsPatch.kt | 2 +- .../redditisfun/api/SpoofClientPatch.kt | 2 +- .../relayforreddit/api/SpoofClientPatch.kt | 2 +- .../sync/syncforreddit/api/Fingerprints.kt | 1 + .../syncforreddit/api/SpoofClientPatch.kt | 6 ++-- .../fix/user/UseUserEndpointPatch.kt | 2 +- .../fix/video/FixVideoDownloadsPatch.kt | 2 +- .../misc/spoof/SpoofVideoStreamsPatch.kt | 6 ++-- .../downloads/UnlockDownloadsPatch.kt | 4 +-- .../links/ChangeLinkSharingDomainPatch.kt | 2 +- .../DisablePreciseSeekingGesturePatch.kt | 9 ++---- .../seekbar/EnableSeekbarTappingPatch.kt | 2 +- .../interaction/seekbar/Fingerprints.kt | 2 ++ .../layout/hide/general/Fingerprints.kt | 1 + .../hide/general/HideLayoutComponentsPatch.kt | 7 ++--- .../layout/hide/infocards/Fingerprints.kt | 1 + .../hide/infocards/HideInfoCardsPatch.kt | 2 +- .../DisableRollingNumberAnimationPatch.kt | 2 +- .../layout/hide/seekbar/HideSeekbarPatch.kt | 3 +- .../layout/hide/shorts/Fingerprints.kt | 1 + .../hide/shorts/HideShortsComponentsPatch.kt | 8 ++--- .../youtube/layout/miniplayer/Fingerprints.kt | 8 +++++ .../layout/miniplayer/MiniplayerPatch.kt | 18 ++++-------- .../player/fullscreen/ExitFullscreenPatch.kt | 3 +- .../returnyoutubedislike/Fingerprints.kt | 2 ++ .../ReturnYouTubeDislikePatch.kt | 7 ++--- .../layout/seekbar/SeekbarColorPatch.kt | 2 +- .../layout/sponsorblock/Fingerprints.kt | 4 +++ .../layout/sponsorblock/SponsorBlockPatch.kt | 10 +++---- .../misc/autorepeat/AutoRepeatPatch.kt | 2 +- .../misc/debugging/EnableDebuggingPatch.kt | 16 +++------- .../youtube/misc/debugging/Fingerprints.kt | 4 +++ .../fix/backtoexitgesture/Fingerprints.kt | 1 + .../FixBackToExitGesturePatch.kt | 13 ++++----- .../misc/imageurlhook/CronetImageUrlHook.kt | 11 ++----- .../youtube/misc/imageurlhook/Fingerprints.kt | 3 ++ .../youtube/misc/navigation/Fingerprints.kt | 1 + .../misc/navigation/NavigationBarHookPatch.kt | 2 +- .../misc/playercontrols/Fingerprints.kt | 1 + .../playercontrols/PlayerControlsPatch.kt | 4 +-- .../RemoveTrackingQueryParameterPatch.kt | 2 +- .../patches/youtube/shared/Fingerprints.kt | 3 ++ .../youtube/video/information/Fingerprints.kt | 5 ++++ .../information/VideoInformationPatch.kt | 22 +++++--------- .../youtube/video/quality/Fingerprints.kt | 1 + .../quality/RememberVideoQualityPatch.kt | 4 +-- .../speed/custom/CustomPlaybackSpeedPatch.kt | 4 +-- .../video/speed/custom/Fingerprints.kt | 1 + .../youtube/video/videoid/Fingerprints.kt | 1 + .../youtube/video/videoid/VideoIdPatch.kt | 6 ++-- .../RestoreOldVideoQualityMenuPatch.kt | 2 +- 56 files changed, 132 insertions(+), 134 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatch.kt index 04fe297156..c3e892b7fe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatch.kt @@ -14,7 +14,7 @@ val restoreHiddenBackUpWhileChargingTogglePatch = bytecodePatch( execute { // Patches 'backup_prefs_had_backup_only_when_charging_enabled' to always be true. - val chargingPrefStringIndex = backupPreferencesFingerprint.stringMatches!!.first().index + val chargingPrefStringIndex = backupPreferencesFingerprint.stringMatches.first().index backupPreferencesFingerprint.method.apply { // Get the register of move-result. val resultRegister = getInstruction(chargingPrefStringIndex + 2).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions.kt b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions.kt index bd6921bfb0..6aec4c6000 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions.kt @@ -14,7 +14,7 @@ val removeDeviceRestrictionsPatch = bytecodePatch( compatibleWith("com.google.android.apps.recorder") execute { - val featureStringIndex = onApplicationCreateFingerprint.stringMatches!!.first().index + val featureStringIndex = onApplicationCreateFingerprint.stringMatches.first().index onApplicationCreateFingerprint.method.apply { // Remove check for device restrictions. diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt index 22cf63b849..59d2f47b8d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt @@ -13,6 +13,7 @@ internal val playerRequestConstructorFingerprint by fingerprint { * Matches using the class found in [playerRequestConstructorFingerprint]. */ internal val createPlayerRequestBodyFingerprint by fingerprint { + classFingerprint(playerRequestConstructorFingerprint) parameters("L") returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt index ad03ded018..3588c0f1cb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt @@ -36,27 +36,26 @@ val spoofClientPatch = bytecodePatch( execute { val playerRequestClass = playerRequestConstructorFingerprint.classDef - val createPlayerRequestBodyMatch = createPlayerRequestBodyFingerprint.match(playerRequestClass) - - val clientInfoContainerClass = createPlayerRequestBodyMatch.method - .getInstruction(createPlayerRequestBodyMatch.filterMatches.first().index) + val clientInfoContainerClass = createPlayerRequestBodyFingerprint.method + .getInstruction(createPlayerRequestBodyFingerprint.filterMatches.first().index) .getReference()!!.type val clientInfoField = setClientInfoClientVersionFingerprint.method.instructions.first { it.opcode == Opcode.IPUT_OBJECT && it.getReference()!!.definingClass == clientInfoContainerClass }.getReference()!! - val setClientInfoFieldInstructions = setClientInfoFieldsFingerprint.method.instructions.filter { - (it.opcode == Opcode.IPUT_OBJECT || it.opcode == Opcode.IPUT) && - it.getReference()!!.definingClass == clientInfoField.type - }.map { it.getReference()!! } + val setClientInfoFieldInstructions = + setClientInfoFieldsFingerprint.method.instructions.filter { + (it.opcode == Opcode.IPUT_OBJECT || it.opcode == Opcode.IPUT) && + it.getReference()!!.definingClass == clientInfoField.type + }.map { it.getReference()!! } // Offsets are known for the fields in the clientInfo object. val clientIdField = setClientInfoFieldInstructions[0] val clientModelField = setClientInfoFieldInstructions[5] val osVersionField = setClientInfoFieldInstructions[7] val clientVersionField = setClientInfoClientVersionFingerprint.method - .getInstruction(setClientInfoClientVersionFingerprint.stringMatches!!.first().index + 1) + .getInstruction(setClientInfoClientVersionFingerprint.stringMatches.first().index + 1) .getReference() // Helper method to spoof the client info. @@ -95,11 +94,15 @@ val spoofClientPatch = bytecodePatch( ) } - createPlayerRequestBodyMatch.method.apply { - val checkCastIndex = createPlayerRequestBodyMatch.filterMatches.first().index - val clientInfoContainerRegister = getInstruction(checkCastIndex).registerA + createPlayerRequestBodyFingerprint.method.apply { + val checkCastIndex = createPlayerRequestBodyFingerprint.filterMatches.first().index + val clientInfoContainerRegister = + getInstruction(checkCastIndex).registerA - addInstruction(checkCastIndex + 1, "invoke-static {v$clientInfoContainerRegister}, $spoofClientInfoMethod") + addInstruction( + checkCastIndex + 1, + "invoke-static {v$clientInfoContainerRegister}, $spoofClientInfoMethod" + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt index d9cfa994f5..35aacc6876 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt @@ -16,7 +16,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "http://baconreader.com/au execute { fun Fingerprint.patch(replacementString: String) { - val clientIdIndex = stringMatches!!.first().index + val clientIdIndex = stringMatches.first().index method.apply { val clientIdRegister = getInstruction(clientIdIndex).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch.kt index 8cb3f55186..c5b548f93f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch.kt @@ -19,7 +19,7 @@ val fixAudioMissingInDownloadsPatch = bytecodePatch( ) downloadAudioFingerprint.method.apply { - downloadAudioFingerprint.stringMatches!!.forEach { match -> + downloadAudioFingerprint.stringMatches.forEach { match -> val replacement = endpointReplacements[match.string] val register = getInstruction(match.index).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch.kt index 440b1fe2a9..2a30b87b56 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch.kt @@ -34,7 +34,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "redditisfun://auth") { cl string: String, getReplacementIndex: List.() -> Int, ) = method.apply { - val replacementIndex = stringMatches!!.getReplacementIndex() + val replacementIndex = stringMatches.getReplacementIndex() val clientIdRegister = getInstruction(replacementIndex).registerA replaceInstruction(replacementIndex, "const-string v$clientIdRegister, \"$string\"") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt index f35bb9137e..9d66e66614 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt @@ -26,7 +26,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "dbrady://relay") { getLoggedOutBearerTokenFingerprint, getRefreshTokenFingerprint, ).forEach { fingerprint -> - val clientIdIndex = fingerprint.stringMatches!!.first().index + val clientIdIndex = fingerprint.stringMatches.first().index fingerprint.method.apply { val clientIdRegister = getInstruction(clientIdIndex).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt index 41e7d5f928..baeaab35e8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt @@ -7,6 +7,7 @@ internal val getAuthorizationStringFingerprint by fingerprint { } internal val getBearerTokenFingerprint by fingerprint { + classFingerprint(getAuthorizationStringFingerprint) strings("Basic") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt index 481d9c3d1e..804931adcc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt @@ -26,7 +26,7 @@ val spoofClientPatch = spoofClientPatch( execute { // region Patch client id. - getBearerTokenFingerprint.match(getAuthorizationStringFingerprint.originalClassDef).method.apply { + getBearerTokenFingerprint.method.apply { val auth = Base64.getEncoder().encodeToString("$clientId:".toByteArray(Charsets.UTF_8)) addInstructions( 0, @@ -36,7 +36,7 @@ val spoofClientPatch = spoofClientPatch( """, ) val occurrenceIndex = - getAuthorizationStringFingerprint.stringMatches!!.first().index + getAuthorizationStringFingerprint.stringMatches.first().index getAuthorizationStringFingerprint.method.apply { val authorizationStringInstruction = getInstruction(occurrenceIndex) @@ -75,7 +75,7 @@ val spoofClientPatch = spoofClientPatch( // region Patch Imgur API URL. - val apiUrlIndex = imgurImageAPIFingerprint.stringMatches!!.first().index + val apiUrlIndex = imgurImageAPIFingerprint.stringMatches.first().index imgurImageAPIFingerprint.method.replaceInstruction( apiUrlIndex, "const-string v1, \"https://api.imgur.com/3/image\"", diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/UseUserEndpointPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/UseUserEndpointPatch.kt index 2d46c284c5..073445aa38 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/UseUserEndpointPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/UseUserEndpointPatch.kt @@ -29,7 +29,7 @@ val useUserEndpointPatch = bytecodePatch( oAuthUserIdRequestFingerprint, oAuthUserInfoRequestFingerprint, ).map { fingerprint -> - fingerprint.stringMatches!!.first().index to fingerprint.method + fingerprint.stringMatches.first().index to fingerprint.method }.forEach { (userPathStringIndex, method) -> val userPathStringInstruction = method.getInstruction(userPathStringIndex) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt index 64c33f308b..b7e9f5b1a8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt @@ -24,7 +24,7 @@ val fixVideoDownloadsPatch = bytecodePatch( ) execute { - val scanResult = parseRedditVideoNetworkResponseFingerprint.patternMatch!! + val scanResult = parseRedditVideoNetworkResponseFingerprint.patternMatch val newInstanceIndex = scanResult.startIndex val invokeDirectIndex = scanResult.endIndex - 1 diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index a15b8aada9..73c04f08c6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -66,7 +66,7 @@ fun spoofVideoStreamsPatch( // region Block /get_watch requests to fall back to /player requests. - val invokeToStringIndex = buildPlayerRequestURIFingerprint.patternMatch.startIndex + val invokeToStringIndex = buildPlayerRequestURIFingerprint.filterMatches.first().index buildPlayerRequestURIFingerprint.method.apply { val uriRegister = getInstruction(invokeToStringIndex).registerC @@ -107,7 +107,7 @@ fun spoofVideoStreamsPatch( createStreamingDataFingerprint.method.apply { val setStreamDataMethodName = "patch_setStreamingData" val resultMethodType = createStreamingDataFingerprint.classDef.type - val videoDetailsIndex = createStreamingDataFingerprint.patternMatch.endIndex + val videoDetailsIndex = createStreamingDataFingerprint.filterMatches.last().index val videoDetailsRegister = getInstruction(videoDetailsIndex).registerA val videoDetailsClass = getInstruction(videoDetailsIndex).getReference()!!.type @@ -118,7 +118,7 @@ fun spoofVideoStreamsPatch( ) val protobufClass = protobufClassParseByteBufferFingerprint.method.definingClass - val setStreamingDataIndex = createStreamingDataFingerprint.patternMatch.startIndex + val setStreamingDataIndex = createStreamingDataFingerprint.filterMatches.first().index val playerProtoClass = getInstruction(setStreamingDataIndex + 1) .getReference()!!.definingClass diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt index 6f2b9c12c7..e08854a238 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt @@ -27,7 +27,7 @@ val unlockDownloadsPatch = bytecodePatch( // Allow downloads for non-premium users. showDownloadVideoUpsellBottomSheetFingerprint.patch { - val checkIndex = patternMatch!!.startIndex + val checkIndex = patternMatch.startIndex val register = method.getInstruction(checkIndex).registerA checkIndex to register @@ -42,7 +42,7 @@ val unlockDownloadsPatch = bytecodePatch( } // Make GIFs downloadable. - val patternMatch = buildMediaOptionsSheetFingerprint.patternMatch!! + val patternMatch = buildMediaOptionsSheetFingerprint.patternMatch buildMediaOptionsSheetFingerprint.method.apply { val checkMediaTypeIndex = patternMatch.startIndex val checkMediaTypeInstruction = getInstruction(checkMediaTypeIndex) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt index 6780f25aa8..4e42200ade 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt @@ -49,7 +49,7 @@ val changeLinkSharingDomainPatch = bytecodePatch( execute { val replacementIndex = - linkSharingDomainFingerprint.stringMatches!!.first().index + linkSharingDomainFingerprint.stringMatches.first().index val domainRegister = linkSharingDomainFingerprint.method.getInstruction(replacementIndex).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt index 20653ce2e3..9dbb4ada65 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt @@ -44,9 +44,7 @@ val disablePreciseSeekingGesturePatch = bytecodePatch( val extensionMethodDescriptor = "Lapp/revanced/extension/youtube/patches/DisablePreciseSeekingGesturePatch;" - allowSwipingUpGestureFingerprint.match( - swipingUpGestureParentFingerprint.originalClassDef, - ).method.apply { + allowSwipingUpGestureFingerprint.method.apply{ addInstructionsWithLabels( 0, """ @@ -59,9 +57,8 @@ val disablePreciseSeekingGesturePatch = bytecodePatch( ) } - showSwipingUpGuideFingerprint.match( - swipingUpGestureParentFingerprint.originalClassDef, - ).method.apply { + + showSwipingUpGuideFingerprint.method.apply { addInstructionsWithLabels( 0, """ diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index 1830644c85..917fb47b23 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -46,7 +46,7 @@ val enableSeekbarTappingPatch = bytecodePatch( ) // Find the required methods to tap the seekbar. - val patternMatch = onTouchEventHandlerFingerprint.patternMatch!! + val patternMatch = onTouchEventHandlerFingerprint.patternMatch fun getReference(index: Int) = onTouchEventHandlerFingerprint.method.getInstruction(index) .reference as MethodReference diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt index fd957739ce..65a4564933 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt @@ -19,6 +19,7 @@ internal val swipingUpGestureParentFingerprint by fingerprint { * Resolves using the class found in [swipingUpGestureParentFingerprint]. */ internal val showSwipingUpGuideFingerprint by fingerprint { + classFingerprint(swipingUpGestureParentFingerprint) accessFlags(AccessFlags.FINAL) returns("Z") parameters() @@ -29,6 +30,7 @@ internal val showSwipingUpGuideFingerprint by fingerprint { * Resolves using the class found in [swipingUpGestureParentFingerprint]. */ internal val allowSwipingUpGestureFingerprint by fingerprint { + classFingerprint(swipingUpGestureParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 2a5abaa9ef..128c9d77f8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -32,6 +32,7 @@ internal val playerOverlayFingerprint by fingerprint { } internal val showWatermarkFingerprint by fingerprint { + classFingerprint(playerOverlayFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index d66a3d204c..473243dc8d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -276,9 +276,7 @@ val hideLayoutComponentsPatch = bytecodePatch( // region Watermark (legacy code for old versions of YouTube) - showWatermarkFingerprint.match( - playerOverlayFingerprint.originalClassDef, - ).method.apply { + showWatermarkFingerprint.method.apply { val index = implementation!!.instructions.size - 5 removeInstruction(index) @@ -399,8 +397,7 @@ val hideLayoutComponentsPatch = bytecodePatch( hookRegisterOffset: Int = 0, instructions: (Int) -> String, ) = method.apply { - val endIndex = patternMatch!!.endIndex - + val endIndex = patternMatch.endIndex val insertIndex = endIndex + insertIndexOffset val register = getInstruction(endIndex + hookRegisterOffset).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt index c158243759..fbde3f5da7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt @@ -6,6 +6,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal val infocardsIncognitoFingerprint by fingerprint { + classFingerprint(infocardsIncognitoParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/Boolean;") parameters("L", "J") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index 052c8206f0..b19d91b56c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -70,7 +70,7 @@ val hideInfoCardsPatch = bytecodePatch( ) execute { - infocardsIncognitoFingerprint.match(infocardsIncognitoParentFingerprint.originalClassDef).method.apply { + infocardsIncognitoFingerprint.method.apply { val invokeInstructionIndex = implementation!!.instructions.indexOfFirst { it.opcode.ordinal == Opcode.INVOKE_VIRTUAL.ordinal && ((it as ReferenceInstruction).reference.toString() == "Landroid/view/View;->setVisibility(I)V") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index 8dac00f2cb..8edd88a884 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -51,7 +51,7 @@ val disableRollingNumberAnimationPatch = bytecodePatch( // Animations are disabled by preventing an Image from being applied to the text span, // which prevents the animations from appearing. - val patternMatch = rollingNumberTextViewAnimationUpdateFingerprint.patternMatch!! + val patternMatch = rollingNumberTextViewAnimationUpdateFingerprint.patternMatch val blockStartIndex = patternMatch.startIndex val blockEndIndex = patternMatch.endIndex + 1 rollingNumberTextViewAnimationUpdateFingerprint.method.apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt index 52d128592b..fb7509c508 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt @@ -9,7 +9,6 @@ import app.revanced.patches.youtube.layout.seekbar.seekbarColorPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.seekbarFingerprint import app.revanced.patches.youtube.shared.seekbarOnDrawFingerprint val hideSeekbarPatch = bytecodePatch( @@ -45,7 +44,7 @@ val hideSeekbarPatch = bytecodePatch( SwitchPreference("revanced_hide_seekbar_thumbnail"), ) - seekbarOnDrawFingerprint.match(seekbarFingerprint.originalClassDef).method.addInstructionsWithLabels( + seekbarOnDrawFingerprint.method.addInstructionsWithLabels( 0, """ const/4 v0, 0x0 diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt index 71a2f1544e..2721c030ca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt @@ -74,6 +74,7 @@ internal val renderBottomNavigationBarParentFingerprint by fingerprint { } internal val setPivotBarVisibilityFingerprint by fingerprint { + classFingerprint(setPivotBarVisibilityParentFingerprint) accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 6b77b2ebb9..c17b70f96b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -207,11 +207,9 @@ val hideShortsComponentsPatch = bytecodePatch( // region Hide the navigation bar. // Hook to get the pivotBar view. - setPivotBarVisibilityFingerprint.match( - setPivotBarVisibilityParentFingerprint.originalClassDef, - ).let { result -> - result.method.apply { - val insertIndex = result.patternMatch.endIndex + setPivotBarVisibilityFingerprint.let { + it.method.apply { + val insertIndex = it.filterMatches.last().index val viewRegister = getInstruction(insertIndex - 1).registerA addInstruction( insertIndex, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 549ecdf505..f66fae956a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -22,6 +22,7 @@ internal val miniplayerDimensionsCalculatorParentFingerprint by fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ internal val miniplayerModernAddViewListenerFingerprint by fingerprint { + classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;") @@ -32,6 +33,7 @@ internal val miniplayerModernAddViewListenerFingerprint by fingerprint { */ internal val miniplayerModernCloseButtonFingerprint by fingerprint { + classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() @@ -64,6 +66,7 @@ internal val miniplayerOnCloseHandlerFingerprint by fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ internal val miniplayerModernExpandButtonFingerprint by fingerprint { + classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() @@ -74,6 +77,7 @@ internal val miniplayerModernExpandButtonFingerprint by fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ internal val miniplayerModernExpandCloseDrawablesFingerprint by fingerprint { + classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") @@ -84,6 +88,7 @@ internal val miniplayerModernExpandCloseDrawablesFingerprint by fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ internal val miniplayerModernForwardButtonFingerprint by fingerprint { + classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() @@ -94,6 +99,7 @@ internal val miniplayerModernForwardButtonFingerprint by fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ internal val miniplayerModernOverlayViewFingerprint by fingerprint { + classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -104,6 +110,7 @@ internal val miniplayerModernOverlayViewFingerprint by fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ internal val miniplayerModernRewindButtonFingerprint by fingerprint { + classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() @@ -133,6 +140,7 @@ internal val miniplayerOverrideFingerprint by fingerprint { } internal val miniplayerOverrideNoContextFingerprint by fingerprint { + classFingerprint(miniplayerDimensionsCalculatorParentFingerprint) accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Z") opcodes(Opcode.IGET_BOOLEAN) // Anchor to insert the instruction. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 3ea37a6eb1..04ad9fa335 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -312,9 +312,7 @@ val miniplayerPatch = bytecodePatch( // region Enable tablet miniplayer. - miniplayerOverrideNoContextFingerprint.match( - miniplayerDimensionsCalculatorParentFingerprint.originalClassDef, - ).method.apply { + miniplayerOverrideNoContextFingerprint.method.apply { findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride(index) } } @@ -327,7 +325,7 @@ val miniplayerPatch = bytecodePatch( } miniplayerResponseModelSizeCheckFingerprint.let { - it.method.insertLegacyTabletMiniplayerOverride(it.patternMatch.endIndex) + it.method.insertLegacyTabletMiniplayerOverride(it.filterMatches.last().index) } // endregion @@ -428,9 +426,7 @@ val miniplayerPatch = bytecodePatch( // YT fixed this mistake in 19.17. // Fix this, by swapping the drawable resource values with each other. if (ytOutlinePictureInPictureWhite24 >= 0) { - miniplayerModernExpandCloseDrawablesFingerprint.match( - miniplayerModernViewParentFingerprint.originalClassDef, - ).method.apply { + miniplayerModernExpandCloseDrawablesFingerprint.method.apply { listOf( ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, ytOutlineXWhite24 to ytOutlinePictureInPictureWhite24, @@ -474,18 +470,14 @@ val miniplayerPatch = bytecodePatch( "adjustMiniplayerOpacity", ), ).forEach { (fingerprint, literalValue, methodName) -> - fingerprint.match( - miniplayerModernViewParentFingerprint.classDef, - ).method.hookInflatedView( + fingerprint.method.hookInflatedView( literalValue, "Landroid/widget/ImageView;", "$EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/widget/ImageView;)V", ) } - miniplayerModernAddViewListenerFingerprint.match( - miniplayerModernViewParentFingerprint.classDef, - ).method.addInstruction( + miniplayerModernAddViewListenerFingerprint.method.addInstruction( 0, "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->" + "hideMiniplayerSubTexts(Landroid/view/View;)V", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt index 105494a221..ac45679318 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt @@ -10,7 +10,6 @@ import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.autoRepeatFingerprint -import app.revanced.patches.youtube.shared.autoRepeatParentFingerprint import app.revanced.util.addInstructionsAtControlFlowLabel @Suppress("unused") @@ -57,7 +56,7 @@ internal val exitFullscreenPatch = bytecodePatch( ) ) - autoRepeatFingerprint.match(autoRepeatParentFingerprint.originalClassDef).method.apply { + autoRepeatFingerprint.method.apply { addInstructionsAtControlFlowLabel( implementation!!.instructions.lastIndex, "invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->endOfVideoReached()V", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt index 747ec7bc40..66d306d57d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt @@ -53,6 +53,7 @@ internal val rollingNumberMeasureAnimatedTextFingerprint by fingerprint { * Matches to class found in [rollingNumberMeasureStaticLabelParentFingerprint]. */ internal val rollingNumberMeasureStaticLabelFingerprint by fingerprint { + classFingerprint(rollingNumberMeasureStaticLabelParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("F") parameters("Ljava/lang/String;") @@ -130,6 +131,7 @@ internal val textComponentDataFingerprint by fingerprint { * Matches against the same class found in [textComponentConstructorFingerprint]. */ internal val textComponentLookupFingerprint by fingerprint { + classFingerprint(textComponentConstructorFingerprint) accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index fc083a80d7..066b6864e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -115,7 +115,6 @@ val returnYouTubeDislikePatch = bytecodePatch( it.type == conversionContextFingerprint.originalClassDef.type } ?: throw PatchException("Could not find conversion context field") - textComponentLookupFingerprint.match(textComponentConstructorFingerprint.originalClassDef) textComponentLookupFingerprint.method.apply { // Find the instruction for creating the text data object. val textDataClassType = textComponentDataFingerprint.originalClassDef.type @@ -258,7 +257,7 @@ val returnYouTubeDislikePatch = bytecodePatch( // Rolling Number text views use the measured width of the raw string for layout. // Modify the measure text calculation to include the left drawable separator if needed. - val patternMatch = rollingNumberMeasureAnimatedTextFingerprint.patternMatch!! + val patternMatch = rollingNumberMeasureAnimatedTextFingerprint.patternMatch // Additional check to verify the opcodes are at the start of the method if (patternMatch.startIndex != 0) throw PatchException("Unexpected opcode location") val endIndex = patternMatch.endIndex @@ -276,9 +275,7 @@ val returnYouTubeDislikePatch = bytecodePatch( // Additional text measurement method. Used if YouTube decides not to animate the likes count // and sometimes used for initial video load. - rollingNumberMeasureStaticLabelFingerprint.match( - rollingNumberMeasureStaticLabelParentFingerprint.originalClassDef, - ).let { + rollingNumberMeasureStaticLabelFingerprint.let { val measureTextIndex = it.filterMatches.first().index + 1 it.method.apply { val freeRegister = getInstruction(0).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index 8b877d446b..ff1d6e953d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -208,7 +208,7 @@ val seekbarColorPatch = bytecodePatch( } setSeekbarClickedColorFingerprint.originalMethod.let { - val setColorMethodIndex = setSeekbarClickedColorFingerprint.patternMatch.startIndex + 1 + val setColorMethodIndex = setSeekbarClickedColorFingerprint.filterMatches.first().index + 1 navigate(it).to(setColorMethodIndex).stop().apply { val colorRegister = getInstruction(0).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt index 421b608596..803103102e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt @@ -1,6 +1,8 @@ package app.revanced.patches.youtube.layout.sponsorblock import app.revanced.patcher.fingerprint +import app.revanced.patches.youtube.shared.layoutConstructorFingerprint +import app.revanced.patches.youtube.shared.seekbarFingerprint import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionReversed import com.android.tools.smali.dexlib2.AccessFlags @@ -32,6 +34,7 @@ internal val appendTimeFingerprint by fingerprint { } internal val controlsOverlayFingerprint by fingerprint { + classFingerprint(layoutConstructorFingerprint) returns("V") accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) parameters() @@ -50,6 +53,7 @@ internal val controlsOverlayFingerprint by fingerprint { } internal val rectangleFieldInvalidatorFingerprint by fingerprint { + classFingerprint(seekbarFingerprint) returns("V") parameters() custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index 1f3bfbb7cf..a3371e6c68 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -132,7 +132,7 @@ val sponsorBlockPatch = bytecodePatch( ) // Seekbar drawing - seekbarOnDrawFingerprint.match(seekbarFingerprint.originalClassDef).method.apply { + seekbarOnDrawFingerprint.method.apply { // Get left and right of seekbar rectangle. val moveRectangleToRegisterIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_OBJECT_FROM16) @@ -194,7 +194,7 @@ val sponsorBlockPatch = bytecodePatch( onCreateHook(EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR, "initialize") // Initialize the SponsorBlock view. - controlsOverlayFingerprint.match(layoutConstructorFingerprint.originalClassDef).let { + controlsOverlayFingerprint.let { val startIndex = it.filterMatches.first().index it.method.apply { val frameLayoutRegister = (getInstruction(startIndex + 2) as OneRegisterInstruction).registerA @@ -206,7 +206,7 @@ val sponsorBlockPatch = bytecodePatch( } // Set seekbar draw rectangle. - rectangleFieldInvalidatorFingerprint.match(seekbarFingerprint.originalClassDef).method.apply { + rectangleFieldInvalidatorFingerprint.method.apply { val invalidateIndex = indexOfInvalidateInstruction(this) val rectangleIndex = indexOfFirstInstructionReversedOrThrow(invalidateIndex + 1) { getReference()?.type == "Landroid/graphics/Rect;" @@ -216,7 +216,7 @@ val sponsorBlockPatch = bytecodePatch( segmentPlaybackControllerFingerprint.let { it.method.apply { - val replaceIndex = it.patternMatch.startIndex + val replaceIndex = it.filterMatches.first().index val replaceRegister = getInstruction(replaceIndex).registerA @@ -231,7 +231,7 @@ val sponsorBlockPatch = bytecodePatch( // The vote and create segment buttons automatically change their visibility when appropriate, // but if buttons are showing when the end of the video is reached then they will not automatically hide. // Add a hook to forcefully hide when the end of the video is reached. - autoRepeatFingerprint.match(autoRepeatParentFingerprint.originalClassDef).method.addInstruction( + autoRepeatFingerprint.method.addInstruction( 0, "invoke-static {}, $EXTENSION_SPONSORBLOCK_VIEW_CONTROLLER_CLASS_DESCRIPTOR->endOfVideoReached()V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt index 9953f5fc82..c79595c24e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt @@ -43,7 +43,7 @@ val autoRepeatPatch = bytecodePatch( SwitchPreference("revanced_auto_repeat"), ) - autoRepeatFingerprint.match(autoRepeatParentFingerprint.originalClassDef).method.apply { + autoRepeatFingerprint.method.apply { val playMethod = autoRepeatParentFingerprint.method val index = instructions.lastIndex diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt index cebfd6b5ee..5a25974459 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt @@ -61,9 +61,7 @@ val enableDebuggingPatch = bytecodePatch( ) // Hook the methods that look up if a feature flag is active. - experimentalBooleanFeatureFlagFingerprint.match( - experimentalFeatureFlagParentFingerprint.originalClassDef - ).method.apply { + experimentalBooleanFeatureFlagFingerprint.method.apply { val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT) // It appears that all usage of this method has a default of 'false', @@ -79,9 +77,7 @@ val enableDebuggingPatch = bytecodePatch( ) } - experimentalDoubleFeatureFlagFingerprint.match( - experimentalFeatureFlagParentFingerprint.originalClassDef - ).method.apply { + experimentalDoubleFeatureFlagFingerprint.method.apply { val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE) addInstructions( @@ -96,9 +92,7 @@ val enableDebuggingPatch = bytecodePatch( } if (is_19_16_or_greater) { - experimentalLongFeatureFlagFingerprint.match( - experimentalFeatureFlagParentFingerprint.originalClassDef - ).method.apply { + experimentalLongFeatureFlagFingerprint.method.apply { val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE) addInstructions( @@ -112,9 +106,7 @@ val enableDebuggingPatch = bytecodePatch( ) } - experimentalStringFeatureFlagFingerprint.match( - experimentalFeatureFlagParentFingerprint.originalClassDef - ).method.apply { + experimentalStringFeatureFlagFingerprint.method.apply { val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.MOVE_RESULT_OBJECT) addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt index 3e976140ec..3813fb0012 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt @@ -11,24 +11,28 @@ internal val experimentalFeatureFlagParentFingerprint by fingerprint { } internal val experimentalBooleanFeatureFlagFingerprint by fingerprint { + classFingerprint(experimentalFeatureFlagParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters("J", "Z") } internal val experimentalDoubleFeatureFlagFingerprint by fingerprint { + classFingerprint(experimentalFeatureFlagParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("D") parameters("J", "D") } internal val experimentalLongFeatureFlagFingerprint by fingerprint { + classFingerprint(experimentalFeatureFlagParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("J") parameters("J", "J") } internal val experimentalStringFeatureFlagFingerprint by fingerprint { + classFingerprint(experimentalFeatureFlagParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("J", "Ljava/lang/String;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt index 17b0e48565..f7e9bf621f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt @@ -28,6 +28,7 @@ internal val scrollPositionFingerprint by fingerprint { } internal val recyclerViewTopScrollingFingerprint by fingerprint { + classFingerprint(recyclerViewTopScrollingParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt index a02e556f8b..8c7b474d65 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt @@ -14,13 +14,12 @@ internal val fixBackToExitGesturePatch = bytecodePatch( ) { execute { - recyclerViewTopScrollingFingerprint.match(recyclerViewTopScrollingParentFingerprint.originalClassDef) - .let { - it.method.addInstruction( - it.filterMatches.last().index, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V" - ) - } + recyclerViewTopScrollingFingerprint.let { + it.method.addInstruction( + it.filterMatches.last().index, + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V" + ) + } scrollPositionFingerprint.let { navigate(it.originalMethod) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt index b9292ef84b..dbff7d03c0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt @@ -30,14 +30,9 @@ val cronetImageUrlHookPatch = bytecodePatch( dependsOn(sharedExtensionPatch) execute { - loadImageUrlMethod = messageDigestImageUrlFingerprint - .match(messageDigestImageUrlParentFingerprint.originalClassDef).method - - loadImageSuccessCallbackMethod = onSucceededFingerprint - .match(onResponseStartedFingerprint.originalClassDef).method - - loadImageErrorCallbackMethod = onFailureFingerprint - .match(onResponseStartedFingerprint.originalClassDef).method + loadImageUrlMethod = messageDigestImageUrlFingerprint.method + loadImageSuccessCallbackMethod = onSucceededFingerprint.method + loadImageErrorCallbackMethod = onFailureFingerprint.method // The URL is required for the failure callback hook, but the URL field is obfuscated. // Add a helper get method that returns the URL field. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt index 818d7c0d05..163d0812a6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt @@ -4,6 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags internal val onFailureFingerprint by fingerprint { + classFingerprint(onResponseStartedFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters( @@ -33,6 +34,7 @@ internal val onResponseStartedFingerprint by fingerprint { } internal val onSucceededFingerprint by fingerprint { + classFingerprint(onResponseStartedFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") @@ -52,6 +54,7 @@ internal val requestFingerprint by fingerprint { } internal val messageDigestImageUrlFingerprint by fingerprint { + classFingerprint(messageDigestImageUrlParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Ljava/lang/String;", "L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt index 7a10ceb03e..2de2df882e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt @@ -19,6 +19,7 @@ internal val actionBarSearchResultsFingerprint by fingerprint { * Matches to the class found in [pivotBarConstructorFingerprint]. */ internal val initializeButtonsFingerprint by fingerprint { + classFingerprint(pivotBarConstructorFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt index f363901871..74308f5060 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt @@ -52,7 +52,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig } } - initializeButtonsFingerprint.match(pivotBarConstructorFingerprint.originalClassDef).method.apply { + initializeButtonsFingerprint.method.apply { // Hook the current navigation bar enum value. Note, the 'You' tab does not have an enum value. val navigationEnumClassName = navigationEnumFingerprint.classDef.type addHook(Hook.SET_LAST_APP_NAVIGATION_ENUM) { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt index b288259fe3..1fee424d79 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt @@ -52,6 +52,7 @@ internal val overlayViewInflateFingerprint by fingerprint { * Resolves to the class found in [playerTopControlsInflateFingerprint]. */ internal val controlsOverlayVisibilityFingerprint by fingerprint { + classFingerprint(playerTopControlsInflateFingerprint) accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Z", "Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt index 6beeaf2425..a3154d3cbc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt @@ -251,9 +251,7 @@ val playerControlsPatch = bytecodePatch( inflateTopControlInsertIndex = inflateReturnObjectIndex + 1 } - visibilityMethod = controlsOverlayVisibilityFingerprint.match( - playerTopControlsInflateFingerprint.originalClassDef, - ).method + visibilityMethod = controlsOverlayVisibilityFingerprint.method // Hook the fullscreen close button. Used to fix visibility // when seeking and other situations. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt index 28598bb517..c1a1a45333 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt @@ -53,7 +53,7 @@ val removeTrackingQueryParameterPatch = bytecodePatch( getInsertIndex: Match.PatternMatch.() -> Int, getUrlRegister: MutableMethod.(insertIndex: Int) -> Int, ) { - val insertIndex = patternMatch!!.getInsertIndex() + val insertIndex = patternMatch.getInsertIndex() val urlRegister = method.getUrlRegister(insertIndex) method.addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index cdbc51c97a..7fdccca736 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -5,6 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal val autoRepeatFingerprint by fingerprint { + classFingerprint(autoRepeatParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -83,6 +84,8 @@ internal val seekbarFingerprint by fingerprint { } internal val seekbarOnDrawFingerprint by fingerprint { + classFingerprint(seekbarFingerprint) + classFingerprint(seekbarFingerprint) custom { method, _ -> method.name == "onDraw" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt index 913fb59911..6aa5bf7df4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt @@ -38,6 +38,7 @@ internal val playerInitFingerprint by fingerprint { * Matched using class found in [playerInitFingerprint]. */ internal val seekFingerprint by fingerprint { + classFingerprint(playerInitFingerprint) strings("Attempting to seek during an ad") } @@ -62,6 +63,7 @@ internal val videoLengthFingerprint by fingerprint { * Matches using class found in [mdxPlayerDirectorSetVideoStageFingerprint]. */ internal val mdxSeekFingerprint by fingerprint { + classFingerprint(mdxPlayerDirectorSetVideoStageFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters("J", "L") @@ -86,6 +88,7 @@ internal val mdxPlayerDirectorSetVideoStageFingerprint by fingerprint { * Matches using class found in [mdxPlayerDirectorSetVideoStageFingerprint]. */ internal val mdxSeekRelativeFingerprint by fingerprint { + classFingerprint(mdxPlayerDirectorSetVideoStageFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) // Return type is boolean up to 19.39, and void with 19.39+. parameters("J", "L") @@ -100,6 +103,7 @@ internal val mdxSeekRelativeFingerprint by fingerprint { * Matches using class found in [playerInitFingerprint]. */ internal val seekRelativeFingerprint by fingerprint { + classFingerprint(playerInitFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) // Return type is boolean up to 19.39, and void with 19.39+. parameters("J", "L") @@ -113,6 +117,7 @@ internal val seekRelativeFingerprint by fingerprint { * Resolves with the class found in [newVideoQualityChangedFingerprint]. */ internal val playbackSpeedMenuSpeedChangedFingerprint by fingerprint { + classFingerprint(newVideoQualityChangedFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index 2463ceb740..f67ad37133 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -8,7 +8,6 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableClass import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.shared.newVideoQualityChangedFingerprint import app.revanced.patches.youtube.video.playerresponse.Hook import app.revanced.patches.youtube.video.playerresponse.addPlayerResponseMethodHook import app.revanced.patches.youtube.video.playerresponse.playerResponseMethodHookPatch @@ -92,15 +91,11 @@ val videoInformationPatch = bytecodePatch( // Hook the player controller for use through the extension. onCreateHook(EXTENSION_CLASS_DESCRIPTOR, "initialize") - val seekFingerprintResultMethod = seekFingerprint.match(playerInitFingerprint.originalClassDef).method - val seekRelativeFingerprintResultMethod = - seekRelativeFingerprint.match(playerInitFingerprint.originalClassDef).method - // Create extension interface methods. addSeekInterfaceMethods( playerInitFingerprint.classDef, - seekFingerprintResultMethod, - seekRelativeFingerprintResultMethod, + seekFingerprint.method, + seekRelativeFingerprint.method, ) with(mdxPlayerDirectorSetVideoStageFingerprint) { @@ -115,10 +110,11 @@ val videoInformationPatch = bytecodePatch( // Hook the MDX director for use through the extension. onCreateHookMdx(EXTENSION_CLASS_DESCRIPTOR, "initializeMdx") - val mdxSeekFingerprintResultMethod = mdxSeekFingerprint.match(classDef).method - val mdxSeekRelativeFingerprintResultMethod = mdxSeekRelativeFingerprint.match(classDef).method - - addSeekInterfaceMethods(classDef, mdxSeekFingerprintResultMethod, mdxSeekRelativeFingerprintResultMethod) + addSeekInterfaceMethods( + classDef, + mdxSeekFingerprint.method, + mdxSeekRelativeFingerprint.method + ) } with(createVideoPlayerSeekbarFingerprint) { @@ -192,9 +188,7 @@ val videoInformationPatch = bytecodePatch( } // Handle new playback speed menu. - playbackSpeedMenuSpeedChangedFingerprint.match( - newVideoQualityChangedFingerprint.originalClassDef, - ).method.apply { + playbackSpeedMenuSpeedChangedFingerprint.method.apply { val index = indexOfFirstInstructionOrThrow(Opcode.IGET) speedSelectionInsertMethod = this diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt index 757fc887ef..5e93f28cb6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt @@ -8,6 +8,7 @@ import com.android.tools.smali.dexlib2.Opcode * Matches with the class found in [videoQualitySetterFingerprint]. */ internal val setQualityByIndexMethodClassFieldReferenceFingerprint by fingerprint { + classFingerprint(videoQualitySetterFingerprint) returns("V") parameters("L") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index 02c12e4732..e90d989fe6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -76,9 +76,7 @@ val rememberVideoQualityPatch = bytecodePatch( onCreateHook(EXTENSION_CLASS_DESCRIPTOR, "newVideoStarted") // Inject a call to set the remembered quality once a video loads. - setQualityByIndexMethodClassFieldReferenceFingerprint.match( - videoQualitySetterFingerprint.originalClassDef, - ).let { match -> + setQualityByIndexMethodClassFieldReferenceFingerprint.let { match -> // This instruction refers to the field with the type that contains the setQualityByIndex method. val instructions = match.method.implementation!!.instructions diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index bd6668993d..4078c34ab9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -139,9 +139,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( // Get the "showOldPlaybackSpeedMenu" method. // This is later called on the field INSTANCE. - val showOldPlaybackSpeedMenuMethod = showOldPlaybackSpeedMenuFingerprint.match( - getOldPlaybackSpeedsFingerprint.classDef, - ).method.toString() + val showOldPlaybackSpeedMenuMethod = showOldPlaybackSpeedMenuFingerprint.method.toString() // Insert the call to the "showOldPlaybackSpeedMenu" method on the field INSTANCE. showOldPlaybackSpeedMenuExtensionFingerprint.method.apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index 9428d40f76..378321031a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -11,6 +11,7 @@ internal val getOldPlaybackSpeedsFingerprint by fingerprint { } internal val showOldPlaybackSpeedMenuFingerprint by fingerprint { + classFingerprint(getOldPlaybackSpeedsFingerprint) literal { speedUnavailableId } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index 275304bbe9..27ab7e1184 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -8,6 +8,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal val videoIdFingerprint by fingerprint { + classFingerprint(videoIdParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt index 9bf382f9a7..825251da39 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt @@ -92,10 +92,10 @@ val videoIdPatch = bytecodePatch( ) execute { - videoIdFingerprint.match(videoIdParentFingerprint.originalClassDef).let { + videoIdFingerprint.let { it.method.apply { - videoIdMethod = this val index = it.filterMatches.first().index + videoIdMethod = this videoIdRegister = getInstruction(index + 1).registerA videoIdInsertIndex = index + 2 } @@ -103,8 +103,8 @@ val videoIdPatch = bytecodePatch( videoIdBackgroundPlayFingerprint.let { it.method.apply { - backgroundPlaybackMethod = this val index = it.filterMatches.first().index + backgroundPlaybackMethod = this backgroundPlaybackVideoIdRegister = getInstruction(index + 1).registerA backgroundPlaybackInsertIndex = index + 2 } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt index 937316c3b7..1676a71e24 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt @@ -104,7 +104,7 @@ val restoreOldVideoQualityMenuPatch = bytecodePatch( } // Force YT to add the 'advanced' quality menu for Shorts. - val patternMatch = videoQualityMenuOptionsFingerprint.patternMatch!! + val patternMatch = videoQualityMenuOptionsFingerprint.patternMatch val startIndex = patternMatch.startIndex if (startIndex != 0) throw PatchException("Unexpected opcode start index: $startIndex") val insertIndex = patternMatch.endIndex From 37833a0bae822351ab073ce80a62a2717622244e Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 4 Jan 2025 10:58:42 +0100 Subject: [PATCH 11/64] refactor --- patches/api/patches.api | 2 -- .../layout/hide/general/Fingerprints.kt | 20 ++++++++++++------- .../hide/general/HideLayoutComponentsPatch.kt | 15 -------------- .../youtube/layout/theme/Fingerprints.kt | 5 ++++- .../youtube/layout/theme/ThemePatch.kt | 12 +++++------ .../youtube/misc/playertype/Fingerprints.kt | 2 +- .../speed/custom/CustomPlaybackSpeedPatch.kt | 2 +- .../video/speed/custom/Fingerprints.kt | 4 +++- .../youtube/video/videoid/Fingerprints.kt | 2 -- 9 files changed, 28 insertions(+), 36 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index eb4cc5f36d..d01baf9c48 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1123,12 +1123,10 @@ public final class app/revanced/patches/youtube/layout/hide/general/HideLayoutCo public static final fun getAlbumCardId ()J public static final fun getBarContainerHeightId ()J public static final fun getCrowdfundingBoxId ()J - public static final fun getExpandButtonDownId ()J public static final fun getFabButtonId ()J public static final fun getFilterBarHeightId ()J public static final fun getHideLayoutComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getRelatedChipCloudMarginId ()J - public static final fun getYouTubeLogo ()J } public final class app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 128c9d77f8..bdcad5d22b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -1,18 +1,22 @@ package app.revanced.patches.youtube.layout.hide.general +import app.revanced.patcher.MethodFilter +import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint +import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal val hideShowMoreButtonFingerprint by fingerprint { - opcodes( - Opcode.CONST, - Opcode.CONST_4, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + instructions( + ResourceMappingFilter("layout", "expand_button_down"), + MethodFilter.parseJvmMethodCall( + "Landroid/view/View;->inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;", + ), + OpcodeFilter(Opcode.MOVE_RESULT_OBJECT) ) - literal { expandButtonDownId } } internal val parseElementFromBufferFingerprint by fingerprint { @@ -42,7 +46,9 @@ internal val yoodlesImageViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") parameters("L", "L") - literal { youTubeLogo } + instructions( + ResourceMappingFilter("id", "youtube_logo") + ) } internal val crowdfundingBoxFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 473243dc8d..d5304d54d0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -33,15 +33,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -var expandButtonDownId = -1L - private set var albumCardId = -1L private set var crowdfundingBoxId = -1L private set -var youTubeLogo = -1L - private set - var filterBarHeightId = -1L private set var relatedChipCloudMarginId = -1L @@ -56,11 +51,6 @@ private val hideLayoutComponentsResourcePatch = resourcePatch { dependsOn(resourceMappingPatch) execute { - expandButtonDownId = resourceMappings[ - "layout", - "expand_button_down", - ] - albumCardId = resourceMappings[ "layout", "album_card", @@ -71,11 +61,6 @@ private val hideLayoutComponentsResourcePatch = resourcePatch { "donation_companion", ] - youTubeLogo = resourceMappings[ - "id", - "youtube_logo", - ] - relatedChipCloudMarginId = resourceMappings[ "layout", "related_chip_cloud_reduced_margins", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt index 3adbccbd4d..2a6db81f7c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.layout.theme +import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags @@ -52,5 +53,7 @@ internal val themeHelperLightColorFingerprint by fingerprint { } internal val useGradientLoadingScreenFingerprint by fingerprint { - literal { GRADIENT_LOADING_SCREEN_AB_CONSTANT } + instructions( + LiteralFilter(45412406L) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt index 92d3a3fd88..9e25db5db6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt @@ -22,8 +22,6 @@ import org.w3c.dom.Element private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/theme/ThemePatch;" -internal const val GRADIENT_LOADING_SCREEN_AB_CONSTANT = 45412406L - val themePatch = bytecodePatch( name = "Theme", description = "Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).", @@ -218,10 +216,12 @@ val themePatch = bytecodePatch( SwitchPreference("revanced_gradient_loading_screen"), ) - useGradientLoadingScreenFingerprint.method.insertFeatureFlagBooleanOverride( - GRADIENT_LOADING_SCREEN_AB_CONSTANT, - "$EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled(Z)Z" - ) + useGradientLoadingScreenFingerprint.let { + it.method.insertFeatureFlagBooleanOverride( + it.filterMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled(Z)Z" + ) + } mapOf( themeHelperLightColorFingerprint to lightThemeBackgroundColor, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt index e424b5b656..4711666d3c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt @@ -36,7 +36,7 @@ internal val videoStateFingerprint by fingerprint { parameters("Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;") instructions( LiteralFilter(1), - LiteralFilter(0), + LiteralFilter(literal = 0, maxInstructionsBefore = 10), // Obfuscated parameter field name. FieldFilter( definingClass = { "Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;" }, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index 4078c34ab9..e307475ebb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -48,7 +48,7 @@ private val customPlaybackSpeedResourcePatch = resourcePatch { private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilterPatch;" -private const val EXTENSION_CLASS_DESCRIPTOR = +internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch;" internal val customPlaybackSpeedPatch = bytecodePatch( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index 378321031a..3bd050877d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -16,7 +16,9 @@ internal val showOldPlaybackSpeedMenuFingerprint by fingerprint { } internal val showOldPlaybackSpeedMenuExtensionFingerprint by fingerprint { - custom { method, _ -> method.name == "showOldPlaybackSpeedMenu" } + custom { method, classDef -> + method.name == "showOldPlaybackSpeedMenu" && classDef.type == EXTENSION_CLASS_DESCRIPTOR + } } internal val speedArrayGeneratorFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index 27ab7e1184..896fc84cb4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -18,8 +18,6 @@ internal val videoIdFingerprint by fingerprint { returnType = "Ljava/lang/String;" ), OpcodeFilter(Opcode.MOVE_RESULT_OBJECT), - OpcodeFilter(Opcode.IGET_OBJECT), - OpcodeFilter(Opcode.INVOKE_INTERFACE), ) } From 0dfa503384d0efabb7235c847203f29de33a9609 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 4 Jan 2025 10:59:57 +0100 Subject: [PATCH 12/64] use `NewInstanceFilter` filter --- .../patches/youtube/shared/Fingerprints.kt | 28 ++++++------------- .../quality/RememberVideoQualityPatch.kt | 2 +- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index 7fdccca736..12c0fe0678 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -1,5 +1,8 @@ package app.revanced.patches.youtube.shared +import app.revanced.patcher.FieldFilter +import app.revanced.patcher.NewInstanceFilter +import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -110,24 +113,11 @@ internal val newVideoQualityChangedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L") - opcodes( - Opcode.IGET, // Video resolution (human readable). - Opcode.IGET_OBJECT, - Opcode.IGET_BOOLEAN, - Opcode.IGET_OBJECT, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_DIRECT, - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.GOTO, - Opcode.CONST_4, - Opcode.IF_NE, - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IGET, + instructions( + NewInstanceFilter("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;"), + OpcodeFilter(Opcode.IGET_OBJECT), + OpcodeFilter(Opcode.CHECK_CAST), + FieldFilter(type = "I", opcode = Opcode.IGET, maxInstructionsBefore = 0), // Video resolution (human readable). + FieldFilter(type = "Ljava/lang/String;", opcode = Opcode.IGET_OBJECT, maxInstructionsBefore = 0), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index e90d989fe6..858a6c8210 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -131,7 +131,7 @@ val rememberVideoQualityPatch = bytecodePatch( // Remember video quality if not using old layout menu. newVideoQualityChangedFingerprint.method.apply { - val index = newVideoQualityChangedFingerprint.filterMatches.first().index + val index = newVideoQualityChangedFingerprint.filterMatches[3].index val qualityRegister = getInstruction(index).registerA addInstruction( From adc89a6004dcc2af54d802f63217e1f4e99549ae Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 4 Jan 2025 11:02:26 +0100 Subject: [PATCH 13/64] fix version constrain --- .../youtube/interaction/swipecontrols/SwipeControlsPatch.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt index ce9b537edf..f1fcf9c7c6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt @@ -10,8 +10,8 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch -import app.revanced.patches.youtube.misc.playservice.is_19_23_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater +import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.mainActivityFingerprint @@ -114,7 +114,7 @@ val swipeControlsPatch = bytecodePatch( // region patch to enable/disable swipe to change video. - if (is_19_23_or_greater) { + if (is_19_43_or_greater) { swipeChangeVideoFingerprint.method.insertFeatureFlagBooleanOverride( SWIPE_CHANGE_VIDEO_FEATURE_FLAG, "$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z" From e823574c326f60357c60728a1b127de56980d0a7 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 4 Jan 2025 12:46:38 +0100 Subject: [PATCH 14/64] refactor --- patches/api/patches.api | 4 --- .../patches/shared/misc/gms/Fingerprints.kt | 8 ++--- .../shared/misc/gms/GmsCoreSupportPatch.kt | 4 +-- .../formfactor/ChangeFormFactorPatch.kt | 33 +++++++------------ .../youtube/layout/formfactor/Fingerprints.kt | 7 +++- 5 files changed, 23 insertions(+), 33 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index d01baf9c48..1b06af3725 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -558,10 +558,6 @@ public final class app/revanced/patches/shared/misc/fix/verticalscroll/VerticalS public static final fun getVerticalScrollPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/shared/misc/gms/FingerprintsKt { - public static final field GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME Ljava/lang/String; -} - public final class app/revanced/patches/shared/misc/gms/GmsCoreSupportPatchKt { public static final fun gmsCoreSupportPatch (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; public static synthetic fun gmsCoreSupportPatch$default (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt index 03658d9c95..355a07ba81 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt @@ -3,11 +3,11 @@ package app.revanced.patches.shared.misc.gms import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -const val GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME = "getGmsCoreVendorGroupId" - internal val gmsCoreSupportFingerprint by fingerprint { - custom { _, classDef -> - classDef.endsWith("GmsCoreSupport;") + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + custom { method, classDef -> + method.name == "getGmsCoreVendorGroupId" + && classDef.endsWith("/GmsCoreSupport;") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index 0e54bb6919..b79def03d1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -221,9 +221,7 @@ fun gmsCoreSupportPatch( } // Change the vendor of GmsCore in the extension. - gmsCoreSupportFingerprint.classDef.methods - .single { it.name == GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME } - .replaceInstruction(0, "const-string v0, \"$gmsCoreVendorGroupId\"") + gmsCoreSupportFingerprint.method.replaceInstruction(0, "const-string v0, \"$gmsCoreVendorGroupId\"") executeBlock() } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt index b7621b02f4..0d816b91a5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt @@ -9,13 +9,9 @@ import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference -internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ChangeFormFactorPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ChangeFormFactorPatch;" @Suppress("unused") val changeFormFactorPatch = bytecodePatch( @@ -52,24 +48,19 @@ val changeFormFactorPatch = bytecodePatch( ) ) - createPlayerRequestBodyWithModelFingerprint.method.apply { - val formFactorEnumClass = formFactorEnumConstructorFingerprint.originalClassDef.type + createPlayerRequestBodyWithModelFingerprint.let { + it.method.apply { + val index = it.filterMatches.last().index + val register = getInstruction(index).registerA - val index = indexOfFirstInstructionOrThrow { - val reference = getReference() - opcode == Opcode.IGET && - reference?.definingClass == formFactorEnumClass && - reference.type == "I" + addInstructions( + index + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getFormFactor(I)I + move-result v$register + """ + ) } - val register = getInstruction(index).registerA - - addInstructions( - index + 1, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getFormFactor(I)I - move-result v$register - """ - ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt index c8a907fcea..5c5494167a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt @@ -2,6 +2,7 @@ package app.revanced.patches.youtube.layout.formfactor import app.revanced.patcher.FieldFilter import app.revanced.patcher.fingerprint +import app.revanced.patches.youtube.layout.formfactor.formFactorEnumConstructorFingerprint import com.android.tools.smali.dexlib2.AccessFlags internal val formFactorEnumConstructorFingerprint by fingerprint { @@ -19,7 +20,11 @@ internal val createPlayerRequestBodyWithModelFingerprint by fingerprint { returns("L") parameters() instructions( - FieldFilter("Landroid/os/Build${'$'}VERSION;", "RELEASE", "Ljava/lang/String;"), FieldFilter("Landroid/os/Build;", "MODEL", "Ljava/lang/String;"), + FieldFilter( + definingClass = { formFactorEnumConstructorFingerprint.originalClassDef.type }, + type = { "I" }, + maxInstructionsBefore = 50 + ) ) } From 2c1cdcc0cbf62d1896dc9f82531f92f3d32f54d2 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 5 Jan 2025 10:05:41 +0100 Subject: [PATCH 15/64] Restore use of context receivers This reverts commit f3b86029150d7a1d16344826d37d0009e7156f63. --- patches/api/patches.api | 2 +- .../patches/shared/misc/mapping/ResourceMappingPatch.kt | 2 ++ .../app/revanced/patches/twitch/ad/shared/util/AdPatch.kt | 8 ++++---- .../patches/youtube/layout/formfactor/Fingerprints.kt | 2 +- .../patches/youtube/misc/playertype/Fingerprints.kt | 5 +++-- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 1b06af3725..b5652b86b7 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -595,7 +595,7 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceElement { public final class app/revanced/patches/shared/misc/mapping/ResourceMappingFilter : app/revanced/patcher/InstructionFilter { public fun (Ljava/lang/String;Ljava/lang/String;I)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun matches (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Z + public fun matches (Lapp/revanced/patcher/patch/BytecodePatchContext;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Z } public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index 8cdd21a680..f607091239 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -2,6 +2,7 @@ package app.revanced.patches.shared.misc.mapping import app.revanced.patcher.InstructionFilter import app.revanced.patcher.LiteralFilter +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.resourcePatch import com.android.tools.smali.dexlib2.iface.Method @@ -34,6 +35,7 @@ class ResourceMappingFilter( } override fun matches( + context: BytecodePatchContext, method: Method, instruction: Instruction, methodIndex: Int diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt index da97b9d41c..48ecefba8e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt @@ -3,7 +3,7 @@ package app.revanced.patches.twitch.ad.shared.util import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatchBuilder -import app.revanced.patcher.patch.BytecodePatchContext.classBy +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.smali.ExternalLabel @@ -12,7 +12,7 @@ fun adPatch( skipLabelName: String, block: BytecodePatchBuilder.( createConditionInstructions: (register: String) -> String, - blockMethods: ( + blockMethods: BytecodePatchContext.( clazz: String, methodNames: Set, returnMethod: ReturnMethod, @@ -25,7 +25,7 @@ fun adPatch( if-eqz $register, :$skipLabelName """ - fun blockMethods( + fun BytecodePatchContext.blockMethods( classDefType: String, methodNames: Set, returnMethod: ReturnMethod, @@ -57,7 +57,7 @@ fun adPatch( true } - block(::createConditionInstructions, ::blockMethods) + block(::createConditionInstructions, BytecodePatchContext::blockMethods) } class ReturnMethod(val returnType: Char, val value: String) { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt index 5c5494167a..1eebc7b5a8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt @@ -22,7 +22,7 @@ internal val createPlayerRequestBodyWithModelFingerprint by fingerprint { instructions( FieldFilter("Landroid/os/Build;", "MODEL", "Ljava/lang/String;"), FieldFilter( - definingClass = { formFactorEnumConstructorFingerprint.originalClassDef.type }, + definingClass = { context -> with(context) { formFactorEnumConstructorFingerprint.originalClassDef.type } }, type = { "I" }, maxInstructionsBefore = 50 ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt index 4711666d3c..473231dd3d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt @@ -3,6 +3,7 @@ package app.revanced.patches.youtube.misc.playertype import app.revanced.patcher.FieldFilter import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -39,8 +40,8 @@ internal val videoStateFingerprint by fingerprint { LiteralFilter(literal = 0, maxInstructionsBefore = 10), // Obfuscated parameter field name. FieldFilter( - definingClass = { "Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;" }, - type = { videoStateEnumFingerprint.originalClassDef.type }, + definingClass = { "Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;"}, + type = { context: BytecodePatchContext -> with(context) { videoStateEnumFingerprint.originalClassDef.type } }, maxInstructionsBefore = 5 ) ) From d44f860c8727025b7d7bfb216471f4062ddf4379 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 5 Jan 2025 10:51:26 +0100 Subject: [PATCH 16/64] refactor: Rename to `MethodCallFilter` and `FieldCallFilter` --- .../app/revanced/patches/shared/misc/spoof/Fingerprints.kt | 4 ++-- .../youtube/layout/buttons/navigation/Fingerprints.kt | 4 ++-- .../patches/youtube/layout/buttons/overlay/Fingerprints.kt | 4 ++-- .../patches/youtube/layout/formfactor/Fingerprints.kt | 6 +++--- .../patches/youtube/layout/hide/general/Fingerprints.kt | 4 ++-- .../patches/youtube/layout/hide/shorts/Fingerprints.kt | 4 ++-- .../patches/youtube/misc/navigation/Fingerprints.kt | 6 +++--- .../patches/youtube/misc/playertype/Fingerprints.kt | 4 ++-- .../app/revanced/patches/youtube/shared/Fingerprints.kt | 6 +++--- .../revanced/patches/youtube/video/videoid/Fingerprints.kt | 6 +++--- 10 files changed, 24 insertions(+), 24 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index 9217884505..23afbbfa4d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -1,7 +1,7 @@ package app.revanced.patches.shared.misc.spoof import app.revanced.patcher.LiteralFilter -import app.revanced.patcher.MethodFilter +import app.revanced.patcher.MethodCallFilter import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -38,7 +38,7 @@ internal val buildRequestFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Lorg/chromium/net/UrlRequest;") instructions( - MethodFilter(methodName = "newUrlRequestBuilder") + MethodCallFilter(methodName = "newUrlRequestBuilder") ) custom { methodDef, _ -> // Different targets have slightly different parameters diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt index 98fa73db03..b1bbecc534 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.layout.buttons.navigation import app.revanced.patcher.LastInstructionFilter import app.revanced.patcher.LiteralFilter -import app.revanced.patcher.MethodFilter +import app.revanced.patcher.MethodCallFilter import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -21,7 +21,7 @@ internal val createPivotBarFingerprint by fingerprint { "Ljava/lang/CharSequence;", ) instructions( - MethodFilter(definingClass = "Landroid/widget/TextView;", methodName = "setText"), + MethodCallFilter(definingClass = "Landroid/widget/TextView;", methodName = "setText"), LastInstructionFilter(OpcodeFilter(Opcode.RETURN_VOID)) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt index 02adf24216..d8d31c611a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.layout.buttons.overlay -import app.revanced.patcher.MethodFilter +import app.revanced.patcher.MethodCallFilter import app.revanced.patcher.fingerprint import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter import com.android.tools.smali.dexlib2.AccessFlags @@ -12,7 +12,7 @@ internal val playerControlsPreviousNextOverlayTouchFingerprint by fingerprint { instructions( ResourceMappingFilter("id", "player_control_previous_button_touch_area"), ResourceMappingFilter("id", "player_control_next_button_touch_area"), - MethodFilter(parameters = listOf("Landroid/view/View;", "I")) + MethodCallFilter(parameters = listOf("Landroid/view/View;", "I")) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt index 1eebc7b5a8..8b0a37f919 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.layout.formfactor -import app.revanced.patcher.FieldFilter +import app.revanced.patcher.FieldCallFilter import app.revanced.patcher.fingerprint import app.revanced.patches.youtube.layout.formfactor.formFactorEnumConstructorFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -20,8 +20,8 @@ internal val createPlayerRequestBodyWithModelFingerprint by fingerprint { returns("L") parameters() instructions( - FieldFilter("Landroid/os/Build;", "MODEL", "Ljava/lang/String;"), - FieldFilter( + FieldCallFilter("Landroid/os/Build;", "MODEL", "Ljava/lang/String;"), + FieldCallFilter( definingClass = { context -> with(context) { formFactorEnumConstructorFingerprint.originalClassDef.type } }, type = { "I" }, maxInstructionsBefore = 50 diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index bdcad5d22b..6d1abc1268 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.layout.hide.general -import app.revanced.patcher.MethodFilter +import app.revanced.patcher.MethodCallFilter import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter @@ -12,7 +12,7 @@ internal val hideShowMoreButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( ResourceMappingFilter("layout", "expand_button_down"), - MethodFilter.parseJvmMethodCall( + MethodCallFilter.parseJvmMethodCall( "Landroid/view/View;->inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;", ), OpcodeFilter(Opcode.MOVE_RESULT_OBJECT) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt index 2721c030ca..b154ef13d9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.layout.hide.shorts -import app.revanced.patcher.MethodFilter +import app.revanced.patcher.MethodCallFilter import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter @@ -26,7 +26,7 @@ internal val shortsBottomBarContainerFingerprint by fingerprint { strings("r_pfvc") instructions( ResourceMappingFilter("id", "bottom_bar_container"), - MethodFilter(methodName = "getHeight"), + MethodCallFilter(methodName = "getHeight"), OpcodeFilter(Opcode.MOVE_RESULT) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt index 2de2df882e..ec4a611aca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.misc.navigation -import app.revanced.patcher.MethodFilter +import app.revanced.patcher.MethodCallFilter import app.revanced.patcher.fingerprint import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter import app.revanced.patches.youtube.layout.buttons.navigation.navigationButtonsPatch @@ -11,7 +11,7 @@ internal val actionBarSearchResultsFingerprint by fingerprint { returns("Landroid/view/View;") instructions( ResourceMappingFilter("layout", "action_bar_search_results_view_mic"), - MethodFilter(methodName = "setLayoutDirection") + MethodCallFilter(methodName = "setLayoutDirection") ) } @@ -94,7 +94,7 @@ internal val pivotBarButtonsViewSetSelectedFingerprint by fingerprint { returns("V") parameters("I", "Z") instructions( - MethodFilter(methodName = "setSelected") + MethodCallFilter(methodName = "setSelected") ) custom { method, _ -> method.definingClass == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt index 473231dd3d..6fa8eef0a5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.misc.playertype -import app.revanced.patcher.FieldFilter +import app.revanced.patcher.FieldCallFilter import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.BytecodePatchContext @@ -39,7 +39,7 @@ internal val videoStateFingerprint by fingerprint { LiteralFilter(1), LiteralFilter(literal = 0, maxInstructionsBefore = 10), // Obfuscated parameter field name. - FieldFilter( + FieldCallFilter( definingClass = { "Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;"}, type = { context: BytecodePatchContext -> with(context) { videoStateEnumFingerprint.originalClassDef.type } }, maxInstructionsBefore = 5 diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index 12c0fe0678..bac9ce03db 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.shared -import app.revanced.patcher.FieldFilter +import app.revanced.patcher.FieldCallFilter import app.revanced.patcher.NewInstanceFilter import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint @@ -117,7 +117,7 @@ internal val newVideoQualityChangedFingerprint by fingerprint { NewInstanceFilter("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;"), OpcodeFilter(Opcode.IGET_OBJECT), OpcodeFilter(Opcode.CHECK_CAST), - FieldFilter(type = "I", opcode = Opcode.IGET, maxInstructionsBefore = 0), // Video resolution (human readable). - FieldFilter(type = "Ljava/lang/String;", opcode = Opcode.IGET_OBJECT, maxInstructionsBefore = 0), + FieldCallFilter(type = "I", opcode = Opcode.IGET, maxInstructionsBefore = 0), // Video resolution (human readable). + FieldCallFilter(type = "Ljava/lang/String;", opcode = Opcode.IGET_OBJECT, maxInstructionsBefore = 0), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index 896fc84cb4..4c273b81e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.video.videoid -import app.revanced.patcher.MethodFilter +import app.revanced.patcher.MethodCallFilter import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint import app.revanced.util.literal @@ -13,7 +13,7 @@ internal val videoIdFingerprint by fingerprint { returns("V") parameters("L") instructions( - MethodFilter( + MethodCallFilter( definingClass = "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;", returnType = "Ljava/lang/String;" ), @@ -26,7 +26,7 @@ internal val videoIdBackgroundPlayFingerprint by fingerprint { returns("V") parameters("L") instructions( - MethodFilter( + MethodCallFilter( definingClass = "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;", returnType = "Ljava/lang/String;" ), From 7ca15426ac4755bb1a5b072d712bfa2621c93371 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 5 Jan 2025 18:12:07 +0100 Subject: [PATCH 17/64] Revert "refactor: Simplify with class (parent) fingerprint" This reverts commit d2fbbf548ae4faee753722e4b97334478c0f21de. --- .../patches/music/misc/spoof/Fingerprints.kt | 1 - .../music/misc/spoof/SpoofClientPatch.kt | 27 +++++++++---------- .../baconreader/api/SpoofClientPatch.kt | 2 +- .../redditisfun/api/SpoofClientPatch.kt | 2 +- .../sync/syncforreddit/api/Fingerprints.kt | 1 - .../syncforreddit/api/SpoofClientPatch.kt | 2 +- .../fix/video/FixVideoDownloadsPatch.kt | 2 +- .../misc/spoof/SpoofVideoStreamsPatch.kt | 6 ++--- .../downloads/UnlockDownloadsPatch.kt | 4 +-- .../DisablePreciseSeekingGesturePatch.kt | 9 ++++--- .../seekbar/EnableSeekbarTappingPatch.kt | 2 +- .../interaction/seekbar/Fingerprints.kt | 2 -- .../layout/hide/general/Fingerprints.kt | 1 - .../hide/general/HideLayoutComponentsPatch.kt | 7 +++-- .../layout/hide/infocards/Fingerprints.kt | 1 - .../hide/infocards/HideInfoCardsPatch.kt | 2 +- .../DisableRollingNumberAnimationPatch.kt | 2 +- .../layout/hide/seekbar/HideSeekbarPatch.kt | 3 ++- .../layout/hide/shorts/Fingerprints.kt | 1 - .../hide/shorts/HideShortsComponentsPatch.kt | 8 +++--- .../youtube/layout/miniplayer/Fingerprints.kt | 8 ------ .../layout/miniplayer/MiniplayerPatch.kt | 18 +++++++++---- .../player/fullscreen/ExitFullscreenPatch.kt | 3 ++- .../returnyoutubedislike/Fingerprints.kt | 2 -- .../ReturnYouTubeDislikePatch.kt | 7 +++-- .../layout/seekbar/SeekbarColorPatch.kt | 2 +- .../layout/sponsorblock/Fingerprints.kt | 4 --- .../layout/sponsorblock/SponsorBlockPatch.kt | 10 +++---- .../misc/autorepeat/AutoRepeatPatch.kt | 2 +- .../misc/debugging/EnableDebuggingPatch.kt | 16 ++++++++--- .../youtube/misc/debugging/Fingerprints.kt | 4 --- .../fix/backtoexitgesture/Fingerprints.kt | 1 - .../FixBackToExitGesturePatch.kt | 13 ++++----- .../misc/imageurlhook/CronetImageUrlHook.kt | 11 +++++--- .../youtube/misc/imageurlhook/Fingerprints.kt | 3 --- .../youtube/misc/navigation/Fingerprints.kt | 1 - .../misc/navigation/NavigationBarHookPatch.kt | 2 +- .../misc/playercontrols/Fingerprints.kt | 1 - .../playercontrols/PlayerControlsPatch.kt | 4 ++- .../RemoveTrackingQueryParameterPatch.kt | 2 +- .../patches/youtube/shared/Fingerprints.kt | 3 --- .../youtube/video/information/Fingerprints.kt | 5 ---- .../information/VideoInformationPatch.kt | 22 +++++++++------ .../youtube/video/quality/Fingerprints.kt | 1 - .../quality/RememberVideoQualityPatch.kt | 4 ++- .../speed/custom/CustomPlaybackSpeedPatch.kt | 4 ++- .../video/speed/custom/Fingerprints.kt | 1 - .../youtube/video/videoid/Fingerprints.kt | 1 - .../youtube/video/videoid/VideoIdPatch.kt | 6 ++--- .../RestoreOldVideoQualityMenuPatch.kt | 2 +- 50 files changed, 125 insertions(+), 123 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt index 59d2f47b8d..22cf63b849 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt @@ -13,7 +13,6 @@ internal val playerRequestConstructorFingerprint by fingerprint { * Matches using the class found in [playerRequestConstructorFingerprint]. */ internal val createPlayerRequestBodyFingerprint by fingerprint { - classFingerprint(playerRequestConstructorFingerprint) parameters("L") returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt index 3588c0f1cb..9cb91a531c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt @@ -36,19 +36,20 @@ val spoofClientPatch = bytecodePatch( execute { val playerRequestClass = playerRequestConstructorFingerprint.classDef - val clientInfoContainerClass = createPlayerRequestBodyFingerprint.method - .getInstruction(createPlayerRequestBodyFingerprint.filterMatches.first().index) + val createPlayerRequestBodyMatch = createPlayerRequestBodyFingerprint.match(playerRequestClass) + + val clientInfoContainerClass = createPlayerRequestBodyMatch.method + .getInstruction(createPlayerRequestBodyMatch.filterMatches.first().index) .getReference()!!.type val clientInfoField = setClientInfoClientVersionFingerprint.method.instructions.first { it.opcode == Opcode.IPUT_OBJECT && it.getReference()!!.definingClass == clientInfoContainerClass }.getReference()!! - val setClientInfoFieldInstructions = - setClientInfoFieldsFingerprint.method.instructions.filter { - (it.opcode == Opcode.IPUT_OBJECT || it.opcode == Opcode.IPUT) && - it.getReference()!!.definingClass == clientInfoField.type - }.map { it.getReference()!! } + val setClientInfoFieldInstructions = setClientInfoFieldsFingerprint.method.instructions.filter { + (it.opcode == Opcode.IPUT_OBJECT || it.opcode == Opcode.IPUT) && + it.getReference()!!.definingClass == clientInfoField.type + }.map { it.getReference()!! } // Offsets are known for the fields in the clientInfo object. val clientIdField = setClientInfoFieldInstructions[0] @@ -94,15 +95,11 @@ val spoofClientPatch = bytecodePatch( ) } - createPlayerRequestBodyFingerprint.method.apply { - val checkCastIndex = createPlayerRequestBodyFingerprint.filterMatches.first().index - val clientInfoContainerRegister = - getInstruction(checkCastIndex).registerA + createPlayerRequestBodyMatch.method.apply { + val checkCastIndex = createPlayerRequestBodyMatch.filterMatches.first().index + val clientInfoContainerRegister = getInstruction(checkCastIndex).registerA - addInstruction( - checkCastIndex + 1, - "invoke-static {v$clientInfoContainerRegister}, $spoofClientInfoMethod" - ) + addInstruction(checkCastIndex + 1, "invoke-static {v$clientInfoContainerRegister}, $spoofClientInfoMethod") } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt index 35aacc6876..d9cfa994f5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt @@ -16,7 +16,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "http://baconreader.com/au execute { fun Fingerprint.patch(replacementString: String) { - val clientIdIndex = stringMatches.first().index + val clientIdIndex = stringMatches!!.first().index method.apply { val clientIdRegister = getInstruction(clientIdIndex).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch.kt index 2a30b87b56..440b1fe2a9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch.kt @@ -34,7 +34,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "redditisfun://auth") { cl string: String, getReplacementIndex: List.() -> Int, ) = method.apply { - val replacementIndex = stringMatches.getReplacementIndex() + val replacementIndex = stringMatches!!.getReplacementIndex() val clientIdRegister = getInstruction(replacementIndex).registerA replaceInstruction(replacementIndex, "const-string v$clientIdRegister, \"$string\"") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt index baeaab35e8..41e7d5f928 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt @@ -7,7 +7,6 @@ internal val getAuthorizationStringFingerprint by fingerprint { } internal val getBearerTokenFingerprint by fingerprint { - classFingerprint(getAuthorizationStringFingerprint) strings("Basic") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt index 804931adcc..86ea4c8923 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt @@ -26,7 +26,7 @@ val spoofClientPatch = spoofClientPatch( execute { // region Patch client id. - getBearerTokenFingerprint.method.apply { + getBearerTokenFingerprint.match(getAuthorizationStringFingerprint.originalClassDef).method.apply { val auth = Base64.getEncoder().encodeToString("$clientId:".toByteArray(Charsets.UTF_8)) addInstructions( 0, diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt index b7e9f5b1a8..64c33f308b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt @@ -24,7 +24,7 @@ val fixVideoDownloadsPatch = bytecodePatch( ) execute { - val scanResult = parseRedditVideoNetworkResponseFingerprint.patternMatch + val scanResult = parseRedditVideoNetworkResponseFingerprint.patternMatch!! val newInstanceIndex = scanResult.startIndex val invokeDirectIndex = scanResult.endIndex - 1 diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index 73c04f08c6..a15b8aada9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -66,7 +66,7 @@ fun spoofVideoStreamsPatch( // region Block /get_watch requests to fall back to /player requests. - val invokeToStringIndex = buildPlayerRequestURIFingerprint.filterMatches.first().index + val invokeToStringIndex = buildPlayerRequestURIFingerprint.patternMatch.startIndex buildPlayerRequestURIFingerprint.method.apply { val uriRegister = getInstruction(invokeToStringIndex).registerC @@ -107,7 +107,7 @@ fun spoofVideoStreamsPatch( createStreamingDataFingerprint.method.apply { val setStreamDataMethodName = "patch_setStreamingData" val resultMethodType = createStreamingDataFingerprint.classDef.type - val videoDetailsIndex = createStreamingDataFingerprint.filterMatches.last().index + val videoDetailsIndex = createStreamingDataFingerprint.patternMatch.endIndex val videoDetailsRegister = getInstruction(videoDetailsIndex).registerA val videoDetailsClass = getInstruction(videoDetailsIndex).getReference()!!.type @@ -118,7 +118,7 @@ fun spoofVideoStreamsPatch( ) val protobufClass = protobufClassParseByteBufferFingerprint.method.definingClass - val setStreamingDataIndex = createStreamingDataFingerprint.filterMatches.first().index + val setStreamingDataIndex = createStreamingDataFingerprint.patternMatch.startIndex val playerProtoClass = getInstruction(setStreamingDataIndex + 1) .getReference()!!.definingClass diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt index e08854a238..6f2b9c12c7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt @@ -27,7 +27,7 @@ val unlockDownloadsPatch = bytecodePatch( // Allow downloads for non-premium users. showDownloadVideoUpsellBottomSheetFingerprint.patch { - val checkIndex = patternMatch.startIndex + val checkIndex = patternMatch!!.startIndex val register = method.getInstruction(checkIndex).registerA checkIndex to register @@ -42,7 +42,7 @@ val unlockDownloadsPatch = bytecodePatch( } // Make GIFs downloadable. - val patternMatch = buildMediaOptionsSheetFingerprint.patternMatch + val patternMatch = buildMediaOptionsSheetFingerprint.patternMatch!! buildMediaOptionsSheetFingerprint.method.apply { val checkMediaTypeIndex = patternMatch.startIndex val checkMediaTypeInstruction = getInstruction(checkMediaTypeIndex) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt index 9dbb4ada65..20653ce2e3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt @@ -44,7 +44,9 @@ val disablePreciseSeekingGesturePatch = bytecodePatch( val extensionMethodDescriptor = "Lapp/revanced/extension/youtube/patches/DisablePreciseSeekingGesturePatch;" - allowSwipingUpGestureFingerprint.method.apply{ + allowSwipingUpGestureFingerprint.match( + swipingUpGestureParentFingerprint.originalClassDef, + ).method.apply { addInstructionsWithLabels( 0, """ @@ -57,8 +59,9 @@ val disablePreciseSeekingGesturePatch = bytecodePatch( ) } - - showSwipingUpGuideFingerprint.method.apply { + showSwipingUpGuideFingerprint.match( + swipingUpGestureParentFingerprint.originalClassDef, + ).method.apply { addInstructionsWithLabels( 0, """ diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index 917fb47b23..1830644c85 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -46,7 +46,7 @@ val enableSeekbarTappingPatch = bytecodePatch( ) // Find the required methods to tap the seekbar. - val patternMatch = onTouchEventHandlerFingerprint.patternMatch + val patternMatch = onTouchEventHandlerFingerprint.patternMatch!! fun getReference(index: Int) = onTouchEventHandlerFingerprint.method.getInstruction(index) .reference as MethodReference diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt index 65a4564933..fd957739ce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt @@ -19,7 +19,6 @@ internal val swipingUpGestureParentFingerprint by fingerprint { * Resolves using the class found in [swipingUpGestureParentFingerprint]. */ internal val showSwipingUpGuideFingerprint by fingerprint { - classFingerprint(swipingUpGestureParentFingerprint) accessFlags(AccessFlags.FINAL) returns("Z") parameters() @@ -30,7 +29,6 @@ internal val showSwipingUpGuideFingerprint by fingerprint { * Resolves using the class found in [swipingUpGestureParentFingerprint]. */ internal val allowSwipingUpGestureFingerprint by fingerprint { - classFingerprint(swipingUpGestureParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 6d1abc1268..983d695333 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -36,7 +36,6 @@ internal val playerOverlayFingerprint by fingerprint { } internal val showWatermarkFingerprint by fingerprint { - classFingerprint(playerOverlayFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index d5304d54d0..2d193b72df 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -261,7 +261,9 @@ val hideLayoutComponentsPatch = bytecodePatch( // region Watermark (legacy code for old versions of YouTube) - showWatermarkFingerprint.method.apply { + showWatermarkFingerprint.match( + playerOverlayFingerprint.originalClassDef, + ).method.apply { val index = implementation!!.instructions.size - 5 removeInstruction(index) @@ -382,7 +384,8 @@ val hideLayoutComponentsPatch = bytecodePatch( hookRegisterOffset: Int = 0, instructions: (Int) -> String, ) = method.apply { - val endIndex = patternMatch.endIndex + val endIndex = patternMatch!!.endIndex + val insertIndex = endIndex + insertIndexOffset val register = getInstruction(endIndex + hookRegisterOffset).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt index fbde3f5da7..c158243759 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt @@ -6,7 +6,6 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal val infocardsIncognitoFingerprint by fingerprint { - classFingerprint(infocardsIncognitoParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/Boolean;") parameters("L", "J") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index b19d91b56c..052c8206f0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -70,7 +70,7 @@ val hideInfoCardsPatch = bytecodePatch( ) execute { - infocardsIncognitoFingerprint.method.apply { + infocardsIncognitoFingerprint.match(infocardsIncognitoParentFingerprint.originalClassDef).method.apply { val invokeInstructionIndex = implementation!!.instructions.indexOfFirst { it.opcode.ordinal == Opcode.INVOKE_VIRTUAL.ordinal && ((it as ReferenceInstruction).reference.toString() == "Landroid/view/View;->setVisibility(I)V") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index 8edd88a884..8dac00f2cb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -51,7 +51,7 @@ val disableRollingNumberAnimationPatch = bytecodePatch( // Animations are disabled by preventing an Image from being applied to the text span, // which prevents the animations from appearing. - val patternMatch = rollingNumberTextViewAnimationUpdateFingerprint.patternMatch + val patternMatch = rollingNumberTextViewAnimationUpdateFingerprint.patternMatch!! val blockStartIndex = patternMatch.startIndex val blockEndIndex = patternMatch.endIndex + 1 rollingNumberTextViewAnimationUpdateFingerprint.method.apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt index fb7509c508..52d128592b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt @@ -9,6 +9,7 @@ import app.revanced.patches.youtube.layout.seekbar.seekbarColorPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.patches.youtube.shared.seekbarFingerprint import app.revanced.patches.youtube.shared.seekbarOnDrawFingerprint val hideSeekbarPatch = bytecodePatch( @@ -44,7 +45,7 @@ val hideSeekbarPatch = bytecodePatch( SwitchPreference("revanced_hide_seekbar_thumbnail"), ) - seekbarOnDrawFingerprint.method.addInstructionsWithLabels( + seekbarOnDrawFingerprint.match(seekbarFingerprint.originalClassDef).method.addInstructionsWithLabels( 0, """ const/4 v0, 0x0 diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt index b154ef13d9..8babedec93 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt @@ -74,7 +74,6 @@ internal val renderBottomNavigationBarParentFingerprint by fingerprint { } internal val setPivotBarVisibilityFingerprint by fingerprint { - classFingerprint(setPivotBarVisibilityParentFingerprint) accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index c17b70f96b..6b77b2ebb9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -207,9 +207,11 @@ val hideShortsComponentsPatch = bytecodePatch( // region Hide the navigation bar. // Hook to get the pivotBar view. - setPivotBarVisibilityFingerprint.let { - it.method.apply { - val insertIndex = it.filterMatches.last().index + setPivotBarVisibilityFingerprint.match( + setPivotBarVisibilityParentFingerprint.originalClassDef, + ).let { result -> + result.method.apply { + val insertIndex = result.patternMatch.endIndex val viewRegister = getInstruction(insertIndex - 1).registerA addInstruction( insertIndex, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index f66fae956a..549ecdf505 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -22,7 +22,6 @@ internal val miniplayerDimensionsCalculatorParentFingerprint by fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ internal val miniplayerModernAddViewListenerFingerprint by fingerprint { - classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;") @@ -33,7 +32,6 @@ internal val miniplayerModernAddViewListenerFingerprint by fingerprint { */ internal val miniplayerModernCloseButtonFingerprint by fingerprint { - classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() @@ -66,7 +64,6 @@ internal val miniplayerOnCloseHandlerFingerprint by fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ internal val miniplayerModernExpandButtonFingerprint by fingerprint { - classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() @@ -77,7 +74,6 @@ internal val miniplayerModernExpandButtonFingerprint by fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ internal val miniplayerModernExpandCloseDrawablesFingerprint by fingerprint { - classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") @@ -88,7 +84,6 @@ internal val miniplayerModernExpandCloseDrawablesFingerprint by fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ internal val miniplayerModernForwardButtonFingerprint by fingerprint { - classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() @@ -99,7 +94,6 @@ internal val miniplayerModernForwardButtonFingerprint by fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ internal val miniplayerModernOverlayViewFingerprint by fingerprint { - classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -110,7 +104,6 @@ internal val miniplayerModernOverlayViewFingerprint by fingerprint { * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ internal val miniplayerModernRewindButtonFingerprint by fingerprint { - classFingerprint(miniplayerModernViewParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() @@ -140,7 +133,6 @@ internal val miniplayerOverrideFingerprint by fingerprint { } internal val miniplayerOverrideNoContextFingerprint by fingerprint { - classFingerprint(miniplayerDimensionsCalculatorParentFingerprint) accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Z") opcodes(Opcode.IGET_BOOLEAN) // Anchor to insert the instruction. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 04ad9fa335..3ea37a6eb1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -312,7 +312,9 @@ val miniplayerPatch = bytecodePatch( // region Enable tablet miniplayer. - miniplayerOverrideNoContextFingerprint.method.apply { + miniplayerOverrideNoContextFingerprint.match( + miniplayerDimensionsCalculatorParentFingerprint.originalClassDef, + ).method.apply { findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride(index) } } @@ -325,7 +327,7 @@ val miniplayerPatch = bytecodePatch( } miniplayerResponseModelSizeCheckFingerprint.let { - it.method.insertLegacyTabletMiniplayerOverride(it.filterMatches.last().index) + it.method.insertLegacyTabletMiniplayerOverride(it.patternMatch.endIndex) } // endregion @@ -426,7 +428,9 @@ val miniplayerPatch = bytecodePatch( // YT fixed this mistake in 19.17. // Fix this, by swapping the drawable resource values with each other. if (ytOutlinePictureInPictureWhite24 >= 0) { - miniplayerModernExpandCloseDrawablesFingerprint.method.apply { + miniplayerModernExpandCloseDrawablesFingerprint.match( + miniplayerModernViewParentFingerprint.originalClassDef, + ).method.apply { listOf( ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, ytOutlineXWhite24 to ytOutlinePictureInPictureWhite24, @@ -470,14 +474,18 @@ val miniplayerPatch = bytecodePatch( "adjustMiniplayerOpacity", ), ).forEach { (fingerprint, literalValue, methodName) -> - fingerprint.method.hookInflatedView( + fingerprint.match( + miniplayerModernViewParentFingerprint.classDef, + ).method.hookInflatedView( literalValue, "Landroid/widget/ImageView;", "$EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/widget/ImageView;)V", ) } - miniplayerModernAddViewListenerFingerprint.method.addInstruction( + miniplayerModernAddViewListenerFingerprint.match( + miniplayerModernViewParentFingerprint.classDef, + ).method.addInstruction( 0, "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->" + "hideMiniplayerSubTexts(Landroid/view/View;)V", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt index ac45679318..105494a221 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt @@ -10,6 +10,7 @@ import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.autoRepeatFingerprint +import app.revanced.patches.youtube.shared.autoRepeatParentFingerprint import app.revanced.util.addInstructionsAtControlFlowLabel @Suppress("unused") @@ -56,7 +57,7 @@ internal val exitFullscreenPatch = bytecodePatch( ) ) - autoRepeatFingerprint.method.apply { + autoRepeatFingerprint.match(autoRepeatParentFingerprint.originalClassDef).method.apply { addInstructionsAtControlFlowLabel( implementation!!.instructions.lastIndex, "invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->endOfVideoReached()V", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt index 66d306d57d..747ec7bc40 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt @@ -53,7 +53,6 @@ internal val rollingNumberMeasureAnimatedTextFingerprint by fingerprint { * Matches to class found in [rollingNumberMeasureStaticLabelParentFingerprint]. */ internal val rollingNumberMeasureStaticLabelFingerprint by fingerprint { - classFingerprint(rollingNumberMeasureStaticLabelParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("F") parameters("Ljava/lang/String;") @@ -131,7 +130,6 @@ internal val textComponentDataFingerprint by fingerprint { * Matches against the same class found in [textComponentConstructorFingerprint]. */ internal val textComponentLookupFingerprint by fingerprint { - classFingerprint(textComponentConstructorFingerprint) accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 066b6864e0..fc083a80d7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -115,6 +115,7 @@ val returnYouTubeDislikePatch = bytecodePatch( it.type == conversionContextFingerprint.originalClassDef.type } ?: throw PatchException("Could not find conversion context field") + textComponentLookupFingerprint.match(textComponentConstructorFingerprint.originalClassDef) textComponentLookupFingerprint.method.apply { // Find the instruction for creating the text data object. val textDataClassType = textComponentDataFingerprint.originalClassDef.type @@ -257,7 +258,7 @@ val returnYouTubeDislikePatch = bytecodePatch( // Rolling Number text views use the measured width of the raw string for layout. // Modify the measure text calculation to include the left drawable separator if needed. - val patternMatch = rollingNumberMeasureAnimatedTextFingerprint.patternMatch + val patternMatch = rollingNumberMeasureAnimatedTextFingerprint.patternMatch!! // Additional check to verify the opcodes are at the start of the method if (patternMatch.startIndex != 0) throw PatchException("Unexpected opcode location") val endIndex = patternMatch.endIndex @@ -275,7 +276,9 @@ val returnYouTubeDislikePatch = bytecodePatch( // Additional text measurement method. Used if YouTube decides not to animate the likes count // and sometimes used for initial video load. - rollingNumberMeasureStaticLabelFingerprint.let { + rollingNumberMeasureStaticLabelFingerprint.match( + rollingNumberMeasureStaticLabelParentFingerprint.originalClassDef, + ).let { val measureTextIndex = it.filterMatches.first().index + 1 it.method.apply { val freeRegister = getInstruction(0).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index ff1d6e953d..8b877d446b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -208,7 +208,7 @@ val seekbarColorPatch = bytecodePatch( } setSeekbarClickedColorFingerprint.originalMethod.let { - val setColorMethodIndex = setSeekbarClickedColorFingerprint.filterMatches.first().index + 1 + val setColorMethodIndex = setSeekbarClickedColorFingerprint.patternMatch.startIndex + 1 navigate(it).to(setColorMethodIndex).stop().apply { val colorRegister = getInstruction(0).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt index 803103102e..421b608596 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt @@ -1,8 +1,6 @@ package app.revanced.patches.youtube.layout.sponsorblock import app.revanced.patcher.fingerprint -import app.revanced.patches.youtube.shared.layoutConstructorFingerprint -import app.revanced.patches.youtube.shared.seekbarFingerprint import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionReversed import com.android.tools.smali.dexlib2.AccessFlags @@ -34,7 +32,6 @@ internal val appendTimeFingerprint by fingerprint { } internal val controlsOverlayFingerprint by fingerprint { - classFingerprint(layoutConstructorFingerprint) returns("V") accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) parameters() @@ -53,7 +50,6 @@ internal val controlsOverlayFingerprint by fingerprint { } internal val rectangleFieldInvalidatorFingerprint by fingerprint { - classFingerprint(seekbarFingerprint) returns("V") parameters() custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index a3371e6c68..1f3bfbb7cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -132,7 +132,7 @@ val sponsorBlockPatch = bytecodePatch( ) // Seekbar drawing - seekbarOnDrawFingerprint.method.apply { + seekbarOnDrawFingerprint.match(seekbarFingerprint.originalClassDef).method.apply { // Get left and right of seekbar rectangle. val moveRectangleToRegisterIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_OBJECT_FROM16) @@ -194,7 +194,7 @@ val sponsorBlockPatch = bytecodePatch( onCreateHook(EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR, "initialize") // Initialize the SponsorBlock view. - controlsOverlayFingerprint.let { + controlsOverlayFingerprint.match(layoutConstructorFingerprint.originalClassDef).let { val startIndex = it.filterMatches.first().index it.method.apply { val frameLayoutRegister = (getInstruction(startIndex + 2) as OneRegisterInstruction).registerA @@ -206,7 +206,7 @@ val sponsorBlockPatch = bytecodePatch( } // Set seekbar draw rectangle. - rectangleFieldInvalidatorFingerprint.method.apply { + rectangleFieldInvalidatorFingerprint.match(seekbarFingerprint.originalClassDef).method.apply { val invalidateIndex = indexOfInvalidateInstruction(this) val rectangleIndex = indexOfFirstInstructionReversedOrThrow(invalidateIndex + 1) { getReference()?.type == "Landroid/graphics/Rect;" @@ -216,7 +216,7 @@ val sponsorBlockPatch = bytecodePatch( segmentPlaybackControllerFingerprint.let { it.method.apply { - val replaceIndex = it.filterMatches.first().index + val replaceIndex = it.patternMatch.startIndex val replaceRegister = getInstruction(replaceIndex).registerA @@ -231,7 +231,7 @@ val sponsorBlockPatch = bytecodePatch( // The vote and create segment buttons automatically change their visibility when appropriate, // but if buttons are showing when the end of the video is reached then they will not automatically hide. // Add a hook to forcefully hide when the end of the video is reached. - autoRepeatFingerprint.method.addInstruction( + autoRepeatFingerprint.match(autoRepeatParentFingerprint.originalClassDef).method.addInstruction( 0, "invoke-static {}, $EXTENSION_SPONSORBLOCK_VIEW_CONTROLLER_CLASS_DESCRIPTOR->endOfVideoReached()V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt index c79595c24e..9953f5fc82 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt @@ -43,7 +43,7 @@ val autoRepeatPatch = bytecodePatch( SwitchPreference("revanced_auto_repeat"), ) - autoRepeatFingerprint.method.apply { + autoRepeatFingerprint.match(autoRepeatParentFingerprint.originalClassDef).method.apply { val playMethod = autoRepeatParentFingerprint.method val index = instructions.lastIndex diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt index 5a25974459..cebfd6b5ee 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt @@ -61,7 +61,9 @@ val enableDebuggingPatch = bytecodePatch( ) // Hook the methods that look up if a feature flag is active. - experimentalBooleanFeatureFlagFingerprint.method.apply { + experimentalBooleanFeatureFlagFingerprint.match( + experimentalFeatureFlagParentFingerprint.originalClassDef + ).method.apply { val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT) // It appears that all usage of this method has a default of 'false', @@ -77,7 +79,9 @@ val enableDebuggingPatch = bytecodePatch( ) } - experimentalDoubleFeatureFlagFingerprint.method.apply { + experimentalDoubleFeatureFlagFingerprint.match( + experimentalFeatureFlagParentFingerprint.originalClassDef + ).method.apply { val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE) addInstructions( @@ -92,7 +96,9 @@ val enableDebuggingPatch = bytecodePatch( } if (is_19_16_or_greater) { - experimentalLongFeatureFlagFingerprint.method.apply { + experimentalLongFeatureFlagFingerprint.match( + experimentalFeatureFlagParentFingerprint.originalClassDef + ).method.apply { val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE) addInstructions( @@ -106,7 +112,9 @@ val enableDebuggingPatch = bytecodePatch( ) } - experimentalStringFeatureFlagFingerprint.method.apply { + experimentalStringFeatureFlagFingerprint.match( + experimentalFeatureFlagParentFingerprint.originalClassDef + ).method.apply { val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.MOVE_RESULT_OBJECT) addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt index 3813fb0012..3e976140ec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt @@ -11,28 +11,24 @@ internal val experimentalFeatureFlagParentFingerprint by fingerprint { } internal val experimentalBooleanFeatureFlagFingerprint by fingerprint { - classFingerprint(experimentalFeatureFlagParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters("J", "Z") } internal val experimentalDoubleFeatureFlagFingerprint by fingerprint { - classFingerprint(experimentalFeatureFlagParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("D") parameters("J", "D") } internal val experimentalLongFeatureFlagFingerprint by fingerprint { - classFingerprint(experimentalFeatureFlagParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("J") parameters("J", "J") } internal val experimentalStringFeatureFlagFingerprint by fingerprint { - classFingerprint(experimentalFeatureFlagParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("J", "Ljava/lang/String;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt index f7e9bf621f..17b0e48565 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt @@ -28,7 +28,6 @@ internal val scrollPositionFingerprint by fingerprint { } internal val recyclerViewTopScrollingFingerprint by fingerprint { - classFingerprint(recyclerViewTopScrollingParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt index 8c7b474d65..a02e556f8b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt @@ -14,12 +14,13 @@ internal val fixBackToExitGesturePatch = bytecodePatch( ) { execute { - recyclerViewTopScrollingFingerprint.let { - it.method.addInstruction( - it.filterMatches.last().index, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V" - ) - } + recyclerViewTopScrollingFingerprint.match(recyclerViewTopScrollingParentFingerprint.originalClassDef) + .let { + it.method.addInstruction( + it.filterMatches.last().index, + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V" + ) + } scrollPositionFingerprint.let { navigate(it.originalMethod) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt index dbff7d03c0..b9292ef84b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt @@ -30,9 +30,14 @@ val cronetImageUrlHookPatch = bytecodePatch( dependsOn(sharedExtensionPatch) execute { - loadImageUrlMethod = messageDigestImageUrlFingerprint.method - loadImageSuccessCallbackMethod = onSucceededFingerprint.method - loadImageErrorCallbackMethod = onFailureFingerprint.method + loadImageUrlMethod = messageDigestImageUrlFingerprint + .match(messageDigestImageUrlParentFingerprint.originalClassDef).method + + loadImageSuccessCallbackMethod = onSucceededFingerprint + .match(onResponseStartedFingerprint.originalClassDef).method + + loadImageErrorCallbackMethod = onFailureFingerprint + .match(onResponseStartedFingerprint.originalClassDef).method // The URL is required for the failure callback hook, but the URL field is obfuscated. // Add a helper get method that returns the URL field. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt index 163d0812a6..818d7c0d05 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt @@ -4,7 +4,6 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags internal val onFailureFingerprint by fingerprint { - classFingerprint(onResponseStartedFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters( @@ -34,7 +33,6 @@ internal val onResponseStartedFingerprint by fingerprint { } internal val onSucceededFingerprint by fingerprint { - classFingerprint(onResponseStartedFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") @@ -54,7 +52,6 @@ internal val requestFingerprint by fingerprint { } internal val messageDigestImageUrlFingerprint by fingerprint { - classFingerprint(messageDigestImageUrlParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Ljava/lang/String;", "L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt index ec4a611aca..279cd93f98 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt @@ -19,7 +19,6 @@ internal val actionBarSearchResultsFingerprint by fingerprint { * Matches to the class found in [pivotBarConstructorFingerprint]. */ internal val initializeButtonsFingerprint by fingerprint { - classFingerprint(pivotBarConstructorFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt index 74308f5060..f363901871 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt @@ -52,7 +52,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig } } - initializeButtonsFingerprint.method.apply { + initializeButtonsFingerprint.match(pivotBarConstructorFingerprint.originalClassDef).method.apply { // Hook the current navigation bar enum value. Note, the 'You' tab does not have an enum value. val navigationEnumClassName = navigationEnumFingerprint.classDef.type addHook(Hook.SET_LAST_APP_NAVIGATION_ENUM) { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt index 1fee424d79..b288259fe3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt @@ -52,7 +52,6 @@ internal val overlayViewInflateFingerprint by fingerprint { * Resolves to the class found in [playerTopControlsInflateFingerprint]. */ internal val controlsOverlayVisibilityFingerprint by fingerprint { - classFingerprint(playerTopControlsInflateFingerprint) accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Z", "Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt index a3154d3cbc..6beeaf2425 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt @@ -251,7 +251,9 @@ val playerControlsPatch = bytecodePatch( inflateTopControlInsertIndex = inflateReturnObjectIndex + 1 } - visibilityMethod = controlsOverlayVisibilityFingerprint.method + visibilityMethod = controlsOverlayVisibilityFingerprint.match( + playerTopControlsInflateFingerprint.originalClassDef, + ).method // Hook the fullscreen close button. Used to fix visibility // when seeking and other situations. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt index c1a1a45333..28598bb517 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt @@ -53,7 +53,7 @@ val removeTrackingQueryParameterPatch = bytecodePatch( getInsertIndex: Match.PatternMatch.() -> Int, getUrlRegister: MutableMethod.(insertIndex: Int) -> Int, ) { - val insertIndex = patternMatch.getInsertIndex() + val insertIndex = patternMatch!!.getInsertIndex() val urlRegister = method.getUrlRegister(insertIndex) method.addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index bac9ce03db..8ecb1999e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -8,7 +8,6 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal val autoRepeatFingerprint by fingerprint { - classFingerprint(autoRepeatParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -87,8 +86,6 @@ internal val seekbarFingerprint by fingerprint { } internal val seekbarOnDrawFingerprint by fingerprint { - classFingerprint(seekbarFingerprint) - classFingerprint(seekbarFingerprint) custom { method, _ -> method.name == "onDraw" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt index 6aa5bf7df4..913fb59911 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt @@ -38,7 +38,6 @@ internal val playerInitFingerprint by fingerprint { * Matched using class found in [playerInitFingerprint]. */ internal val seekFingerprint by fingerprint { - classFingerprint(playerInitFingerprint) strings("Attempting to seek during an ad") } @@ -63,7 +62,6 @@ internal val videoLengthFingerprint by fingerprint { * Matches using class found in [mdxPlayerDirectorSetVideoStageFingerprint]. */ internal val mdxSeekFingerprint by fingerprint { - classFingerprint(mdxPlayerDirectorSetVideoStageFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters("J", "L") @@ -88,7 +86,6 @@ internal val mdxPlayerDirectorSetVideoStageFingerprint by fingerprint { * Matches using class found in [mdxPlayerDirectorSetVideoStageFingerprint]. */ internal val mdxSeekRelativeFingerprint by fingerprint { - classFingerprint(mdxPlayerDirectorSetVideoStageFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) // Return type is boolean up to 19.39, and void with 19.39+. parameters("J", "L") @@ -103,7 +100,6 @@ internal val mdxSeekRelativeFingerprint by fingerprint { * Matches using class found in [playerInitFingerprint]. */ internal val seekRelativeFingerprint by fingerprint { - classFingerprint(playerInitFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) // Return type is boolean up to 19.39, and void with 19.39+. parameters("J", "L") @@ -117,7 +113,6 @@ internal val seekRelativeFingerprint by fingerprint { * Resolves with the class found in [newVideoQualityChangedFingerprint]. */ internal val playbackSpeedMenuSpeedChangedFingerprint by fingerprint { - classFingerprint(newVideoQualityChangedFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index f67ad37133..2463ceb740 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -8,6 +8,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableClass import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.shared.newVideoQualityChangedFingerprint import app.revanced.patches.youtube.video.playerresponse.Hook import app.revanced.patches.youtube.video.playerresponse.addPlayerResponseMethodHook import app.revanced.patches.youtube.video.playerresponse.playerResponseMethodHookPatch @@ -91,11 +92,15 @@ val videoInformationPatch = bytecodePatch( // Hook the player controller for use through the extension. onCreateHook(EXTENSION_CLASS_DESCRIPTOR, "initialize") + val seekFingerprintResultMethod = seekFingerprint.match(playerInitFingerprint.originalClassDef).method + val seekRelativeFingerprintResultMethod = + seekRelativeFingerprint.match(playerInitFingerprint.originalClassDef).method + // Create extension interface methods. addSeekInterfaceMethods( playerInitFingerprint.classDef, - seekFingerprint.method, - seekRelativeFingerprint.method, + seekFingerprintResultMethod, + seekRelativeFingerprintResultMethod, ) with(mdxPlayerDirectorSetVideoStageFingerprint) { @@ -110,11 +115,10 @@ val videoInformationPatch = bytecodePatch( // Hook the MDX director for use through the extension. onCreateHookMdx(EXTENSION_CLASS_DESCRIPTOR, "initializeMdx") - addSeekInterfaceMethods( - classDef, - mdxSeekFingerprint.method, - mdxSeekRelativeFingerprint.method - ) + val mdxSeekFingerprintResultMethod = mdxSeekFingerprint.match(classDef).method + val mdxSeekRelativeFingerprintResultMethod = mdxSeekRelativeFingerprint.match(classDef).method + + addSeekInterfaceMethods(classDef, mdxSeekFingerprintResultMethod, mdxSeekRelativeFingerprintResultMethod) } with(createVideoPlayerSeekbarFingerprint) { @@ -188,7 +192,9 @@ val videoInformationPatch = bytecodePatch( } // Handle new playback speed menu. - playbackSpeedMenuSpeedChangedFingerprint.method.apply { + playbackSpeedMenuSpeedChangedFingerprint.match( + newVideoQualityChangedFingerprint.originalClassDef, + ).method.apply { val index = indexOfFirstInstructionOrThrow(Opcode.IGET) speedSelectionInsertMethod = this diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt index 5e93f28cb6..757fc887ef 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt @@ -8,7 +8,6 @@ import com.android.tools.smali.dexlib2.Opcode * Matches with the class found in [videoQualitySetterFingerprint]. */ internal val setQualityByIndexMethodClassFieldReferenceFingerprint by fingerprint { - classFingerprint(videoQualitySetterFingerprint) returns("V") parameters("L") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index 858a6c8210..01e19216e8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -76,7 +76,9 @@ val rememberVideoQualityPatch = bytecodePatch( onCreateHook(EXTENSION_CLASS_DESCRIPTOR, "newVideoStarted") // Inject a call to set the remembered quality once a video loads. - setQualityByIndexMethodClassFieldReferenceFingerprint.let { match -> + setQualityByIndexMethodClassFieldReferenceFingerprint.match( + videoQualitySetterFingerprint.originalClassDef, + ).let { match -> // This instruction refers to the field with the type that contains the setQualityByIndex method. val instructions = match.method.implementation!!.instructions diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index e307475ebb..6e65c0b90c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -139,7 +139,9 @@ internal val customPlaybackSpeedPatch = bytecodePatch( // Get the "showOldPlaybackSpeedMenu" method. // This is later called on the field INSTANCE. - val showOldPlaybackSpeedMenuMethod = showOldPlaybackSpeedMenuFingerprint.method.toString() + val showOldPlaybackSpeedMenuMethod = showOldPlaybackSpeedMenuFingerprint.match( + getOldPlaybackSpeedsFingerprint.classDef, + ).method.toString() // Insert the call to the "showOldPlaybackSpeedMenu" method on the field INSTANCE. showOldPlaybackSpeedMenuExtensionFingerprint.method.apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index 3bd050877d..a7125d0eb3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -11,7 +11,6 @@ internal val getOldPlaybackSpeedsFingerprint by fingerprint { } internal val showOldPlaybackSpeedMenuFingerprint by fingerprint { - classFingerprint(getOldPlaybackSpeedsFingerprint) literal { speedUnavailableId } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index 4c273b81e2..f601ccabd7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -8,7 +8,6 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal val videoIdFingerprint by fingerprint { - classFingerprint(videoIdParentFingerprint) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt index 825251da39..9bf382f9a7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt @@ -92,10 +92,10 @@ val videoIdPatch = bytecodePatch( ) execute { - videoIdFingerprint.let { + videoIdFingerprint.match(videoIdParentFingerprint.originalClassDef).let { it.method.apply { - val index = it.filterMatches.first().index videoIdMethod = this + val index = it.filterMatches.first().index videoIdRegister = getInstruction(index + 1).registerA videoIdInsertIndex = index + 2 } @@ -103,8 +103,8 @@ val videoIdPatch = bytecodePatch( videoIdBackgroundPlayFingerprint.let { it.method.apply { - val index = it.filterMatches.first().index backgroundPlaybackMethod = this + val index = it.filterMatches.first().index backgroundPlaybackVideoIdRegister = getInstruction(index + 1).registerA backgroundPlaybackInsertIndex = index + 2 } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt index 1676a71e24..937316c3b7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt @@ -104,7 +104,7 @@ val restoreOldVideoQualityMenuPatch = bytecodePatch( } // Force YT to add the 'advanced' quality menu for Shorts. - val patternMatch = videoQualityMenuOptionsFingerprint.patternMatch + val patternMatch = videoQualityMenuOptionsFingerprint.patternMatch!! val startIndex = patternMatch.startIndex if (startIndex != 0) throw PatchException("Unexpected opcode start index: $startIndex") val insertIndex = patternMatch.endIndex From d270192c7183c00cb1e2e114a508dbdf5433fb8a Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 6 Jan 2025 10:36:14 +0100 Subject: [PATCH 18/64] refactor: Rename FieldCallFilter -> FieldAccessFilter --- .../patches/youtube/layout/formfactor/Fingerprints.kt | 6 +++--- .../patches/youtube/misc/playertype/Fingerprints.kt | 4 ++-- .../app/revanced/patches/youtube/shared/Fingerprints.kt | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt index 8b0a37f919..42569990b1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.layout.formfactor -import app.revanced.patcher.FieldCallFilter +import app.revanced.patcher.FieldAccessFilter import app.revanced.patcher.fingerprint import app.revanced.patches.youtube.layout.formfactor.formFactorEnumConstructorFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -20,8 +20,8 @@ internal val createPlayerRequestBodyWithModelFingerprint by fingerprint { returns("L") parameters() instructions( - FieldCallFilter("Landroid/os/Build;", "MODEL", "Ljava/lang/String;"), - FieldCallFilter( + FieldAccessFilter("Landroid/os/Build;", "MODEL", "Ljava/lang/String;"), + FieldAccessFilter( definingClass = { context -> with(context) { formFactorEnumConstructorFingerprint.originalClassDef.type } }, type = { "I" }, maxInstructionsBefore = 50 diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt index 6fa8eef0a5..e66e544539 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.misc.playertype -import app.revanced.patcher.FieldCallFilter +import app.revanced.patcher.FieldAccessFilter import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.BytecodePatchContext @@ -39,7 +39,7 @@ internal val videoStateFingerprint by fingerprint { LiteralFilter(1), LiteralFilter(literal = 0, maxInstructionsBefore = 10), // Obfuscated parameter field name. - FieldCallFilter( + FieldAccessFilter( definingClass = { "Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;"}, type = { context: BytecodePatchContext -> with(context) { videoStateEnumFingerprint.originalClassDef.type } }, maxInstructionsBefore = 5 diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index 8ecb1999e0..bc778042b3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.shared -import app.revanced.patcher.FieldCallFilter +import app.revanced.patcher.FieldAccessFilter import app.revanced.patcher.NewInstanceFilter import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint @@ -114,7 +114,7 @@ internal val newVideoQualityChangedFingerprint by fingerprint { NewInstanceFilter("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;"), OpcodeFilter(Opcode.IGET_OBJECT), OpcodeFilter(Opcode.CHECK_CAST), - FieldCallFilter(type = "I", opcode = Opcode.IGET, maxInstructionsBefore = 0), // Video resolution (human readable). - FieldCallFilter(type = "Ljava/lang/String;", opcode = Opcode.IGET_OBJECT, maxInstructionsBefore = 0), + FieldAccessFilter(type = "I", opcode = Opcode.IGET, maxInstructionsBefore = 0), // Video resolution (human readable). + FieldAccessFilter(type = "Ljava/lang/String;", opcode = Opcode.IGET_OBJECT, maxInstructionsBefore = 0), ) } From 81146173f475d90e9688d7d0f82450e8fafccd5a Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:31:24 +0100 Subject: [PATCH 19/64] refactor: Use DSL style constructor functions --- patches/api/patches.api | 15 ++++-- .../backdrops/misc/pro/ProUnlockPatch.kt | 4 +- .../patches/duolingo/ad/DisableAdsPatch.kt | 2 +- .../duolingo/debug/EnableDebugMenuPatch.kt | 2 +- .../ads/mainfeed/HideSponsoredStoriesPatch.kt | 2 +- .../customtabs/EnableCustomTabsPatch.kt | 2 +- .../DisableSwitchingEmojiToStickerPatch.kt | 2 +- .../misc/locale/ForceEnglishLocalePatch.kt | 2 +- .../patches/music/ad/video/HideVideoAds.kt | 2 +- .../permanentrepeat/PermanentRepeatPatch.kt | 2 +- .../layout/compactheader/HideCategoryBar.kt | 2 +- .../layout/premium/HideGetPremiumPatch.kt | 2 +- .../upgradebutton/RemoveUpgradeButtonPatch.kt | 4 +- .../music/misc/spoof/SpoofClientPatch.kt | 4 +- .../signature/SignatureDetectionPatch.kt | 2 +- .../relayforreddit/api/SpoofClientPatch.kt | 2 +- .../fix/video/FixVideoDownloadsPatch.kt | 6 +-- .../fix/verticalscroll/VerticalScrollPatch.kt | 18 ++++--- .../misc/mapping/ResourceMappingPatch.kt | 19 +++++-- .../patches/shared/misc/spoof/Fingerprints.kt | 8 +-- .../misc/spoof/SpoofVideoStreamsPatch.kt | 33 ++++++------ .../filesize/RemoveFileSizeLimitPatch.kt | 2 +- .../patches/soundcloud/ad/HideAdsPatch.kt | 2 +- .../spotify/lite/ondemand/OnDemandPatch.kt | 2 +- .../subscription/UnlockSubscriptionPatch.kt | 2 +- .../DisableSubscriptionSuggestionsPatch.kt | 2 +- .../featureflags/OverrideFeatureFlagsPatch.kt | 2 +- .../tumblr/fixes/FixOldVersionsPatch.kt | 2 +- .../FilterTimelineObjectsPatch.kt | 2 +- .../downloads/UnlockDownloadsPatch.kt | 31 ++++++------ .../twitter/misc/hook/json/JsonHookPatch.kt | 4 +- .../ad/getpremium/HideGetPremiumPatch.kt | 2 +- .../seekbar/EnableSeekbarTappingPatch.kt | 8 +-- .../seekbar/EnableSlideToSeekPatch.kt | 6 +-- .../interaction/seekbar/Fingerprints.kt | 4 +- .../layout/buttons/navigation/Fingerprints.kt | 18 +++---- .../navigation/NavigationButtonsPatch.kt | 8 +-- .../layout/buttons/overlay/Fingerprints.kt | 10 ++-- .../overlay/HidePlayerOverlayButtonsPatch.kt | 2 +- .../formfactor/ChangeFormFactorPatch.kt | 2 +- .../youtube/layout/formfactor/Fingerprints.kt | 6 +-- .../endscreencards/HideEndscreenCardsPatch.kt | 2 +- .../layout/hide/general/Fingerprints.kt | 16 +++--- .../hide/general/HideLayoutComponentsPatch.kt | 16 +++--- .../hide/infocards/HideInfoCardsPatch.kt | 2 +- .../DisableRollingNumberAnimationPatch.kt | 30 +++++------ .../layout/hide/shorts/Fingerprints.kt | 14 +++--- .../hide/shorts/HideShortsComponentsPatch.kt | 4 +- .../DisableSuggestedVideoEndScreenPatch.kt | 2 +- .../youtube/layout/miniplayer/Fingerprints.kt | 12 ++--- .../layout/miniplayer/MiniplayerPatch.kt | 4 +- .../layout/player/fullscreen/Fingerprints.kt | 4 +- .../OpenVideosFullscreenHookPatch.kt | 2 +- .../ReturnYouTubeDislikePatch.kt | 34 +++++++------ .../layout/searchbar/WideSearchbarPatch.kt | 2 +- .../youtube/layout/seekbar/Fingerprints.kt | 6 +-- .../layout/seekbar/SeekbarColorPatch.kt | 4 +- .../shortsautoplay/ShortsAutoplayPatch.kt | 2 +- .../layout/sponsorblock/SponsorBlockPatch.kt | 9 ++-- .../spoofappversion/SpoofAppVersionPatch.kt | 2 +- .../youtube/layout/theme/Fingerprints.kt | 5 +- .../layout/theme/LithoColorHookPatch.kt | 2 +- .../youtube/layout/theme/ThemePatch.kt | 2 +- .../misc/autorepeat/AutoRepeatPatch.kt | 14 ++++++ .../FixBackToExitGesturePatch.kt | 6 +-- .../fix/cairo/DisableCairoSettingsPatch.kt | 2 +- .../youtube/misc/fix/cairo/Fingerprints.kt | 8 +-- .../youtube/misc/navigation/Fingerprints.kt | 14 +++--- .../misc/navigation/NavigationBarHookPatch.kt | 4 +- .../youtube/misc/playertype/Fingerprints.kt | 10 ++-- .../misc/playertype/PlayerTypeHookPatch.kt | 2 +- .../hook/RecyclerViewTreeHookPatch.kt | 2 +- .../patches/youtube/shared/Fingerprints.kt | 50 ++++++++++++++++--- .../information/VideoInformationPatch.kt | 6 +-- .../quality/RememberVideoQualityPatch.kt | 2 +- .../youtube/video/videoid/Fingerprints.kt | 22 ++++---- .../youtube/video/videoid/VideoIdPatch.kt | 4 +- .../RestoreOldVideoQualityMenuPatch.kt | 10 ++-- 78 files changed, 324 insertions(+), 260 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index b5652b86b7..860f50f620 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -592,12 +592,17 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceElement { public fun toString ()Ljava/lang/String; } -public final class app/revanced/patches/shared/misc/mapping/ResourceMappingFilter : app/revanced/patcher/InstructionFilter { - public fun (Ljava/lang/String;Ljava/lang/String;I)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V +public final class app/revanced/patches/shared/misc/mapping/ResourceLiteralFilter : app/revanced/patcher/InstructionFilter { + public static final field Companion Lapp/revanced/patches/shared/misc/mapping/ResourceLiteralFilter$Companion; + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun matches (Lapp/revanced/patcher/patch/BytecodePatchContext;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Z } +public final class app/revanced/patches/shared/misc/mapping/ResourceLiteralFilter$Companion { + public final fun resourceLiteral (Ljava/lang/String;Ljava/lang/String;I)Lapp/revanced/patches/shared/misc/mapping/ResourceLiteralFilter; + public static synthetic fun resourceLiteral$default (Lapp/revanced/patches/shared/misc/mapping/ResourceLiteralFilter$Companion;Ljava/lang/String;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceLiteralFilter; +} + public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { public static final fun get (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)J public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; @@ -1392,6 +1397,10 @@ public final class app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatc public static final fun getZoomHapticsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/youtube/shared/FingerprintsKt { + public static final fun getHideAdsFingerprint ()Lapp/revanced/patcher/Fingerprint; +} + public final class app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatchKt { public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt index b84d8dc2c1..19dda8b166 100644 --- a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt @@ -12,12 +12,12 @@ val proUnlockPatch = bytecodePatch( compatibleWith("com.backdrops.wallpapers") execute { - val registerIndex = proUnlockFingerprint.filterMatches.last().index - 1 + val registerIndex = proUnlockFingerprint.instructionMatches.last().index - 1 proUnlockFingerprint.method.apply { val register = getInstruction(registerIndex).registerA addInstruction( - proUnlockFingerprint.filterMatches.last().index, + proUnlockFingerprint.instructionMatches.last().index, "const/4 v$register, 0x1", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt index 0b4b8809a6..86a236d71d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt @@ -20,7 +20,7 @@ val disableAdsPatch = bytecodePatch( // // MonetizationDebugSettings seems to be the most general setting to work fine. initializeMonetizationDebugSettingsFingerprint.method.apply { - val insertIndex = initializeMonetizationDebugSettingsFingerprint.filterMatches.first().index + val insertIndex = initializeMonetizationDebugSettingsFingerprint.instructionMatches.first().index val register = getInstruction(insertIndex).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt index 8f20a0cae3..715bb80def 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt @@ -14,7 +14,7 @@ val enableDebugMenuPatch = bytecodePatch( execute { initializeBuildConfigProviderFingerprint.method.apply { - val insertIndex = initializeBuildConfigProviderFingerprint.filterMatches.first().index + val insertIndex = initializeBuildConfigProviderFingerprint.instructionMatches.first().index val register = getInstruction(insertIndex).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt index f6ef051e85..b2d3d6a2d8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt @@ -67,7 +67,7 @@ val hideSponsoredStoriesPatch = bytecodePatch( // Check if the parameter type is GraphQLStory and if sponsoredDataModelGetter returns a non-null value. // If so, hide the story by setting the visibility to StoryVisibility.GONE. getStoryVisibilityFingerprint.method.addInstructionsWithLabels( - getStoryVisibilityFingerprint.filterMatches.first().index, + getStoryVisibilityFingerprint.instructionMatches.first().index, """ instance-of v0, p0, $graphQlStoryClassDescriptor if-eqz v0, :resume_normal diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt index b22fea718a..6057630e69 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt @@ -14,7 +14,7 @@ val enableCustomTabsPatch = bytecodePatch( execute { launchCustomTabFingerprint.method.apply { - val checkIndex = launchCustomTabFingerprint.filterMatches.last().index + 1 + val checkIndex = launchCustomTabFingerprint.instructionMatches.last().index + 1 val register = getInstruction(checkIndex).registerA replaceInstruction(checkIndex, "const/4 v$register, 0x1") diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt index c5c6732177..417e49d596 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt @@ -14,7 +14,7 @@ val disableSwitchingEmojiToStickerPatch = bytecodePatch( execute { switchMessengeInputEmojiButtonFingerprint.method.apply { - val setStringIndex = switchMessengeInputEmojiButtonFingerprint.filterMatches.first().index + 2 + val setStringIndex = switchMessengeInputEmojiButtonFingerprint.instructionMatches.first().index + 2 val targetRegister = getInstruction(setStringIndex).registerA replaceInstruction(setStringIndex, "const-string v$targetRegister, \"expression\"") diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt index f2ef00b104..676df651e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt @@ -17,7 +17,7 @@ val forceEnglishLocalePatch = bytecodePatch( execute { syncBluetoothLanguageFingerprint.method.apply { - val resolvePhoneLocaleInstruction = syncBluetoothLanguageFingerprint.filterMatches.first().index + val resolvePhoneLocaleInstruction = syncBluetoothLanguageFingerprint.instructionMatches.first().index val registerIndexToUpdate = getInstruction(resolvePhoneLocaleInstruction).registerA replaceInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt index df147b47ea..445dc02fd4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt @@ -12,7 +12,7 @@ val hideVideoAdsPatch = bytecodePatch( execute { navigate(showVideoAdsParentFingerprint.originalMethod) - .to(showVideoAdsParentFingerprint.filterMatches.first().index + 1) + .to(showVideoAdsParentFingerprint.instructionMatches.first().index + 1) .stop() .addInstruction(0, "const/4 p1, 0x0") } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt index 4fa57ab422..99d816f701 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt @@ -15,7 +15,7 @@ val permanentRepeatPatch = bytecodePatch( execute { - val startIndex = repeatTrackFingerprint.filterMatches.last().index + val startIndex = repeatTrackFingerprint.instructionMatches.last().index val repeatIndex = startIndex + 1 repeatTrackFingerprint.method.apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt index f112ba071d..9bf541b482 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt @@ -15,7 +15,7 @@ val hideCategoryBar = bytecodePatch( execute { constructCategoryBarFingerprint.method.apply { - val insertIndex = constructCategoryBarFingerprint.filterMatches.first().index + val insertIndex = constructCategoryBarFingerprint.instructionMatches.first().index val register = getInstruction(insertIndex - 1).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt index e1b962229d..ce723b9dc1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt @@ -15,7 +15,7 @@ val hideGetPremiumPatch = bytecodePatch( execute { hideGetPremiumFingerprint.method.apply { - val insertIndex = hideGetPremiumFingerprint.filterMatches.last().index + val insertIndex = hideGetPremiumFingerprint.instructionMatches.last().index val setVisibilityInstruction = getInstruction(insertIndex) val getPremiumViewRegister = setVisibilityInstruction.registerC diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/RemoveUpgradeButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/RemoveUpgradeButtonPatch.kt index 38c76a6793..b1fb8ed9f5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/RemoveUpgradeButtonPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/RemoveUpgradeButtonPatch.kt @@ -23,7 +23,7 @@ val removeUpgradeButtonPatch = bytecodePatch( execute { pivotBarConstructorFingerprint.method.apply { val pivotBarElementFieldReference = - getInstruction(pivotBarConstructorFingerprint.filterMatches.last().index - 1) + getInstruction(pivotBarConstructorFingerprint.instructionMatches.last().index - 1) .getReference() val register = getInstruction(0).registerC @@ -37,7 +37,7 @@ val removeUpgradeButtonPatch = bytecodePatch( iput-object v0, v$register, $pivotBarElementFieldReference """.toInstructions().toMutableList() - val endIndex = pivotBarConstructorFingerprint.filterMatches.last().index + val endIndex = pivotBarConstructorFingerprint.instructionMatches.last().index // Replace the instruction to retain the label at given index. replaceInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt index 9cb91a531c..3e53018c22 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt @@ -39,7 +39,7 @@ val spoofClientPatch = bytecodePatch( val createPlayerRequestBodyMatch = createPlayerRequestBodyFingerprint.match(playerRequestClass) val clientInfoContainerClass = createPlayerRequestBodyMatch.method - .getInstruction(createPlayerRequestBodyMatch.filterMatches.first().index) + .getInstruction(createPlayerRequestBodyMatch.instructionMatches.first().index) .getReference()!!.type val clientInfoField = setClientInfoClientVersionFingerprint.method.instructions.first { @@ -96,7 +96,7 @@ val spoofClientPatch = bytecodePatch( } createPlayerRequestBodyMatch.method.apply { - val checkCastIndex = createPlayerRequestBodyMatch.filterMatches.first().index + val checkCastIndex = createPlayerRequestBodyMatch.instructionMatches.first().index val clientInfoContainerRegister = getInstruction(checkCastIndex).registerA addInstruction(checkCastIndex + 1, "invoke-static {v$clientInfoContainerRegister}, $spoofClientInfoMethod") diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt index fc5f4a6ab3..96eb3ba0fb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt @@ -10,7 +10,7 @@ val signatureDetectionPatch = bytecodePatch( ) { execute { - val replacementIndex = checkSignatureFingerprint.filterMatches.last().index + val replacementIndex = checkSignatureFingerprint.instructionMatches.last().index val checkRegister = checkSignatureFingerprint.method.getInstruction(replacementIndex).registerA checkSignatureFingerprint.method.replaceInstruction(replacementIndex, "const/4 v$checkRegister, 0x1") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt index 9d66e66614..c7817ae3ba 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt @@ -45,7 +45,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "dbrady://relay") { setRemoteConfigFingerprint.method.addInstructions(0, "return-void") // Prevent OAuth login being disabled remotely. - val checkIsOAuthRequestIndex = redditCheckDisableAPIFingerprint.filterMatches.first().index + val checkIsOAuthRequestIndex = redditCheckDisableAPIFingerprint.instructionMatches.first().index redditCheckDisableAPIFingerprint.method.apply { val returnNextChain = getInstruction(checkIsOAuthRequestIndex).target diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt index 64c33f308b..cb4fa24651 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt @@ -24,9 +24,9 @@ val fixVideoDownloadsPatch = bytecodePatch( ) execute { - val scanResult = parseRedditVideoNetworkResponseFingerprint.patternMatch!! - val newInstanceIndex = scanResult.startIndex - val invokeDirectIndex = scanResult.endIndex - 1 + val scanResult = parseRedditVideoNetworkResponseFingerprint.instructionMatches + val newInstanceIndex = scanResult.first().index + val invokeDirectIndex = scanResult.last().index - 1 val buildResponseInstruction = parseRedditVideoNetworkResponseFingerprint.method.getInstruction(invokeDirectIndex) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt index f395b82566..b4bc540a9e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt @@ -10,15 +10,17 @@ val verticalScrollPatch = bytecodePatch( ) { execute { - canScrollVerticallyFingerprint.method.apply { - val moveResultIndex = canScrollVerticallyFingerprint.filterMatches.last().index - val moveResultRegister = getInstruction(moveResultIndex).registerA + canScrollVerticallyFingerprint.let { + it.method.apply { + val moveResultIndex = it.instructionMatches.last().index + val moveResultRegister = getInstruction(moveResultIndex).registerA - val insertIndex = moveResultIndex + 1 - addInstruction( - insertIndex, - "const/4 v$moveResultRegister, 0x0", - ) + val insertIndex = moveResultIndex + 1 + addInstruction( + insertIndex, + "const/4 v$moveResultRegister, 0x0", + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index f607091239..84533d5e5c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -18,13 +18,10 @@ import java.util.concurrent.TimeUnit lateinit var resourceMappings: List private set -/** - * Identical to [LiteralFilter] except uses the literal resource value. - */ -class ResourceMappingFilter( +class ResourceLiteralFilter private constructor( private val type: String, private val name: String, - maxInstructionsBefore: Int = METHOD_MAX_INSTRUCTIONS, + maxInstructionsBefore: Int, ) : InstructionFilter(maxInstructionsBefore) { private val resourceId by lazy { @@ -42,8 +39,20 @@ class ResourceMappingFilter( ): Boolean { return (instruction as? WideLiteralInstruction)?.wideLiteral == resourceId } + + companion object { + /** + * Identical to [LiteralFilter] except uses a decoded resource literal value. + */ + fun resourceLiteral( + type: String, + name: String, + maxInstructionsBefore: Int = METHOD_MAX_INSTRUCTIONS, + ) = ResourceLiteralFilter(type, name, maxInstructionsBefore) + } } + val resourceMappingPatch = resourcePatch { val resourceMappings = Collections.synchronizedList(mutableListOf()) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index 23afbbfa4d..db7415a3bf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -1,8 +1,8 @@ package app.revanced.patches.shared.misc.spoof -import app.revanced.patcher.LiteralFilter -import app.revanced.patcher.MethodCallFilter import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -38,7 +38,7 @@ internal val buildRequestFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Lorg/chromium/net/UrlRequest;") instructions( - MethodCallFilter(methodName = "newUrlRequestBuilder") + methodCall(name = "newUrlRequestBuilder") ) custom { methodDef, _ -> // Different targets have slightly different parameters @@ -120,7 +120,7 @@ internal val hlsCurrentTimeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Z", "L") instructions( - LiteralFilter(45355374L) + literal(45355374L) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index a15b8aada9..678d7e691e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -48,7 +48,7 @@ fun spoofVideoStreamsPatch( // region Block /initplayback requests to fall back to /get_watch requests. - val moveUriStringIndex = buildInitPlaybackRequestFingerprint.filterMatches.first().index + val moveUriStringIndex = buildInitPlaybackRequestFingerprint.instructionMatches.first().index buildInitPlaybackRequestFingerprint.method.apply { val targetRegister = getInstruction(moveUriStringIndex).registerA @@ -66,18 +66,19 @@ fun spoofVideoStreamsPatch( // region Block /get_watch requests to fall back to /player requests. - val invokeToStringIndex = buildPlayerRequestURIFingerprint.patternMatch.startIndex - - buildPlayerRequestURIFingerprint.method.apply { - val uriRegister = getInstruction(invokeToStringIndex).registerC + buildPlayerRequestURIFingerprint.let { + val invokeToStringIndex = it.instructionMatches.first().index + it.method.apply { + val uriRegister = getInstruction(invokeToStringIndex).registerC - addInstructions( - invokeToStringIndex, - """ - invoke-static { v$uriRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockGetWatchRequest(Landroid/net/Uri;)Landroid/net/Uri; - move-result-object v$uriRegister - """, - ) + addInstructions( + invokeToStringIndex, + """ + invoke-static { v$uriRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockGetWatchRequest(Landroid/net/Uri;)Landroid/net/Uri; + move-result-object v$uriRegister + """ + ) + } } // endregion @@ -86,7 +87,7 @@ fun spoofVideoStreamsPatch( buildRequestFingerprint.let { it.method.apply { - val builderIndex = it.filterMatches.first().index + val builderIndex = it.instructionMatches.first().index val urlRegister = getInstruction(builderIndex).registerD val freeRegister = getInstruction(builderIndex + 1).registerA @@ -107,7 +108,7 @@ fun spoofVideoStreamsPatch( createStreamingDataFingerprint.method.apply { val setStreamDataMethodName = "patch_setStreamingData" val resultMethodType = createStreamingDataFingerprint.classDef.type - val videoDetailsIndex = createStreamingDataFingerprint.patternMatch.endIndex + val videoDetailsIndex = createStreamingDataFingerprint.instructionMatches.last().index val videoDetailsRegister = getInstruction(videoDetailsIndex).registerA val videoDetailsClass = getInstruction(videoDetailsIndex).getReference()!!.type @@ -118,7 +119,7 @@ fun spoofVideoStreamsPatch( ) val protobufClass = protobufClassParseByteBufferFingerprint.method.definingClass - val setStreamingDataIndex = createStreamingDataFingerprint.patternMatch.startIndex + val setStreamingDataIndex = createStreamingDataFingerprint.instructionMatches.first().index val playerProtoClass = getInstruction(setStreamingDataIndex + 1) .getReference()!!.definingClass @@ -231,7 +232,7 @@ fun spoofVideoStreamsPatch( hlsCurrentTimeFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatches.first().index, + it.instructionMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->fixHLSCurrentTime(Z)Z" ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt index f0931b75d9..c75a12b119 100644 --- a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt @@ -14,7 +14,7 @@ val removeFileSizeLimitPatch = bytecodePatch( execute { onReadyFingerprint.method.apply { - val cmpIndex = onReadyFingerprint.filterMatches.first().index + 1 + val cmpIndex = onReadyFingerprint.instructionMatches.first().index + 1 val cmpResultRegister = getInstruction(cmpIndex).registerA replaceInstruction(cmpIndex, "const/4 v$cmpResultRegister, 0x0") diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt index c0f06c9c51..76104a4230 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt @@ -54,7 +54,7 @@ val hideAdsPatch = bytecodePatch( // Prevent verification of an HTTP header containing the user's current plan, which would contradict the previous patch. - val conditionIndex = interceptFingerprint.filterMatches.last().index + 1 + val conditionIndex = interceptFingerprint.instructionMatches.last().index + 1 interceptFingerprint.method.addInstruction( conditionIndex, "return-object p1", diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt index 2c9ec0f498..491820dac0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt @@ -14,7 +14,7 @@ val onDemandPatch = bytecodePatch( // Spoof a premium account onDemandFingerprint.method.addInstruction( - onDemandFingerprint.filterMatches.last().index - 1, + onDemandFingerprint.instructionMatches.last().index - 1, "const/4 v0, 0x2", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt index d2889cd223..d0e061b9c6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt @@ -12,7 +12,7 @@ val unlockSubscriptionPatch = bytecodePatch( execute { getSubscribedFingerprint.method.replaceInstruction( - getSubscribedFingerprint.filterMatches.first().index, + getSubscribedFingerprint.instructionMatches.first().index, "const/4 v0, 0x1", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt index 795694f2d5..751c720e6a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt @@ -52,7 +52,7 @@ val disableSubscriptionSuggestionsPatch = bytecodePatch( }, ) - val getModulesIndex = getModulesFingerprint.filterMatches.first().index + val getModulesIndex = getModulesFingerprint.instructionMatches.first().index with(originalMethod) { removeInstruction(getModulesIndex) addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt index 0bef2c3630..06f7d44379 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt @@ -69,7 +69,7 @@ val overrideFeatureFlagsPatch = bytecodePatch( // This is equivalent to // String forcedValue = getValueOverride(feature) // if (forcedValue != null) return forcedValue - val getFeatureIndex = getFeatureValueFingerprint.filterMatches.first().index + val getFeatureIndex = getFeatureValueFingerprint.instructionMatches.first().index getFeatureValueFingerprint.method.addInstructionsWithLabels( getFeatureIndex, """ diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt index 03b1500783..ad9f52f4b0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt @@ -21,7 +21,7 @@ val fixOldVersionsPatch = bytecodePatch( // Remove the live query parameters from the path when it's specified via a @METHOD annotation. for (liveQueryParameter in liveQueryParameters) { httpPathParserFingerprint.method.addInstructions( - httpPathParserFingerprint.filterMatches.last().index + 1, + httpPathParserFingerprint.instructionMatches.last().index + 1, """ # urlPath = urlPath.replace(liveQueryParameter, "") const-string p1, "$liveQueryParameter" diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt index b11acb9adf..68f3022f6d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt @@ -24,7 +24,7 @@ val filterTimelineObjectsPatch = bytecodePatch( dependsOn(sharedExtensionPatch) execute { - val filterInsertIndex = timelineFilterExtensionFingerprint.filterMatches.first().index + val filterInsertIndex = timelineFilterExtensionFingerprint.instructionMatches.first().index timelineFilterExtensionFingerprint.method.apply { val addInstruction = getInstruction(filterInsertIndex + 1) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt index 6f2b9c12c7..945f0a47b9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt @@ -27,7 +27,7 @@ val unlockDownloadsPatch = bytecodePatch( // Allow downloads for non-premium users. showDownloadVideoUpsellBottomSheetFingerprint.patch { - val checkIndex = patternMatch!!.startIndex + val checkIndex = instructionMatches.first().index val register = method.getInstruction(checkIndex).registerA checkIndex to register @@ -42,25 +42,26 @@ val unlockDownloadsPatch = bytecodePatch( } // Make GIFs downloadable. - val patternMatch = buildMediaOptionsSheetFingerprint.patternMatch!! - buildMediaOptionsSheetFingerprint.method.apply { - val checkMediaTypeIndex = patternMatch.startIndex - val checkMediaTypeInstruction = getInstruction(checkMediaTypeIndex) + buildMediaOptionsSheetFingerprint.let { + it.method.apply { + val checkMediaTypeIndex = it.instructionMatches.first().index + val checkMediaTypeInstruction = getInstruction(checkMediaTypeIndex) - // Treat GIFs as videos. - addInstructionsWithLabels( - checkMediaTypeIndex + 1, - """ + // Treat GIFs as videos. + addInstructionsWithLabels( + checkMediaTypeIndex + 1, + """ const/4 v${checkMediaTypeInstruction.registerB}, 0x2 # GIF if-eq v${checkMediaTypeInstruction.registerA}, v${checkMediaTypeInstruction.registerB}, :video """, - ExternalLabel("video", getInstruction(patternMatch.endIndex)), - ) + ExternalLabel("video", getInstruction(it.instructionMatches.last().index)), + ) - // Remove media.isDownloadable check. - removeInstruction( - instructions.first { it.opcode == Opcode.IGET_BOOLEAN }.location.index + 1, - ) + // Remove media.isDownloadable check. + removeInstruction( + instructions.first { it.opcode == Opcode.IGET_BOOLEAN }.location.index + 1, + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt index 3a80c60777..b350a548db 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt @@ -22,7 +22,7 @@ fun addJsonHook( jsonHookPatchFingerprint.method.apply { // Insert hooks right before calling buildList. - val insertIndex = jsonHookPatchFingerprint.filterMatches.last().index + val insertIndex = jsonHookPatchFingerprint.instructionMatches.last().index addInstructions( insertIndex, @@ -77,7 +77,7 @@ val jsonHookPatch = bytecodePatch( finalize { // Remove hooks.add(dummyHook). jsonHookPatchFingerprint.method.apply { - val addDummyHookIndex = jsonHookPatchFingerprint.filterMatches.last().index - 2 + val addDummyHookIndex = jsonHookPatchFingerprint.instructionMatches.last().index - 2 removeInstructions(addDummyHookIndex, 2) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt index e775fb3ec6..4bae4284e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt @@ -45,7 +45,7 @@ val hideGetPremiumPatch = bytecodePatch( ) getPremiumViewFingerprint.method.apply { - val startIndex = getPremiumViewFingerprint.filterMatches.first().index + val startIndex = getPremiumViewFingerprint.instructionMatches.first().index val measuredWidthRegister = getInstruction(startIndex).registerA val measuredHeightInstruction = getInstruction(startIndex + 1) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index 1830644c85..db92bbca3a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -46,17 +46,17 @@ val enableSeekbarTappingPatch = bytecodePatch( ) // Find the required methods to tap the seekbar. - val patternMatch = onTouchEventHandlerFingerprint.patternMatch!! + val instructionMatches = onTouchEventHandlerFingerprint.instructionMatches fun getReference(index: Int) = onTouchEventHandlerFingerprint.method.getInstruction(index) .reference as MethodReference val seekbarTappingMethods = buildMap { - put("N", getReference(patternMatch.startIndex)) - put("O", getReference(patternMatch.endIndex)) + put("N", getReference(instructionMatches.first().index)) + put("O", getReference(instructionMatches.last().index)) } - val insertIndex = seekbarTappingFingerprint.filterMatches.last().index - 1 + val insertIndex = seekbarTappingFingerprint.instructionMatches.last().index - 1 seekbarTappingFingerprint.method.apply { val thisInstanceRegister = getInstruction(insertIndex - 1).registerC diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index f5d34999e5..062f30c57c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -59,7 +59,7 @@ val enableSlideToSeekPatch = bytecodePatch( // Restore the behaviour to slide to seek. - val checkIndex = slideToSeekFingerprint.filterMatches.first().index + val checkIndex = slideToSeekFingerprint.instructionMatches.first().index val checkReference = slideToSeekFingerprint.method.getInstruction(checkIndex) .getReference()!! @@ -93,7 +93,7 @@ val enableSlideToSeekPatch = bytecodePatch( disableFastForwardNoticeFingerprint, ).forEach { fingerprint -> fingerprint.method.apply { - val targetIndex = fingerprint.filterMatches.last().index + val targetIndex = fingerprint.instructionMatches.last().index val targetRegister = getInstruction(targetIndex).registerA addInstructions( @@ -107,7 +107,7 @@ val enableSlideToSeekPatch = bytecodePatch( } } else { disableFastForwardLegacyFingerprint.method.apply { - val insertIndex = disableFastForwardLegacyFingerprint.filterMatches.last().index + 1 + val insertIndex = disableFastForwardLegacyFingerprint.instructionMatches.last().index + 1 val targetRegister = getInstruction(insertIndex).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt index fd957739ce..4b43156a4a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.interaction.seekbar -import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction import app.revanced.util.literal @@ -130,6 +130,6 @@ internal val fullscreenSeekbarThumbnailsQualityFingerprint by fingerprint { returns("Z") parameters() instructions ( - LiteralFilter(45399684L) + literal(45399684L) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt index b1bbecc534..cdcf9b8d4c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt @@ -1,10 +1,10 @@ package app.revanced.patches.youtube.layout.buttons.navigation -import app.revanced.patcher.LastInstructionFilter -import app.revanced.patcher.LiteralFilter -import app.revanced.patcher.MethodCallFilter -import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint +import app.revanced.patcher.lastInstruction +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -21,8 +21,8 @@ internal val createPivotBarFingerprint by fingerprint { "Ljava/lang/CharSequence;", ) instructions( - MethodCallFilter(definingClass = "Landroid/widget/TextView;", methodName = "setText"), - LastInstructionFilter(OpcodeFilter(Opcode.RETURN_VOID)) + methodCall(definingClass = "Landroid/widget/TextView;", name = "setText"), + lastInstruction(opcode(Opcode.RETURN_VOID)) ) } @@ -30,7 +30,7 @@ internal val translucentNavigationStatusBarFeatureFlagFingerprint by fingerprint accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( - LiteralFilter(45400535L) + literal(45400535L) ) } @@ -41,7 +41,7 @@ internal val translucentNavigationButtonsFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( - LiteralFilter(45630927L) + literal(45630927L) ) } @@ -52,6 +52,6 @@ internal val translucentNavigationButtonsSystemFeatureFlagFingerprint by fingerp accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( - LiteralFilter(45632194L) + literal(45632194L) ) } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index 9a27669b44..c4d8dd0b93 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -95,7 +95,7 @@ val navigationButtonsPatch = bytecodePatch( // Hide navigation button labels. createPivotBarFingerprint.let { it.method.apply { - val setTextIndex = it.filterMatches.first().index + val setTextIndex = it.instructionMatches.first().index val targetRegister = getInstruction(setTextIndex).registerC addInstruction( @@ -114,21 +114,21 @@ val navigationButtonsPatch = bytecodePatch( if (is_19_25_or_greater) { translucentNavigationStatusBarFeatureFlagFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatches.first().index, + it.instructionMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationStatusBar(Z)Z", ) } translucentNavigationButtonsFeatureFlagFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatches.first().index, + it.instructionMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", ) } translucentNavigationButtonsSystemFeatureFlagFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatches.first().index, + it.instructionMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt index d8d31c611a..d719196bf3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt @@ -1,8 +1,8 @@ package app.revanced.patches.youtube.layout.buttons.overlay -import app.revanced.patcher.MethodCallFilter import app.revanced.patcher.fingerprint -import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter +import app.revanced.patcher.methodCall +import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags internal val playerControlsPreviousNextOverlayTouchFingerprint by fingerprint { @@ -10,9 +10,9 @@ internal val playerControlsPreviousNextOverlayTouchFingerprint by fingerprint { returns("V") strings("1.0x") instructions( - ResourceMappingFilter("id", "player_control_previous_button_touch_area"), - ResourceMappingFilter("id", "player_control_next_button_touch_area"), - MethodCallFilter(parameters = listOf("Landroid/view/View;", "I")) + resourceLiteral("id", "player_control_previous_button_touch_area"), + resourceLiteral("id", "player_control_next_button_touch_area"), + methodCall(parameters = listOf("Landroid/view/View;", "I")) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt index 6a275dbab1..b11696fe1e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt @@ -63,7 +63,7 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( playerControlsPreviousNextOverlayTouchFingerprint.let { it.method.apply { - val insertIndex = it.filterMatches.last().index + val insertIndex = it.instructionMatches.last().index val viewRegister = getInstruction(insertIndex).registerC addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt index 0d816b91a5..c469a6e2f6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt @@ -50,7 +50,7 @@ val changeFormFactorPatch = bytecodePatch( createPlayerRequestBodyWithModelFingerprint.let { it.method.apply { - val index = it.filterMatches.last().index + val index = it.instructionMatches.last().index val register = getInstruction(index).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt index 42569990b1..c1ec6f8ef7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.layout.formfactor -import app.revanced.patcher.FieldAccessFilter +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint import app.revanced.patches.youtube.layout.formfactor.formFactorEnumConstructorFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -20,8 +20,8 @@ internal val createPlayerRequestBodyWithModelFingerprint by fingerprint { returns("L") parameters() instructions( - FieldAccessFilter("Landroid/os/Build;", "MODEL", "Ljava/lang/String;"), - FieldAccessFilter( + fieldAccess("Landroid/os/Build;", "MODEL", "Ljava/lang/String;"), + fieldAccess( definingClass = { context -> with(context) { formFactorEnumConstructorFingerprint.originalClassDef.type } }, type = { "I" }, maxInstructionsBefore = 50 diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt index baa372e872..96feb706e9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt @@ -75,7 +75,7 @@ val hideEndscreenCardsPatch = bytecodePatch( layoutVideoFingerprint, ).forEach { fingerprint -> fingerprint.method.apply { - val insertIndex = fingerprint.filterMatches.last().index + 1 + val insertIndex = fingerprint.instructionMatches.last().index + 1 val viewRegister = getInstruction(insertIndex - 1).registerA addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 983d695333..6450fa2d23 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -1,9 +1,9 @@ package app.revanced.patches.youtube.layout.hide.general -import app.revanced.patcher.MethodCallFilter -import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint -import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -11,11 +11,9 @@ import com.android.tools.smali.dexlib2.Opcode internal val hideShowMoreButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( - ResourceMappingFilter("layout", "expand_button_down"), - MethodCallFilter.parseJvmMethodCall( - "Landroid/view/View;->inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;", - ), - OpcodeFilter(Opcode.MOVE_RESULT_OBJECT) + resourceLiteral("layout", "expand_button_down"), + methodCall(smaliString = "Landroid/view/View;->inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;"), + opcode(Opcode.MOVE_RESULT_OBJECT) ) } @@ -46,7 +44,7 @@ internal val yoodlesImageViewFingerprint by fingerprint { returns("Landroid/view/View;") parameters("L", "L") instructions( - ResourceMappingFilter("id", "youtube_logo") + resourceLiteral("id", "youtube_logo") ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 2d193b72df..926dd86b7c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -233,7 +233,7 @@ val hideLayoutComponentsPatch = bytecodePatch( // region Mix playlists parseElementFromBufferFingerprint.method.apply { - val startIndex = parseElementFromBufferFingerprint.filterMatches.first().index + val startIndex = parseElementFromBufferFingerprint.instructionMatches.first().index // Target code is a mess with a lot of register moves. // There is no simple way to find a free register for all versions so this is hard coded. val freeRegister = if (is_19_47_or_greater) 6 else 0 @@ -281,7 +281,7 @@ val hideLayoutComponentsPatch = bytecodePatch( // region Show more button hideShowMoreButtonFingerprint.method.apply { - val moveRegisterIndex = hideShowMoreButtonFingerprint.filterMatches.last().index + val moveRegisterIndex = hideShowMoreButtonFingerprint.instructionMatches.last().index val viewRegister = getInstruction(moveRegisterIndex).registerA val insertIndex = moveRegisterIndex + 1 @@ -297,7 +297,7 @@ val hideLayoutComponentsPatch = bytecodePatch( // region crowdfunding box crowdfundingBoxFingerprint.let { it.method.apply { - val insertIndex = it.filterMatches.last().index + val insertIndex = it.instructionMatches.last().index val objectRegister = getInstruction(insertIndex).registerA addInstruction( @@ -314,7 +314,7 @@ val hideLayoutComponentsPatch = bytecodePatch( albumCardsFingerprint.let { it.method.apply { - val checkCastAnchorIndex = it.filterMatches.last().index + val checkCastAnchorIndex = it.instructionMatches.last().index val insertIndex = checkCastAnchorIndex + 1 val register = getInstruction(checkCastAnchorIndex).registerA @@ -332,7 +332,7 @@ val hideLayoutComponentsPatch = bytecodePatch( showFloatingMicrophoneButtonFingerprint.let { it.method.apply { - val startIndex = it.filterMatches.first().index + val startIndex = it.instructionMatches.first().index val register = getInstruction(startIndex).registerA addInstructions( @@ -384,11 +384,9 @@ val hideLayoutComponentsPatch = bytecodePatch( hookRegisterOffset: Int = 0, instructions: (Int) -> String, ) = method.apply { - val endIndex = patternMatch!!.endIndex - + val endIndex = instructionMatches.last().index val insertIndex = endIndex + insertIndexOffset - val register = - getInstruction(endIndex + hookRegisterOffset).registerA + val register = getInstruction(endIndex + hookRegisterOffset).registerA addInstructions(insertIndex, instructions(register)) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index 052c8206f0..033ff4b0ab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -85,7 +85,7 @@ val hideInfoCardsPatch = bytecodePatch( val hideInfoCardsCallMethod = infocardsMethodCallFingerprint.method - val invokeInterfaceIndex = infocardsMethodCallFingerprint.filterMatches.last().index + val invokeInterfaceIndex = infocardsMethodCallFingerprint.instructionMatches.last().index val toggleRegister = infocardsMethodCallFingerprint.method.implementation!!.registerCount - 1 hideInfoCardsCallMethod.addInstructionsWithLabels( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index 8dac00f2cb..efebe593f3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -50,27 +50,27 @@ val disableRollingNumberAnimationPatch = bytecodePatch( // Animations are disabled by preventing an Image from being applied to the text span, // which prevents the animations from appearing. + rollingNumberTextViewAnimationUpdateFingerprint.let { + val blockStartIndex = it.instructionMatches.first().index + val blockEndIndex = it.instructionMatches.last().index + 1 + it.method.apply { + val freeRegister = getInstruction(blockStartIndex).registerA - val patternMatch = rollingNumberTextViewAnimationUpdateFingerprint.patternMatch!! - val blockStartIndex = patternMatch.startIndex - val blockEndIndex = patternMatch.endIndex + 1 - rollingNumberTextViewAnimationUpdateFingerprint.method.apply { - val freeRegister = getInstruction(blockStartIndex).registerA + // ReturnYouTubeDislike also makes changes to this same method, + // and must add control flow label to a noop instruction to + // ensure RYD patch adds its changes after the control flow label. + addInstructions(blockEndIndex, "nop") - // ReturnYouTubeDislike also makes changes to this same method, - // and must add control flow label to a noop instruction to - // ensure RYD patch adds its changes after the control flow label. - addInstructions(blockEndIndex, "nop") - - addInstructionsWithLabels( - blockStartIndex, - """ + addInstructionsWithLabels( + blockStartIndex, + """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableRollingNumberAnimations()Z move-result v$freeRegister if-nez v$freeRegister, :disable_animations """, - ExternalLabel("disable_animations", getInstruction(blockEndIndex)), - ) + ExternalLabel("disable_animations", getInstruction(blockEndIndex)), + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt index 8babedec93..5dd5a8f48c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt @@ -1,9 +1,9 @@ package app.revanced.patches.youtube.layout.hide.shorts -import app.revanced.patcher.MethodCallFilter -import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint -import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -25,16 +25,16 @@ internal val shortsBottomBarContainerFingerprint by fingerprint { parameters("Landroid/view/View;", "Landroid/os/Bundle;") strings("r_pfvc") instructions( - ResourceMappingFilter("id", "bottom_bar_container"), - MethodCallFilter(methodName = "getHeight"), - OpcodeFilter(Opcode.MOVE_RESULT) + resourceLiteral("id", "bottom_bar_container"), + methodCall(name = "getHeight"), + opcode(Opcode.MOVE_RESULT) ) } internal val createShortsButtonsFingerprint by fingerprint { returns("V") instructions( - ResourceMappingFilter("dimen", "reel_player_right_cell_button_height") + resourceLiteral("dimen", "reel_player_right_cell_button_height") ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 6b77b2ebb9..6bc4af2af6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -211,7 +211,7 @@ val hideShortsComponentsPatch = bytecodePatch( setPivotBarVisibilityParentFingerprint.originalClassDef, ).let { result -> result.method.apply { - val insertIndex = result.patternMatch.endIndex + val insertIndex = result.instructionMatches.last().index val viewRegister = getInstruction(insertIndex - 1).registerA addInstruction( insertIndex, @@ -236,7 +236,7 @@ val hideShortsComponentsPatch = bytecodePatch( // Hide the bottom bar container of the Shorts player. shortsBottomBarContainerFingerprint.let { it.method.apply { - val targetIndex = it.filterMatches.last().index + val targetIndex = it.instructionMatches.last().index val heightRegister = getInstruction(targetIndex).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt index e70a99b7e5..290a423596 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt @@ -68,7 +68,7 @@ val disableSuggestedVideoEndScreenPatch = bytecodePatch( execute { createEndScreenViewFingerprint.method.apply { - val addOnClickEventListenerIndex = createEndScreenViewFingerprint.filterMatches.last().index - 1 + val addOnClickEventListenerIndex = createEndScreenViewFingerprint.instructionMatches.last().index - 1 val viewRegister = getInstruction(addOnClickEventListenerIndex).registerC addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 549ecdf505..33ab427f7a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -2,9 +2,9 @@ package app.revanced.patches.youtube.layout.miniplayer -import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint -import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter +import app.revanced.patcher.literal +import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -14,7 +14,7 @@ internal val miniplayerDimensionsCalculatorParentFingerprint by fingerprint { returns("V") parameters("L") instructions( - ResourceMappingFilter("dimen", "floaty_bar_button_top_margin") + resourceLiteral("dimen", "floaty_bar_button_top_margin") ) } @@ -120,9 +120,9 @@ internal val miniplayerModernViewParentFingerprint by fingerprint { internal val miniplayerMinimumSizeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( - ResourceMappingFilter("dimen", "miniplayer_max_size"), - LiteralFilter(192), - LiteralFilter(128) + resourceLiteral("dimen", "miniplayer_max_size"), + literal(192), + literal(128) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 3ea37a6eb1..70f273e76e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -327,7 +327,7 @@ val miniplayerPatch = bytecodePatch( } miniplayerResponseModelSizeCheckFingerprint.let { - it.method.insertLegacyTabletMiniplayerOverride(it.patternMatch.endIndex) + it.method.insertLegacyTabletMiniplayerOverride(it.instructionMatches.last().index) } // endregion @@ -392,7 +392,7 @@ val miniplayerPatch = bytecodePatch( // Override a minimum size constant. miniplayerMinimumSizeFingerprint.let { it.method.apply { - val index = it.filterMatches[1].index + val index = it.instructionMatches[1].index val register = getInstruction(index).registerA // Smaller sizes can be used, but the miniplayer will always start in size 170 if set any smaller. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt index bee674206b..dff9dbae45 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.layout.player.fullscreen -import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal import com.android.tools.smali.dexlib2.AccessFlags internal val openVideosFullscreenPortraitFingerprint by fingerprint { @@ -9,7 +9,7 @@ internal val openVideosFullscreenPortraitFingerprint by fingerprint { returns("V") parameters("L", "Lj\$/util/Optional;") instructions( - LiteralFilter(45666112L) + literal(45666112L) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt index 0603a6a8dc..ae993d926e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt @@ -26,7 +26,7 @@ internal val openVideosFullscreenHookPatch = bytecodePatch { openVideosFullscreenPortraitFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatches.first().index, + it.instructionMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->openVideoFullscreenPortrait(Z)Z" ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index fc083a80d7..42a743cb16 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -172,7 +172,7 @@ val returnYouTubeDislikePatch = bytecodePatch( // region Hook for non-litho Short videos. shortsTextViewFingerprint.method.apply { - val insertIndex = shortsTextViewFingerprint.filterMatches.last().index + 1 + val insertIndex = shortsTextViewFingerprint.instructionMatches.last().index + 1 // If the field is true, the TextView is for a dislike button. val isDisLikesBooleanInstruction = instructions.first { instruction -> @@ -229,7 +229,7 @@ val returnYouTubeDislikePatch = bytecodePatch( // Do this last to allow patching old unsupported versions (if the user really wants), // On older unsupported version this will fail to match and throw an exception, // but everything will still work correctly anyway. - val dislikesIndex = rollingNumberSetterFingerprint.filterMatches.last().index + val dislikesIndex = rollingNumberSetterFingerprint.instructionMatches.last().index rollingNumberSetterFingerprint.method.apply { val insertIndex = 1 @@ -258,20 +258,22 @@ val returnYouTubeDislikePatch = bytecodePatch( // Rolling Number text views use the measured width of the raw string for layout. // Modify the measure text calculation to include the left drawable separator if needed. - val patternMatch = rollingNumberMeasureAnimatedTextFingerprint.patternMatch!! - // Additional check to verify the opcodes are at the start of the method - if (patternMatch.startIndex != 0) throw PatchException("Unexpected opcode location") - val endIndex = patternMatch.endIndex - rollingNumberMeasureAnimatedTextFingerprint.method.apply { - val measuredTextWidthRegister = getInstruction(endIndex).registerA + rollingNumberMeasureAnimatedTextFingerprint.let { + // Additional check to verify the opcodes are at the start of the method + if (it.instructionMatches.first().index != 0) throw PatchException("Unexpected opcode location") + val endIndex = it.instructionMatches.last().index - addInstructions( - endIndex + 1, - """ - invoke-static {p1, v$measuredTextWidthRegister}, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F - move-result v$measuredTextWidthRegister - """, - ) + it.method.apply { + val measuredTextWidthRegister = getInstruction(endIndex).registerA + + addInstructions( + endIndex + 1, + """ + invoke-static {p1, v$measuredTextWidthRegister}, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F + move-result v$measuredTextWidthRegister + """ + ) + } } // Additional text measurement method. Used if YouTube decides not to animate the likes count @@ -279,7 +281,7 @@ val returnYouTubeDislikePatch = bytecodePatch( rollingNumberMeasureStaticLabelFingerprint.match( rollingNumberMeasureStaticLabelParentFingerprint.originalClassDef, ).let { - val measureTextIndex = it.filterMatches.first().index + 1 + val measureTextIndex = it.instructionMatches.first().index + 1 it.method.apply { val freeRegister = getInstruction(0).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt index 448185867b..9aa4bdcc87 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt @@ -76,7 +76,7 @@ val wideSearchbarPatch = bytecodePatch( mapOf( setWordmarkHeaderFingerprint to 1, - createSearchSuggestionsFingerprint to createSearchSuggestionsFingerprint.filterMatches.first().index, + createSearchSuggestionsFingerprint to createSearchSuggestionsFingerprint.instructionMatches.first().index, ).forEach { (fingerprint, callIndex) -> walkMutable(callIndex, fingerprint).injectSearchBarHook() } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index 25dfeff76d..a9e178e363 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.layout.seekbar -import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal import app.revanced.util.containsLiteralInstruction import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags @@ -12,7 +12,7 @@ internal val fullscreenSeekbarThumbnailsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() instructions( - LiteralFilter(45398577) + literal(45398577) ) } @@ -42,7 +42,7 @@ internal val playerSeekbarGradientConfigFingerprint by fingerprint { returns("Z") parameters() instructions( - LiteralFilter(45617850L) + literal(45617850L) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index 8b877d446b..be5af1ff94 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -208,7 +208,7 @@ val seekbarColorPatch = bytecodePatch( } setSeekbarClickedColorFingerprint.originalMethod.let { - val setColorMethodIndex = setSeekbarClickedColorFingerprint.patternMatch.startIndex + 1 + val setColorMethodIndex = setSeekbarClickedColorFingerprint.instructionMatches.first().index + 1 navigate(it).to(setColorMethodIndex).stop().apply { val colorRegister = getInstruction(0).registerA @@ -232,7 +232,7 @@ val seekbarColorPatch = bytecodePatch( playerSeekbarGradientConfigFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatches.first().index, + it.instructionMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->playerSeekbarGradientEnabled(Z)Z" ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt index bf3a1e1aaa..07de7d75cb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt @@ -67,7 +67,7 @@ val shortsAutoplayPatch = bytecodePatch( val reelEnumClass = reelEnumConstructorFingerprint.originalClassDef.type reelEnumConstructorFingerprint.method.apply { - val insertIndex = reelEnumConstructorFingerprint.filterMatches.first().index + val insertIndex = reelEnumConstructorFingerprint.instructionMatches.first().index addInstructions( insertIndex, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index 1f3bfbb7cf..7f37e88c6b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -177,7 +177,7 @@ val sponsorBlockPatch = bytecodePatch( injectVisibilityCheckCall(EXTENSION_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR) // Append the new time to the player layout. - val appendTimePatternScanStartIndex = appendTimeFingerprint.filterMatches.first().index + val appendTimePatternScanStartIndex = appendTimeFingerprint.instructionMatches.first().index appendTimeFingerprint.method.apply { val register = getInstruction(appendTimePatternScanStartIndex + 1).registerA @@ -195,7 +195,7 @@ val sponsorBlockPatch = bytecodePatch( // Initialize the SponsorBlock view. controlsOverlayFingerprint.match(layoutConstructorFingerprint.originalClassDef).let { - val startIndex = it.filterMatches.first().index + val startIndex = it.instructionMatches.first().index it.method.apply { val frameLayoutRegister = (getInstruction(startIndex + 2) as OneRegisterInstruction).registerA addInstruction( @@ -216,9 +216,8 @@ val sponsorBlockPatch = bytecodePatch( segmentPlaybackControllerFingerprint.let { it.method.apply { - val replaceIndex = it.patternMatch.startIndex - val replaceRegister = - getInstruction(replaceIndex).registerA + val replaceIndex = it.instructionMatches.first().index + val replaceRegister = getInstruction(replaceIndex).registerA replaceInstruction( replaceIndex, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index 029220e354..1e8a1f5869 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -64,7 +64,7 @@ val spoofAppVersionPatch = bytecodePatch( } ) - val insertIndex = spoofAppVersionFingerprint.filterMatches.first().index + 1 + val insertIndex = spoofAppVersionFingerprint.instructionMatches.first().index + 1 val buildOverrideNameRegister = spoofAppVersionFingerprint.method.getInstruction(insertIndex - 1).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt index 2a6db81f7c..35fbf5bf02 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt @@ -1,8 +1,7 @@ package app.revanced.patches.youtube.layout.theme -import app.revanced.patcher.LiteralFilter import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -54,6 +53,6 @@ internal val themeHelperLightColorFingerprint by fingerprint { internal val useGradientLoadingScreenFingerprint by fingerprint { instructions( - LiteralFilter(45412406L) + literal(45412406L) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt index 0e1ca1d67c..531db33c8f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt @@ -12,7 +12,7 @@ val lithoColorHookPatch = bytecodePatch( execute { - var insertionIndex = lithoThemeFingerprint.filterMatches.last().index - 1 + var insertionIndex = lithoThemeFingerprint.instructionMatches.last().index - 1 lithoColorOverrideHook = { targetMethodClass, targetMethodName -> lithoThemeFingerprint.method.addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt index 9e25db5db6..4e88654208 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt @@ -218,7 +218,7 @@ val themePatch = bytecodePatch( useGradientLoadingScreenFingerprint.let { it.method.insertFeatureFlagBooleanOverride( - it.filterMatches.first().index, + it.instructionMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled(Z)Z" ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt index 9953f5fc82..054406092c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.misc.autorepeat +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction @@ -11,6 +12,8 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.shared.autoRepeatFingerprint import app.revanced.patches.youtube.shared.autoRepeatParentFingerprint +import app.revanced.patches.youtube.shared.hideAdsFingerprint +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction // TODO: Rename this patch to AlwaysRepeatPatch (as well as strings and references in the extension). val autoRepeatPatch = bytecodePatch( @@ -43,6 +46,17 @@ val autoRepeatPatch = bytecodePatch( SwitchPreference("revanced_auto_repeat"), ) + hideAdsFingerprint.match(hideAdsFingerprint.originalClassDef) + + hideAdsFingerprint.let { + val filter3 = it.instructionMatches[2] + + val moveResultIndex = filter3.index + val moveResultRegister = filter3.getInstruction().registerA + + it.method.addInstruction(moveResultIndex + 1, "const/4 v$moveResultRegister, 0x0") + } + autoRepeatFingerprint.match(autoRepeatParentFingerprint.originalClassDef).method.apply { val playMethod = autoRepeatParentFingerprint.method val index = instructions.lastIndex diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt index a02e556f8b..e5f14935fe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt @@ -17,14 +17,14 @@ internal val fixBackToExitGesturePatch = bytecodePatch( recyclerViewTopScrollingFingerprint.match(recyclerViewTopScrollingParentFingerprint.originalClassDef) .let { it.method.addInstruction( - it.filterMatches.last().index, + it.instructionMatches.last().index, "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V" ) } scrollPositionFingerprint.let { navigate(it.originalMethod) - .to(it.filterMatches.first().index + 1) + .to(it.instructionMatches.first().index + 1) .stop().apply { val index = indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_VIRTUAL && getReference()?.definingClass == @@ -41,7 +41,7 @@ internal val fixBackToExitGesturePatch = bytecodePatch( onBackPressedFingerprint.let { it.method.addInstruction( - it.filterMatches.last().index, + it.instructionMatches.last().index, "invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->onBackPressed(Landroid/app/Activity;)V" ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt index 1021efeed1..060d8ab306 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/DisableCairoSettingsPatch.kt @@ -32,7 +32,7 @@ internal val disableCairoSettingsPatch = bytecodePatch( */ cairoFragmentConfigFingerprint.let{ it.method.apply { - val resultIndex = it.filterMatches.last().index + val resultIndex = it.instructionMatches.last().index val register = getInstruction(resultIndex).registerA addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/Fingerprints.kt index c44b37aff2..517c8e6626 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/cairo/Fingerprints.kt @@ -1,8 +1,8 @@ package app.revanced.patches.youtube.misc.fix.cairo -import app.revanced.patcher.LiteralFilter -import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal +import app.revanced.patcher.opcode import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -16,7 +16,7 @@ internal val cairoFragmentConfigFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( - LiteralFilter(45532100L), - OpcodeFilter(Opcode.MOVE_RESULT, 10) + literal(45532100L), + opcode(Opcode.MOVE_RESULT, 10) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt index 279cd93f98..2fc358ef53 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt @@ -1,8 +1,8 @@ package app.revanced.patches.youtube.misc.navigation -import app.revanced.patcher.MethodCallFilter import app.revanced.patcher.fingerprint -import app.revanced.patches.shared.misc.mapping.ResourceMappingFilter +import app.revanced.patcher.methodCall +import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral import app.revanced.patches.youtube.layout.buttons.navigation.navigationButtonsPatch import com.android.tools.smali.dexlib2.AccessFlags @@ -10,8 +10,8 @@ internal val actionBarSearchResultsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") instructions( - ResourceMappingFilter("layout", "action_bar_search_results_view_mic"), - MethodCallFilter(methodName = "setLayoutDirection") + resourceLiteral("layout", "action_bar_search_results_view_mic"), + methodCall(name = "setLayoutDirection") ) } @@ -22,7 +22,7 @@ internal val initializeButtonsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( - ResourceMappingFilter("layout", "image_only_tab") + resourceLiteral("layout", "image_only_tab") ) } @@ -93,7 +93,7 @@ internal val pivotBarButtonsViewSetSelectedFingerprint by fingerprint { returns("V") parameters("I", "Z") instructions( - MethodCallFilter(methodName = "setSelected") + methodCall(name = "setSelected") ) custom { method, _ -> method.definingClass == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" @@ -113,6 +113,6 @@ internal val imageEnumConstructorFingerprint by fingerprint { internal val setEnumMapFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( - ResourceMappingFilter("drawable", "yt_fill_bell_black_24") + resourceLiteral("drawable", "yt_fill_bell_black_24") ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt index f363901871..552a57f31f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt @@ -80,7 +80,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig pivotBarButtonsViewSetSelectedFingerprint.let { it.method.apply { - val index = it.filterMatches.first().index + val index = it.instructionMatches.first().index val instruction = getInstruction(index) val viewRegister = instruction.registerC val isSelectedRegister = instruction.registerD @@ -108,7 +108,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig // so this works regardless which layout is used. actionBarSearchResultsFingerprint.let { it.method.apply { - val instructionIndex = it.filterMatches.last().index + val instructionIndex = it.instructionMatches.last().index val viewRegister = getInstruction(instructionIndex).registerC addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt index e66e544539..c53db6c305 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt @@ -1,8 +1,8 @@ package app.revanced.patches.youtube.misc.playertype -import app.revanced.patcher.FieldAccessFilter -import app.revanced.patcher.LiteralFilter +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -36,10 +36,10 @@ internal val videoStateFingerprint by fingerprint { returns("V") parameters("Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;") instructions( - LiteralFilter(1), - LiteralFilter(literal = 0, maxInstructionsBefore = 10), + literal(1), + literal(literal = 0, maxInstructionsBefore = 10), // Obfuscated parameter field name. - FieldAccessFilter( + fieldAccess( definingClass = { "Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;"}, type = { context: BytecodePatchContext -> with(context) { videoStateEnumFingerprint.originalClassDef.type } }, maxInstructionsBefore = 5 diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt index 9ec8a44333..ed43d15413 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt @@ -23,7 +23,7 @@ val playerTypeHookPatch = bytecodePatch( videoStateFingerprint.let { it.method.apply { val videoStateFieldName = getInstruction( - it.filterMatches.last().index + it.instructionMatches.last().index ).reference addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt index fb91c31486..1044c7d2f2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt @@ -13,7 +13,7 @@ val recyclerViewTreeHookPatch = bytecodePatch { execute { recyclerViewTreeObserverFingerprint.method.apply { - val insertIndex = recyclerViewTreeObserverFingerprint.filterMatches.first().index + 1 + val insertIndex = recyclerViewTreeObserverFingerprint.instructionMatches.first().index + 1 val recyclerViewParameter = 2 addRecyclerViewTreeHook = { classDescriptor -> diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index bc778042b3..b70240361f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -1,12 +1,46 @@ package app.revanced.patches.youtube.shared -import app.revanced.patcher.FieldAccessFilter -import app.revanced.patcher.NewInstanceFilter -import app.revanced.patcher.OpcodeFilter +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.newInstance +import app.revanced.patcher.opcode import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode + +val hideAdsFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + parameters("Ljava/lang/String;", "I") + strings("showBannerAds") + instructions( + // Filter 1 + fieldAccess( + definingClass = "this", + type = "Ljava/util/Map;" + ), + + // Filter 2 + methodCall( + definingClass = "Ljava/lang/String;", + name = "equals", + parameters = listOf("Ljava/lang/Object;"), + returnType = "Z" + ), + + // Filter 3 + opcode(Opcode.MOVE_RESULT), + + // Filter 4 + literal(1337) + ) + custom { method, classDef -> + classDef.type == "Lapp/revanced/extension/shared/AdsLoader;" + } +} + internal val autoRepeatFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") @@ -111,10 +145,10 @@ internal val newVideoQualityChangedFingerprint by fingerprint { returns("L") parameters("L") instructions( - NewInstanceFilter("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;"), - OpcodeFilter(Opcode.IGET_OBJECT), - OpcodeFilter(Opcode.CHECK_CAST), - FieldAccessFilter(type = "I", opcode = Opcode.IGET, maxInstructionsBefore = 0), // Video resolution (human readable). - FieldAccessFilter(type = "Ljava/lang/String;", opcode = Opcode.IGET_OBJECT, maxInstructionsBefore = 0), + newInstance("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;"), + opcode(Opcode.IGET_OBJECT), + opcode(Opcode.CHECK_CAST), + fieldAccess(type = "I", opcode = Opcode.IGET, maxInstructionsBefore = 0), // Video resolution (human readable). + fieldAccess(type = "Ljava/lang/String;", opcode = Opcode.IGET_OBJECT, maxInstructionsBefore = 0), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index 2463ceb740..b70904d2a4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -125,12 +125,12 @@ val videoInformationPatch = bytecodePatch( val videoLengthMethodMatch = videoLengthFingerprint.match(originalClassDef) videoLengthMethodMatch.method.apply { - val videoLengthRegisterIndex = videoLengthMethodMatch.filterMatches.last().index - 2 + val videoLengthRegisterIndex = videoLengthMethodMatch.instructionMatches.last().index - 2 val videoLengthRegister = getInstruction(videoLengthRegisterIndex).registerA val dummyRegisterForLong = videoLengthRegister + 1 // required for long values since they are wide addInstruction( - videoLengthMethodMatch.filterMatches.last().index, + videoLengthMethodMatch.instructionMatches.last().index, "invoke-static {v$videoLengthRegister, v$dummyRegisterForLong}, " + "$EXTENSION_CLASS_DESCRIPTOR->setVideoLength(J)V", ) @@ -159,7 +159,7 @@ val videoInformationPatch = bytecodePatch( * Set the video time method */ timeMethod = navigate(playerControllerSetTimeReferenceFingerprint.originalMethod) - .to(playerControllerSetTimeReferenceFingerprint.filterMatches.first().index) + .to(playerControllerSetTimeReferenceFingerprint.instructionMatches.first().index) .stop() /* diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index 01e19216e8..129b258eee 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -133,7 +133,7 @@ val rememberVideoQualityPatch = bytecodePatch( // Remember video quality if not using old layout menu. newVideoQualityChangedFingerprint.method.apply { - val index = newVideoQualityChangedFingerprint.filterMatches[3].index + val index = newVideoQualityChangedFingerprint.instructionMatches[3].index val qualityRegister = getInstruction(index).registerA addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index f601ccabd7..77aac5076d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -1,8 +1,8 @@ package app.revanced.patches.youtube.video.videoid -import app.revanced.patcher.MethodCallFilter -import app.revanced.patcher.OpcodeFilter import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -12,11 +12,11 @@ internal val videoIdFingerprint by fingerprint { returns("V") parameters("L") instructions( - MethodCallFilter( + methodCall( definingClass = "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;", returnType = "Ljava/lang/String;" ), - OpcodeFilter(Opcode.MOVE_RESULT_OBJECT), + opcode(Opcode.MOVE_RESULT_OBJECT), ) } @@ -25,16 +25,16 @@ internal val videoIdBackgroundPlayFingerprint by fingerprint { returns("V") parameters("L") instructions( - MethodCallFilter( + methodCall( definingClass = "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;", returnType = "Ljava/lang/String;" ), - OpcodeFilter(Opcode.MOVE_RESULT_OBJECT), - OpcodeFilter(Opcode.IPUT_OBJECT), - OpcodeFilter(Opcode.MONITOR_EXIT), - OpcodeFilter(Opcode.RETURN_VOID), - OpcodeFilter(Opcode.MONITOR_EXIT), - OpcodeFilter(Opcode.RETURN_VOID) + opcode(Opcode.MOVE_RESULT_OBJECT), + opcode(Opcode.IPUT_OBJECT), + opcode(Opcode.MONITOR_EXIT), + opcode(Opcode.RETURN_VOID), + opcode(Opcode.MONITOR_EXIT), + opcode(Opcode.RETURN_VOID) ) // The target snippet of code is buried in a huge switch block and the target method // has been changed many times by YT which makes identifying it more difficult than usual. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt index 9bf382f9a7..7ffdb3b2e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt @@ -95,7 +95,7 @@ val videoIdPatch = bytecodePatch( videoIdFingerprint.match(videoIdParentFingerprint.originalClassDef).let { it.method.apply { videoIdMethod = this - val index = it.filterMatches.first().index + val index = it.instructionMatches.first().index videoIdRegister = getInstruction(index + 1).registerA videoIdInsertIndex = index + 2 } @@ -104,7 +104,7 @@ val videoIdPatch = bytecodePatch( videoIdBackgroundPlayFingerprint.let { it.method.apply { backgroundPlaybackMethod = this - val index = it.filterMatches.first().index + val index = it.instructionMatches.first().index backgroundPlaybackVideoIdRegister = getInstruction(index + 1).registerA backgroundPlaybackInsertIndex = index + 2 } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt index 937316c3b7..36dddde2af 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt @@ -3,7 +3,6 @@ package app.revanced.patches.youtube.video.videoqualitymenu import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources @@ -92,7 +91,7 @@ val restoreOldVideoQualityMenuPatch = bytecodePatch( // and for the Shorts quality flyout on newer app versions. videoQualityMenuViewInflateFingerprint.method.apply { - val checkCastIndex = videoQualityMenuViewInflateFingerprint.filterMatches.last().index + val checkCastIndex = videoQualityMenuViewInflateFingerprint.instructionMatches.last().index val listViewRegister = getInstruction(checkCastIndex).registerA addInstruction( @@ -104,10 +103,9 @@ val restoreOldVideoQualityMenuPatch = bytecodePatch( } // Force YT to add the 'advanced' quality menu for Shorts. - val patternMatch = videoQualityMenuOptionsFingerprint.patternMatch!! - val startIndex = patternMatch.startIndex - if (startIndex != 0) throw PatchException("Unexpected opcode start index: $startIndex") - val insertIndex = patternMatch.endIndex + val instructionMatches = videoQualityMenuOptionsFingerprint.instructionMatches + val startIndex = instructionMatches.first().index + val insertIndex = instructionMatches.last().index videoQualityMenuOptionsFingerprint.method.apply { val register = getInstruction(insertIndex).registerA From dfd61492dd55b185b02a9a90e029bd1a93703262 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 7 Jan 2025 14:40:55 +0100 Subject: [PATCH 20/64] refactor: Use String literal instruction filter --- patches/api/patches.api | 4 -- .../subscription/Fingerprints.kt | 8 ++-- .../patches/shared/misc/spoof/Fingerprints.kt | 5 ++- .../patches/spotify/navbar/Fingerprints.kt | 6 ++- .../spotify/navbar/PremiumNavbarTabPatch.kt | 7 ---- .../interaction/downloads/Fingerprints.kt | 7 +++- .../interaction/seekbar/Fingerprints.kt | 15 +++++-- .../layout/buttons/overlay/Fingerprints.kt | 2 +- .../layout/hide/general/Fingerprints.kt | 5 ++- .../layout/hide/infocards/Fingerprints.kt | 9 +++- .../layout/hide/shorts/Fingerprints.kt | 15 +++++-- .../youtube/layout/miniplayer/Fingerprints.kt | 21 +++++++--- .../layout/miniplayer/MiniplayerPatch.kt | 2 +- .../returnyoutubedislike/Fingerprints.kt | 29 +++++++++---- .../layout/shortsautoplay/Fingerprints.kt | 5 ++- .../layout/shortsplayer/Fingerprints.kt | 8 ++-- .../youtube/layout/startpage/Fingerprints.kt | 5 ++- .../layout/startupshortsreset/Fingerprints.kt | 13 +++--- .../misc/autorepeat/AutoRepeatPatch.kt | 14 ------- .../misc/backgroundplayback/Fingerprints.kt | 8 +++- .../youtube/misc/debugging/Fingerprints.kt | 5 ++- .../misc/dimensions/spoof/Fingerprints.kt | 6 ++- .../youtube/misc/imageurlhook/Fingerprints.kt | 5 ++- .../youtube/misc/links/Fingerprints.kt | 5 ++- .../youtube/misc/litho/filter/Fingerprints.kt | 23 +++++++--- .../youtube/misc/navigation/Fingerprints.kt | 9 +++- .../misc/playercontrols/Fingerprints.kt | 8 +++- .../youtube/misc/zoomhaptics/Fingerprints.kt | 5 ++- .../patches/youtube/shared/Fingerprints.kt | 42 ++++--------------- .../youtube/video/audio/Fingerprints.kt | 13 ++++-- .../youtube/video/information/Fingerprints.kt | 18 +++++--- .../video/playerresponse/Fingerprints.kt | 5 ++- .../youtube/video/quality/Fingerprints.kt | 5 ++- .../video/speed/custom/Fingerprints.kt | 5 ++- .../video/speed/remember/Fingerprints.kt | 5 ++- .../youtube/video/videoid/Fingerprints.kt | 6 ++- .../yuka/misc/unlockpremium/Fingerprints.kt | 5 ++- .../kotlin/app/revanced/util/BytecodeUtils.kt | 2 +- 38 files changed, 222 insertions(+), 138 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 860f50f620..7484c53b18 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1397,10 +1397,6 @@ public final class app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatc public static final fun getZoomHapticsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/shared/FingerprintsKt { - public static final fun getHideAdsFingerprint ()Lapp/revanced/patcher/Fingerprint; -} - public final class app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatchKt { public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt index f2845f12dc..2217ab3eb5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt @@ -1,15 +1,15 @@ package app.revanced.patches.reddit.customclients.infinityforreddit.subscription import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal internal val billingClientOnServiceConnectedFingerprint by fingerprint { strings("Billing service connected") } internal val startSubscriptionActivityFingerprint by fingerprint { - literal { + instructions( // Intent start flag only used in the subscription activity - 0x10008000 - } + literal(0x10008000) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index db7415a3bf..38597158e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -3,6 +3,7 @@ package app.revanced.patches.shared.misc.spoof import app.revanced.patcher.fingerprint import app.revanced.patcher.literal import app.revanced.patcher.methodCall +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -128,7 +129,9 @@ internal val nerdsStatsVideoFormatBuilderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters("L") - strings("codecs=\"") + instructions( + string("codecs=\"") + ) } internal val patchIncludedExtensionMethodFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/Fingerprints.kt index 7197bd14c9..12b1024b37 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/Fingerprints.kt @@ -1,11 +1,13 @@ package app.revanced.patches.spotify.navbar import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags internal val addNavBarItemFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") - literal { showBottomNavigationItemsTextId } + instructions( + resourceLiteral("bool", "show_bottom_navigation_items_text") + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt index c191c676b7..c633f33fec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt @@ -7,8 +7,6 @@ import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.mapping.resourceMappings -internal var showBottomNavigationItemsTextId = -1L - private set internal var premiumTabId = -1L private set @@ -17,11 +15,6 @@ private val premiumNavbarTabResourcePatch = resourcePatch { execute { premiumTabId = resourceMappings["id", "premium_tab"] - - showBottomNavigationItemsTextId = resourceMappings[ - "bool", - "show_bottom_navigation_items_text", - ] } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt index 19fc38f02e..abd9a1e125 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt @@ -1,7 +1,8 @@ package app.revanced.patches.youtube.interaction.downloads -import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint +import app.revanced.patcher.string +import com.android.tools.smali.dexlib2.AccessFlags internal val offlineVideoEndpointFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) @@ -12,5 +13,7 @@ internal val offlineVideoEndpointFingerprint by fingerprint { "Ljava/lang/String", // VideoId "L", ) - strings("Object is not an offlineable video: ") + instructions( + string("Object is not an offlineable video: ") + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt index 4b43156a4a..38daa0edbc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt @@ -12,7 +12,9 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference internal val swipingUpGestureParentFingerprint by fingerprint { returns("Z") parameters() - literal { 45379021 } + instructions( + literal(45379021) + ) } /** @@ -22,7 +24,9 @@ internal val showSwipingUpGuideFingerprint by fingerprint { accessFlags(AccessFlags.FINAL) returns("Z") parameters() - literal { 1 } + instructions( + literal(1) + ) } /** @@ -38,7 +42,10 @@ internal val disableFastForwardLegacyFingerprint by fingerprint { returns("Z") parameters() opcodes(Opcode.MOVE_RESULT) - literal { 45411330 } + instructions( + // Intent start flag only used in the subscription activity + literal(45411330) + ) } internal val disableFastForwardGestureFingerprint by fingerprint { @@ -129,7 +136,7 @@ internal val fullscreenSeekbarThumbnailsQualityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() - instructions ( + instructions( literal(45399684L) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt index d719196bf3..16dc8cf3b0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt @@ -8,12 +8,12 @@ import com.android.tools.smali.dexlib2.AccessFlags internal val playerControlsPreviousNextOverlayTouchFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") - strings("1.0x") instructions( resourceLiteral("id", "player_control_previous_button_touch_area"), resourceLiteral("id", "player_control_next_button_touch_area"), methodCall(parameters = listOf("Landroid/view/View;", "I")) ) + strings("1.0x") } internal val mediaRouteButtonFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 6450fa2d23..99b0c861fa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -3,6 +3,7 @@ package app.revanced.patches.youtube.layout.hide.general import app.revanced.patcher.fingerprint import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.string import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags @@ -30,7 +31,9 @@ internal val parseElementFromBufferFingerprint by fingerprint { internal val playerOverlayFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") - strings("player_overlay_in_video_programming") + instructions( + string("player_overlay_in_video_programming") + ) } internal val showWatermarkFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt index c158243759..6b1b09d585 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.layout.hide.infocards import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -9,13 +10,17 @@ internal val infocardsIncognitoFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/Boolean;") parameters("L", "J") - strings("vibrator") + instructions( + string("vibrator") + ) } internal val infocardsIncognitoParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") - strings("player_overlay_info_card_teaser") + instructions( + string("player_overlay_info_card_teaser") + ) } internal val infocardsMethodCallFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt index 5dd5a8f48c..487433970f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt @@ -3,6 +3,7 @@ package app.revanced.patches.youtube.layout.hide.shorts import app.revanced.patcher.fingerprint import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.string import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -16,15 +17,17 @@ internal val legacyRenderBottomNavigationBarParentFingerprint by fingerprint { "J", "L", ) - strings("aa") + instructions( + string("aa") + ) } internal val shortsBottomBarContainerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;", "Landroid/os/Bundle;") - strings("r_pfvc") instructions( + string("r_pfvc"), resourceLiteral("id", "bottom_bar_container"), methodCall(name = "getHeight"), opcode(Opcode.MOVE_RESULT) @@ -70,7 +73,9 @@ internal val renderBottomNavigationBarParentFingerprint by fingerprint { "Ljava/lang/String;", "L", ) - strings("aa") + instructions( + string("aa") + ) } internal val setPivotBarVisibilityFingerprint by fingerprint { @@ -85,5 +90,7 @@ internal val setPivotBarVisibilityFingerprint by fingerprint { internal val setPivotBarVisibilityParentFingerprint by fingerprint { parameters("Z") - strings("FEnotifications_inbox") + instructions( + string("FEnotifications_inbox") + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 33ab427f7a..32ef39f730 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -4,6 +4,7 @@ package app.revanced.patches.youtube.layout.miniplayer import app.revanced.patcher.fingerprint import app.revanced.patcher.literal +import app.revanced.patcher.string import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags @@ -35,7 +36,9 @@ internal val miniplayerModernCloseButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/widget/ImageView;") parameters() - literal { modernMiniplayerClose } + instructions( + literal(modernMiniplayerClose) + ) } internal const val MINIPLAYER_MODERN_FEATURE_KEY = 45622882L @@ -51,13 +54,17 @@ internal const val MINIPLAYER_DISABLED_FEATURE_KEY = 45657015L internal val miniplayerModernConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("L") - literal { 45623000L } + instructions( + literal(45623000L) + ) } internal val miniplayerOnCloseHandlerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") - literal { MINIPLAYER_DISABLED_FEATURE_KEY } + instructions( + literal(MINIPLAYER_DISABLED_FEATURE_KEY) + ) } /** @@ -114,7 +121,9 @@ internal val miniplayerModernViewParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() - strings("player_overlay_modern_mini_player_controls") + instructions( + string("player_overlay_modern_mini_player_controls") + ) } internal val miniplayerMinimumSizeFingerprint by fingerprint { @@ -129,7 +138,9 @@ internal val miniplayerMinimumSizeFingerprint by fingerprint { internal val miniplayerOverrideFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") - strings("appName") + instructions( + string("appName") + ) } internal val miniplayerOverrideNoContextFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 70f273e76e..51fd3cbab6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -321,7 +321,7 @@ val miniplayerPatch = bytecodePatch( // endregion // region Legacy tablet miniplayer hooks. - val appNameStringIndex = miniplayerOverrideFingerprint.stringMatches.first().index + 2 + val appNameStringIndex = miniplayerOverrideFingerprint.instructionMatches.first().index + 2 navigate(miniplayerOverrideFingerprint.originalMethod).to(appNameStringIndex).stop().apply { findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride(index) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt index 747ec7bc40..b090ca96a9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.layout.returnyoutubedislike import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -18,17 +19,23 @@ internal val conversionContextFingerprint by fingerprint { internal val dislikeFingerprint by fingerprint { returns("V") - strings("like/dislike") + instructions( + string("like/dislike") + ) } internal val likeFingerprint by fingerprint { returns("V") - strings("like/like") + instructions( + string("like/like") + ) } internal val removeLikeFingerprint by fingerprint { returns("V") - strings("like/removelike") + instructions( + string("like/removelike") + ) } internal val rollingNumberMeasureAnimatedTextFingerprint by fingerprint { @@ -68,7 +75,9 @@ internal val rollingNumberMeasureStaticLabelParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() - strings("RollingNumberFontProperties{paint=") + instructions( + string("RollingNumberFontProperties{paint=") + ) } internal val rollingNumberSetterFingerprint by fingerprint { @@ -114,13 +123,17 @@ internal val shortsTextViewFingerprint by fingerprint { internal val textComponentConstructorFingerprint by fingerprint { accessFlags(AccessFlags.CONSTRUCTOR, AccessFlags.PRIVATE) - strings("TextComponent") + instructions( + string("TextComponent") + ) } internal val textComponentDataFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("L", "L") - strings("text") + instructions( + string("text") + ) custom { _, classDef -> classDef.fields.find { it.type == "Ljava/util/BitSet;" } != null } @@ -133,5 +146,7 @@ internal val textComponentLookupFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("L") parameters("L") - strings("…") + instructions( + string("…") + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt index 42e239dc0e..63342e9d78 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.layout.shortsautoplay import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -18,5 +19,7 @@ internal val reelEnumConstructorFingerprint by fingerprint { internal val reelPlaybackRepeatFingerprint by fingerprint { returns("V") parameters("L") - strings("YoutubePlayerState is in throwing an Error.") + instructions( + string("YoutubePlayerState is in throwing an Error.") + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt index 56c56119e2..e6198077b1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.layout.shortsplayer import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal import com.android.tools.smali.dexlib2.AccessFlags /** @@ -13,9 +13,9 @@ internal val playbackStartFeatureFlagFingerprint by fingerprint { parameters( "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;", ) - literal { - 45380134L - } + instructions( + literal(45380134L) + ) } // Pre 19.25 diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt index c70616e382..bf6722d1fe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt @@ -1,11 +1,14 @@ package app.revanced.patches.youtube.layout.startpage import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.Opcode internal val intentActionFingerprint by fingerprint { parameters("Landroid/content/Intent;") - strings("has_handled_intent") + instructions( + string("has_handled_intent") + ) } internal val browseIdFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt index 11a2700f25..3e36e4fde0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt @@ -1,14 +1,17 @@ package app.revanced.patches.youtube.layout.startupshortsreset import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags internal val userWasInShortsFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Ljava/lang/Object;") - strings("Failed to read user_was_in_shorts proto after successful warmup") + instructions( + string("Failed to read user_was_in_shorts proto after successful warmup") + ) } /** @@ -17,7 +20,7 @@ internal val userWasInShortsFingerprint by fingerprint { internal val userWasInShortsConfigFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") - literal { - 45358360L - } + instructions( + literal(45358360L) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt index 054406092c..9953f5fc82 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.misc.autorepeat -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction @@ -12,8 +11,6 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.shared.autoRepeatFingerprint import app.revanced.patches.youtube.shared.autoRepeatParentFingerprint -import app.revanced.patches.youtube.shared.hideAdsFingerprint -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction // TODO: Rename this patch to AlwaysRepeatPatch (as well as strings and references in the extension). val autoRepeatPatch = bytecodePatch( @@ -46,17 +43,6 @@ val autoRepeatPatch = bytecodePatch( SwitchPreference("revanced_auto_repeat"), ) - hideAdsFingerprint.match(hideAdsFingerprint.originalClassDef) - - hideAdsFingerprint.let { - val filter3 = it.instructionMatches[2] - - val moveResultIndex = filter3.index - val moveResultRegister = filter3.getInstruction().registerA - - it.method.addInstruction(moveResultIndex + 1, "const/4 v$moveResultRegister, 0x0") - } - autoRepeatFingerprint.match(autoRepeatParentFingerprint.originalClassDef).method.apply { val playMethod = autoRepeatParentFingerprint.method val index = instructions.lastIndex diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt index bfbbf0d56e..06985c0564 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt @@ -75,12 +75,16 @@ internal val backgroundPlaybackManagerShortsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L") - literal { 151635310 } + instructions( + app.revanced.patcher.literal(151635310) + ) } internal val shortsBackgroundPlaybackFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() - literal { 45415425 } + instructions( + app.revanced.patcher.literal(45415425) + ) } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt index 3e976140ec..79ad7eab9b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt @@ -1,13 +1,16 @@ package app.revanced.patches.youtube.misc.debugging import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags internal val experimentalFeatureFlagParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L", "J", "[B") - strings("Unable to parse proto typed experiment flag: ") + instructions( + string("Unable to parse proto typed experiment flag: ") + ) } internal val experimentalBooleanFeatureFlagFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt index a777267184..6d772c5169 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt @@ -1,8 +1,12 @@ package app.revanced.patches.youtube.misc.dimensions.spoof import app.revanced.patcher.fingerprint +import app.revanced.patcher.string internal val deviceDimensionsModelToStringFingerprint by fingerprint { returns("L") - strings("minh.", ";maxh.") + instructions( + string("minh."), + string(";maxh.") + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt index 818d7c0d05..9916dd58c7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.misc.imageurlhook import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags internal val onFailureFingerprint by fingerprint { @@ -60,5 +61,7 @@ internal val messageDigestImageUrlParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() - strings("@#&=*+-_.,:!?()/~'%;\$") + instructions( + string("@#&=*+-_.,:!?()/~'%;\$"), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt index 2ed7defeaa..c0d82aec92 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.misc.links import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -68,5 +69,7 @@ internal val httpUriParserLegacyFingerprint by fingerprint { Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, ) - strings("://") + instructions( + string("://"), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt index a826313b06..b89ff377d1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt @@ -1,7 +1,8 @@ package app.revanced.patches.youtube.misc.litho.filter import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -10,7 +11,9 @@ import com.android.tools.smali.dexlib2.Opcode * In 19.18+ this resolves to a different method. */ internal val componentContextParserFingerprint by fingerprint { - strings("Component was not found %s because it was removed due to duplicate converter bindings.") + instructions( + string("Component was not found %s because it was removed due to duplicate converter bindings."), + ) } internal val lithoFilterFingerprint by fingerprint { @@ -38,13 +41,17 @@ internal val protobufBufferReferenceFingerprint by fingerprint { * In 19.18+ this resolves to a different method. */ internal val readComponentIdentifierFingerprint by fingerprint { - strings("Number of bits must be positive") + instructions( + string("Number of bits must be positive") + ) } internal val emptyComponentFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) parameters() - strings("EmptyComponent") + instructions( + string("EmptyComponent") + ) custom { _, classDef -> classDef.methods.filter { AccessFlags.STATIC.isSet(it.accessFlags) }.size == 1 } @@ -54,12 +61,16 @@ internal val lithoComponentNameUpbFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() - literal { 45631264L } + instructions( + literal(45631264L ) + ) } internal val lithoConverterBufferUpbFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L") - literal { 45419603L } + instructions( + literal(45419603L) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt index 2fc358ef53..a496d2e4e4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt @@ -2,6 +2,7 @@ package app.revanced.patches.youtube.misc.navigation import app.revanced.patcher.fingerprint import app.revanced.patcher.methodCall +import app.revanced.patcher.string import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral import app.revanced.patches.youtube.layout.buttons.navigation.navigationButtonsPatch import com.android.tools.smali.dexlib2.AccessFlags @@ -102,12 +103,16 @@ internal val pivotBarButtonsViewSetSelectedFingerprint by fingerprint { internal val pivotBarConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - strings("com.google.android.apps.youtube.app.endpoint.flags") + instructions( + string("com.google.android.apps.youtube.app.endpoint.flags"), + ) } internal val imageEnumConstructorFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - strings("TAB_ACTIVITY_CAIRO") + instructions( + string("TAB_ACTIVITY_CAIRO"), + ) } internal val setEnumMapFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt index b288259fe3..aef82d17b5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt @@ -61,13 +61,17 @@ internal val playerBottomControlsExploderFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() - literal { 45643739L } + instructions( + app.revanced.patcher.literal(45643739L) + ) } internal val playerTopControlsExperimentalLayoutFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") parameters() - literal { 45629424L } + instructions( + app.revanced.patcher.literal(45629424L) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/Fingerprints.kt index 8224bb5e5a..530359cab8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/Fingerprints.kt @@ -1,7 +1,10 @@ package app.revanced.patches.youtube.misc.zoomhaptics import app.revanced.patcher.fingerprint +import app.revanced.patcher.string internal val zoomHapticsFingerprint by fingerprint { - strings("Failed to haptics vibrate for video zoom") + instructions( + string("Failed to haptics vibrate for video zoom"), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index b70240361f..048ebfde16 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -2,45 +2,13 @@ package app.revanced.patches.youtube.shared import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint -import app.revanced.patcher.literal -import app.revanced.patcher.methodCall import app.revanced.patcher.newInstance import app.revanced.patcher.opcode +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -val hideAdsFingerprint by fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters("Ljava/lang/String;", "I") - strings("showBannerAds") - instructions( - // Filter 1 - fieldAccess( - definingClass = "this", - type = "Ljava/util/Map;" - ), - - // Filter 2 - methodCall( - definingClass = "Ljava/lang/String;", - name = "equals", - parameters = listOf("Ljava/lang/Object;"), - returnType = "Z" - ), - - // Filter 3 - opcode(Opcode.MOVE_RESULT), - - // Filter 4 - literal(1337) - ) - custom { method, classDef -> - classDef.type == "Lapp/revanced/extension/shared/AdsLoader;" - } -} - internal val autoRepeatFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") @@ -63,7 +31,9 @@ internal val layoutConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() - strings("1.0x") + instructions( + string("1.0x"), + ) } internal val mainActivityFingerprint by fingerprint { @@ -116,7 +86,9 @@ internal val rollingNumberTextViewAnimationUpdateFingerprint by fingerprint { internal val seekbarFingerprint by fingerprint { returns("V") - strings("timed_markers_width") + instructions( + string("timed_markers_width"), + ) } internal val seekbarOnDrawFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt index 8756039d08..16dbc07f73 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt @@ -1,23 +1,30 @@ package app.revanced.patches.youtube.video.audio import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags internal val streamingModelBuilderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") - strings("vprng") + instructions( + string("vprng") + ) } internal val menuItemAudioTrackFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("L") returns("V") - strings("menu_item_audio_track") + instructions( + string("menu_item_audio_track") + ) } internal val audioStreamingTypeSelector by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("L") - strings("raw") // String is not unique + instructions( + string("raw") // String is not unique + ) } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt index 913fb59911..9c13357665 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.video.information import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import app.revanced.patches.youtube.shared.newVideoQualityChangedFingerprint import app.revanced.util.getReference import com.android.tools.smali.dexlib2.AccessFlags @@ -9,7 +10,9 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference internal val createVideoPlayerSeekbarFingerprint by fingerprint { returns("V") - strings("timed_markers_width") + instructions( + string("timed_markers_width"), + ) } internal val onPlaybackSpeedItemClickFingerprint by fingerprint { @@ -31,14 +34,18 @@ internal val playerControllerSetTimeReferenceFingerprint by fingerprint { } internal val playerInitFingerprint by fingerprint { - strings("playVideo called on player response with no videoStreamingData.") + instructions( + string("playVideo called on player response with no videoStreamingData."), + ) } /** * Matched using class found in [playerInitFingerprint]. */ internal val seekFingerprint by fingerprint { - strings("Attempting to seek during an ad") + instructions( + string("Attempting to seek during an ad"), + ) } internal val videoLengthFingerprint by fingerprint { @@ -79,7 +86,9 @@ internal val mdxSeekFingerprint by fingerprint { } internal val mdxPlayerDirectorSetVideoStageFingerprint by fingerprint { - strings("MdxDirector setVideoStage ad should be null when videoStage is not an Ad state ") + instructions( + string("MdxDirector setVideoStage ad should be null when videoStage is not an Ad state "), + ) } /** @@ -90,7 +99,6 @@ internal val mdxSeekRelativeFingerprint by fingerprint { // Return type is boolean up to 19.39, and void with 19.39+. parameters("J", "L") opcodes( - Opcode.IGET_OBJECT, Opcode.INVOKE_INTERFACE, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt index d5658dc306..c9067d7af0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.video.playerresponse import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags /** @@ -25,7 +26,9 @@ internal val playerParameterBuilderFingerprint by fingerprint { "Z", "Z", ) - strings("psps") + instructions( + string("psps"), + ) } /** diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt index 757fc887ef..e831d790e9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.video.quality import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -19,7 +20,9 @@ internal val setQualityByIndexMethodClassFieldReferenceFingerprint by fingerprin internal val videoQualityItemOnClickParentFingerprint by fingerprint { returns("V") - strings("VIDEO_QUALITIES_MENU_BOTTOM_SHEET_FRAGMENT") + instructions( + string("VIDEO_QUALITIES_MENU_BOTTOM_SHEET_FRAGMENT"), + ) } internal val videoQualitySetterFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index a7125d0eb3..878d4b8b79 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -1,13 +1,16 @@ package app.revanced.patches.youtube.video.speed.custom import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal val getOldPlaybackSpeedsFingerprint by fingerprint { parameters("[L", "I") - strings("menu_item_playback_speed") + instructions( + string("menu_item_playback_speed"), + ) } internal val showOldPlaybackSpeedMenuFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt index 7d7afa9f40..5c73615f71 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt @@ -1,8 +1,11 @@ package app.revanced.patches.youtube.video.speed.remember import app.revanced.patcher.fingerprint +import app.revanced.patcher.string internal val initializePlaybackSpeedValuesFingerprint by fingerprint { parameters("[L", "I") - strings("menu_item_playback_speed") + instructions( + string("menu_item_playback_speed"), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index 77aac5076d..9c8fbbc23c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -1,9 +1,9 @@ package app.revanced.patches.youtube.video.videoid import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.opcode -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -48,5 +48,7 @@ internal val videoIdParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("[L") parameters("L") - literal { 524288L } + instructions( + literal(524288L) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt index e22b839570..f3076dc0b1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt @@ -3,6 +3,7 @@ package app.revanced.patches.yuka.misc.unlockpremium import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint +import app.revanced.patcher.string internal val isPremiumFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) @@ -16,5 +17,7 @@ internal val isPremiumFingerprint by fingerprint { internal val yukaUserConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") - strings("premiumProvider") + instructions( + string("premiumProvider"), + ) } diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index d183bca2ba..20632aeb51 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -473,7 +473,7 @@ fun MutableMethod.returnEarly(bool: Boolean = false) { * * @param literalSupplier The supplier for the literal value to check for. */ -// TODO: add a way for subclasses to also use their own custom fingerprint. +@Deprecated("Instead use instruction filters and `literal()`") fun FingerprintBuilder.literal(literalSupplier: () -> Long) { custom { method, _ -> method.containsLiteralInstruction(literalSupplier()) From d2900b77bae90a284f0e50db3eb0b85fa8007f69 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 8 Jan 2025 01:18:45 +0100 Subject: [PATCH 21/64] refactor --- .../patches/youtube/misc/navigation/Fingerprints.kt | 3 +++ .../youtube/misc/navigation/NavigationBarHookPatch.kt | 10 ++-------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt index a496d2e4e4..4a02b7f65e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt @@ -2,10 +2,12 @@ package app.revanced.patches.youtube.misc.navigation import app.revanced.patcher.fingerprint import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode import app.revanced.patcher.string import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral import app.revanced.patches.youtube.layout.buttons.navigation.navigationButtonsPatch import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode internal val actionBarSearchResultsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) @@ -112,6 +114,7 @@ internal val imageEnumConstructorFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) instructions( string("TAB_ACTIVITY_CAIRO"), + opcode(Opcode.SPUT_OBJECT) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt index 552a57f31f..e3feda75c4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt @@ -12,7 +12,6 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_35_or_greater import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @@ -130,13 +129,8 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig // Fix YT bug of notification tab missing the filled icon. if (is_19_35_or_greater) { - val cairoNotificationEnumReference = with(imageEnumConstructorFingerprint) { - val stringIndex = stringMatches.first().index - val cairoNotificationEnumIndex = method.indexOfFirstInstructionOrThrow(stringIndex) { - opcode == Opcode.SPUT_OBJECT - } - method.getInstruction(cairoNotificationEnumIndex).reference - } + val cairoNotificationEnumReference = imageEnumConstructorFingerprint + .instructionMatches.last().getInstruction().reference setEnumMapFingerprint.method.apply { val enumMapIndex = indexOfFirstInstructionReversedOrThrow { From 41f753eadfa925136eede66bce1fd4821fe9d879 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 9 Jan 2025 19:10:18 +0100 Subject: [PATCH 22/64] simplify --- patches/api/patches.api | 17 +------ .../patches/duolingo/debug/Fingerprints.kt | 1 - .../patches/irplus/ad/Fingerprints.kt | 1 - .../layout/compactheader/Fingerprints.kt | 1 - .../layout/upgradebutton/Fingerprints.kt | 1 - .../piccomafr/tracking/Fingerprints.kt | 1 - .../revanced/patches/shared/Fingerprints.kt | 10 +++- .../shared/misc/gms/GmsCoreSupportPatch.kt | 6 +-- .../misc/mapping/ResourceMappingPatch.kt | 48 ++++--------------- .../patches/shared/misc/spoof/Fingerprints.kt | 4 +- .../patches/soundcloud/ad/Fingerprints.kt | 1 - .../patches/soundcloud/shared/Fingerprints.kt | 1 - .../patches/spotify/navbar/Fingerprints.kt | 2 +- .../twitch/chat/antidelete/Fingerprints.kt | 1 - .../interaction/downloads/Fingerprints.kt | 1 - .../interaction/seekbar/Fingerprints.kt | 6 +-- .../interaction/swipecontrols/Fingerprints.kt | 11 ++--- .../swipecontrols/SwipeControlsPatch.kt | 10 ++-- .../layout/buttons/navigation/Fingerprints.kt | 1 - .../layout/buttons/overlay/Fingerprints.kt | 2 +- .../hide/endscreencards/Fingerprints.kt | 7 +++ .../layout/hide/general/Fingerprints.kt | 7 +-- .../layout/hide/shorts/Fingerprints.kt | 2 +- .../youtube/layout/miniplayer/Fingerprints.kt | 3 +- .../youtube/layout/seekbar/Fingerprints.kt | 1 - .../layout/sponsorblock/Fingerprints.kt | 8 +++- .../layout/sponsorblock/SponsorBlockPatch.kt | 6 +-- .../layout/startupshortsreset/Fingerprints.kt | 1 + .../youtube/misc/imageurlhook/Fingerprints.kt | 1 - .../youtube/misc/links/Fingerprints.kt | 5 +- .../youtube/misc/litho/filter/Fingerprints.kt | 1 - .../youtube/misc/navigation/Fingerprints.kt | 2 +- .../misc/playercontrols/Fingerprints.kt | 15 ++++-- .../playercontrols/PlayerControlsPatch.kt | 6 --- .../recyclerviewtree/hook/Fingerprints.kt | 1 - .../speed/custom/CustomPlaybackSpeedPatch.kt | 19 +------- .../video/speed/custom/Fingerprints.kt | 9 +++- .../yuka/misc/unlockpremium/Fingerprints.kt | 1 - 38 files changed, 79 insertions(+), 142 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 7484c53b18..9e7ff0c2bb 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -592,21 +592,12 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceElement { public fun toString ()Ljava/lang/String; } -public final class app/revanced/patches/shared/misc/mapping/ResourceLiteralFilter : app/revanced/patcher/InstructionFilter { - public static final field Companion Lapp/revanced/patches/shared/misc/mapping/ResourceLiteralFilter$Companion; - public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun matches (Lapp/revanced/patcher/patch/BytecodePatchContext;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Z -} - -public final class app/revanced/patches/shared/misc/mapping/ResourceLiteralFilter$Companion { - public final fun resourceLiteral (Ljava/lang/String;Ljava/lang/String;I)Lapp/revanced/patches/shared/misc/mapping/ResourceLiteralFilter; - public static synthetic fun resourceLiteral$default (Lapp/revanced/patches/shared/misc/mapping/ResourceLiteralFilter$Companion;Ljava/lang/String;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceLiteralFilter; -} - public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { public static final fun get (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)J public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; public static final fun getResourceMappings ()Ljava/util/List; + public static final fun resourceLiteral (Ljava/lang/String;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralFilter; + public static synthetic fun resourceLiteral$default (Ljava/lang/String;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralFilter; } public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt { @@ -1442,10 +1433,6 @@ public final class app/revanced/patches/youtube/video/speed/button/PlaybackSpeed public static final fun getPlaybackSpeedButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatchKt { - public static final fun getSpeedUnavailableId ()J -} - public final class app/revanced/patches/youtube/video/videoid/VideoIdPatchKt { public static final fun getVideoIdPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun hookBackgroundPlayVideoId (Ljava/lang/String;)V diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt index 2319ed2da0..b1ec382943 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt @@ -13,7 +13,6 @@ import com.android.tools.smali.dexlib2.Opcode internal val initializeBuildConfigProviderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes(Opcode.IPUT_BOOLEAN) strings("debug", "release", "china") } diff --git a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt index ceb65afeb6..431bbd99a2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt @@ -5,7 +5,6 @@ import app.revanced.patcher.fingerprint internal val irplusAdsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters("L", "Z") strings("TAGGED") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt index 196df7f731..2cefcc63ce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt @@ -6,7 +6,6 @@ import app.revanced.patcher.fingerprint internal val constructCategoryBarFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters("Landroid/content/Context;", "L", "L", "L") opcodes( Opcode.IPUT_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt index a25436faa3..7012360a51 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt @@ -6,7 +6,6 @@ import app.revanced.patcher.fingerprint internal val pivotBarConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters("L", "Z") opcodes( Opcode.CHECK_CAST, diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt index fba2bf2375..e757223dd3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt @@ -11,7 +11,6 @@ internal val appMeasurementFingerprint by fingerprint { internal val facebookSDKFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - returns("V") strings("instagram.com", "facebook.com") } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt index 2dbaf6e8f4..a83f3b1d2c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt @@ -1,11 +1,17 @@ package app.revanced.patches.shared import app.revanced.patcher.fingerprint +import app.revanced.patcher.string internal val castContextFetchFingerprint by fingerprint { - strings("Error fetching CastContext.") + instructions( + string("Error fetching CastContext.") + ) } internal val primeMethodFingerprint by fingerprint { - strings("com.google.android.GoogleCamera", "com.android.vending") + instructions( + string("com.android.vending"), + string("com.google.android.GoogleCamera") + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index b79def03d1..34647b3c59 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -89,12 +89,12 @@ fun gmsCoreSupportPatch( mutableClass.methods.first { MethodUtil.methodSignaturesMatch(it, method) } } - implementation.instructions.forEachIndexed insnLoop@{ index, instruction -> + implementation.instructions.forEachIndexed { index, instruction -> val string = ((instruction as? Instruction21c)?.reference as? StringReference)?.string - ?: return@insnLoop + ?: return@forEachIndexed // Apply transformation. - val transformedString = transform(string) ?: return@insnLoop + val transformedString = transform(string) ?: return@forEachIndexed mutableMethod.replaceInstruction( index, diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index 84533d5e5c..2ad771b545 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -1,13 +1,10 @@ package app.revanced.patches.shared.misc.mapping -import app.revanced.patcher.InstructionFilter +import app.revanced.patcher.InstructionFilter.Companion.METHOD_MAX_INSTRUCTIONS import app.revanced.patcher.LiteralFilter -import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.literal import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.resourcePatch -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.instruction.Instruction -import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction import org.w3c.dom.Element import java.lang.Runtime import java.util.Collections @@ -18,39 +15,14 @@ import java.util.concurrent.TimeUnit lateinit var resourceMappings: List private set -class ResourceLiteralFilter private constructor( - private val type: String, - private val name: String, - maxInstructionsBefore: Int, -) : InstructionFilter(maxInstructionsBefore) { - - private val resourceId by lazy { - resourceMappings[ - type, - name, - ] - } - - override fun matches( - context: BytecodePatchContext, - method: Method, - instruction: Instruction, - methodIndex: Int - ): Boolean { - return (instruction as? WideLiteralInstruction)?.wideLiteral == resourceId - } - - companion object { - /** - * Identical to [LiteralFilter] except uses a decoded resource literal value. - */ - fun resourceLiteral( - type: String, - name: String, - maxInstructionsBefore: Int = METHOD_MAX_INSTRUCTIONS, - ) = ResourceLiteralFilter(type, name, maxInstructionsBefore) - } -} +/** + * Identical to [LiteralFilter] except uses a decoded resource literal value. + */ +fun resourceLiteral( + type: String, + name: String, + maxInstructionsBefore: Int = METHOD_MAX_INSTRUCTIONS, +) = literal({ resourceMappings[type, name] }, null, maxInstructionsBefore) val resourceMappingPatch = resourcePatch { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index 38597158e2..2ad4138c33 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -84,7 +84,6 @@ internal val protobufClassParseByteBufferFingerprint by fingerprint { internal val createStreamingDataFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters("L") opcodes( Opcode.IPUT_OBJECT, @@ -102,7 +101,6 @@ internal val createStreamingDataFingerprint by fingerprint { internal val buildMediaDataSourceFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters( "Landroid/net/Uri;", "J", @@ -139,6 +137,6 @@ internal val patchIncludedExtensionMethodFingerprint by fingerprint { returns("Z") parameters() custom { method, classDef -> - classDef.type == EXTENSION_CLASS_DESCRIPTOR && method.name == "isPatchIncluded" + method.name == "isPatchIncluded" && classDef.type == EXTENSION_CLASS_DESCRIPTOR } } diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt index d345a8a76f..f6f442306f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt @@ -18,7 +18,6 @@ internal val interceptFingerprint by fingerprint { internal val userConsumerPlanConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters( "Ljava/lang/String;", "Z", diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt index 87a8305442..646bb929a7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt @@ -5,7 +5,6 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal val featureConstructorFingerprint by fingerprint { - returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Ljava/lang/String;", "Z", "Ljava/util/List;") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/Fingerprints.kt index 12b1024b37..65431b214e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/Fingerprints.kt @@ -1,7 +1,7 @@ package app.revanced.patches.spotify.navbar import app.revanced.patcher.fingerprint -import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags internal val addNavBarItemFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt index 84fc079f35..04ef723432 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt @@ -11,7 +11,6 @@ internal val chatUtilCreateDeletedSpanFingerprint by fingerprint { internal val deletedMessageClickableSpanCtorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") custom { _, classDef -> classDef.endsWith("DeletedMessageClickableSpan;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt index 3381365f59..b01f75081f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt @@ -16,7 +16,6 @@ internal val buildMediaOptionsSheetFingerprint by fingerprint { internal val constructMediaOptionsSheetFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") strings("captionsState") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt index 38daa0edbc..be67b8908b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt @@ -42,10 +42,8 @@ internal val disableFastForwardLegacyFingerprint by fingerprint { returns("Z") parameters() opcodes(Opcode.MOVE_RESULT) - instructions( - // Intent start flag only used in the subscription activity - literal(45411330) - ) + // Intent start flag only used in the subscription activity + literal {45411330} } internal val disableFastForwardGestureFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt index f28f16482f..450053cfff 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.interaction.swipecontrols import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal import com.android.tools.smali.dexlib2.AccessFlags internal val swipeControlsHostActivityFingerprint by fingerprint { @@ -12,12 +12,9 @@ internal val swipeControlsHostActivityFingerprint by fingerprint { } } -internal const val SWIPE_CHANGE_VIDEO_FEATURE_FLAG = 45631116L - internal val swipeChangeVideoFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("L") - literal { - SWIPE_CHANGE_VIDEO_FEATURE_FLAG - } + instructions( + literal(45631116L) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt index f1fcf9c7c6..bfcb9deb00 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt @@ -115,10 +115,12 @@ val swipeControlsPatch = bytecodePatch( // region patch to enable/disable swipe to change video. if (is_19_43_or_greater) { - swipeChangeVideoFingerprint.method.insertFeatureFlagBooleanOverride( - SWIPE_CHANGE_VIDEO_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z" - ) + swipeChangeVideoFingerprint.let { + it.method.insertFeatureFlagBooleanOverride( + it.instructionMatches.last().index, + "$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z" + ) + } } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt index cdcf9b8d4c..bc5e3b4902 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt @@ -14,7 +14,6 @@ internal val addCreateButtonViewFingerprint by fingerprint { internal val createPivotBarFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters( "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;", "Landroid/widget/TextView;", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt index 16dc8cf3b0..dd34e59667 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.layout.buttons.overlay import app.revanced.patcher.fingerprint import app.revanced.patcher.methodCall -import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags internal val playerControlsPreviousNextOverlayTouchFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt index 8161256923..dfd8f3110e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt @@ -2,9 +2,12 @@ package app.revanced.patches.youtube.layout.hide.endscreencards import app.revanced.patcher.fingerprint import app.revanced.util.literal +import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal val layoutCircleFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameters() returns("Landroid/view/View;") opcodes( Opcode.CONST, @@ -17,6 +20,8 @@ internal val layoutCircleFingerprint by fingerprint { } internal val layoutIconFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameters() returns("Landroid/view/View;") opcodes( Opcode.INVOKE_VIRTUAL, @@ -28,6 +33,8 @@ internal val layoutIconFingerprint by fingerprint { } internal val layoutVideoFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC) + parameters() returns("Landroid/view/View;") opcodes( Opcode.CONST, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 99b0c861fa..1670dc6f4a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.methodCall import app.revanced.patcher.opcode import app.revanced.patcher.string -import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral +import app.revanced.patches.shared.misc.mapping.resourceLiteral import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -13,7 +13,7 @@ internal val hideShowMoreButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( resourceLiteral("layout", "expand_button_down"), - methodCall(smaliString = "Landroid/view/View;->inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;"), + methodCall(smali = "Landroid/view/View;->inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;"), opcode(Opcode.MOVE_RESULT_OBJECT) ) } @@ -76,7 +76,6 @@ internal val albumCardsFingerprint by fingerprint { internal val filterBarHeightFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes( Opcode.CONST, Opcode.INVOKE_VIRTUAL, @@ -88,7 +87,6 @@ internal val filterBarHeightFingerprint by fingerprint { internal val relatedChipCloudFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes( Opcode.CONST, Opcode.INVOKE_VIRTUAL, @@ -99,7 +97,6 @@ internal val relatedChipCloudFingerprint by fingerprint { internal val searchResultsChipBarFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes( Opcode.CONST, Opcode.INVOKE_VIRTUAL, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt index 487433970f..9bfdaf1bdf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.methodCall import app.revanced.patcher.opcode import app.revanced.patcher.string -import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 32ef39f730..432294fb13 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -5,7 +5,7 @@ package app.revanced.patches.youtube.layout.miniplayer import app.revanced.patcher.fingerprint import app.revanced.patcher.literal import app.revanced.patcher.string -import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral +import app.revanced.patches.shared.misc.mapping.resourceLiteral import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -53,7 +53,6 @@ internal const val MINIPLAYER_DISABLED_FEATURE_KEY = 45657015L internal val miniplayerModernConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("L") instructions( literal(45623000L) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index a9e178e363..842e876a58 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -56,7 +56,6 @@ internal const val launchScreenLayoutTypeLotteFeatureFlag = 268507948L internal val launchScreenLayoutTypeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") custom { method, _ -> val firstParameter = method.parameterTypes.firstOrNull() // 19.25 - 19.45 diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt index 421b608596..9d5445a380 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.layout.sponsorblock import app.revanced.patcher.fingerprint +import app.revanced.patches.youtube.shared.seekbarFingerprint import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionReversed import com.android.tools.smali.dexlib2.AccessFlags @@ -49,6 +50,9 @@ internal val controlsOverlayFingerprint by fingerprint { ) } +/** + * Resolves to the class found in [seekbarFingerprint]. + */ internal val rectangleFieldInvalidatorFingerprint by fingerprint { returns("V") parameters() @@ -63,8 +67,8 @@ internal val segmentPlaybackControllerFingerprint by fingerprint { parameters("Ljava/lang/Object;") opcodes(Opcode.CONST_STRING) custom { method, _ -> - method.definingClass == EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR - && method.name == "setSponsorBarRect" + method.name == "setSponsorBarRect" && + method.definingClass == EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index 7f37e88c6b..b9ef5247a1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -211,13 +211,13 @@ val sponsorBlockPatch = bytecodePatch( val rectangleIndex = indexOfFirstInstructionReversedOrThrow(invalidateIndex + 1) { getReference()?.type == "Landroid/graphics/Rect;" } - val rectangleFieldName = - (getInstruction(rectangleIndex).reference as FieldReference).name + val rectangleFieldName = (getInstruction(rectangleIndex).reference as FieldReference).name segmentPlaybackControllerFingerprint.let { it.method.apply { val replaceIndex = it.instructionMatches.first().index - val replaceRegister = getInstruction(replaceIndex).registerA + val replaceRegister = + getInstruction(replaceIndex).registerA replaceInstruction( replaceIndex, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt index 3e36e4fde0..643e060d3f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt @@ -20,6 +20,7 @@ internal val userWasInShortsFingerprint by fingerprint { internal val userWasInShortsConfigFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") + parameters() instructions( literal(45358360L) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt index 9916dd58c7..52315bc699 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt @@ -46,7 +46,6 @@ internal const val CRONET_URL_REQUEST_CLASS_DESCRIPTOR = "Lorg/chromium/net/impl internal val requestFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") custom { _, classDef -> classDef.type == CRONET_URL_REQUEST_CLASS_DESCRIPTOR } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt index c0d82aec92..2ed7defeaa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt @@ -1,7 +1,6 @@ package app.revanced.patches.youtube.misc.links import app.revanced.patcher.fingerprint -import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -69,7 +68,5 @@ internal val httpUriParserLegacyFingerprint by fingerprint { Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, ) - instructions( - string("://"), - ) + strings("://") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt index b89ff377d1..e26bb7a057 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt @@ -18,7 +18,6 @@ internal val componentContextParserFingerprint by fingerprint { internal val lithoFilterFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - returns("V") custom { _, classDef -> classDef.endsWith("LithoFilterPatch;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt index 4a02b7f65e..2beddc1f05 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.methodCall import app.revanced.patcher.opcode import app.revanced.patcher.string -import app.revanced.patches.shared.misc.mapping.ResourceLiteralFilter.Companion.resourceLiteral +import app.revanced.patches.shared.misc.mapping.resourceLiteral import app.revanced.patches.youtube.layout.buttons.navigation.navigationButtonsPatch import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt index aef82d17b5..608a675552 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt @@ -1,15 +1,18 @@ package app.revanced.patches.youtube.misc.playercontrols import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal +import app.revanced.patches.shared.misc.mapping.resourceLiteral import app.revanced.util.containsLiteralInstruction -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags internal val playerTopControlsInflateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() - literal { controlsLayoutStub } + instructions( + resourceLiteral("id", "controls_layout_stub") + ) } internal val playerControlsExtensionHookListenersExistFingerprint by fingerprint { @@ -35,7 +38,9 @@ internal val playerControlsExtensionHookFingerprint by fingerprint { internal val playerBottomControlsInflateFingerprint by fingerprint { returns("Ljava/lang/Object;") parameters() - literal { bottomUiContainerResourceId } + instructions( + resourceLiteral("id", "bottom_ui_container_stub") + ) } internal val overlayViewInflateFingerprint by fingerprint { @@ -62,7 +67,7 @@ internal val playerBottomControlsExploderFeatureFlagFingerprint by fingerprint { returns("Z") parameters() instructions( - app.revanced.patcher.literal(45643739L) + literal(45643739L) ) } @@ -71,7 +76,7 @@ internal val playerTopControlsExperimentalLayoutFeatureFlagFingerprint by finger returns("I") parameters() instructions( - app.revanced.patcher.literal(45629424L) + literal(45629424L) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt index 6beeaf2425..6869dfc474 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt @@ -40,10 +40,6 @@ internal lateinit var addTopControl: (String) -> Unit lateinit var addBottomControl: (String) -> Unit private set -internal var bottomUiContainerResourceId = -1L - private set -internal var controlsLayoutStub = -1L - private set internal var heatseekerViewstub = -1L private set internal var fullscreenButton = -1L @@ -65,8 +61,6 @@ val playerControlsResourcePatch = resourcePatch { execute { val targetResourceName = "youtube_controls_bottom_ui_container.xml" - bottomUiContainerResourceId = resourceMappings["id", "bottom_ui_container_stub"] - controlsLayoutStub = resourceMappings["id", "controls_layout_stub"] heatseekerViewstub = resourceMappings["id", "heatseeker_viewstub"] fullscreenButton = resourceMappings["id", "fullscreen_button"] diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt index 88b2e9f3da..a2bf2ee303 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt @@ -6,7 +6,6 @@ import com.android.tools.smali.dexlib2.Opcode internal val recyclerViewTreeObserverFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes( Opcode.CHECK_CAST, Opcode.NEW_INSTANCE, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index 6e65c0b90c..cb4be195d5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -7,13 +7,10 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference @@ -31,20 +28,6 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableField -var speedUnavailableId = -1L - internal set - -private val customPlaybackSpeedResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - speedUnavailableId = resourceMappings[ - "string", - "varispeed_unavailable_message", - ] - } -} - private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilterPatch;" @@ -59,8 +42,8 @@ internal val customPlaybackSpeedPatch = bytecodePatch( lithoFilterPatch, settingsPatch, recyclerViewTreeHookPatch, - customPlaybackSpeedResourcePatch, addResourcesPatch, + resourceMappingPatch, ) execute { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index 878d4b8b79..a47050010e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.video.speed.custom import app.revanced.patcher.fingerprint import app.revanced.patcher.string -import app.revanced.util.literal +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -14,10 +14,15 @@ internal val getOldPlaybackSpeedsFingerprint by fingerprint { } internal val showOldPlaybackSpeedMenuFingerprint by fingerprint { - literal { speedUnavailableId } + instructions( + resourceLiteral("string", "varispeed_unavailable_message") + ) } internal val showOldPlaybackSpeedMenuExtensionFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + returns("V") + parameters() custom { method, classDef -> method.name == "showOldPlaybackSpeedMenu" && classDef.type == EXTENSION_CLASS_DESCRIPTOR } diff --git a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt index f3076dc0b1..99f3a4f224 100644 --- a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt @@ -16,7 +16,6 @@ internal val isPremiumFingerprint by fingerprint { internal val yukaUserConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") instructions( string("premiumProvider"), ) From 0277624d80f35cb1ce8388f55787f98bc6650bdc Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 10 Jan 2025 01:42:19 +0100 Subject: [PATCH 23/64] vastly simplify --- .../misc/links/BypassURLRedirectsPatch.kt | 41 +++------- .../youtube/misc/links/Fingerprints.kt | 80 +++++-------------- 2 files changed, 32 insertions(+), 89 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt index 6c90a0b8f7..27383ca41b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt @@ -7,15 +7,11 @@ import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playservice.is_19_33_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/BypassURLRedirectsPatch;" val bypassURLRedirectsPatch = bytecodePatch( name = "Bypass URL redirects", @@ -25,7 +21,6 @@ val bypassURLRedirectsPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, - versionCheckPatch, ) compatibleWith( @@ -49,36 +44,20 @@ val bypassURLRedirectsPatch = bytecodePatch( SwitchPreference("revanced_bypass_url_redirects"), ) - val fingerprints = if (is_19_33_or_greater) { - arrayOf( - abUriParserFingerprint, - httpUriParserFingerprint, - ) - } else { - arrayOf( - abUriParserLegacyFingerprint, - httpUriParserLegacyFingerprint, - ) - } - - fingerprints.forEach { - it.method.apply { - val insertIndex = findUriParseIndex() + arrayOf( + abUriParserFingerprint, + httpUriParserFingerprint, + ).forEach { fingerprint -> + fingerprint.method.apply { + val insertIndex = fingerprint.instructionMatches.first().index val uriStringRegister = getInstruction(insertIndex).registerC replaceInstruction( insertIndex, - "invoke-static {v$uriStringRegister}," + - "Lapp/revanced/extension/youtube/patches/BypassURLRedirectsPatch;" + - "->" + - "parseRedirectUri(Ljava/lang/String;)Landroid/net/Uri;", + "invoke-static { v$uriStringRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->" + + "parseRedirectUri(Ljava/lang/String;)Landroid/net/Uri;", ) } } } } - -internal fun Method.findUriParseIndex() = indexOfFirstInstruction { - val reference = getReference() - reference?.returnType == "Landroid/net/Uri;" && reference.name == "parse" -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt index 2ed7defeaa..3908ffe813 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt @@ -1,72 +1,36 @@ package app.revanced.patches.youtube.misc.links +import app.revanced.patcher.checkCast +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode -/** - * Target 19.33+ - */ internal val abUriParserFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/Object") - parameters("Ljava/lang/Object") - strings( - "Found entityKey=`", - "` that does not contain a PlaylistVideoEntityId message as it's identifier.", + returns("Ljava/lang/Object;") + parameters("Ljava/lang/Object;") + instructions( + methodCall(smali = "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;"), + fieldAccess( + definingClass = "Lcom/google/protos/youtube/api/innertube/WebviewEndpointOuterClass${'$'}WebviewEndpoint;", + name = "webviewEndpoint" + ), + checkCast("Lcom/google/protos/youtube/api/innertube/WebviewEndpointOuterClass${'$'}WebviewEndpoint;"), + methodCall(smali = "Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;") ) - custom { method, _ -> - method.findUriParseIndex() >= 0 - } } -internal val abUriParserLegacyFingerprint by fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/Object") - parameters("Ljava/lang/Object") - opcodes( - Opcode.RETURN_OBJECT, - Opcode.CHECK_CAST, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.CHECK_CAST, - Opcode.RETURN_OBJECT, - Opcode.CHECK_CAST, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - Opcode.RETURN_OBJECT, - Opcode.CHECK_CAST, - ) - custom { methodDef, classDef -> - // This method is always called "a" because this kind of class always has a single (non-synthetic) method. - - if (methodDef.name != "a") return@custom false - - val count = classDef.methods.count() - count == 2 || count == 3 - } -} - -/** - * Target 19.33+ - */ internal val httpUriParserFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Landroid/net/Uri") - parameters("Ljava/lang/String") - strings("https", "https:", "://") - custom { methodDef, _ -> - methodDef.findUriParseIndex() >= 0 - } -} - -internal val httpUriParserLegacyFingerprint by fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Landroid/net/Uri") - parameters("Ljava/lang/String") - opcodes( - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, + returns("Landroid/net/Uri;") + parameters("Ljava/lang/String;") + instructions( + methodCall(smali = "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;"), + string("https"), + string("://"), + string("https:"), ) - strings("://") } + From 676991a03846dc246247ce06958f79c103ac9153 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 10 Jan 2025 20:51:50 +0100 Subject: [PATCH 24/64] refactor: Match class types using endsWith --- .../app/revanced/patches/youtube/misc/links/Fingerprints.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt index 3908ffe813..7ad6cab6d7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt @@ -14,11 +14,10 @@ internal val abUriParserFingerprint by fingerprint { instructions( methodCall(smali = "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;"), fieldAccess( - definingClass = "Lcom/google/protos/youtube/api/innertube/WebviewEndpointOuterClass${'$'}WebviewEndpoint;", + definingClass = "/WebviewEndpointOuterClass${'$'}WebviewEndpoint;", name = "webviewEndpoint" ), - checkCast("Lcom/google/protos/youtube/api/innertube/WebviewEndpointOuterClass${'$'}WebviewEndpoint;"), - methodCall(smali = "Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;") + checkCast("/WebviewEndpointOuterClass${'$'}WebviewEndpoint;"), ) } From d293cdde9ade84d505f39fb0382cd302bc8a58e6 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 10 Jan 2025 22:08:24 +0100 Subject: [PATCH 25/64] unofficial 20.02 --- patches/api/patches.api | 7 +-- .../misc/mapping/ResourceMappingPatch.kt | 3 + .../layout/hide/general/Fingerprints.kt | 10 ++-- .../hide/general/HideLayoutComponentsPatch.kt | 33 +++++------ .../DisableResumingShortsOnStartupPatch.kt | 41 ++++++++------ .../layout/startupshortsreset/Fingerprints.kt | 5 +- .../misc/playservice/VersionCheckPatch.kt | 3 + .../video/playerresponse/Fingerprints.kt | 31 +++++++++- .../PlayerResponseMethodHookPatch.kt | 17 ++++-- .../speed/custom/CustomPlaybackSpeedPatch.kt | 56 +++++++++---------- .../video/speed/custom/Fingerprints.kt | 20 ++++--- 11 files changed, 131 insertions(+), 95 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 9e7ff0c2bb..a8fe66979b 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1112,13 +1112,7 @@ public final class app/revanced/patches/youtube/layout/hide/fullscreenambientmod } public final class app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatchKt { - public static final fun getAlbumCardId ()J - public static final fun getBarContainerHeightId ()J - public static final fun getCrowdfundingBoxId ()J - public static final fun getFabButtonId ()J - public static final fun getFilterBarHeightId ()J public static final fun getHideLayoutComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getRelatedChipCloudMarginId ()J } public final class app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatchKt { @@ -1344,6 +1338,7 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_19_43_or_greater ()Z public static final fun is_19_46_or_greater ()Z public static final fun is_19_47_or_greater ()Z + public static final fun is_20_02_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index 2ad771b545..b550176ca8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -17,6 +17,9 @@ lateinit var resourceMappings: List /** * Identical to [LiteralFilter] except uses a decoded resource literal value. + * + * Any patch with fingerprints of this filter must + * also declare [resourceMappingPatch] as a dependency. */ fun resourceLiteral( type: String, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 1670dc6f4a..d7282574a1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.layout.hide.general +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint import app.revanced.patcher.methodCall import app.revanced.patcher.opcode @@ -111,10 +112,9 @@ internal val showFloatingMicrophoneButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() - opcodes( - Opcode.IGET_BOOLEAN, - Opcode.IF_EQZ, - Opcode.RETURN_VOID, + instructions( + resourceLiteral("id", "fab"), + checkCast("/FloatingActionButton;", maxInstructionsBefore = 10), + opcode(Opcode.IGET_BOOLEAN, maxInstructionsBefore = 10) ) - literal { fabButtonId } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 926dd86b7c..42f184e3cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -33,18 +33,15 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -var albumCardId = -1L +internal var albumCardId = -1L private set -var crowdfundingBoxId = -1L +internal var crowdfundingBoxId = -1L private set -var filterBarHeightId = -1L +internal var filterBarHeightId = -1L private set -var relatedChipCloudMarginId = -1L +internal var relatedChipCloudMarginId = -1L private set -var barContainerHeightId = -1L - private set - -var fabButtonId = -1L +internal var barContainerHeightId = -1L private set private val hideLayoutComponentsResourcePatch = resourcePatch { @@ -75,11 +72,6 @@ private val hideLayoutComponentsResourcePatch = resourcePatch { "dimen", "bar_container_height", ] - - fabButtonId = resourceMappings[ - "id", - "fab", - ] } } @@ -105,7 +97,8 @@ val hideLayoutComponentsPatch = bytecodePatch( addResourcesPatch, hideLayoutComponentsResourcePatch, navigationBarHookPatch, - versionCheckPatch + versionCheckPatch, + resourceMappingPatch ) compatibleWith( @@ -332,15 +325,15 @@ val hideLayoutComponentsPatch = bytecodePatch( showFloatingMicrophoneButtonFingerprint.let { it.method.apply { - val startIndex = it.instructionMatches.first().index - val register = getInstruction(startIndex).registerA + val index = it.instructionMatches.last().index + val register = getInstruction(index).registerA addInstructions( - startIndex + 1, + index + 1, """ - invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideFloatingMicrophoneButton(Z)Z - move-result v$register - """, + invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideFloatingMicrophoneButton(Z)Z + move-result v$register + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index 1b7188c965..0fe675b6ca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -7,6 +7,8 @@ import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.util.addInstructionsAtControlFlowLabel @@ -27,6 +29,7 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, + versionCheckPatch ) compatibleWith( @@ -50,25 +53,27 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( SwitchPreference("revanced_disable_resuming_shorts_player"), ) - userWasInShortsFingerprint.method.apply { - val listenableInstructionIndex = indexOfFirstInstructionOrThrow { - opcode == Opcode.INVOKE_INTERFACE && - getReference()?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && - getReference()?.name == "isDone" - } - val freeRegister = getInstruction(listenableInstructionIndex + 1).registerA + if (!is_20_02_or_greater) { + userWasInShortsLegacyFingerprint.method.apply { + val listenableInstructionIndex = indexOfFirstInstructionOrThrow { + opcode == Opcode.INVOKE_INTERFACE && + getReference()?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && + getReference()?.name == "isDone" + } + val freeRegister = getInstruction(listenableInstructionIndex + 1).registerA - addInstructionsAtControlFlowLabel( - listenableInstructionIndex, - """ - invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z - move-result v$freeRegister - if-eqz v$freeRegister, :show_startup_shorts_player - return-void - :show_startup_shorts_player - nop - """, - ) + addInstructionsAtControlFlowLabel( + listenableInstructionIndex, + """ + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z + move-result v$freeRegister + if-eqz v$freeRegister, :show_startup_shorts_player + return-void + :show_startup_shorts_player + nop + """, + ) + } } userWasInShortsConfigFingerprint.method.addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt index 643e060d3f..e3c7e35a58 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt @@ -5,7 +5,10 @@ import app.revanced.patcher.literal import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags -internal val userWasInShortsFingerprint by fingerprint { +/** + * Pre 20.02. + */ +internal val userWasInShortsLegacyFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Ljava/lang/Object;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index e5c233b11b..c4bec474e3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -41,6 +41,8 @@ var is_19_46_or_greater = false private set var is_19_47_or_greater = false private set +var is_20_02_or_greater = false + private set val versionCheckPatch = resourcePatch( description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", @@ -74,5 +76,6 @@ val versionCheckPatch = resourcePatch( is_19_43_or_greater = 244405000 <= playStoreServicesVersion is_19_46_or_greater = 244705000 <= playStoreServicesVersion is_19_47_or_greater = 244799000 <= playStoreServicesVersion + is_20_02_or_greater = 250299000 <= playStoreServicesVersion } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt index c9067d7af0..c62753f09b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt @@ -4,10 +4,39 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags + /** - * For targets 19.25 and later. + * For targets 20.02 and later. */ internal val playerParameterBuilderFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("L") + parameters( + "Ljava/lang/String;", // VideoId. + "[B", + "Ljava/lang/String;", // Player parameters proto buffer. + "Ljava/lang/String;", + "I", + "I", + "L", // 19.25+ parameter + "Ljava/util/Set;", + "Ljava/lang/String;", + "Ljava/lang/String;", + "L", + "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", + "Z", + "Z", + ) + instructions( + string("psps"), + ) +} + +/** + * For targets 19.25 to 19.50. + */ +internal val playerParameterBuilder1925Fingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt index b990d74afa..a56d22008a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt @@ -1,11 +1,13 @@ package app.revanced.patches.youtube.video.playerresponse +import app.revanced.patcher.Fingerprint import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_23_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch private val hooks = mutableSetOf() @@ -35,15 +37,18 @@ val playerResponseMethodHookPatch = bytecodePatch { ) execute { - playerResponseMethod = if (is_19_23_or_greater) { + val fingerprint : Fingerprint + if (is_20_02_or_greater) { parameterIsShortAndOpeningOrPlaying = 12 - - playerParameterBuilderFingerprint + fingerprint = playerParameterBuilderFingerprint + } else if (is_19_23_or_greater) { + parameterIsShortAndOpeningOrPlaying = 12 + fingerprint = playerParameterBuilder1925Fingerprint } else { parameterIsShortAndOpeningOrPlaying = 11 - - playerParameterBuilderLegacyFingerprint - }.method + fingerprint = playerParameterBuilderLegacyFingerprint + } + playerResponseMethod = fingerprint.method // On some app targets the method has too many registers pushing the parameters past v15. // If needed, move the parameters to 4-bit registers, so they can be passed to the extension. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index cb4be195d5..17015cd5a1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -24,8 +24,6 @@ import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.util.* import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableField private const val FILTER_CLASS_DESCRIPTOR = @@ -55,35 +53,33 @@ internal val customPlaybackSpeedPatch = bytecodePatch( ) // Replace the speeds float array with custom speeds. - speedArrayGeneratorFingerprint.method.apply { - val sizeCallIndex = indexOfFirstInstructionOrThrow { getReference()?.name == "size" } - val sizeCallResultRegister = getInstruction(sizeCallIndex + 1).registerA - - replaceInstruction(sizeCallIndex + 1, "const/4 v$sizeCallResultRegister, 0x0") - - val arrayLengthConstIndex = indexOfFirstLiteralInstructionOrThrow(7) - val arrayLengthConstDestination = getInstruction(arrayLengthConstIndex).registerA - val playbackSpeedsArrayType = "$EXTENSION_CLASS_DESCRIPTOR->customPlaybackSpeeds:[F" - - addInstructions( - arrayLengthConstIndex + 1, - """ - sget-object v$arrayLengthConstDestination, $playbackSpeedsArrayType - array-length v$arrayLengthConstDestination, v$arrayLengthConstDestination - """, - ) - - val originalArrayFetchIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.type == "[F" && reference.definingClass.endsWith("/PlayerConfigModel;") + speedArrayGeneratorFingerprint.let { + val matches = it.instructionMatches + it.method.apply { + val playbackSpeedsArrayType = "$EXTENSION_CLASS_DESCRIPTOR->customPlaybackSpeeds:[F" + // Apply changes from last index to first to preserve indexes. + + val originalArrayFetchIndex = matches[5].index + val originalArrayFetchDestination = matches[5].getInstruction().registerA + replaceInstruction( + originalArrayFetchIndex, + "sget-object v$originalArrayFetchDestination, $playbackSpeedsArrayType" + ) + + val arrayLengthConstDestination = matches[3].getInstruction().registerA + val newArrayIndex = matches[4].index + addInstructions( + newArrayIndex, + """ + sget-object v$arrayLengthConstDestination, $playbackSpeedsArrayType + array-length v$arrayLengthConstDestination, v$arrayLengthConstDestination + """ + ) + + val sizeCallIndex = matches[0].index + 1 + val sizeCallResultRegister = getInstruction(sizeCallIndex).registerA + replaceInstruction(sizeCallIndex, "const/4 v$sizeCallResultRegister, 0x0") } - val originalArrayFetchDestination = - getInstruction(originalArrayFetchIndex).registerA - - replaceInstruction( - originalArrayFetchIndex, - "sget-object v$originalArrayFetchDestination, $playbackSpeedsArrayType", - ) } // Override the min/max speeds that can be used. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index a47050010e..73ed6dc884 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -1,6 +1,11 @@ package app.revanced.patches.youtube.video.speed.custom +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.newInstance +import app.revanced.patcher.opcode import app.revanced.patcher.string import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags @@ -32,15 +37,14 @@ internal val speedArrayGeneratorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("[L") parameters("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;") - opcodes( - Opcode.IF_NEZ, - Opcode.SGET_OBJECT, - Opcode.GOTO_16, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IGET_OBJECT, + instructions( + methodCall(name = "size", returnType = "I"), + newInstance("Ljava/text/DecimalFormat;"), + string("0.0#"), + literal(7), + opcode(Opcode.NEW_ARRAY), + fieldAccess(definingClass = "/PlayerConfigModel;", type = "[F") ) - strings("0.0#") } internal val speedLimiterFingerprint by fingerprint { From 1802d000ce4782b14c363ff044b27224ce9477a9 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 12 Jan 2025 20:54:58 +0100 Subject: [PATCH 26/64] refactor --- .../layout/buttons/navigation/Fingerprints.kt | 7 ++++- .../navigation/NavigationButtonsPatch.kt | 28 +++++++++---------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt index bc5e3b4902..b41b1b0afb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt @@ -5,11 +5,16 @@ import app.revanced.patcher.lastInstruction import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal val addCreateButtonViewFingerprint by fingerprint { - strings("Android Automotive", "Android Wear") + instructions( + string("Android Wear"), + opcode(Opcode.IF_EQZ), + string("Android Automotive", maxInstructionsBefore = 0), + ) } internal val createPivotBarFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index c4d8dd0b93..4b91830599 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -76,20 +76,20 @@ val navigationButtonsPatch = bytecodePatch( ) // Switch create with notifications button. - addCreateButtonViewFingerprint.method.apply { - val stringIndex = addCreateButtonViewFingerprint.stringMatches.first().index - - val conditionalCheckIndex = stringIndex - 1 - val conditionRegister = - getInstruction(conditionalCheckIndex).registerA - - addInstructions( - conditionalCheckIndex, - """ - invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->switchCreateWithNotificationButton()Z - move-result v$conditionRegister - """, - ) + addCreateButtonViewFingerprint.let { + it.method.apply { + val conditionalCheckIndex = it.instructionMatches[1].index + val conditionRegister = + getInstruction(conditionalCheckIndex).registerA + + addInstructions( + conditionalCheckIndex, + """ + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->switchCreateWithNotificationButton()Z + move-result v$conditionRegister + """, + ) + } } // Hide navigation button labels. From 53226723253c488b84239942d100247aa7ab4ecc Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 20 Jan 2025 12:08:17 +0100 Subject: [PATCH 27/64] fix merge --- .../patches/youtube/misc/settings/Fingerprints.kt | 15 +++++++++------ .../youtube/misc/settings/SettingsPatch.kt | 10 ++++++---- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt index 2d2c8e7de0..c9b4b0dc7d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt @@ -1,7 +1,9 @@ package app.revanced.patches.youtube.misc.settings import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.opcode +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -25,10 +27,11 @@ internal val setThemeFingerprint by fingerprint { /** * Added in YouTube v19.04.38. */ -internal const val CAIRO_CONFIG_LITERAL_VALUE = 45532100L - -internal val cairoFragmentConfigFingerprint = fingerprint { +internal val cairoFragmentConfigFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") - literal { CAIRO_CONFIG_LITERAL_VALUE } -} + instructions( + literal(45532100L), + opcode(Opcode.MOVE_RESULT, 10) + ) +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt index 8bf7cfc069..729b3c0927 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt @@ -248,10 +248,12 @@ val settingsPatch = bytecodePatch( // Add setting to force cairo settings fragment on/off. if (is_19_04_or_greater) { - cairoFragmentConfigFingerprint.method.insertFeatureFlagBooleanOverride( - CAIRO_CONFIG_LITERAL_VALUE, - "$activityHookClassDescriptor->useCairoSettingsFragment(Z)Z" - ) + cairoFragmentConfigFingerprint.let { + it.method.insertFeatureFlagBooleanOverride( + it.instructionMatches.last().index, + "$activityHookClassDescriptor->useCairoSettingsFragment(Z)Z" + ) + } } } From 9d3ba6477926bcfb62d47be96ae0852eb04577df Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 20 Jan 2025 12:17:00 +0100 Subject: [PATCH 28/64] refactor --- .../youtube/misc/settings/Fingerprints.kt | 5 +-- .../youtube/misc/settings/SettingsPatch.kt | 36 ++++--------------- 2 files changed, 10 insertions(+), 31 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt index c9b4b0dc7d..845db2b5b8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt @@ -20,8 +20,9 @@ internal val setThemeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() - opcodes(Opcode.RETURN_OBJECT) - literal { appearanceStringId } + instructions( + resourceLiteral("string", "app_theme_appearance_dark"), + ) } /** diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt index 729b3c0927..c9aaa91134 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt @@ -1,18 +1,14 @@ package app.revanced.patches.youtube.misc.settings -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting import app.revanced.patches.shared.misc.settings.settingsPatch @@ -31,10 +27,6 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter import com.android.tools.smali.dexlib2.util.MethodUtil -// Used by a fingerprint() from SettingsPatch. -internal var appearanceStringId = -1L - private set - private val preferences = mutableSetOf() fun addSettingPreference(screen: BasePreference) { @@ -70,9 +62,6 @@ private val settingsResourcePatch = resourcePatch { ) execute { - // Used for a fingerprint from SettingsPatch. - appearanceStringId = resourceMappings["string", "app_theme_appearance_dark"] - arrayOf( ResourceGroup("drawable", "revanced_settings_icon.xml"), ResourceGroup("layout", "revanced_settings_with_toolbar.xml"), @@ -183,24 +172,13 @@ val settingsPatch = bytecodePatch( ) ) - setThemeFingerprint.method.let { setThemeMethod -> - setThemeMethod.implementation!!.instructions.mapIndexedNotNull { i, instruction -> - if (instruction.opcode == Opcode.RETURN_OBJECT) i else null - }.asReversed().forEach { returnIndex -> - // The following strategy is to replace the return instruction with the setTheme instruction, - // then add a return instruction after the setTheme instruction. - // This is done because the return instruction is a target of another instruction. - - setThemeMethod.apply { - // This register is returned by the setTheme method. - val register = getInstruction(returnIndex).registerA - replaceInstruction( - returnIndex, - "invoke-static { v$register }, " + - "$themeHelperDescriptor->$setThemeMethodName(Ljava/lang/Enum;)V", - ) - addInstruction(returnIndex + 1, "return-object v$register") - } + setThemeFingerprint.method.apply { + findInstructionIndicesReversedOrThrow(Opcode.RETURN_OBJECT).forEach { returnIndex -> + val register = getInstruction(returnIndex).registerA + addInstructionsAtControlFlowLabel( + returnIndex, + "invoke-static { v$register }, $themeHelperDescriptor->$setThemeMethodName(Ljava/lang/Enum;)V", + ) } } From d20905e0061f179594f91c3388581c311b7eb24b Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:09:28 +0100 Subject: [PATCH 29/64] unofficial 20.03 support --- ...sableResumingStartupShortsPlayerPatch.java | 9 +- .../youtube/patches/MiniplayerPatch.java | 12 +- .../youtube/layout/miniplayer/Fingerprints.kt | 49 +++++--- .../layout/miniplayer/MiniplayerPatch.kt | 110 +++--------------- .../DisableResumingShortsOnStartupPatch.kt | 18 ++- .../layout/startupshortsreset/Fingerprints.kt | 20 +++- .../youtube/misc/litho/filter/Fingerprints.kt | 6 +- 7 files changed, 103 insertions(+), 121 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableResumingStartupShortsPlayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableResumingStartupShortsPlayerPatch.java index 938ac54583..2e8c3cc06a 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableResumingStartupShortsPlayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableResumingStartupShortsPlayerPatch.java @@ -2,7 +2,7 @@ import app.revanced.extension.youtube.settings.Settings; -/** @noinspection unused*/ +@SuppressWarnings("unused") public class DisableResumingStartupShortsPlayerPatch { /** @@ -11,4 +11,11 @@ public class DisableResumingStartupShortsPlayerPatch { public static boolean disableResumingStartupShortsPlayer() { return Settings.DISABLE_RESUMING_SHORTS_PLAYER.get(); } + + /** + * Injection point. + */ + public static boolean disableResumingStartupShortsPlayer(boolean original) { + return original && !Settings.DISABLE_RESUMING_SHORTS_PLAYER.get(); + } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java index be27811c92..42264ce372 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java @@ -227,9 +227,13 @@ public static int getModernMiniplayerOverrideType(int original) { /** * Injection point. */ - public static void adjustMiniplayerOpacity(ImageView view) { + public static void adjustMiniplayerOpacity(View view) { if (CURRENT_TYPE == MODERN_1) { - view.setImageAlpha(OPACITY_LEVEL); + if (view instanceof ImageView imageView) { + imageView.setImageAlpha(OPACITY_LEVEL); + } else { + Logger.printException(() -> "Unknown miniplayer overlay view: " + view); + } } } @@ -304,14 +308,14 @@ public static boolean setHorizontalDrag(boolean original) { /** * Injection point. */ - public static void hideMiniplayerExpandClose(ImageView view) { + public static void hideMiniplayerExpandClose(View view) { Utils.hideViewByRemovingFromParentUnderCondition(HIDE_EXPAND_CLOSE_ENABLED, view); } /** * Injection point. */ - public static void hideMiniplayerRewindForward(ImageView view) { + public static void hideMiniplayerRewindForward(View view) { Utils.hideViewByRemovingFromParentUnderCondition(HIDE_REWIND_FORWARD_ENABLED, view); } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 432294fb13..5b8028b226 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -2,11 +2,12 @@ package app.revanced.patches.youtube.layout.miniplayer +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint import app.revanced.patcher.literal +import app.revanced.patcher.opcode import app.revanced.patcher.string import app.revanced.patches.shared.misc.mapping.resourceLiteral -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -31,13 +32,13 @@ internal val miniplayerModernAddViewListenerFingerprint by fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ - internal val miniplayerModernCloseButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/widget/ImageView;") + returns("L") parameters() instructions( - literal(modernMiniplayerClose) + resourceLiteral("id", "modern_miniplayer_close"), + checkCast("Landroid/widget/ImageView;") ) } @@ -54,7 +55,7 @@ internal const val MINIPLAYER_DISABLED_FEATURE_KEY = 45657015L internal val miniplayerModernConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( - literal(45623000L) + literal(45623000L) // Magic number found in the constructor. ) } @@ -71,9 +72,12 @@ internal val miniplayerOnCloseHandlerFingerprint by fingerprint { */ internal val miniplayerModernExpandButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/widget/ImageView;") + returns("L") parameters() - literal { modernMiniplayerExpand } + instructions( + resourceLiteral("id", "modern_miniplayer_expand"), + checkCast("Landroid/widget/ImageView;") + ) } /** @@ -83,7 +87,9 @@ internal val miniplayerModernExpandCloseDrawablesFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") - literal { ytOutlinePictureInPictureWhite24 } + instructions( + literal(ytOutlinePictureInPictureWhite24) + ) } /** @@ -91,19 +97,21 @@ internal val miniplayerModernExpandCloseDrawablesFingerprint by fingerprint { */ internal val miniplayerModernForwardButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/widget/ImageView;") + returns("L") parameters() - literal { modernMiniplayerForwardButton } + instructions( + resourceLiteral("id", "modern_miniplayer_forward_button"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 5) + ) } -/** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. - */ internal val miniplayerModernOverlayViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") parameters() - literal { scrimOverlay } + instructions( + resourceLiteral("id", "scrim_overlay"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 5) + ) } /** @@ -111,9 +119,12 @@ internal val miniplayerModernOverlayViewFingerprint by fingerprint { */ internal val miniplayerModernRewindButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/widget/ImageView;") + returns("L") parameters() - literal { modernMiniplayerRewindButton } + instructions( + resourceLiteral("id", "modern_miniplayer_rewind_button"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 5) + ) } internal val miniplayerModernViewParentFingerprint by fingerprint { @@ -145,7 +156,9 @@ internal val miniplayerOverrideFingerprint by fingerprint { internal val miniplayerOverrideNoContextFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Z") - opcodes(Opcode.IGET_BOOLEAN) // Anchor to insert the instruction. + instructions( + opcode(Opcode.IGET_BOOLEAN) // Anchor to insert the instruction. + ) } internal val miniplayerResponseModelSizeCheckFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 51fd3cbab6..2ef8586c8d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -29,7 +29,6 @@ import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference -import com.android.tools.smali.dexlib2.iface.reference.TypeReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter @@ -38,18 +37,6 @@ internal var ytOutlineXWhite24 = -1L private set internal var ytOutlinePictureInPictureWhite24 = -1L private set -internal var scrimOverlay = -1L - private set -internal var modernMiniplayerClose = -1L - private set -internal var modernMiniplayerExpand = -1L - private set -internal var modernMiniplayerRewindButton = -1L - private set -internal var modernMiniplayerForwardButton = -1L - private set -internal var playerOverlays = -1L - private set private val miniplayerResourcePatch = resourcePatch { dependsOn( @@ -58,37 +45,7 @@ private val miniplayerResourcePatch = resourcePatch { ) execute { - scrimOverlay = resourceMappings[ - "id", - "scrim_overlay", - ] - - playerOverlays = resourceMappings[ - "layout", - "player_overlays", - ] - if (is_19_16_or_greater) { - modernMiniplayerClose = resourceMappings[ - "id", - "modern_miniplayer_close", - ] - - modernMiniplayerExpand = resourceMappings[ - "id", - "modern_miniplayer_expand", - ] - - modernMiniplayerRewindButton = resourceMappings[ - "id", - "modern_miniplayer_rewind_button", - ] - - modernMiniplayerForwardButton = resourceMappings[ - "id", - "modern_miniplayer_forward_button", - ] - // Resource id is not used during patching, but is used by extension. // Verify the resource is present while patching. resourceMappings[ @@ -147,7 +104,6 @@ val miniplayerPatch = bytecodePatch( // 19.30.39 // Modern 3 is less broken when double tap expand is enabled, but cannot swipe to expand when double tap is off. // 19.31.36 // All Modern 1 buttons are missing. Unusable. // 19.32.36 // 19.32+ and beyond all work without issues. - // 19.33.35 "19.34.42", "19.43.41", "19.45.38", @@ -292,24 +248,6 @@ val miniplayerPatch = bytecodePatch( ) } - fun MutableMethod.hookInflatedView( - literalValue: Long, - hookedClassType: String, - extensionMethodName: String, - ) { - val imageViewIndex = indexOfFirstInstructionOrThrow( - indexOfFirstLiteralInstructionOrThrow(literalValue), - ) { - opcode == Opcode.CHECK_CAST && getReference()?.type == hookedClassType - } - - val register = getInstruction(imageViewIndex).registerA - addInstruction( - imageViewIndex + 1, - "invoke-static { v$register }, $extensionMethodName", - ) - } - // region Enable tablet miniplayer. miniplayerOverrideNoContextFingerprint.match( @@ -427,7 +365,7 @@ val miniplayerPatch = bytecodePatch( // region Fix 19.16 using mixed up drawables for tablet modern. // YT fixed this mistake in 19.17. // Fix this, by swapping the drawable resource values with each other. - if (ytOutlinePictureInPictureWhite24 >= 0) { + if (!is_19_17_or_greater) { miniplayerModernExpandCloseDrawablesFingerprint.match( miniplayerModernViewParentFingerprint.originalClassDef, ).method.apply { @@ -448,39 +386,23 @@ val miniplayerPatch = bytecodePatch( // region Add hooks to hide modern miniplayer buttons. listOf( - Triple( - miniplayerModernExpandButtonFingerprint, - modernMiniplayerExpand, - "hideMiniplayerExpandClose", - ), - Triple( - miniplayerModernCloseButtonFingerprint, - modernMiniplayerClose, - "hideMiniplayerExpandClose", - ), - Triple( - miniplayerModernRewindButtonFingerprint, - modernMiniplayerRewindButton, - "hideMiniplayerRewindForward", - ), - Triple( - miniplayerModernForwardButtonFingerprint, - modernMiniplayerForwardButton, - "hideMiniplayerRewindForward", - ), - Triple( - miniplayerModernOverlayViewFingerprint, - scrimOverlay, - "adjustMiniplayerOpacity", - ), - ).forEach { (fingerprint, literalValue, methodName) -> + miniplayerModernExpandButtonFingerprint to "hideMiniplayerExpandClose", + miniplayerModernCloseButtonFingerprint to "hideMiniplayerExpandClose", + miniplayerModernRewindButtonFingerprint to "hideMiniplayerRewindForward", + miniplayerModernForwardButtonFingerprint to "hideMiniplayerRewindForward", + miniplayerModernOverlayViewFingerprint to "adjustMiniplayerOpacity" + ).forEach { (fingerprint, methodName) -> fingerprint.match( miniplayerModernViewParentFingerprint.classDef, - ).method.hookInflatedView( - literalValue, - "Landroid/widget/ImageView;", - "$EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/widget/ImageView;)V", - ) + ).method.apply { + val index = fingerprint.instructionMatches.last().index + val register = getInstruction(index).registerA + + addInstruction( + index + 1, + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V", + ) + } } miniplayerModernAddViewListenerFingerprint.match( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index 0fe675b6ca..249a29ae82 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -53,7 +53,23 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( SwitchPreference("revanced_disable_resuming_shorts_player"), ) - if (!is_20_02_or_greater) { + if (is_20_02_or_greater) { + userWasInShortsAlternativeFingerprint.let { + it.method.apply { + val match = it.instructionMatches[2] + val insertIndex = match.index + 1 + val register = match.getInstruction().registerA + + addInstructions( + insertIndex, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer(Z)Z + move-result v$register + """ + ) + } + } + } else { userWasInShortsLegacyFingerprint.method.apply { val listenableInstructionIndex = indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_INTERFACE && diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt index e3c7e35a58..86801582e7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt @@ -2,11 +2,29 @@ package app.revanced.patches.youtube.layout.startupshortsreset import app.revanced.patcher.fingerprint import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode /** - * Pre 20.02. + * 20.02+ + */ +internal val userWasInShortsAlternativeFingerprint by fingerprint { + returns("V") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameters("Ljava/lang/Object;") + instructions( + methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z"), + methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z"), + opcode(Opcode.MOVE_RESULT, maxInstructionsBefore = 0), + string("userIsInShorts: ", maxInstructionsBefore = 5) + ) +} + +/** + * Pre 20.02 */ internal val userWasInShortsLegacyFingerprint by fingerprint { returns("V") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt index e26bb7a057..21e1721a56 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt @@ -12,14 +12,16 @@ import com.android.tools.smali.dexlib2.Opcode */ internal val componentContextParserFingerprint by fingerprint { instructions( - string("Component was not found %s because it was removed due to duplicate converter bindings."), + string("TreeNode result must be set."), + // String changed slightly in 20.03+ + string("it was removed due to duplicate converter bindings.", partialMatch = true) ) } internal val lithoFilterFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) custom { _, classDef -> - classDef.endsWith("LithoFilterPatch;") + classDef.endsWith("/LithoFilterPatch;") } } From 7ddd83b1c90c043fb27f45e5dfa01c94b6d4d270 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 21 Jan 2025 12:40:32 +0100 Subject: [PATCH 30/64] fix Open Shorts fullscreen patch with 19.50+ --- .../OpenShortsInRegularPlayerPatch.java | 9 ---- .../OpenVideosFullscreenHookPatch.java | 10 ++-- patches/api/patches.api | 4 -- .../layout/player/fullscreen/Fingerprints.kt | 31 +++++++++++- .../player/fullscreen/OpenVideosFullscreen.kt | 9 ---- .../OpenVideosFullscreenHookPatch.kt | 47 +++++++++++++++---- .../fullscreen/OpenVideosFullscreenPatch.kt | 15 +++--- .../OpenShortsInRegularPlayerPatch.kt | 38 +++++---------- .../resources/addresources/values/arrays.xml | 9 ---- 9 files changed, 95 insertions(+), 77 deletions(-) delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java index abe3b0cfd7..596675974b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java @@ -20,15 +20,6 @@ public enum ShortsPlayerType { REGULAR_PLAYER_FULLSCREEN } - static { - if (!VersionCheckPatch.IS_19_46_OR_GREATER - && Settings.SHORTS_PLAYER_TYPE.get() == ShortsPlayerType.REGULAR_PLAYER_FULLSCREEN) { - // User imported newer settings to an older app target. - Logger.printInfo(() -> "Resetting " + Settings.SHORTS_PLAYER_TYPE); - Settings.SHORTS_PLAYER_TYPE.resetToDefault(); - } - } - private static WeakReference mainActivityRef = new WeakReference<>(null); /** diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch.java index 62f9bbff9c..9a7989d9a1 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch.java @@ -24,18 +24,20 @@ private static boolean isFullScreenPatchIncluded() { /** * Injection point. + * + * Returns negated value. */ - public static boolean openVideoFullscreenPortrait(boolean original) { + public static boolean doNotOpenVideoFullscreenPortrait(boolean original) { Boolean openFullscreen = openNextVideoFullscreen; if (openFullscreen != null) { openNextVideoFullscreen = null; - return openFullscreen; + return !openFullscreen; } if (!isFullScreenPatchIncluded()) { - return false; + return original; } - return Settings.OPEN_VIDEOS_FULLSCREEN_PORTRAIT.get(); + return !Settings.OPEN_VIDEOS_FULLSCREEN_PORTRAIT.get(); } } diff --git a/patches/api/patches.api b/patches/api/patches.api index 64fbec1648..6c659f6d3e 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1162,10 +1162,6 @@ public final class app/revanced/patches/youtube/layout/player/background/PlayerC public static final fun getPlayerControlsBackgroundPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenKt { - public static final fun getOpenVideosFullscreen ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatchKt { public static final fun getOpenVideosFullscreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt index dff9dbae45..4fb6a578af 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt @@ -2,14 +2,43 @@ package app.revanced.patches.youtube.layout.player.fullscreen import app.revanced.patcher.fingerprint import app.revanced.patcher.literal +import app.revanced.patcher.opcode import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +/** + * 19.46+ + */ internal val openVideosFullscreenPortraitFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "Lj\$/util/Optional;") instructions( - literal(45666112L) + opcode(Opcode.MOVE_RESULT), // Conditional check to modify. + literal(45666112L, maxInstructionsBefore = 5), // Cannot be more than 5. + opcode(Opcode.MOVE_RESULT, maxInstructionsBefore = 10), + ) +} + +/** + * Pre 19.46. + */ +internal val openVideosFullscreenPortraitLegacyFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters("L", "Lj\$/util/Optional;") + opcodes( + Opcode.GOTO, + Opcode.SGET_OBJECT, + Opcode.GOTO, + Opcode.SGET_OBJECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT, + Opcode.IF_EQ, + Opcode.IF_EQ, + Opcode.IGET_OBJECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT // Conditional check to modify. ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt deleted file mode 100644 index 89311b08c0..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.layout.player.fullscreen - -import app.revanced.patcher.patch.bytecodePatch - -@Suppress("unused") -@Deprecated("Renamed to openVideosFullscreenPatch", ReplaceWith("openVideosFullscreenPatch")) -val openVideosFullscreen = bytecodePatch{ - dependsOn(openVideosFullscreenPatch) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt index ae993d926e..5742949f5e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt @@ -1,11 +1,15 @@ package app.revanced.patches.youtube.layout.player.fullscreen +import app.revanced.patcher.Fingerprint +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.youtube.layout.shortsplayer.openShortsInRegularPlayerPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.util.insertFeatureFlagBooleanOverride +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch;" @@ -20,15 +24,42 @@ internal val openVideosFullscreenHookPatch = bytecodePatch { ) execute { - if (!is_19_46_or_greater) { - return@execute + var fingerprint: Fingerprint + var insertIndex: Int + + if (is_19_46_or_greater) { + fingerprint = openVideosFullscreenPortraitFingerprint + insertIndex = fingerprint.instructionMatches.first().index + + openVideosFullscreenPortraitFingerprint.let { + it.method.apply { + // Remove A/B feature call that forces what this patch already does. + // Cannot use the A/B flag to accomplish the same goal because 19.50+ + // Shorts fullscreen regular player does not use fullscreen + // if the player is minimized and it must be forced using other conditional check. + val featureFlagIndex = it.instructionMatches.last().index + val featureFlagRegister = getInstruction(featureFlagIndex).registerA + + addInstruction(featureFlagIndex + 1, "const/4 v$featureFlagRegister, 0x0") + } + } + } else { + fingerprint = openVideosFullscreenPortraitLegacyFingerprint + insertIndex = fingerprint.instructionMatches.last().index } - openVideosFullscreenPortraitFingerprint.let { - it.method.insertFeatureFlagBooleanOverride( - it.instructionMatches.first().index, - "$EXTENSION_CLASS_DESCRIPTOR->openVideoFullscreenPortrait(Z)Z" - ) + fingerprint.let { + it.method.apply { + val register = getInstruction(insertIndex).registerA + + addInstructions( + insertIndex + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->doNotOpenVideoFullscreenPortrait(Z)Z + move-result v$register + """ + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt index 7f117ca9b9..4df8784b58 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt @@ -1,12 +1,9 @@ package app.revanced.patches.youtube.layout.player.fullscreen -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.util.returnEarly @@ -20,21 +17,23 @@ val openVideosFullscreenPatch = bytecodePatch( openVideosFullscreenHookPatch, settingsPatch, addResourcesPatch, - versionCheckPatch ) compatibleWith( "com.google.android.youtube"( + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41", + "19.45.38", "19.46.42", "19.47.53", ) ) execute { - if (!is_19_46_or_greater) { - throw PatchException("'Open videos fullscreen' requires 19.46.42 or greater") - } - addResources("youtube", "layout.player.fullscreen.openVideosFullscreen") PreferenceScreen.PLAYER.addPreferences( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt index 247a49d781..905a02ed1c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt @@ -36,7 +36,6 @@ val openShortsInRegularPlayerPatch = bytecodePatch( addResourcesPatch, openVideosFullscreenHookPatch, navigationBarHookPatch, - versionCheckPatch ) compatibleWith( @@ -57,19 +56,10 @@ val openShortsInRegularPlayerPatch = bytecodePatch( addResources("youtube", "layout.shortsplayer.shortsPlayerTypePatch") PreferenceScreen.SHORTS.addPreferences( - if (is_19_46_or_greater) { - ListPreference( - key = "revanced_shorts_player_type", - summaryKey = null, - ) - } else { - ListPreference( - key = "revanced_shorts_player_type", - summaryKey = null, - entriesKey = "revanced_shorts_player_type_legacy_entries", - entryValuesKey = "revanced_shorts_player_type_legacy_entry_values" - ) - } + ListPreference( + key = "revanced_shorts_player_type", + summaryKey = null + ) ) // Activity is used as the context to launch an Intent. @@ -103,7 +93,15 @@ val openShortsInRegularPlayerPatch = bytecodePatch( nop """ - if (!is_19_25_or_greater) { + if (is_19_25_or_greater) { + shortsPlaybackIntentFingerprint.method.addInstructionsWithLabels( + 0, + """ + move-object/from16 v0, p1 + ${extensionInstructions(0, 1)} + """ + ) + } else { shortsPlaybackIntentLegacyFingerprint.method.apply { val index = indexOfFirstInstructionOrThrow { getReference()?.returnType == @@ -117,16 +115,6 @@ val openShortsInRegularPlayerPatch = bytecodePatch( extensionInstructions(playbackStartRegister, freeRegister) ) } - - return@execute } - - shortsPlaybackIntentFingerprint.method.addInstructionsWithLabels( - 0, - """ - move-object/from16 v0, p1 - ${extensionInstructions(0, 1)} - """ - ) } } diff --git a/patches/src/main/resources/addresources/values/arrays.xml b/patches/src/main/resources/addresources/values/arrays.xml index a8bf565d9f..b9a949d305 100644 --- a/patches/src/main/resources/addresources/values/arrays.xml +++ b/patches/src/main/resources/addresources/values/arrays.xml @@ -262,15 +262,6 @@ - - @string/revanced_shorts_player_type_shorts - @string/revanced_shorts_player_type_regular_player - - - - SHORTS_PLAYER - REGULAR_PLAYER - @string/revanced_shorts_player_type_shorts @string/revanced_shorts_player_type_regular_player From 598baa42a807cc2a2a50a2d79f24cada629116a2 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 21 Jan 2025 22:26:49 +0100 Subject: [PATCH 31/64] refactor, fix 19.25 --- patches/api/patches.api | 2 + .../youtube/layout/seekbar/Fingerprints.kt | 54 +++++++++++++------ .../layout/seekbar/SeekbarColorPatch.kt | 22 ++++---- .../DisableResumingShortsOnStartupPatch.kt | 4 +- .../misc/playservice/VersionCheckPatch.kt | 6 +++ 5 files changed, 60 insertions(+), 28 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 6c659f6d3e..4373004309 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1341,7 +1341,9 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_19_43_or_greater ()Z public static final fun is_19_46_or_greater ()Z public static final fun is_19_47_or_greater ()Z + public static final fun is_19_49_or_greater ()Z public static final fun is_20_02_or_greater ()Z + public static final fun is_20_03_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index 2a6d79718d..d1f23618bc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -2,8 +2,9 @@ package app.revanced.patches.youtube.layout.seekbar import app.revanced.patcher.fingerprint import app.revanced.patcher.literal +import app.revanced.patcher.opcode +import app.revanced.patches.shared.misc.mapping.resourceLiteral import app.revanced.util.containsLiteralInstruction -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -34,7 +35,9 @@ internal val setSeekbarClickedColorFingerprint by fingerprint { internal val shortsSeekbarColorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - literal { reelTimeBarPlayedColorId } + instructions( + literal(reelTimeBarPlayedColorId) + ) } internal val lithoLinearGradientFingerprint by fingerprint { @@ -44,33 +47,50 @@ internal val lithoLinearGradientFingerprint by fingerprint { } /** - * 29.25 - 19.50 + * 19.49+ + */ +internal val playerLinearGradientFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + parameters("I", "I", "I", "I", "Landroid/content/Context;", "I") + returns("Landroid/graphics/LinearGradient;") + instructions( + resourceLiteral("color", "yt_youtube_magenta"), + + opcode(Opcode.FILLED_NEW_ARRAY, maxInstructionsBefore = 5), + opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 0) + ) +} + +/** + * 19.46 - 19.47 */ -internal val playerLinearGradientLegacyFingerprint by fingerprint { +internal val playerLinearGradientLegacy1946Fingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("I", "I", "I", "I") returns("V") - opcodes( - Opcode.FILLED_NEW_ARRAY, - Opcode.MOVE_RESULT_OBJECT + instructions( + resourceLiteral("color", "yt_youtube_magenta"), + + opcode(Opcode.FILLED_NEW_ARRAY), + opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 0), ) custom { method, _ -> - method.name == "setBounds" && method.containsLiteralInstruction(ytYoutubeMagentaColorId) + method.name == "setBounds" } } /** - * 20.03+ + * 19.25 - 19.45 */ -internal val playerLinearGradientFingerprint by fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - parameters("I", "I", "I", "I", "Landroid/content/Context;", "I") - returns("Landroid/graphics/LinearGradient;") - opcodes( - Opcode.FILLED_NEW_ARRAY, - Opcode.MOVE_RESULT_OBJECT +internal val playerLinearGradientLegacy1925Fingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + parameters("Landroid/content/Context;") + instructions( + resourceLiteral("color", "yt_youtube_magenta"), + + opcode(Opcode.FILLED_NEW_ARRAY, maxInstructionsBefore = 10), + opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 0), ) - literal { ytYoutubeMagentaColorId } } internal const val launchScreenLayoutTypeLotteFeatureFlag = 268507948L diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index 70ac938094..d44bedcf29 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -15,6 +15,7 @@ import app.revanced.patches.youtube.layout.theme.lithoColorOverrideHook import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater +import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint @@ -39,8 +40,6 @@ internal var inlineTimeBarColorizedBarPlayedColorDarkId = -1L private set internal var inlineTimeBarPlayedNotHighlightedColorId = -1L private set -internal var ytYoutubeMagentaColorId = -1L - private set internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color" @@ -64,10 +63,6 @@ private val seekbarColorResourcePatch = resourcePatch { "color", "inline_time_bar_played_not_highlighted_color", ] - ytYoutubeMagentaColorId = resourceMappings[ - "color", - "yt_youtube_magenta", - ] // Modify the resume playback drawable and replace the progress bar with a custom drawable. document("res/drawable/resume_playback_progressbar_drawable.xml").use { document -> @@ -189,6 +184,7 @@ val seekbarColorPatch = bytecodePatch( lithoColorHookPatch, seekbarColorResourcePatch, resourceMappingPatch, + versionCheckPatch ) execute { @@ -241,10 +237,18 @@ val seekbarColorPatch = bytecodePatch( "invoke-static/range { p4 .. p5 }, $EXTENSION_CLASS_DESCRIPTOR->setLinearGradient([I[F)V" ) - // TODO: add 20.03 support - playerLinearGradientLegacyFingerprint.let { + val playerFingerprint = + if (is_19_49_or_greater) { + playerLinearGradientFingerprint + } else if (is_19_46_or_greater) { + playerLinearGradientLegacy1946Fingerprint + } else { + playerLinearGradientLegacy1925Fingerprint + } + + playerFingerprint.let { it.method.apply { - val index = it.patternMatch!!.endIndex + val index = it.instructionMatches.last().index val register = getInstruction(index).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index 249a29ae82..010c92c690 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -7,7 +7,7 @@ import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_03_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch @@ -53,7 +53,7 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( SwitchPreference("revanced_disable_resuming_shorts_player"), ) - if (is_20_02_or_greater) { + if (is_20_03_or_greater) { userWasInShortsAlternativeFingerprint.let { it.method.apply { val match = it.instructionMatches[2] diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index c4bec474e3..932ffd6752 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -41,8 +41,12 @@ var is_19_46_or_greater = false private set var is_19_47_or_greater = false private set +var is_19_49_or_greater = false + private set var is_20_02_or_greater = false private set +var is_20_03_or_greater = false + private set val versionCheckPatch = resourcePatch( description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", @@ -76,6 +80,8 @@ val versionCheckPatch = resourcePatch( is_19_43_or_greater = 244405000 <= playStoreServicesVersion is_19_46_or_greater = 244705000 <= playStoreServicesVersion is_19_47_or_greater = 244799000 <= playStoreServicesVersion + is_19_49_or_greater = 245005000 <= playStoreServicesVersion is_20_02_or_greater = 250299000 <= playStoreServicesVersion + is_20_03_or_greater = 250405000 <= playStoreServicesVersion } } From f05794ab955e44769b0a0d46c34a100ce089b2a5 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 22 Jan 2025 13:13:26 +0100 Subject: [PATCH 32/64] simplify --- .../youtube/layout/seekbar/Fingerprints.kt | 16 ++++-- .../layout/seekbar/SeekbarColorPatch.kt | 55 ++++++++----------- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index 177a9450d1..26fa8bc303 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -2,6 +2,7 @@ package app.revanced.patches.youtube.layout.seekbar import app.revanced.patcher.fingerprint import app.revanced.patcher.literal +import app.revanced.patcher.methodCall import app.revanced.patcher.opcode import app.revanced.patches.shared.misc.mapping.resourceLiteral import app.revanced.util.containsLiteralInstruction @@ -40,17 +41,24 @@ internal val shortsSeekbarColorFingerprint by fingerprint { ) } -internal val playerSeekbarHandleColorFingerprint = fingerprint { +internal val playerSeekbarHandleColorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Landroid/content/Context;") - literal { ytStaticBrandRedId } + instructions( + resourceLiteral("attr", "ytStaticBrandRed"), + opcode(Opcode.MOVE_RESULT) + ) } -internal val watchHistoryMenuUseProgressDrawableFingerprint = fingerprint { +internal val watchHistoryMenuUseProgressDrawableFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") - literal { -1712394514 } + instructions( + methodCall("Landroid/widget/ProgressBar;", "setMax"), + opcode(Opcode.MOVE_RESULT), + literal(-1712394514) + ) } internal val lithoLinearGradientFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index 5a83ef72ea..bd258f05c7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -41,8 +41,6 @@ internal var inlineTimeBarColorizedBarPlayedColorDarkId = -1L private set internal var inlineTimeBarPlayedNotHighlightedColorId = -1L private set -internal var ytStaticBrandRedId = -1L - private set internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color" @@ -66,10 +64,6 @@ private val seekbarColorResourcePatch = resourcePatch { "color", "inline_time_bar_played_not_highlighted_color", ] - ytStaticBrandRedId = resourceMappings[ - "attr", - "ytStaticBrandRed", - ] // Modify the resume playback drawable and replace the progress bar with a custom drawable. document("res/drawable/resume_playback_progressbar_drawable.xml").use { document -> @@ -239,39 +233,38 @@ val seekbarColorPatch = bytecodePatch( // 19.25+ changes - playerSeekbarHandleColorFingerprint.method.apply { - val index = indexOfFirstLiteralInstructionOrThrow(ytStaticBrandRedId) - val insertIndex = indexOfFirstInstructionOrThrow(index, Opcode.MOVE_RESULT) - val register = getInstruction(insertIndex).registerA + playerSeekbarHandleColorFingerprint.let { + it.method.apply { + val insertIndex = it.instructionMatches.last().index + val register = getInstruction(insertIndex).registerA - addInstructions( - insertIndex + 1, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getSeekbarScrubHandleColor(I)I - move-result v$register - """ - ) + addInstructions( + insertIndex + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getSeekbarScrubHandleColor(I)I + move-result v$register + """ + ) + } } // If hiding feed seekbar thumbnails, then turn off the cairo gradient // of the watch history menu items as they use the same gradient as the // player and there is no easy way to distinguish which to use a transparent color. if (is_19_34_or_greater) { - watchHistoryMenuUseProgressDrawableFingerprint.method.apply { - val progressIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Landroid/widget/ProgressBar;" && reference.name == "setMax" + watchHistoryMenuUseProgressDrawableFingerprint.let { + it.method.apply { + val index = it.instructionMatches[1].index + val register = getInstruction(index).registerA + + addInstructions( + index + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->showWatchHistoryProgressDrawable(Z)Z + move-result v$register + """ + ) } - val index = indexOfFirstInstructionOrThrow(progressIndex, Opcode.MOVE_RESULT) - val register = getInstruction(index).registerA - - addInstructions( - index + 1, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->showWatchHistoryProgressDrawable(Z)Z - move-result v$register - """ - ) } } From d68b096d2c0afc613e7f4f72264fd354b3901ef8 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:43:12 +0200 Subject: [PATCH 33/64] refactor --- .../youtube/layout/seekbar/Fingerprints.kt | 13 ++-- .../layout/seekbar/SeekbarColorPatch.kt | 65 +++++-------------- 2 files changed, 21 insertions(+), 57 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index 26fa8bc303..1480c2fe7a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -20,24 +20,24 @@ internal val fullscreenSeekbarThumbnailsFingerprint by fingerprint { internal val playerSeekbarColorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - custom { method, _ -> - method.containsLiteralInstruction(inlineTimeBarColorizedBarPlayedColorDarkId) && - method.containsLiteralInstruction(inlineTimeBarPlayedNotHighlightedColorId) - } + instructions( + resourceLiteral("color", "inline_time_bar_played_not_highlighted_color"), + resourceLiteral("color", "inline_time_bar_colorized_bar_played_color_dark") + ) } internal val setSeekbarClickedColorFingerprint by fingerprint { opcodes(Opcode.CONST_HIGH16) strings("YOUTUBE", "PREROLL", "POSTROLL") custom { _, classDef -> - classDef.endsWith("ControlsOverlayStyle;") + classDef.endsWith("/ControlsOverlayStyle;") } } internal val shortsSeekbarColorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( - literal(reelTimeBarPlayedColorId) + resourceLiteral("color", "reel_time_bar_played_color") ) } @@ -46,7 +46,6 @@ internal val playerSeekbarHandleColorFingerprint by fingerprint { parameters("Landroid/content/Context;") instructions( resourceLiteral("attr", "ytStaticBrandRed"), - opcode(Opcode.MOVE_RESULT) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index 345f7a41f9..a321d96057 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -7,9 +7,7 @@ import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.layout.theme.lithoColorHookPatch import app.revanced.patches.youtube.layout.theme.lithoColorOverrideHook import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch @@ -18,13 +16,11 @@ import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint import app.revanced.util.copyXmlNode import app.revanced.util.findElementByAttributeValueOrThrow import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import app.revanced.util.inputStreamFromBundledResource import app.revanced.util.insertFeatureFlagBooleanOverride import com.android.tools.smali.dexlib2.Opcode @@ -35,36 +31,15 @@ import org.w3c.dom.Element import java.io.ByteArrayInputStream import kotlin.use -internal var reelTimeBarPlayedColorId = -1L - private set -internal var inlineTimeBarColorizedBarPlayedColorDarkId = -1L - private set -internal var inlineTimeBarPlayedNotHighlightedColorId = -1L - private set - -internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color" +private const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color" private val seekbarColorResourcePatch = resourcePatch { dependsOn( - settingsPatch, resourceMappingPatch, versionCheckPatch, ) execute { - reelTimeBarPlayedColorId = resourceMappings[ - "color", - "reel_time_bar_played_color", - ] - inlineTimeBarColorizedBarPlayedColorDarkId = resourceMappings[ - "color", - "inline_time_bar_colorized_bar_played_color_dark", - ] - inlineTimeBarPlayedNotHighlightedColorId = resourceMappings[ - "color", - "inline_time_bar_played_not_highlighted_color", - ] - // Modify the resume playback drawable and replace the progress bar with a custom drawable. document("res/drawable/resume_playback_progressbar_drawable.xml").use { document -> val layerList = document.getElementsByTagName("layer-list").item(0) as Element @@ -189,27 +164,28 @@ val seekbarColorPatch = bytecodePatch( ) execute { - fun MutableMethod.addColorChangeInstructions(resourceId: Long) { - val index = indexOfFirstLiteralInstructionOrThrow(resourceId) - val insertIndex = indexOfFirstInstructionOrThrow(index, Opcode.MOVE_RESULT) - val register = getInstruction(insertIndex).registerA + fun MutableMethod.addColorChangeInstructions(resourceIndex: Int) { + val moveResultIndex = indexOfFirstInstructionOrThrow(resourceIndex, Opcode.MOVE_RESULT) + val register = getInstruction(moveResultIndex).registerA addInstructions( - insertIndex + 1, + moveResultIndex + 1, """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->"getVideoPlayerSeekbarColor"(I)I + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getVideoPlayerSeekbarColor(I)I move-result v$register """ ) } - playerSeekbarColorFingerprint.method.apply { - addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId) - addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId) + playerSeekbarColorFingerprint.let { + it.method.apply { + addColorChangeInstructions(it.instructionMatches.last().index) + addColorChangeInstructions(it.instructionMatches.first().index) + } } - shortsSeekbarColorFingerprint.method.apply { - addColorChangeInstructions(reelTimeBarPlayedColorId) + shortsSeekbarColorFingerprint.let { + it.method.addColorChangeInstructions(it.instructionMatches.first().index) } setSeekbarClickedColorFingerprint.originalMethod.let { @@ -222,7 +198,7 @@ val seekbarColorPatch = bytecodePatch( """ invoke-static { v$colorRegister }, $EXTENSION_CLASS_DESCRIPTOR->getVideoPlayerSeekbarClickedColor(I)I move-result v$colorRegister - """, + """ ) } } @@ -236,18 +212,7 @@ val seekbarColorPatch = bytecodePatch( // 19.25+ changes playerSeekbarHandleColorFingerprint.let { - it.method.apply { - val insertIndex = it.instructionMatches.last().index - val register = getInstruction(insertIndex).registerA - - addInstructions( - insertIndex + 1, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getSeekbarScrubHandleColor(I)I - move-result v$register - """ - ) - } + it.method.addColorChangeInstructions(it.instructionMatches.last().index) } // If hiding feed seekbar thumbnails, then turn off the cairo gradient From 24daaacfce550ef9f1c65ab9fa5550b88201025b Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 25 Jan 2025 10:59:22 +0200 Subject: [PATCH 34/64] refactor: Simplify --- .../patches/youtube/video/hdr/DisableHdrPatch.kt | 12 ++---------- .../patches/youtube/video/hdr/Fingerprints.kt | 9 ++++++--- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt index 8e1eb7c96a..c8f0c46e6d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt @@ -8,9 +8,6 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisableHdrPatch;" @@ -49,14 +46,9 @@ val disableHdrPatch = bytecodePatch( hdrCapabilityFingerprint.let { it.originalMethod.apply { - val stringIndex = it.stringMatches!!.first().index - val navigateIndex = indexOfFirstInstructionOrThrow(stringIndex) { - val reference = getReference() - reference?.parameterTypes == listOf("I", "Landroid/view/Display;") && - reference.returnType == "Z" - } + val navigateIndex = it.instructionMatches.last().index - // Modify the HDR lookup method (Method is in the same class as the fingerprint). + // Modify the HDR lookup method (Method is in the same class as the fingerprint class). navigate(this).to(navigateIndex).stop().addInstructionsWithLabels( 0, """ diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/Fingerprints.kt index 57ecb9678c..1dc39914de 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/Fingerprints.kt @@ -1,12 +1,15 @@ package app.revanced.patches.youtube.video.hdr import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags internal val hdrCapabilityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - strings( - "av1_profile_main_10_hdr_10_plus_supported", - "video/av01" + instructions( + string("av1_profile_main_10_hdr_10_plus_supported"), + string("video/av01"), + methodCall(returnType = "Z", parameters = listOf("I", "Landroid/view/Display;")) ) } \ No newline at end of file From 9ca94795b5d3aab0c91c41b704dd1583fd276777 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 25 Jan 2025 11:13:57 +0200 Subject: [PATCH 35/64] refactor: Simplify --- .../youtube/patches/DownloadsPatch.java | 2 +- .../interaction/downloads/DownloadsPatch.kt | 12 +++---- .../swipecontrols/SwipeControlsPatch.kt | 4 +-- .../youtube/layout/seekbar/Fingerprints.kt | 21 ++++++++--- .../layout/seekbar/SeekbarColorPatch.kt | 36 ++++++++----------- .../patches/youtube/shared/Fingerprints.kt | 9 ----- 6 files changed, 40 insertions(+), 44 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java index 6da31b6a4c..bbe01ec89f 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java @@ -23,7 +23,7 @@ public final class DownloadsPatch { /** * Injection point. */ - public static void activityCreated(Activity mainActivity) { + public static void setMainActivity(Activity mainActivity) { activityRef = new WeakReference<>(mainActivity); } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt index a647e589c4..5dc8d38dfb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt @@ -14,7 +14,7 @@ import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.playercontrols.* import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.mainActivityFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint import app.revanced.patches.youtube.video.information.videoInformationPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources @@ -85,12 +85,10 @@ val downloadsPatch = bytecodePatch( injectVisibilityCheckCall(BUTTON_DESCRIPTOR) // Main activity is used to launch downloader intent. - mainActivityFingerprint.method.apply { - addInstruction( - implementation!!.instructions.lastIndex, - "invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->activityCreated(Landroid/app/Activity;)V", - ) - } + mainActivityOnCreateFingerprint.method.addInstruction( + 1, + "invoke-static/range { p0 .. p0 }, ${EXTENSION_CLASS_DESCRIPTOR}->setMainActivity(Landroid/app/Activity;)V", + ) offlineVideoEndpointFingerprint.method.apply { addInstructionsWithLabels( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt index 669bf609f4..d3b8c65bf8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt @@ -13,7 +13,7 @@ import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.mainActivityFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint import app.revanced.util.* import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.immutable.ImmutableMethod @@ -88,7 +88,7 @@ val swipeControlsPatch = bytecodePatch( execute { val wrapperClass = swipeControlsHostActivityFingerprint.classDef - val targetClass = mainActivityFingerprint.classDef + val targetClass = mainActivityOnCreateFingerprint.classDef // Inject the wrapper class from the extension into the class hierarchy of MainActivity. wrapperClass.setSuperClass(targetClass.superclass) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index 1480c2fe7a..a3a2d5c053 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -5,7 +5,6 @@ import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.opcode import app.revanced.patches.shared.misc.mapping.resourceLiteral -import app.revanced.util.containsLiteralInstruction import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -117,11 +116,25 @@ internal const val launchScreenLayoutTypeLotteFeatureFlag = 268507948L internal val launchScreenLayoutTypeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + instructions( + literal(launchScreenLayoutTypeLotteFeatureFlag) + ) custom { method, _ -> val firstParameter = method.parameterTypes.firstOrNull() // 19.25 - 19.45 - (firstParameter == "Lcom/google/android/apps/youtube/app/watchwhile/MainActivity;" - || firstParameter == "Landroid/app/Activity;") // 19.46+ - && method.containsLiteralInstruction(launchScreenLayoutTypeLotteFeatureFlag) + firstParameter == "Lcom/google/android/apps/youtube/app/watchwhile/MainActivity;" + || firstParameter == "Landroid/app/Activity;" // 19.46+ + } +} + +internal val mainActivityOnCreateSplashScreenImageViewFingerprint by fingerprint { + returns("V") + parameters("Landroid/os/Bundle;") + instructions( + methodCall(definingClass = "Landroid/widget/ImageView;", name = "getDrawable"), + opcode(Opcode.CHECK_CAST) + ) + custom { method, classDef -> + method.name == "onCreate" && classDef.endsWith("/MainActivity;") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index a321d96057..be52b63d43 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -16,17 +16,14 @@ import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint import app.revanced.util.copyXmlNode import app.revanced.util.findElementByAttributeValueOrThrow -import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.inputStreamFromBundledResource import app.revanced.util.insertFeatureFlagBooleanOverride import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference import org.w3c.dom.Element import java.io.ByteArrayInputStream import kotlin.use @@ -269,10 +266,24 @@ val seekbarColorPatch = bytecodePatch( // region apply seekbar custom color to splash screen animation. + // Hook the splash animation drawable to set the a seekbar color theme. + mainActivityOnCreateSplashScreenImageViewFingerprint.let { + it.method.apply { + val checkCastIndex = it.instructionMatches.last().index + val drawableRegister = getInstruction(checkCastIndex).registerA + + addInstruction( + checkCastIndex + 1, + "invoke-static { v$drawableRegister }, $EXTENSION_CLASS_DESCRIPTOR->" + + "setSplashAnimationDrawableTheme(Landroid/graphics/drawable/AnimatedVectorDrawable;)V" + ) + } + } + // Don't use the lotte splash screen layout if using custom seekbar. arrayOf( launchScreenLayoutTypeFingerprint, - mainActivityOnCreateFingerprint + mainActivityOnCreateSplashScreenImageViewFingerprint ).forEach { fingerprint -> fingerprint.method.insertFeatureFlagBooleanOverride( launchScreenLayoutTypeLotteFeatureFlag, @@ -280,23 +291,6 @@ val seekbarColorPatch = bytecodePatch( ) } - // Hook the splash animation drawable to set the a seekbar color theme. - mainActivityOnCreateFingerprint.method.apply { - val drawableIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Landroid/widget/ImageView;" - && reference.name == "getDrawable" - } - val checkCastIndex = indexOfFirstInstructionOrThrow(drawableIndex, Opcode.CHECK_CAST) - val drawableRegister = getInstruction(checkCastIndex).registerA - - addInstruction( - checkCastIndex + 1, - "invoke-static { v$drawableRegister }, $EXTENSION_CLASS_DESCRIPTOR->" + - "setSplashAnimationDrawableTheme(Landroid/graphics/drawable/AnimatedVectorDrawable;)V" - ) - } - // endregion } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index 048ebfde16..8ad68500b8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -36,15 +36,6 @@ internal val layoutConstructorFingerprint by fingerprint { ) } -internal val mainActivityFingerprint by fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters() - custom { _, classDef -> - // Old versions of YouTube called this class "WatchWhileActivity" instead. - classDef.endsWith("MainActivity;") || classDef.endsWith("WatchWhileActivity;") - } -} - internal val mainActivityOnCreateFingerprint by fingerprint { returns("V") parameters("Landroid/os/Bundle;") From d55cb5db03a164f79b102b146e3ad9f0730b2f10 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 27 Jan 2025 11:57:34 +0200 Subject: [PATCH 36/64] Add debugging code --- .../youtube/layout/seekbar/Fingerprints.kt | 4 +- .../layout/seekbar/SeekbarColorPatch.kt | 41 ++++++++++++++----- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index a3a2d5c053..0e00c3ad89 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.layout.seekbar +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint import app.revanced.patcher.literal import app.revanced.patcher.methodCall @@ -132,7 +133,8 @@ internal val mainActivityOnCreateSplashScreenImageViewFingerprint by fingerprint parameters("Landroid/os/Bundle;") instructions( methodCall(definingClass = "Landroid/widget/ImageView;", name = "getDrawable"), - opcode(Opcode.CHECK_CAST) + opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 0), + checkCast("Landroid/graphics/drawable/AnimatedVectorDrawable;", maxInstructionsBefore = 0) ) custom { method, classDef -> method.name == "onCreate" && classDef.endsWith("/MainActivity;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index be52b63d43..8d0e060d76 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -16,14 +16,18 @@ import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch +import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint import app.revanced.util.copyXmlNode import app.revanced.util.findElementByAttributeValueOrThrow +import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.inputStreamFromBundledResource import app.revanced.util.insertFeatureFlagBooleanOverride import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference import org.w3c.dom.Element import java.io.ByteArrayInputStream import kotlin.use @@ -266,10 +270,36 @@ val seekbarColorPatch = bytecodePatch( // region apply seekbar custom color to splash screen animation. + // Don't use the lotte splash screen layout if using custom seekbar. + arrayOf( + launchScreenLayoutTypeFingerprint, + mainActivityOnCreateFingerprint + ).forEach { fingerprint -> + fingerprint.method.insertFeatureFlagBooleanOverride( + launchScreenLayoutTypeLotteFeatureFlag, + "$EXTENSION_CLASS_DESCRIPTOR->useLotteLaunchSplashScreen(Z)Z" + ) + } + + + // FIXME DEBUG CODE: + mainActivityOnCreateSplashScreenImageViewFingerprint.method.apply { + val drawableIndex = indexOfFirstInstructionOrThrow { + val reference = getReference() + reference?.definingClass == "Landroid/widget/ImageView;" + && reference.name == "getDrawable" + } + val checkCastIndex = indexOfFirstInstructionOrThrow(drawableIndex, Opcode.CHECK_CAST) + println("correct cast index: $checkCastIndex") + } + // Hook the splash animation drawable to set the a seekbar color theme. mainActivityOnCreateSplashScreenImageViewFingerprint.let { it.method.apply { val checkCastIndex = it.instructionMatches.last().index + /* FIXME: DEBUG CODE */println("fingerprint cast index: $checkCastIndex instruction:" + + getInstruction(checkCastIndex).reference) + val drawableRegister = getInstruction(checkCastIndex).registerA addInstruction( @@ -280,17 +310,6 @@ val seekbarColorPatch = bytecodePatch( } } - // Don't use the lotte splash screen layout if using custom seekbar. - arrayOf( - launchScreenLayoutTypeFingerprint, - mainActivityOnCreateSplashScreenImageViewFingerprint - ).forEach { fingerprint -> - fingerprint.method.insertFeatureFlagBooleanOverride( - launchScreenLayoutTypeLotteFeatureFlag, - "$EXTENSION_CLASS_DESCRIPTOR->useLotteLaunchSplashScreen(Z)Z" - ) - } - // endregion } } From e4c298e1494bf2e274edab38618b2478618c1b0f Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 27 Jan 2025 12:12:09 +0200 Subject: [PATCH 37/64] Revert "Add debugging code" This reverts commit d55cb5db03a164f79b102b146e3ad9f0730b2f10. --- .../youtube/layout/seekbar/Fingerprints.kt | 4 +- .../layout/seekbar/SeekbarColorPatch.kt | 41 +++++-------------- 2 files changed, 12 insertions(+), 33 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index 0e00c3ad89..a3a2d5c053 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.layout.seekbar -import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint import app.revanced.patcher.literal import app.revanced.patcher.methodCall @@ -133,8 +132,7 @@ internal val mainActivityOnCreateSplashScreenImageViewFingerprint by fingerprint parameters("Landroid/os/Bundle;") instructions( methodCall(definingClass = "Landroid/widget/ImageView;", name = "getDrawable"), - opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 0), - checkCast("Landroid/graphics/drawable/AnimatedVectorDrawable;", maxInstructionsBefore = 0) + opcode(Opcode.CHECK_CAST) ) custom { method, classDef -> method.name == "onCreate" && classDef.endsWith("/MainActivity;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index 8d0e060d76..be52b63d43 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -16,18 +16,14 @@ import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint import app.revanced.util.copyXmlNode import app.revanced.util.findElementByAttributeValueOrThrow -import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.inputStreamFromBundledResource import app.revanced.util.insertFeatureFlagBooleanOverride import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference import org.w3c.dom.Element import java.io.ByteArrayInputStream import kotlin.use @@ -270,36 +266,10 @@ val seekbarColorPatch = bytecodePatch( // region apply seekbar custom color to splash screen animation. - // Don't use the lotte splash screen layout if using custom seekbar. - arrayOf( - launchScreenLayoutTypeFingerprint, - mainActivityOnCreateFingerprint - ).forEach { fingerprint -> - fingerprint.method.insertFeatureFlagBooleanOverride( - launchScreenLayoutTypeLotteFeatureFlag, - "$EXTENSION_CLASS_DESCRIPTOR->useLotteLaunchSplashScreen(Z)Z" - ) - } - - - // FIXME DEBUG CODE: - mainActivityOnCreateSplashScreenImageViewFingerprint.method.apply { - val drawableIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Landroid/widget/ImageView;" - && reference.name == "getDrawable" - } - val checkCastIndex = indexOfFirstInstructionOrThrow(drawableIndex, Opcode.CHECK_CAST) - println("correct cast index: $checkCastIndex") - } - // Hook the splash animation drawable to set the a seekbar color theme. mainActivityOnCreateSplashScreenImageViewFingerprint.let { it.method.apply { val checkCastIndex = it.instructionMatches.last().index - /* FIXME: DEBUG CODE */println("fingerprint cast index: $checkCastIndex instruction:" - + getInstruction(checkCastIndex).reference) - val drawableRegister = getInstruction(checkCastIndex).registerA addInstruction( @@ -310,6 +280,17 @@ val seekbarColorPatch = bytecodePatch( } } + // Don't use the lotte splash screen layout if using custom seekbar. + arrayOf( + launchScreenLayoutTypeFingerprint, + mainActivityOnCreateSplashScreenImageViewFingerprint + ).forEach { fingerprint -> + fingerprint.method.insertFeatureFlagBooleanOverride( + launchScreenLayoutTypeLotteFeatureFlag, + "$EXTENSION_CLASS_DESCRIPTOR->useLotteLaunchSplashScreen(Z)Z" + ) + } + // endregion } } From 6acbf3490836b43bb9fe615ff3b73c95ba07623a Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 28 Jan 2025 10:55:58 +0200 Subject: [PATCH 38/64] refactor: Remove ClassProxy wrapper that's no longer needed --- .../all/misc/transformation/TransformInstructionsPatch.kt | 2 +- .../revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt | 2 +- .../revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt | 2 +- .../app/revanced/patches/twitch/ad/shared/util/AdPatch.kt | 2 +- .../revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt | 4 ++-- .../app/revanced/patches/youtube/ad/general/HideAdsPatch.kt | 1 - .../patches/youtube/misc/litho/filter/LithoFilterPatch.kt | 2 +- .../patches/youtube/video/audio/ForceOriginalAudioPatch.kt | 2 +- .../youtube/video/information/VideoInformationPatch.kt | 2 +- patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt | 4 ++-- 10 files changed, 11 insertions(+), 12 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt index 6564f4f26a..4fc994786a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt @@ -36,7 +36,7 @@ fun transformInstructionsPatch( } }.forEach { (classDef, methods) -> // And finally transform the methods... - val mutableClass = proxy(classDef).mutableClass + val mutableClass = proxy(classDef) methods.map(mutableClass::findMutableMethodOf).forEach methods@{ mutableMethod -> val patchIndices = findPatchIndices(mutableClass, mutableMethod)?.toCollection(ArrayDeque()) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index 34647b3c59..d927c036a6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -79,7 +79,7 @@ fun gmsCoreSupportPatch( execute { fun transformStringReferences(transform: (str: String) -> String?) = classes.forEach { val mutableClass by lazy { - proxy(it).mutableClass + proxy(it) } it.methods.forEach classLoop@{ method -> diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt index 40a45650de..b1fa34005d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt @@ -69,7 +69,7 @@ val spoofSimPatch = bytecodePatch( } } }.forEach { (classDef, methods) -> - with(proxy(classDef).mutableClass) { + with(proxy(classDef)) { methods.forEach { (method, patches) -> with(findMutableMethodOf(method)) { while (!patches.isEmpty()) { diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt index 48ecefba8e..f04c730e9c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt @@ -29,7 +29,7 @@ fun adPatch( classDefType: String, methodNames: Set, returnMethod: ReturnMethod, - ) = with(classBy { classDefType == it.type }?.mutableClass) { + ) = with(classBy { classDefType == it.type }) { this ?: return false methods.filter { it.name in methodNames }.forEach { diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt index b350a548db..e26487732b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt @@ -52,7 +52,7 @@ val jsonHookPatch = bytecodePatch( val jsonHookPatch = classBy { classDef -> classDef.type == JSON_HOOK_PATCH_CLASS_DESCRIPTOR } ?: throw PatchException("Could not find the extension.") - matchOrNull(jsonHookPatch.immutableClass) + matchOrNull(jsonHookPatch) ?: throw PatchException("Unexpected extension.") } @@ -100,7 +100,7 @@ class JsonHook( init { classBy { it.type == descriptor }?.let { - it.mutableClass.also { classDef -> + it.also { classDef -> if ( classDef.superclass != JSON_HOOK_CLASS_DESCRIPTOR || !classDef.fields.any { field -> field.name == "INSTANCE" } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt index 14e5aa3b60..da6087b90d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt @@ -105,7 +105,6 @@ val hideAdsPatch = bytecodePatch( // Hide the view val viewRegister = (this as Instruction35c).registerC proxy(classDef) - .mutableClass .findMutableMethodOf(method) .injectHideViewCall( insertIndex, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt index 16a8340830..42ac2e0d13 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt @@ -128,7 +128,7 @@ val lithoFilterPatch = bytecodePatch( // Only one field. val emptyComponentField = classBy { classDef -> builderMethodDescriptor.returnType == classDef.type - }!!.immutableClass.fields.single() + }!!.fields.single() // Returns an empty component instead of the original component. fun createReturnEmptyComponentInstructions(register: Int): String = diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt index 80b91f139f..6fc76c4c37 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt @@ -83,7 +83,7 @@ val forceOriginalAudioPatch = bytecodePatch( val audioTrackDisplayNameMethod = audioStreamingTypeSelector.originalMethod.firstFormatStreamingModelCall() val formatStreamModelClass = proxy(classes.first { it.type == audioTrackIdMethod.definingClass - }).mutableClass + }) formatStreamModelClass.apply { // Add a new field to store the override. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index b70904d2a4..6710e7b7ca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -187,7 +187,7 @@ val videoInformationPatch = bytecodePatch( setPlaybackSpeedMethod = proxy(classes.first { it.type == setPlaybackSpeedMethodReference.definingClass }) - .mutableClass.methods.first { it.name == setPlaybackSpeedMethodReference.name } + .methods.first { it.name == setPlaybackSpeedMethodReference.name } setPlaybackSpeedMethodIndex = 0 } diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index 20632aeb51..36e8d44f57 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -192,7 +192,7 @@ fun BytecodePatchContext.traverseClassHierarchy(targetClass: MutableClass, callb targetClass.superclass ?: return - classBy { targetClass.superclass == it.type }?.mutableClass?.let { + classBy { targetClass.superclass == it.type }?.let { traverseClassHierarchy(it, callback) } } @@ -434,7 +434,7 @@ fun BytecodePatchContext.forEachLiteralValueInstruction( if (instruction.opcode == Opcode.CONST && (instruction as WideLiteralInstruction).wideLiteral == literal ) { - val mutableMethod = proxy(classDef).mutableClass.findMutableMethodOf(method) + val mutableMethod = proxy(classDef).findMutableMethodOf(method) block.invoke(mutableMethod, index) } } From d15183955d2d46786f212fd49e8aa2ea40f1c07a Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 28 Jan 2025 12:38:47 +0200 Subject: [PATCH 39/64] refactor --- .../all/misc/transformation/TransformInstructionsPatch.kt | 2 +- .../patches/shared/misc/extension/SharedExtensionPatch.kt | 2 +- .../patches/shared/misc/gms/GmsCoreSupportPatch.kt | 2 +- .../patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt | 2 +- .../app/revanced/patches/twitch/ad/shared/util/AdPatch.kt | 4 +--- .../patches/twitter/misc/hook/json/JsonHookPatch.kt | 8 ++++---- .../revanced/patches/youtube/ad/general/HideAdsPatch.kt | 2 +- .../patches/youtube/misc/litho/filter/LithoFilterPatch.kt | 2 +- .../youtube/video/audio/ForceOriginalAudioPatch.kt | 4 +--- .../youtube/video/information/VideoInformationPatch.kt | 2 +- .../youtube/video/quality/RememberVideoQualityPatch.kt | 3 +-- .../src/main/kotlin/app/revanced/util/BytecodeUtils.kt | 4 ++-- 12 files changed, 16 insertions(+), 21 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt index 4fc994786a..8e694f103a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt @@ -36,7 +36,7 @@ fun transformInstructionsPatch( } }.forEach { (classDef, methods) -> // And finally transform the methods... - val mutableClass = proxy(classDef) + val mutableClass = mutableClassBy(classDef) methods.map(mutableClass::findMutableMethodOf).forEach methods@{ mutableMethod -> val patchIndices = findPatchIndices(mutableClass, mutableMethod)?.toCollection(ArrayDeque()) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt index 16640edaca..93166f693a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt @@ -39,7 +39,7 @@ fun sharedExtensionPatch( extendWith("extensions/shared.rve") execute { - if (classes.none { EXTENSION_CLASS_DESCRIPTOR == it.type }) { + if (classes.classBy(EXTENSION_CLASS_DESCRIPTOR) == null) { throw PatchException( "Shared extension has not been merged yet. This patch can not succeed without merging it.", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index d927c036a6..8761677497 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -79,7 +79,7 @@ fun gmsCoreSupportPatch( execute { fun transformStringReferences(transform: (str: String) -> String?) = classes.forEach { val mutableClass by lazy { - proxy(it) + mutableClassBy(it) } it.methods.forEach classLoop@{ method -> diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt index b1fa34005d..b069b88f55 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt @@ -69,7 +69,7 @@ val spoofSimPatch = bytecodePatch( } } }.forEach { (classDef, methods) -> - with(proxy(classDef)) { + with(mutableClassBy(classDef)) { methods.forEach { (method, patches) -> with(findMutableMethodOf(method)) { while (!patches.isEmpty()) { diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt index f04c730e9c..089f7dc0ab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt @@ -29,9 +29,7 @@ fun adPatch( classDefType: String, methodNames: Set, returnMethod: ReturnMethod, - ) = with(classBy { classDefType == it.type }) { - this ?: return false - + ) = with(mutableClassBy(classDefType)) { methods.filter { it.name in methodNames }.forEach { val retInstruction = when (returnMethod.returnType) { 'V' -> "return-void" diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt index e26487732b..4e9eff908d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt @@ -49,7 +49,7 @@ val jsonHookPatch = bytecodePatch( execute { jsonHookPatchFingerprint.apply { // Make sure the extension is present. - val jsonHookPatch = classBy { classDef -> classDef.type == JSON_HOOK_PATCH_CLASS_DESCRIPTOR } + val jsonHookPatch = classBy(JSON_HOOK_PATCH_CLASS_DESCRIPTOR) ?: throw PatchException("Could not find the extension.") matchOrNull(jsonHookPatch) @@ -61,7 +61,7 @@ val jsonHookPatch = bytecodePatch( .fields .firstOrNull { it.name == "JSON_FACTORY" } ?.type - .let { type -> classes.find { it.type == type } } + ?.let { type -> classes.classBy(type) } ?: throw PatchException("Could not find required class.") // Hook the methods first parameter. @@ -99,7 +99,7 @@ class JsonHook( internal var added = false init { - classBy { it.type == descriptor }?.let { + mutableClassBy(descriptor).let { it.also { classDef -> if ( classDef.superclass != JSON_HOOK_CLASS_DESCRIPTOR || @@ -108,6 +108,6 @@ class JsonHook( throw InvalidClassException(classDef.type, "Not a hook class") } } - } ?: throw ClassNotFoundException("Failed to find hook class $descriptor") + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt index da6087b90d..20be36f247 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt @@ -104,7 +104,7 @@ val hideAdsPatch = bytecodePatch( // Hide the view val viewRegister = (this as Instruction35c).registerC - proxy(classDef) + mutableClassBy(classDef) .findMutableMethodOf(method) .injectHideViewCall( insertIndex, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt index 42ac2e0d13..7e59b5160d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt @@ -126,7 +126,7 @@ val lithoFilterPatch = bytecodePatch( AccessFlags.STATIC.isSet(method.accessFlags) } // Only one field. - val emptyComponentField = classBy { classDef -> + val emptyComponentField = mutableClassBy { classDef -> builderMethodDescriptor.returnType == classDef.type }!!.fields.single() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt index 6fc76c4c37..ac0db79beb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt @@ -81,9 +81,7 @@ val forceOriginalAudioPatch = bytecodePatch( val isDefaultMethod = streamingModelBuilderFingerprint.originalMethod.firstFormatStreamingModelCall("Z") val audioTrackIdMethod = menuItemAudioTrackFingerprint.originalMethod.firstFormatStreamingModelCall() val audioTrackDisplayNameMethod = audioStreamingTypeSelector.originalMethod.firstFormatStreamingModelCall() - val formatStreamModelClass = proxy(classes.first { - it.type == audioTrackIdMethod.definingClass - }) + val formatStreamModelClass = mutableClassBy(audioTrackIdMethod.definingClass) formatStreamModelClass.apply { // Add a new field to store the override. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index 6710e7b7ca..0a586e7235 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -186,7 +186,7 @@ val videoInformationPatch = bytecodePatch( getInstruction(indexOfFirstInstructionOrThrow(Opcode.IF_EQZ) - 1).reference as FieldReference setPlaybackSpeedMethod = - proxy(classes.first { it.type == setPlaybackSpeedMethodReference.definingClass }) + mutableClassBy(setPlaybackSpeedMethodReference.definingClass) .methods.first { it.name == setPlaybackSpeedMethodReference.name } setPlaybackSpeedMethodIndex = 0 } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index 129b258eee..24cc75dabd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -90,8 +90,7 @@ val rememberVideoQualityPatch = bytecodePatch( val setQualityByIndexMethodClassFieldReference = getSetQualityByIndexMethodClassFieldReference as FieldReference - val setQualityByIndexMethodClass = classes - .find { classDef -> classDef.type == setQualityByIndexMethodClassFieldReference.type }!! + val setQualityByIndexMethodClass = classBy(setQualityByIndexMethodClassFieldReference.type)!! // Get the name of the setQualityByIndex method. val setQualityByIndexMethod = setQualityByIndexMethodClass.methods diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index 36e8d44f57..1355265eeb 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -192,7 +192,7 @@ fun BytecodePatchContext.traverseClassHierarchy(targetClass: MutableClass, callb targetClass.superclass ?: return - classBy { targetClass.superclass == it.type }?.let { + mutableClassBy { targetClass.superclass == it.type }?.let { traverseClassHierarchy(it, callback) } } @@ -434,7 +434,7 @@ fun BytecodePatchContext.forEachLiteralValueInstruction( if (instruction.opcode == Opcode.CONST && (instruction as WideLiteralInstruction).wideLiteral == literal ) { - val mutableMethod = proxy(classDef).findMutableMethodOf(method) + val mutableMethod = mutableClassBy(classDef).findMutableMethodOf(method) block.invoke(mutableMethod, index) } } From d9679c0de6c4df43c3fb093251da4fa66a11e49f Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 28 Jan 2025 15:47:45 +0200 Subject: [PATCH 40/64] refactor --- .../patches/shared/misc/extension/SharedExtensionPatch.kt | 8 ++------ .../patches/twitter/misc/hook/json/JsonHookPatch.kt | 2 -- .../patches/youtube/misc/litho/filter/LithoFilterPatch.kt | 4 +--- .../youtube/video/quality/RememberVideoQualityPatch.kt | 5 ++--- .../src/main/kotlin/app/revanced/util/BytecodeUtils.kt | 2 +- 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt index 93166f693a..45acf6cc01 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt @@ -5,7 +5,6 @@ import app.revanced.patcher.FingerprintBuilder import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import com.android.tools.smali.dexlib2.iface.Method import java.net.URLDecoder @@ -39,11 +38,8 @@ fun sharedExtensionPatch( extendWith("extensions/shared.rve") execute { - if (classes.classBy(EXTENSION_CLASS_DESCRIPTOR) == null) { - throw PatchException( - "Shared extension has not been merged yet. This patch can not succeed without merging it.", - ) - } + // Verify the extension class exists. + classBy(EXTENSION_CLASS_DESCRIPTOR) hooks.forEach { hook -> hook(EXTENSION_CLASS_DESCRIPTOR) } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt index 4e9eff908d..d3e95102fa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt @@ -48,9 +48,7 @@ val jsonHookPatch = bytecodePatch( execute { jsonHookPatchFingerprint.apply { - // Make sure the extension is present. val jsonHookPatch = classBy(JSON_HOOK_PATCH_CLASS_DESCRIPTOR) - ?: throw PatchException("Could not find the extension.") matchOrNull(jsonHookPatch) ?: throw PatchException("Unexpected extension.") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt index 7e59b5160d..522abc4fed 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt @@ -126,9 +126,7 @@ val lithoFilterPatch = bytecodePatch( AccessFlags.STATIC.isSet(method.accessFlags) } // Only one field. - val emptyComponentField = mutableClassBy { classDef -> - builderMethodDescriptor.returnType == classDef.type - }!!.fields.single() + val emptyComponentField = classBy(builderMethodDescriptor.returnType).fields.single() // Returns an empty component instead of the original component. fun createReturnEmptyComponentInstructions(register: Int): String = diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index 24cc75dabd..bdb6aa318d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -90,10 +90,9 @@ val rememberVideoQualityPatch = bytecodePatch( val setQualityByIndexMethodClassFieldReference = getSetQualityByIndexMethodClassFieldReference as FieldReference - val setQualityByIndexMethodClass = classBy(setQualityByIndexMethodClassFieldReference.type)!! - // Get the name of the setQualityByIndex method. - val setQualityByIndexMethod = setQualityByIndexMethodClass.methods + val setQualityByIndexMethod = classBy(setQualityByIndexMethodClassFieldReference.type) + .methods .find { method -> method.parameterTypes.first() == "I" } ?: throw PatchException("Could not find setQualityByIndex method") diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index 1355265eeb..e4828b8b76 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -192,7 +192,7 @@ fun BytecodePatchContext.traverseClassHierarchy(targetClass: MutableClass, callb targetClass.superclass ?: return - mutableClassBy { targetClass.superclass == it.type }?.let { + mutableClassByOrNull(targetClass.superclass!!)?.let { traverseClassHierarchy(it, callback) } } From 6ff335936db007cb54813fa0143a9a360c234c14 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 29 Jan 2025 10:42:12 +0200 Subject: [PATCH 41/64] fix a/b seekbar color --- .../patches/youtube/layout/seekbar/Fingerprints.kt | 12 +++++++++++- .../youtube/layout/seekbar/SeekbarColorPatch.kt | 5 ++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index a3a2d5c053..d256d2f189 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -40,10 +40,20 @@ internal val shortsSeekbarColorFingerprint by fingerprint { ) } -internal val playerSeekbarHandleColorFingerprint by fingerprint { +internal val playerSeekbarHandle1ColorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Landroid/content/Context;") instructions( + resourceLiteral("attr", "ytTextSecondary"), + resourceLiteral("attr", "ytStaticBrandRed"), + ) +} + +internal val playerSeekbarHandle2ColorFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + parameters("Landroid/content/Context;") + instructions( + resourceLiteral("color", "inline_time_bar_live_seekable_range"), resourceLiteral("attr", "ytStaticBrandRed"), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index be52b63d43..fae8dc6200 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -208,7 +208,10 @@ val seekbarColorPatch = bytecodePatch( // 19.25+ changes - playerSeekbarHandleColorFingerprint.let { + arrayOf( + playerSeekbarHandle1ColorFingerprint, + playerSeekbarHandle2ColorFingerprint + ).forEach { it.method.addColorChangeInstructions(it.instructionMatches.last().index) } From a3339b4664db519a50b9aceb7f7c23bf224d9b35 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:15:12 +0200 Subject: [PATCH 42/64] add Miniplayer Modern 4, fix visual glitch if horizontal drag is enabled --- .../youtube/patches/MiniplayerPatch.java | 49 ++++++++++++------- .../youtube/patches/VersionCheckPatch.java | 1 - .../youtube/layout/miniplayer/Fingerprints.kt | 1 + .../layout/miniplayer/MiniplayerPatch.kt | 28 ++++++++--- .../resources/addresources/values/arrays.xml | 25 ++++++++-- .../resources/addresources/values/strings.xml | 1 + 6 files changed, 76 insertions(+), 29 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java index 42264ce372..6155001ccd 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java @@ -43,10 +43,13 @@ public enum MiniplayerType { MODERN_2(null, 2), MODERN_3(null, 3), /** - * Half broken miniplayer, that might be work in progress or left over abandoned code. - * Can force this type by editing the import/export settings. + * Works and is functional with 20.03+ */ - MODERN_4(null, 4); + MODERN_4(null, 4), + /** + * Half broken miniplayer, and in 20.02 and earlier is declared as type 4. + */ + MODERN_5(null, 5); /** * Legacy tablet hook value. @@ -139,7 +142,7 @@ public boolean isModern() { && (VersionCheckPatch.IS_19_34_OR_GREATER || Settings.MINIPLAYER_HIDE_REWIND_FORWARD.get()); private static final boolean MINIPLAYER_ROUNDED_CORNERS_ENABLED = - Settings.MINIPLAYER_ROUNDED_CORNERS.get(); + CURRENT_TYPE.isModern() && Settings.MINIPLAYER_ROUNDED_CORNERS.get(); private static final boolean MINIPLAYER_HORIZONTAL_DRAG_ENABLED = DRAG_AND_DROP_ENABLED && Settings.MINIPLAYER_HORIZONTAL_DRAG.get(); @@ -176,7 +179,8 @@ public static final class MiniplayerHideExpandCloseAvailability implements Setti @Override public boolean isAvailable() { MiniplayerType type = Settings.MINIPLAYER_TYPE.get(); - return (!IS_19_20_OR_GREATER && (type == MODERN_1 || type == MODERN_3)) + return type == MODERN_4 + || (!IS_19_20_OR_GREATER && (type == MODERN_1 || type == MODERN_3)) || (!IS_19_26_OR_GREATER && type == MODERN_1 && !Settings.MINIPLAYER_DOUBLE_TAP_ACTION.get() && !Settings.MINIPLAYER_DRAG_AND_DROP.get()) || (IS_19_29_OR_GREATER && type == MODERN_3); @@ -251,7 +255,7 @@ public static boolean getModernFeatureFlagsActiveOverride(boolean original) { /** * Injection point. */ - public static boolean enableMiniplayerDoubleTapAction(boolean original) { + public static boolean getMiniplayerDoubleTapAction(boolean original) { if (CURRENT_TYPE == DEFAULT) { return original; } @@ -262,7 +266,7 @@ public static boolean enableMiniplayerDoubleTapAction(boolean original) { /** * Injection point. */ - public static boolean enableMiniplayerDragAndDrop(boolean original) { + public static boolean getMiniplayerDragAndDrop(boolean original) { if (CURRENT_TYPE == DEFAULT) { return original; } @@ -270,36 +274,47 @@ public static boolean enableMiniplayerDragAndDrop(boolean original) { return DRAG_AND_DROP_ENABLED; } + /** + * Injection point. + */ + public static boolean getRoundedCorners(boolean original) { + if (CURRENT_TYPE == DEFAULT) { + return original; + } + + return MINIPLAYER_ROUNDED_CORNERS_ENABLED; + } /** * Injection point. */ - public static boolean setRoundedCorners(boolean original) { - if (CURRENT_TYPE.isModern()) { - return MINIPLAYER_ROUNDED_CORNERS_ENABLED; + public static boolean getHorizontalDrag(boolean original) { + if (CURRENT_TYPE == DEFAULT) { + return original; } - return original; + return MINIPLAYER_HORIZONTAL_DRAG_ENABLED; } /** * Injection point. */ - public static int setMiniplayerDefaultSize(int original) { - if (CURRENT_TYPE.isModern()) { - return MINIPLAYER_SIZE; + public static boolean getMaximizeAnimation(boolean original) { + // This must be forced on if horizontal drag is enabled, + // otherwise the UI has visual glitches when maximizing the miniplayer. + if (MINIPLAYER_HORIZONTAL_DRAG_ENABLED) { + return true; } return original; } - /** * Injection point. */ - public static boolean setHorizontalDrag(boolean original) { + public static int getMiniplayerDefaultSize(int original) { if (CURRENT_TYPE.isModern()) { - return MINIPLAYER_HORIZONTAL_DRAG_ENABLED; + return MINIPLAYER_SIZE; } return original; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java index c825b88d3d..74f082bf4c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java @@ -9,5 +9,4 @@ public class VersionCheckPatch { public static final boolean IS_19_26_OR_GREATER = Utils.getAppVersionName().compareTo("19.26.00") >= 0; public static final boolean IS_19_29_OR_GREATER = Utils.getAppVersionName().compareTo("19.29.00") >= 0; public static final boolean IS_19_34_OR_GREATER = Utils.getAppVersionName().compareTo("19.34.00") >= 0; - public static final boolean IS_19_46_OR_GREATER = Utils.getAppVersionName().compareTo("19.46.00") >= 0; } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 5b8028b226..3c18dedf4c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -51,6 +51,7 @@ internal const val MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY = 45658112L internal const val MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY = 45652224L internal const val MINIPLAYER_INITIAL_SIZE_FEATURE_KEY = 45640023L internal const val MINIPLAYER_DISABLED_FEATURE_KEY = 45657015L +internal const val MINIPLAYER_ANIMATED_EXPAND_FEATURE_KEY = 45644360L internal val miniplayerModernConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 2ef8586c8d..b38a57bc0a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -119,17 +119,24 @@ val miniplayerPatch = bytecodePatch( preferences += - if (is_19_43_or_greater) { + if (is_20_03_or_greater) { ListPreference( "revanced_miniplayer_type", summaryKey = null, ) + } else if (is_19_43_or_greater) { + ListPreference( + "revanced_miniplayer_type", + summaryKey = null, + entriesKey = "revanced_miniplayer_type_legacy_19_43_entries", + entryValuesKey = "revanced_miniplayer_type_legacy_19_43_entry_values", + ) } else { ListPreference( "revanced_miniplayer_type", summaryKey = null, - entriesKey = "revanced_miniplayer_type_legacy_entries", - entryValuesKey = "revanced_miniplayer_type_legacy_entry_values", + entriesKey = "revanced_miniplayer_type_legacy_19_16_entries", + entryValuesKey = "revanced_miniplayer_type_legacy_19_16_entry_values", ) } @@ -289,7 +296,7 @@ val miniplayerPatch = bytecodePatch( if (is_19_23_or_greater) { miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_DRAG_DROP_FEATURE_KEY, - "enableMiniplayerDragAndDrop", + "getMiniplayerDragAndDrop", ) } @@ -306,7 +313,7 @@ val miniplayerPatch = bytecodePatch( miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_DOUBLE_TAP_FEATURE_KEY, - "enableMiniplayerDoubleTapAction", + "getMiniplayerDoubleTapAction", ) } @@ -321,7 +328,7 @@ val miniplayerPatch = bytecodePatch( addInstructions( targetIndex + 1, """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setMiniplayerDefaultSize(I)I + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getMiniplayerDefaultSize(I)I move-result v$register """, ) @@ -344,7 +351,7 @@ val miniplayerPatch = bytecodePatch( if (is_19_36_or_greater) { miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY, - "setRoundedCorners", + "getRoundedCorners", ) } @@ -356,7 +363,12 @@ val miniplayerPatch = bytecodePatch( miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY, - "setHorizontalDrag", + "getHorizontalDrag", + ) + + miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + MINIPLAYER_ANIMATED_EXPAND_FEATURE_KEY, + "getMaximizeAnimation", ) } diff --git a/patches/src/main/resources/addresources/values/arrays.xml b/patches/src/main/resources/addresources/values/arrays.xml index b9a949d305..9132b1644a 100644 --- a/patches/src/main/resources/addresources/values/arrays.xml +++ b/patches/src/main/resources/addresources/values/arrays.xml @@ -191,6 +191,7 @@ @string/revanced_miniplayer_type_entry_4 @string/revanced_miniplayer_type_entry_5 @string/revanced_miniplayer_type_entry_6 + @string/revanced_miniplayer_type_entry_7 @@ -201,8 +202,10 @@ MODERN_1 MODERN_2 MODERN_3 + MODERN_4 - + + @string/revanced_miniplayer_type_entry_0 @string/revanced_miniplayer_type_entry_1 @string/revanced_miniplayer_type_entry_2 @string/revanced_miniplayer_type_entry_3 @@ -210,8 +213,24 @@ @string/revanced_miniplayer_type_entry_5 @string/revanced_miniplayer_type_entry_6 - - + + DISABLED + DEFAULT + MINIMAL + TABLET + MODERN_1 + MODERN_2 + MODERN_3 + + + @string/revanced_miniplayer_type_entry_1 + @string/revanced_miniplayer_type_entry_2 + @string/revanced_miniplayer_type_entry_3 + @string/revanced_miniplayer_type_entry_4 + @string/revanced_miniplayer_type_entry_5 + @string/revanced_miniplayer_type_entry_6 + + DEFAULT MINIMAL TABLET diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index ed53a0d5a1..0d381c9c04 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -1174,6 +1174,7 @@ If later turned off, it is recommended to clear the app data to prevent UI bugs. Modern 1 Modern 2 Modern 3 + Modern 4 Enable rounded corners Corners are rounded Corners are square From af2e9358adda7e7999d3c4b2d867858466d4b975 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 29 Jan 2025 12:41:32 +0200 Subject: [PATCH 43/64] Add comments for literal filters --- .../infinityforreddit/subscription/Fingerprints.kt | 3 +-- .../app/revanced/patches/shared/misc/spoof/Fingerprints.kt | 2 +- .../patches/youtube/interaction/seekbar/Fingerprints.kt | 4 ++-- .../youtube/interaction/swipecontrols/Fingerprints.kt | 2 +- .../youtube/layout/buttons/navigation/Fingerprints.kt | 6 +++--- .../patches/youtube/layout/miniplayer/Fingerprints.kt | 4 ++-- .../youtube/layout/player/fullscreen/Fingerprints.kt | 1 + 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt index 2217ab3eb5..22842f81ec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt @@ -9,7 +9,6 @@ internal val billingClientOnServiceConnectedFingerprint by fingerprint { internal val startSubscriptionActivityFingerprint by fingerprint { instructions( - // Intent start flag only used in the subscription activity - literal(0x10008000) + literal(0x10008000) // Intent start flag only used in the subscription activity ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index 2ad4138c33..7fee85218d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -119,7 +119,7 @@ internal val hlsCurrentTimeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Z", "L") instructions( - literal(45355374L) + literal(45355374L) // HLS current time feature flag. ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt index be67b8908b..00b0b5d527 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt @@ -13,7 +13,7 @@ internal val swipingUpGestureParentFingerprint by fingerprint { returns("Z") parameters() instructions( - literal(45379021) + literal(45379021) // Swipe up fullscreen feature flag ) } @@ -135,6 +135,6 @@ internal val fullscreenSeekbarThumbnailsQualityFingerprint by fingerprint { returns("Z") parameters() instructions( - literal(45399684L) + literal(45399684L) // Video stream seekbar thumbnails feature flag. ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt index 450053cfff..2c7dc336b6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt @@ -15,6 +15,6 @@ internal val swipeControlsHostActivityFingerprint by fingerprint { internal val swipeChangeVideoFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( - literal(45631116L) + literal(45631116L) // Swipe to change fullscreen video feature flag. ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt index b41b1b0afb..6fd623581d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt @@ -34,7 +34,7 @@ internal val translucentNavigationStatusBarFeatureFlagFingerprint by fingerprint accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( - literal(45400535L) + literal(45400535L) // Translucent status bar feature flag. ) } @@ -45,7 +45,7 @@ internal val translucentNavigationButtonsFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( - literal(45630927L) + literal(45630927L) // Translucent navigation bar buttons feature flag. ) } @@ -56,6 +56,6 @@ internal val translucentNavigationButtonsSystemFeatureFlagFingerprint by fingerp accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( - literal(45632194L) + literal(45632194L) // Translucent system buttons feature flag. ) } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 3c18dedf4c..4a4f1c343d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -141,8 +141,8 @@ internal val miniplayerMinimumSizeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( resourceLiteral("dimen", "miniplayer_max_size"), - literal(192), - literal(128) + literal(192), // Default miniplayer width constant. + literal(128) // Default miniplayer height constant. ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt index 4fb6a578af..c62f4e1527 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt @@ -15,6 +15,7 @@ internal val openVideosFullscreenPortraitFingerprint by fingerprint { parameters("L", "Lj\$/util/Optional;") instructions( opcode(Opcode.MOVE_RESULT), // Conditional check to modify. + // Open videos fullscreen portrait feature flag. literal(45666112L, maxInstructionsBefore = 5), // Cannot be more than 5. opcode(Opcode.MOVE_RESULT, maxInstructionsBefore = 10), ) From 3ba91aa755efd802e94059b0a7e774ef956506a0 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:24:13 +0200 Subject: [PATCH 44/64] fix Modern 4 hide overlay buttons --- .../youtube/patches/MiniplayerPatch.java | 22 ++++-- .../extension/youtube/settings/Settings.java | 6 +- .../youtube/layout/miniplayer/Fingerprints.kt | 72 +++++++++++-------- .../layout/miniplayer/MiniplayerPatch.kt | 58 ++++++++------- .../resources/addresources/values/strings.xml | 12 ++-- 5 files changed, 101 insertions(+), 69 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java index 6155001ccd..1b41e44c63 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java @@ -129,12 +129,13 @@ public boolean isModern() { private static final boolean DRAG_AND_DROP_ENABLED = CURRENT_TYPE.isModern() && Settings.MINIPLAYER_DRAG_AND_DROP.get(); - private static final boolean HIDE_EXPAND_CLOSE_ENABLED = - Settings.MINIPLAYER_HIDE_EXPAND_CLOSE.get() - && Settings.MINIPLAYER_HIDE_EXPAND_CLOSE.isAvailable(); + private static final boolean HIDE_OVERLAY_BUTTONS_ENABLED = + Settings.MINIPLAYER_HIDE_OVERLAY_BUTTONS.get() + && Settings.MINIPLAYER_HIDE_OVERLAY_BUTTONS.isAvailable(); private static final boolean HIDE_SUBTEXT_ENABLED = - (CURRENT_TYPE == MODERN_1 || CURRENT_TYPE == MODERN_3) && Settings.MINIPLAYER_HIDE_SUBTEXT.get(); + (CURRENT_TYPE == MODERN_1 || CURRENT_TYPE == MODERN_3 || CURRENT_TYPE == MODERN_4) + && Settings.MINIPLAYER_HIDE_SUBTEXT.get(); // 19.25 is last version that has forward/back buttons for phones, // but buttons still show for tablets/foldable devices and they don't work well so always hide. @@ -175,7 +176,7 @@ public boolean isAvailable() { } } - public static final class MiniplayerHideExpandCloseAvailability implements Setting.Availability { + public static final class MiniplayerHideOverlayButtonsAvailability implements Setting.Availability { @Override public boolean isAvailable() { MiniplayerType type = Settings.MINIPLAYER_TYPE.get(); @@ -324,7 +325,16 @@ public static int getMiniplayerDefaultSize(int original) { * Injection point. */ public static void hideMiniplayerExpandClose(View view) { - Utils.hideViewByRemovingFromParentUnderCondition(HIDE_EXPAND_CLOSE_ENABLED, view); + Utils.hideViewByRemovingFromParentUnderCondition(HIDE_OVERLAY_BUTTONS_ENABLED, view); + } + + /** + * Injection point. + */ + public static void hideMiniplayerActionButton(View view) { + if (CURRENT_TYPE == MODERN_4) { + Utils.hideViewByRemovingFromParentUnderCondition(HIDE_OVERLAY_BUTTONS_ENABLED, view); + } } /** diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index 6977d59e3b..b57b18974c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -11,7 +11,7 @@ import static app.revanced.extension.youtube.patches.ChangeStartPagePatch.StartPage; import static app.revanced.extension.youtube.patches.ExitFullscreenPatch.FullscreenMode; import static app.revanced.extension.youtube.patches.ForceOriginalAudioPatch.ForceOriginalAudioAvailability; -import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHideExpandCloseAvailability; +import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHideOverlayButtonsAvailability; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHorizontalDragAvailability; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.MINIMAL; @@ -156,8 +156,8 @@ public class Settings extends BaseSettings { public static final BooleanSetting MINIPLAYER_DOUBLE_TAP_ACTION = new BooleanSetting("revanced_miniplayer_double_tap_action", TRUE, true, MINIPLAYER_ANY_MODERN); public static final BooleanSetting MINIPLAYER_DRAG_AND_DROP = new BooleanSetting("revanced_miniplayer_drag_and_drop", TRUE, true, MINIPLAYER_ANY_MODERN); public static final BooleanSetting MINIPLAYER_HORIZONTAL_DRAG = new BooleanSetting("revanced_miniplayer_horizontal_drag", FALSE, true, new MiniplayerHorizontalDragAvailability()); - public static final BooleanSetting MINIPLAYER_HIDE_EXPAND_CLOSE = new BooleanSetting("revanced_miniplayer_hide_expand_close", FALSE, true, new MiniplayerHideExpandCloseAvailability()); - public static final BooleanSetting MINIPLAYER_HIDE_SUBTEXT = new BooleanSetting("revanced_miniplayer_hide_subtext", FALSE, true, MINIPLAYER_TYPE.availability(MODERN_1, MODERN_3)); + public static final BooleanSetting MINIPLAYER_HIDE_OVERLAY_BUTTONS = new BooleanSetting("revanced_miniplayer_hide_overlay_buttons", FALSE, true, new MiniplayerHideOverlayButtonsAvailability()); + public static final BooleanSetting MINIPLAYER_HIDE_SUBTEXT = new BooleanSetting("revanced_miniplayer_hide_subtext", FALSE, true, MINIPLAYER_TYPE.availability(MODERN_1, MODERN_3, MODERN_4)); public static final BooleanSetting MINIPLAYER_HIDE_REWIND_FORWARD = new BooleanSetting("revanced_miniplayer_hide_rewind_forward", TRUE, true, MINIPLAYER_TYPE.availability(MODERN_1)); public static final BooleanSetting MINIPLAYER_ROUNDED_CORNERS = new BooleanSetting("revanced_miniplayer_rounded_corners", TRUE, true, MINIPLAYER_ANY_MODERN); public static final IntegerSetting MINIPLAYER_WIDTH_DIP = new IntegerSetting("revanced_miniplayer_width_dip", 192, true, MINIPLAYER_ANY_MODERN); diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 4a4f1c343d..248af2e256 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -11,6 +11,24 @@ import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +internal const val MINIPLAYER_MODERN_FEATURE_KEY = 45622882L +// In later targets this feature flag does nothing and is dead code. +internal const val MINIPLAYER_MODERN_FEATURE_LEGACY_KEY = 45630429L +internal const val MINIPLAYER_DOUBLE_TAP_FEATURE_KEY = 45628823L +internal const val MINIPLAYER_DRAG_DROP_FEATURE_KEY = 45628752L +internal const val MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY = 45658112L +internal const val MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY = 45652224L +internal const val MINIPLAYER_INITIAL_SIZE_FEATURE_KEY = 45640023L +internal const val MINIPLAYER_DISABLED_FEATURE_KEY = 45657015L +internal const val MINIPLAYER_ANIMATED_EXPAND_FEATURE_KEY = 45644360L + +internal val miniplayerModernConstructorFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + instructions( + literal(45623000L) // Magic number found in the constructor. + ) +} + internal val miniplayerDimensionsCalculatorParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") @@ -20,6 +38,16 @@ internal val miniplayerDimensionsCalculatorParentFingerprint by fingerprint { ) } + +internal val miniplayerModernViewParentFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Ljava/lang/String;") + parameters() + instructions( + string("player_overlay_modern_mini_player_controls") + ) +} + /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ @@ -42,32 +70,6 @@ internal val miniplayerModernCloseButtonFingerprint by fingerprint { ) } -internal const val MINIPLAYER_MODERN_FEATURE_KEY = 45622882L -// In later targets this feature flag does nothing and is dead code. -internal const val MINIPLAYER_MODERN_FEATURE_LEGACY_KEY = 45630429L -internal const val MINIPLAYER_DOUBLE_TAP_FEATURE_KEY = 45628823L -internal const val MINIPLAYER_DRAG_DROP_FEATURE_KEY = 45628752L -internal const val MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY = 45658112L -internal const val MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY = 45652224L -internal const val MINIPLAYER_INITIAL_SIZE_FEATURE_KEY = 45640023L -internal const val MINIPLAYER_DISABLED_FEATURE_KEY = 45657015L -internal const val MINIPLAYER_ANIMATED_EXPAND_FEATURE_KEY = 45644360L - -internal val miniplayerModernConstructorFingerprint by fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - instructions( - literal(45623000L) // Magic number found in the constructor. - ) -} - -internal val miniplayerOnCloseHandlerFingerprint by fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - instructions( - literal(MINIPLAYER_DISABLED_FEATURE_KEY) - ) -} - /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ @@ -128,12 +130,16 @@ internal val miniplayerModernRewindButtonFingerprint by fingerprint { ) } -internal val miniplayerModernViewParentFingerprint by fingerprint { +/** + * Matches using the class found in [miniplayerModernViewParentFingerprint]. + */ +internal val miniplayerModernActionButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") + returns("L") parameters() instructions( - string("player_overlay_modern_mini_player_controls") + resourceLiteral("id", "modern_miniplayer_overlay_action_button"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 5) ) } @@ -176,6 +182,14 @@ internal val miniplayerResponseModelSizeCheckFingerprint by fingerprint { ) } +internal val miniplayerOnCloseHandlerFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + instructions( + literal(MINIPLAYER_DISABLED_FEATURE_KEY) + ) +} + internal const val YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME = "Lcom/google/android/apps/youtube/app/common/player/overlay/YouTubePlayerOverlaysLayout;" diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index b38a57bc0a..e1e8c46ac6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -158,13 +158,13 @@ val miniplayerPatch = bytecodePatch( preferences += SwitchPreference("revanced_miniplayer_hide_subtext") preferences += if (is_19_26_or_greater) { - SwitchPreference("revanced_miniplayer_hide_expand_close") + SwitchPreference("revanced_miniplayer_hide_overlay_buttons") } else { SwitchPreference( - key = "revanced_miniplayer_hide_expand_close", - titleKey = "revanced_miniplayer_hide_expand_close_legacy_title", - summaryOnKey = "revanced_miniplayer_hide_expand_close_legacy_summary_on", - summaryOffKey = "revanced_miniplayer_hide_expand_close_legacy_summary_off", + key = "revanced_miniplayer_hide_overlay_buttons", + titleKey = "revanced_miniplayer_hide_overlay_buttons_legacy_title", + summaryOnKey = "revanced_miniplayer_hide_overlay_buttons_legacy_summary_on", + summaryOffKey = "revanced_miniplayer_hide_overlay_buttons_legacy_summary_off", ) } @@ -400,6 +400,7 @@ val miniplayerPatch = bytecodePatch( listOf( miniplayerModernExpandButtonFingerprint to "hideMiniplayerExpandClose", miniplayerModernCloseButtonFingerprint to "hideMiniplayerExpandClose", + miniplayerModernActionButtonFingerprint to "hideMiniplayerActionButton", miniplayerModernRewindButtonFingerprint to "hideMiniplayerRewindForward", miniplayerModernForwardButtonFingerprint to "hideMiniplayerRewindForward", miniplayerModernOverlayViewFingerprint to "adjustMiniplayerOpacity" @@ -429,33 +430,40 @@ val miniplayerPatch = bytecodePatch( // Modern 2 uses the same overlay controls as the regular video player, // and the overlay views are added at runtime. // Add a hook to the overlay class, and pass the added views to extension. + // Problem is fixed in 19.21+ // // NOTE: Modern 2 uses the same video UI as the regular player except resized to smaller. // This patch code could be used to hide other player overlays that do not use Litho. - playerOverlaysLayoutFingerprint.classDef.methods.add( - ImmutableMethod( - YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME, - "addView", - listOf( - ImmutableMethodParameter("Landroid/view/View;", null, null), - ImmutableMethodParameter("I", null, null), - ImmutableMethodParameter("Landroid/view/ViewGroup\$LayoutParams;", null, null), - ), - "V", - AccessFlags.PUBLIC.value, - null, - null, - MutableMethodImplementation(4), - ).toMutable().apply { - addInstructions( - """ + if (!is_19_17_or_greater) { + playerOverlaysLayoutFingerprint.classDef.methods.add( + ImmutableMethod( + YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME, + "addView", + listOf( + ImmutableMethodParameter("Landroid/view/View;", null, null), + ImmutableMethodParameter("I", null, null), + ImmutableMethodParameter( + "Landroid/view/ViewGroup\$LayoutParams;", + null, + null + ), + ), + "V", + AccessFlags.PUBLIC.value, + null, + null, + MutableMethodImplementation(4), + ).toMutable().apply { + addInstructions( + """ invoke-super { p0, p1, p2, p3 }, Landroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup${'$'}LayoutParams;)V invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->playerOverlayGroupCreated(Landroid/view/View;)V return-void """ - ) - } - ) + ) + } + ) + } // endregion } diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index 0d381c9c04..ec46430114 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -1194,14 +1194,14 @@ Miniplayer can be dragged to any corner of the screen" Miniplayer can be dragged off screen to the left or right" Horizontal drag gesture disabled - Hide close button - Close button is hidden - Close button is shown - Hide expand and close buttons - "Buttons are hidden + Hide overlay buttons + Overlay buttons are hidden + Overlay buttons are shown + Hide expand and close buttons + "Buttons are hidden Swipe to expand or close" - Expand and close buttons are shown + Expand and close buttons are shown Hide subtexts Subtexts are hidden Subtexts are shown From 737e2914db6fdff1ef5a09a61695aa68e12e255c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 30 Jan 2025 09:40:57 +0200 Subject: [PATCH 45/64] fix Twitch --- .../app/revanced/patches/twitch/ad/shared/util/AdPatch.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt index 089f7dc0ab..2cf8e55925 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt @@ -29,7 +29,9 @@ fun adPatch( classDefType: String, methodNames: Set, returnMethod: ReturnMethod, - ) = with(mutableClassBy(classDefType)) { + ) = with(mutableClassByOrNull(classDefType)) { + this ?: return false + methods.filter { it.name in methodNames }.forEach { val retInstruction = when (returnMethod.returnType) { 'V' -> "return-void" From f02489d81dac32a66ccd404e9e126184a967848d Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 30 Jan 2025 14:50:10 +0200 Subject: [PATCH 46/64] refactor --- .../shared/misc/mapping/ResourceMappingPatch.kt | 4 ++-- .../youtube/layout/buttons/navigation/Fingerprints.kt | 2 +- .../patches/youtube/layout/formfactor/Fingerprints.kt | 2 +- .../youtube/layout/hide/general/Fingerprints.kt | 4 ++-- .../patches/youtube/layout/miniplayer/Fingerprints.kt | 8 ++++---- .../youtube/layout/player/fullscreen/Fingerprints.kt | 4 ++-- .../patches/youtube/layout/seekbar/Fingerprints.kt | 10 +++++----- .../youtube/layout/startupshortsreset/Fingerprints.kt | 4 ++-- .../patches/youtube/misc/playertype/Fingerprints.kt | 4 ++-- .../revanced/patches/youtube/shared/Fingerprints.kt | 4 ++-- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index b550176ca8..ca856f71f7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -24,8 +24,8 @@ lateinit var resourceMappings: List fun resourceLiteral( type: String, name: String, - maxInstructionsBefore: Int = METHOD_MAX_INSTRUCTIONS, -) = literal({ resourceMappings[type, name] }, null, maxInstructionsBefore) + maxBefore: Int = METHOD_MAX_INSTRUCTIONS, +) = literal({ resourceMappings[type, name] }, null, maxBefore) val resourceMappingPatch = resourcePatch { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt index 6fd623581d..78641079a2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt @@ -13,7 +13,7 @@ internal val addCreateButtonViewFingerprint by fingerprint { instructions( string("Android Wear"), opcode(Opcode.IF_EQZ), - string("Android Automotive", maxInstructionsBefore = 0), + string("Android Automotive", maxBefore = 0), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt index c1ec6f8ef7..bd97ae94d7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt @@ -24,7 +24,7 @@ internal val createPlayerRequestBodyWithModelFingerprint by fingerprint { fieldAccess( definingClass = { context -> with(context) { formFactorEnumConstructorFingerprint.originalClassDef.type } }, type = { "I" }, - maxInstructionsBefore = 50 + maxBefore = 50 ) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index d7282574a1..7ecd228ce9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -114,7 +114,7 @@ internal val showFloatingMicrophoneButtonFingerprint by fingerprint { parameters() instructions( resourceLiteral("id", "fab"), - checkCast("/FloatingActionButton;", maxInstructionsBefore = 10), - opcode(Opcode.IGET_BOOLEAN, maxInstructionsBefore = 10) + checkCast("/FloatingActionButton;", maxBefore = 10), + opcode(Opcode.IGET_BOOLEAN, maxBefore = 10) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 248af2e256..7c9e49d5a7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -104,7 +104,7 @@ internal val miniplayerModernForwardButtonFingerprint by fingerprint { parameters() instructions( resourceLiteral("id", "modern_miniplayer_forward_button"), - opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 5) + opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 5) ) } @@ -113,7 +113,7 @@ internal val miniplayerModernOverlayViewFingerprint by fingerprint { parameters() instructions( resourceLiteral("id", "scrim_overlay"), - opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 5) + opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 5) ) } @@ -126,7 +126,7 @@ internal val miniplayerModernRewindButtonFingerprint by fingerprint { parameters() instructions( resourceLiteral("id", "modern_miniplayer_rewind_button"), - opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 5) + opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 5) ) } @@ -139,7 +139,7 @@ internal val miniplayerModernActionButtonFingerprint by fingerprint { parameters() instructions( resourceLiteral("id", "modern_miniplayer_overlay_action_button"), - opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 5) + opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 5) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt index c62f4e1527..67f0754b0b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt @@ -16,8 +16,8 @@ internal val openVideosFullscreenPortraitFingerprint by fingerprint { instructions( opcode(Opcode.MOVE_RESULT), // Conditional check to modify. // Open videos fullscreen portrait feature flag. - literal(45666112L, maxInstructionsBefore = 5), // Cannot be more than 5. - opcode(Opcode.MOVE_RESULT, maxInstructionsBefore = 10), + literal(45666112L, maxBefore = 5), // Cannot be more than 5. + opcode(Opcode.MOVE_RESULT, maxBefore = 10), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index d256d2f189..5d08153d21 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -85,8 +85,8 @@ internal val playerLinearGradientFingerprint by fingerprint { instructions( resourceLiteral("color", "yt_youtube_magenta"), - opcode(Opcode.FILLED_NEW_ARRAY, maxInstructionsBefore = 5), - opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 0) + opcode(Opcode.FILLED_NEW_ARRAY, maxBefore = 5), + opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 0) ) } @@ -101,7 +101,7 @@ internal val playerLinearGradientLegacy1946Fingerprint by fingerprint { resourceLiteral("color", "yt_youtube_magenta"), opcode(Opcode.FILLED_NEW_ARRAY), - opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 0), + opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 0), ) custom { method, _ -> method.name == "setBounds" @@ -117,8 +117,8 @@ internal val playerLinearGradientLegacy1925Fingerprint by fingerprint { instructions( resourceLiteral("color", "yt_youtube_magenta"), - opcode(Opcode.FILLED_NEW_ARRAY, maxInstructionsBefore = 10), - opcode(Opcode.MOVE_RESULT_OBJECT, maxInstructionsBefore = 0), + opcode(Opcode.FILLED_NEW_ARRAY, maxBefore = 10), + opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 0), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt index 86801582e7..cd6543b2ab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt @@ -18,8 +18,8 @@ internal val userWasInShortsAlternativeFingerprint by fingerprint { instructions( methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z"), methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z"), - opcode(Opcode.MOVE_RESULT, maxInstructionsBefore = 0), - string("userIsInShorts: ", maxInstructionsBefore = 5) + opcode(Opcode.MOVE_RESULT, maxBefore = 0), + string("userIsInShorts: ", maxBefore = 5) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt index c53db6c305..4bb79487fd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt @@ -37,12 +37,12 @@ internal val videoStateFingerprint by fingerprint { parameters("Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;") instructions( literal(1), - literal(literal = 0, maxInstructionsBefore = 10), + literal(literal = 0, maxBefore = 10), // Obfuscated parameter field name. fieldAccess( definingClass = { "Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;"}, type = { context: BytecodePatchContext -> with(context) { videoStateEnumFingerprint.originalClassDef.type } }, - maxInstructionsBefore = 5 + maxBefore = 5 ) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index 8ad68500b8..299573a07f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -111,7 +111,7 @@ internal val newVideoQualityChangedFingerprint by fingerprint { newInstance("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;"), opcode(Opcode.IGET_OBJECT), opcode(Opcode.CHECK_CAST), - fieldAccess(type = "I", opcode = Opcode.IGET, maxInstructionsBefore = 0), // Video resolution (human readable). - fieldAccess(type = "Ljava/lang/String;", opcode = Opcode.IGET_OBJECT, maxInstructionsBefore = 0), + fieldAccess(type = "I", opcode = Opcode.IGET, maxBefore = 0), // Video resolution (human readable). + fieldAccess(type = "Ljava/lang/String;", opcode = Opcode.IGET_OBJECT, maxBefore = 0), ) } From f0e179ef5bdb36a88103bbe055852eb2f61972ad Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 30 Jan 2025 15:45:41 +0200 Subject: [PATCH 47/64] Unofficial support for 20.05 beta --- patches/api/patches.api | 1 + .../patches/youtube/misc/litho/filter/Fingerprints.kt | 2 +- .../patches/youtube/misc/litho/filter/LithoFilterPatch.kt | 6 +++++- .../patches/youtube/misc/playservice/VersionCheckPatch.kt | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index f540648743..e77ec50682 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1344,6 +1344,7 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_19_49_or_greater ()Z public static final fun is_20_02_or_greater ()Z public static final fun is_20_03_or_greater ()Z + public static final fun is_20_05_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt index 21e1721a56..d23a34ee4a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt @@ -63,7 +63,7 @@ internal val lithoComponentNameUpbFeatureFlagFingerprint by fingerprint { returns("Z") parameters() instructions( - literal(45631264L ) + literal(45631264L) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt index 522abc4fed..18c424497d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt @@ -14,6 +14,7 @@ import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_18_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_05_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -233,7 +234,10 @@ val lithoFilterPatch = bytecodePatch( // Turn off native code that handles litho component names. If this feature is on then nearly // all litho components have a null name and identifier/path filtering is completely broken. - if (is_19_25_or_greater) { + // + // Flag was removed in 20.05. It appears a new flag might be used instead (45660109L), + // but if the flag is forced on then litho filtering still works correctly. + if (is_19_25_or_greater && !is_20_05_or_greater) { lithoComponentNameUpbFeatureFlagFingerprint.method.apply { // Don't use return early, so the debug patch logs if this was originally on. val insertIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index 932ffd6752..7a95c6a096 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -47,6 +47,8 @@ var is_20_02_or_greater = false private set var is_20_03_or_greater = false private set +var is_20_05_or_greater = false + private set val versionCheckPatch = resourcePatch( description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", @@ -83,5 +85,6 @@ val versionCheckPatch = resourcePatch( is_19_49_or_greater = 245005000 <= playStoreServicesVersion is_20_02_or_greater = 250299000 <= playStoreServicesVersion is_20_03_or_greater = 250405000 <= playStoreServicesVersion + is_20_05_or_greater = 250605000 <= playStoreServicesVersion } } From aceb3a69a6c459806e7f826d95d80093c7eee9af Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 2 Feb 2025 11:24:59 +0200 Subject: [PATCH 48/64] Simplify with instruction filters --- .../youtube/layout/seekbar/Fingerprints.kt | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index 6c8fd593fa..bd22167c63 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -2,14 +2,12 @@ package app.revanced.patches.youtube.layout.seekbar import app.revanced.patcher.fingerprint import app.revanced.patcher.literal -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.string import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.reference.MethodReference internal val fullscreenSeekbarThumbnailsFingerprint by fingerprint { returns("Z") @@ -158,12 +156,11 @@ internal val lottieAnimationViewSetAnimationIntFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("I") returns("V") - custom { methodDef, classDef -> - classDef.type == LOTTIE_ANIMATION_VIEW_CLASS_TYPE && methodDef.indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Lcom/airbnb/lottie/LottieAnimationView;" - && reference.name == "isInEditMode" - } >= 0 + instructions( + methodCall("this", "isInEditMode") + ) + custom { _, classDef -> + classDef.type == LOTTIE_ANIMATION_VIEW_CLASS_TYPE } } @@ -171,20 +168,23 @@ internal val lottieAnimationViewSetAnimationStreamFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("L") returns("V") - custom { methodDef, classDef -> - classDef.type == LOTTIE_ANIMATION_VIEW_CLASS_TYPE && methodDef.indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Ljava/util/Set;" - && reference.name == "add" - } >= 0 && methodDef.containsLiteralInstruction(0) + instructions( + methodCall("Ljava/util/Set;", "add"), + literal(0) + ) + custom { _, classDef -> + classDef.type == LOTTIE_ANIMATION_VIEW_CLASS_TYPE } } -internal val lottieCompositionFactoryZipFingerprint = fingerprint { +internal val lottieCompositionFactoryZipFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) parameters("Landroid/content/Context;", "Ljava/lang/String;", "Ljava/lang/String;") returns("L") - strings(".zip", ".lottie") + instructions( + string(".zip"), + string(".lottie") + ) } /** @@ -192,11 +192,12 @@ internal val lottieCompositionFactoryZipFingerprint = fingerprint { * * [Original method](https://github.com/airbnb/lottie-android/blob/26ad8bab274eac3f93dccccfa0cafc39f7408d13/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java#L386) */ -internal val lottieCompositionFactoryFromJsonInputStreamFingerprint = fingerprint { +internal val lottieCompositionFactoryFromJsonInputStreamFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) parameters("Ljava/io/InputStream;", "Ljava/lang/String;") returns("L") - literal { 2 } + instructions( + literal(2) + ) } - From 3d667d897647d1eb3877d5f0238c2da1bcbf6f74 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 2 Feb 2025 16:11:50 +0200 Subject: [PATCH 49/64] Remove `lastInstruction()` filter --- .../youtube/layout/buttons/navigation/Fingerprints.kt | 5 ++--- .../patches/youtube/layout/formfactor/Fingerprints.kt | 2 +- .../youtube/layout/hide/general/Fingerprints.kt | 4 ++-- .../patches/youtube/layout/miniplayer/Fingerprints.kt | 8 ++++---- .../youtube/layout/player/fullscreen/Fingerprints.kt | 4 ++-- .../patches/youtube/layout/seekbar/Fingerprints.kt | 10 +++++----- .../youtube/layout/seekbar/SeekbarColorPatch.kt | 2 +- .../youtube/layout/startupshortsreset/Fingerprints.kt | 4 ++-- .../patches/youtube/misc/playertype/Fingerprints.kt | 4 ++-- .../revanced/patches/youtube/shared/Fingerprints.kt | 4 ++-- 10 files changed, 23 insertions(+), 24 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt index 78641079a2..5f0449db73 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt @@ -1,7 +1,6 @@ package app.revanced.patches.youtube.layout.buttons.navigation import app.revanced.patcher.fingerprint -import app.revanced.patcher.lastInstruction import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.opcode @@ -13,7 +12,7 @@ internal val addCreateButtonViewFingerprint by fingerprint { instructions( string("Android Wear"), opcode(Opcode.IF_EQZ), - string("Android Automotive", maxBefore = 0), + string("Android Automotive", maxAfter = 0), ) } @@ -26,7 +25,7 @@ internal val createPivotBarFingerprint by fingerprint { ) instructions( methodCall(definingClass = "Landroid/widget/TextView;", name = "setText"), - lastInstruction(opcode(Opcode.RETURN_VOID)) + opcode(Opcode.RETURN_VOID) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt index bd97ae94d7..8e4a005858 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt @@ -24,7 +24,7 @@ internal val createPlayerRequestBodyWithModelFingerprint by fingerprint { fieldAccess( definingClass = { context -> with(context) { formFactorEnumConstructorFingerprint.originalClassDef.type } }, type = { "I" }, - maxBefore = 50 + maxAfter = 50 ) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 7ecd228ce9..9b7d6a9a34 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -114,7 +114,7 @@ internal val showFloatingMicrophoneButtonFingerprint by fingerprint { parameters() instructions( resourceLiteral("id", "fab"), - checkCast("/FloatingActionButton;", maxBefore = 10), - opcode(Opcode.IGET_BOOLEAN, maxBefore = 10) + checkCast("/FloatingActionButton;", maxAfter = 10), + opcode(Opcode.IGET_BOOLEAN, maxAfter = 10) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 7c9e49d5a7..75c935e4d5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -104,7 +104,7 @@ internal val miniplayerModernForwardButtonFingerprint by fingerprint { parameters() instructions( resourceLiteral("id", "modern_miniplayer_forward_button"), - opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 5) + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 5) ) } @@ -113,7 +113,7 @@ internal val miniplayerModernOverlayViewFingerprint by fingerprint { parameters() instructions( resourceLiteral("id", "scrim_overlay"), - opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 5) + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 5) ) } @@ -126,7 +126,7 @@ internal val miniplayerModernRewindButtonFingerprint by fingerprint { parameters() instructions( resourceLiteral("id", "modern_miniplayer_rewind_button"), - opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 5) + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 5) ) } @@ -139,7 +139,7 @@ internal val miniplayerModernActionButtonFingerprint by fingerprint { parameters() instructions( resourceLiteral("id", "modern_miniplayer_overlay_action_button"), - opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 5) + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 5) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt index 67f0754b0b..1ac5c307f0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt @@ -16,8 +16,8 @@ internal val openVideosFullscreenPortraitFingerprint by fingerprint { instructions( opcode(Opcode.MOVE_RESULT), // Conditional check to modify. // Open videos fullscreen portrait feature flag. - literal(45666112L, maxBefore = 5), // Cannot be more than 5. - opcode(Opcode.MOVE_RESULT, maxBefore = 10), + literal(45666112L, maxAfter = 5), // Cannot be more than 5. + opcode(Opcode.MOVE_RESULT, maxAfter = 10), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index bd22167c63..56fe3d9f82 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -86,8 +86,8 @@ internal val playerLinearGradientFingerprint by fingerprint { instructions( resourceLiteral("color", "yt_youtube_magenta"), - opcode(Opcode.FILLED_NEW_ARRAY, maxBefore = 5), - opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 0) + opcode(Opcode.FILLED_NEW_ARRAY, maxAfter = 5), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) ) } @@ -102,7 +102,7 @@ internal val playerLinearGradientLegacy1946Fingerprint by fingerprint { resourceLiteral("color", "yt_youtube_magenta"), opcode(Opcode.FILLED_NEW_ARRAY), - opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 0), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), ) custom { method, _ -> method.name == "setBounds" @@ -118,8 +118,8 @@ internal val playerLinearGradientLegacy1925Fingerprint by fingerprint { instructions( resourceLiteral("color", "yt_youtube_magenta"), - opcode(Opcode.FILLED_NEW_ARRAY, maxBefore = 10), - opcode(Opcode.MOVE_RESULT_OBJECT, maxBefore = 0), + opcode(Opcode.FILLED_NEW_ARRAY, maxAfter = 10), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index 5e2546bff3..b2475fd580 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -302,7 +302,7 @@ val seekbarColorPatch = bytecodePatch( findInstructionIndicesReversedOrThrow { val reference = getReference() - reference?.definingClass == "Lcom/airbnb/lottie/LottieAnimationView;" + reference?.definingClass == LOTTIE_ANIMATION_VIEW_CLASS_TYPE && reference.name == setAnimationIntMethodName }.forEach { index -> val instruction = getInstruction(index) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt index cd6543b2ab..709b8c1090 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt @@ -18,8 +18,8 @@ internal val userWasInShortsAlternativeFingerprint by fingerprint { instructions( methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z"), methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z"), - opcode(Opcode.MOVE_RESULT, maxBefore = 0), - string("userIsInShorts: ", maxBefore = 5) + opcode(Opcode.MOVE_RESULT, maxAfter = 0), + string("userIsInShorts: ", maxAfter = 5) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt index 4bb79487fd..27d72d7be3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt @@ -37,12 +37,12 @@ internal val videoStateFingerprint by fingerprint { parameters("Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;") instructions( literal(1), - literal(literal = 0, maxBefore = 10), + literal(literal = 0, maxAfter = 10), // Obfuscated parameter field name. fieldAccess( definingClass = { "Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;"}, type = { context: BytecodePatchContext -> with(context) { videoStateEnumFingerprint.originalClassDef.type } }, - maxBefore = 5 + maxAfter = 5 ) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index 299573a07f..1c143b188e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -111,7 +111,7 @@ internal val newVideoQualityChangedFingerprint by fingerprint { newInstance("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;"), opcode(Opcode.IGET_OBJECT), opcode(Opcode.CHECK_CAST), - fieldAccess(type = "I", opcode = Opcode.IGET, maxBefore = 0), // Video resolution (human readable). - fieldAccess(type = "Ljava/lang/String;", opcode = Opcode.IGET_OBJECT, maxBefore = 0), + fieldAccess(type = "I", opcode = Opcode.IGET, maxAfter = 0), // Video resolution (human readable). + fieldAccess(type = "Ljava/lang/String;", opcode = Opcode.IGET_OBJECT, maxAfter = 0), ) } From 3b7b30c37ad3167d6a9f2aac02c961c84f728720 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 6 Feb 2025 19:03:42 +0200 Subject: [PATCH 50/64] refactor --- .../music/misc/extension/hooks/ApplicationInitHook.kt | 5 ++++- .../patches/youtube/layout/buttons/overlay/Fingerprints.kt | 3 ++- .../youtube/misc/extension/hooks/ApplicationInitHook.kt | 6 +++++- .../app/revanced/patches/youtube/shared/Fingerprints.kt | 6 +++--- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt index 1e1a43f9aa..869174c45f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt @@ -1,10 +1,13 @@ package app.revanced.patches.music.misc.extension.hooks +import app.revanced.patcher.string import app.revanced.patches.shared.misc.extension.extensionHook internal val applicationInitHook = extensionHook { returns("V") parameters() - strings("activity") + instructions( + string("activity") + ) custom { method, _ -> method.name == "onCreate" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt index dd34e59667..6fc08a1e36 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt @@ -2,6 +2,7 @@ package app.revanced.patches.youtube.layout.buttons.overlay import app.revanced.patcher.fingerprint import app.revanced.patcher.methodCall +import app.revanced.patcher.string import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags @@ -9,11 +10,11 @@ internal val playerControlsPreviousNextOverlayTouchFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( + string("1.0x"), resourceLiteral("id", "player_control_previous_button_touch_area"), resourceLiteral("id", "player_control_next_button_touch_area"), methodCall(parameters = listOf("Landroid/view/View;", "I")) ) - strings("1.0x") } internal val mediaRouteButtonFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt index 6a0e7d1f48..8f2274d83d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.misc.extension.hooks +import app.revanced.patcher.string import app.revanced.patches.shared.misc.extension.extensionHook /** @@ -7,5 +8,8 @@ import app.revanced.patches.shared.misc.extension.extensionHook */ // Extension context is the Activity itself. internal val applicationInitHook = extensionHook { - strings("Application creation", "Application.onCreate") + instructions( + string("Application.onCreate"), + string("Application creation") + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index 1c143b188e..a396d8c460 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -21,9 +21,9 @@ internal val autoRepeatFingerprint by fingerprint { internal val autoRepeatParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") - strings( - "play() called when the player wasn't loaded.", - "play() blocked because Background Playability failed", + instructions( + string("play() called when the player wasn't loaded."), + string("play() blocked because Background Playability failed") ) } From 02e66a48f45f4e889f3147e7f024cfedbf346bc9 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Feb 2025 20:54:28 +0200 Subject: [PATCH 51/64] Remove unneeded annotations --- .../youtube/patches/announcements/AnnouncementsPatch.java | 5 ----- .../youtube/settings/preference/HtmlPreference.java | 4 ---- .../settings/preference/ReVancedPreferenceFragment.java | 3 --- 3 files changed, 12 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/announcements/AnnouncementsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/announcements/AnnouncementsPatch.java index 92490aabd7..3e465a6c36 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/announcements/AnnouncementsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/announcements/AnnouncementsPatch.java @@ -7,13 +7,10 @@ import android.app.Activity; import android.app.AlertDialog; -import android.os.Build; import android.text.Html; import android.text.method.LinkMovementMethod; import android.widget.TextView; -import androidx.annotation.RequiresApi; - import org.json.JSONArray; import java.io.IOException; @@ -31,7 +28,6 @@ public final class AnnouncementsPatch { private AnnouncementsPatch() { } - @RequiresApi(api = Build.VERSION_CODES.O) private static boolean isLatestAlready() throws IOException { HttpURLConnection connection = AnnouncementsRoutes.getAnnouncementsConnectionFromRoute(GET_LATEST_ANNOUNCEMENT_IDS); @@ -70,7 +66,6 @@ private static boolean isLatestAlready() throws IOException { return Settings.ANNOUNCEMENT_LAST_ID.get() == id; } - @RequiresApi(api = Build.VERSION_CODES.O) public static void showAnnouncement(final Activity context) { if (!Settings.ANNOUNCEMENTS.get()) return; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HtmlPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HtmlPreference.java index bd9db08f55..ecdcf03cf8 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HtmlPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HtmlPreference.java @@ -3,18 +3,14 @@ import static android.text.Html.FROM_HTML_MODE_COMPACT; import android.content.Context; -import android.os.Build; import android.preference.Preference; import android.text.Html; import android.util.AttributeSet; -import androidx.annotation.RequiresApi; - /** * Allows using basic html for the summary text. */ @SuppressWarnings({"unused", "deprecation"}) -@RequiresApi(api = Build.VERSION_CODES.O) public class HtmlPreference extends Preference { { setSummary(Html.fromHtml(getSummary().toString(), FROM_HTML_MODE_COMPACT)); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java index 3a826107f7..6a99f144b2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java @@ -17,8 +17,6 @@ import android.widget.TextView; import android.widget.Toolbar; -import androidx.annotation.RequiresApi; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -98,7 +96,6 @@ private static void sortListPreferenceByValues(ListPreference listPreference, in listPreference.setEntryValues(sortedEntryValues); } - @RequiresApi(api = Build.VERSION_CODES.O) @Override protected void initialize() { super.initialize(); From e5bf3d0379170deca9ab5b86d6f0d232eb44e567 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:11:24 +0200 Subject: [PATCH 52/64] fix floating point literals --- patches/api/patches.api | 4 ++-- .../patches/shared/misc/mapping/ResourceMappingPatch.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index e77ec50682..154da892f4 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -596,8 +596,8 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatch public static final fun get (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)J public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; public static final fun getResourceMappings ()Ljava/util/List; - public static final fun resourceLiteral (Ljava/lang/String;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralFilter; - public static synthetic fun resourceLiteral$default (Ljava/lang/String;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralFilter; + public static final fun resourceLiteral (Ljava/lang/String;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralWideFilter; + public static synthetic fun resourceLiteral$default (Ljava/lang/String;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralWideFilter; } public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index ca856f71f7..ac12f50c7b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.shared.misc.mapping import app.revanced.patcher.InstructionFilter.Companion.METHOD_MAX_INSTRUCTIONS -import app.revanced.patcher.LiteralFilter +import app.revanced.patcher.LiteralWideFilter import app.revanced.patcher.literal import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.resourcePatch @@ -16,7 +16,7 @@ lateinit var resourceMappings: List private set /** - * Identical to [LiteralFilter] except uses a decoded resource literal value. + * Identical to [LiteralWideFilter] except uses a decoded resource literal value. * * Any patch with fingerprints of this filter must * also declare [resourceMappingPatch] as a dependency. From 042f16f58904d1dc6ccffc10cc7dad1c3f4e0ab9 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:26:01 +0200 Subject: [PATCH 53/64] Unofficial 20.07 support --- .../seekbar/EnableSlideToSeekPatch.kt | 24 ++++++++++--------- .../interaction/seekbar/Fingerprints.kt | 8 +++++-- .../layout/hide/general/Fingerprints.kt | 11 +++++---- .../layout/startupshortsreset/Fingerprints.kt | 5 ++-- .../speed/custom/CustomPlaybackSpeedPatch.kt | 3 ++- 5 files changed, 30 insertions(+), 21 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index 8102f60581..e641776c14 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -104,17 +104,19 @@ val enableSlideToSeekPatch = bytecodePatch( } } } else { - disableFastForwardLegacyFingerprint.method.apply { - val insertIndex = disableFastForwardLegacyFingerprint.instructionMatches.last().index + 1 - val targetRegister = getInstruction(insertIndex).registerA - - addInstructions( - insertIndex, - """ - invoke-static { v$targetRegister }, $EXTENSION_METHOD_DESCRIPTOR - move-result v$targetRegister - """, - ) + disableFastForwardLegacyFingerprint.let { + it.method.apply { + val insertIndex = it.instructionMatches.last().index + 1 + val targetRegister = getInstruction(insertIndex).registerA + + addInstructions( + insertIndex, + """ + invoke-static { v$targetRegister }, $EXTENSION_METHOD_DESCRIPTOR + move-result v$targetRegister + """, + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt index 00b0b5d527..61041439de 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt @@ -2,6 +2,8 @@ package app.revanced.patches.youtube.interaction.seekbar import app.revanced.patcher.fingerprint import app.revanced.patcher.literal +import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater +import app.revanced.patches.youtube.misc.playservice.is_19_47_or_greater import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction import app.revanced.util.literal @@ -72,10 +74,12 @@ internal val disableFastForwardNoticeFingerprint by fingerprint { Opcode.MOVE_RESULT, ) custom { method, _ -> + // Code is found in different methods with different strings. + val findSearchLandingKey = is_19_34_or_greater && !is_19_47_or_greater + method.name == "run" && method.indexOfFirstInstruction { - // In later targets the code is found in different methods with different strings. val string = getReference()?.string - string == "Failed to easy seek haptics vibrate." || string == "search_landing_cache_key" + string == "Failed to easy seek haptics vibrate." || (findSearchLandingKey && string == "search_landing_cache_key") } >= 0 } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 9b7d6a9a34..10d0521e86 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -21,12 +21,13 @@ internal val hideShowMoreButtonFingerprint by fingerprint { internal val parseElementFromBufferFingerprint by fingerprint { parameters("L", "L", "[B", "L", "L") - opcodes( - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, + instructions( + opcode(Opcode.IGET_OBJECT), + // IGET_BOOLEAN // 20.07+ + opcode(Opcode.INVOKE_INTERFACE, maxAfter = 1), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), + string("Failed to parse Element", partialMatch = true) ) - strings("Failed to parse Element") // String is a partial match. } internal val playerOverlayFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt index 709b8c1090..d668510541 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.layout.startupshortsreset +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint import app.revanced.patcher.literal import app.revanced.patcher.methodCall @@ -16,8 +17,8 @@ internal val userWasInShortsAlternativeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Ljava/lang/Object;") instructions( - methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z"), - methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z"), + checkCast("Ljava/lang/Boolean;"), + methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z", maxAfter = 0), opcode(Opcode.MOVE_RESULT, maxAfter = 0), string("userIsInShorts: ", maxAfter = 5) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index f36fe42f1d..029b7904e1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -162,8 +162,9 @@ internal val customPlaybackSpeedPatch = bytecodePatch( if (is_19_25_or_greater) { disableFastForwardNoticeFingerprint.method.apply { + val floatLiteral = 2.0f.toRawBits() val index = indexOfFirstInstructionOrThrow { - (this as? NarrowLiteralInstruction)?.narrowLiteral == 2.0f.toRawBits() + (this as? NarrowLiteralInstruction)?.narrowLiteral == floatLiteral } val register = getInstruction(index).registerA From 2616ce24ad9ca1f3e9973ea654545f12380d4db2 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:36:59 +0200 Subject: [PATCH 54/64] refactor --- patches/api/patches.api | 8 ++- .../misc/mapping/ResourceMappingPatch.kt | 4 +- .../speed/custom/CustomPlaybackSpeedPatch.kt | 11 ++-- .../kotlin/app/revanced/util/BytecodeUtils.kt | 52 ++++++++++++++++++- 4 files changed, 63 insertions(+), 12 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 154da892f4..b365d82e80 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -596,8 +596,8 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatch public static final fun get (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)J public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; public static final fun getResourceMappings ()Ljava/util/List; - public static final fun resourceLiteral (Ljava/lang/String;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralWideFilter; - public static synthetic fun resourceLiteral$default (Ljava/lang/String;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralWideFilter; + public static final fun resourceLiteral (Ljava/lang/String;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralFilter; + public static synthetic fun resourceLiteral$default (Ljava/lang/String;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralFilter; } public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt { @@ -1481,7 +1481,11 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun indexOfFirstInstructionReversedOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/Integer;Lkotlin/jvm/functions/Function1;)I public static synthetic fun indexOfFirstInstructionReversedOrThrow$default (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/Integer;Lcom/android/tools/smali/dexlib2/Opcode;ILjava/lang/Object;)I public static synthetic fun indexOfFirstInstructionReversedOrThrow$default (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/Integer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)I + public static final fun indexOfFirstLiteralInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;D)I + public static final fun indexOfFirstLiteralInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;F)I public static final fun indexOfFirstLiteralInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;J)I + public static final fun indexOfFirstLiteralInstructionOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;D)I + public static final fun indexOfFirstLiteralInstructionOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;F)I public static final fun indexOfFirstLiteralInstructionOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;J)I public static final fun indexOfFirstLiteralInstructionReversed (Lcom/android/tools/smali/dexlib2/iface/Method;J)I public static final fun indexOfFirstLiteralInstructionReversedOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;J)I diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index ac12f50c7b..ca856f71f7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.shared.misc.mapping import app.revanced.patcher.InstructionFilter.Companion.METHOD_MAX_INSTRUCTIONS -import app.revanced.patcher.LiteralWideFilter +import app.revanced.patcher.LiteralFilter import app.revanced.patcher.literal import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.resourcePatch @@ -16,7 +16,7 @@ lateinit var resourceMappings: List private set /** - * Identical to [LiteralWideFilter] except uses a decoded resource literal value. + * Identical to [LiteralFilter] except uses a decoded resource literal value. * * Any patch with fingerprints of this filter must * also declare [resourceMappingPatch] as a dependency. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index 029b7904e1..1c1eb4fd7b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -95,11 +95,11 @@ internal val customPlaybackSpeedPatch = bytecodePatch( // Override the min/max speeds that can be used. speedLimiterFingerprint.method.apply { - val limitMinIndex = indexOfFirstLiteralInstructionOrThrow(0.25f.toRawBits().toLong()) - var limitMaxIndex = indexOfFirstLiteralInstruction(2.0f.toRawBits().toLong()) + val limitMinIndex = indexOfFirstLiteralInstructionOrThrow(0.25f) + var limitMaxIndex = indexOfFirstLiteralInstruction(2.0f) // Newer targets have 4x max speed. if (limitMaxIndex < 0) { - limitMaxIndex = indexOfFirstLiteralInstructionOrThrow(4.0f.toRawBits().toLong()) + limitMaxIndex = indexOfFirstLiteralInstructionOrThrow(4.0f) } val limitMinRegister = getInstruction(limitMinIndex).registerA @@ -162,10 +162,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( if (is_19_25_or_greater) { disableFastForwardNoticeFingerprint.method.apply { - val floatLiteral = 2.0f.toRawBits() - val index = indexOfFirstInstructionOrThrow { - (this as? NarrowLiteralInstruction)?.narrowLiteral == floatLiteral - } + val index = indexOfFirstLiteralInstruction(2.0f) val register = getInstruction(index).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index e4828b8b76..c3855edafa 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -145,7 +145,57 @@ fun Method.indexOfFirstLiteralInstruction(literal: Long) = implementation?.let { */ fun Method.indexOfFirstLiteralInstructionOrThrow(literal: Long): Int { val index = indexOfFirstLiteralInstruction(literal) - if (index < 0) throw PatchException("Could not find literal value: $literal") + if (index < 0) throw PatchException("Could not find literal long: $literal") + return index +} + +/** + * Find the index of the first literal instruction with the given float value. + * + * @return the first literal instruction with the value, or -1 if not found. + * @see indexOfFirstLiteralInstructionOrThrow + */ +fun Method.indexOfFirstLiteralInstruction(literal: Float) = implementation?.let { + val floatBits = literal.toRawBits().toLong() + it.instructions.indexOfFirst { instruction -> + (instruction as? WideLiteralInstruction)?.wideLiteral == floatBits + } +} ?: -1 + +/** + * Find the index of the first literal instruction with the given float value, + * or throw an exception if not found. + * + * @return the first literal instruction with the value, or throws [PatchException] if not found. + */ +fun Method.indexOfFirstLiteralInstructionOrThrow(literal: Float): Int { + val index = indexOfFirstLiteralInstruction(literal) + if (index < 0) throw PatchException("Could not find literal float: $literal") + return index +} + +/** + * Find the index of the first literal instruction with the given double value. + * + * @return the first literal instruction with the value, or -1 if not found. + * @see indexOfFirstLiteralInstructionOrThrow + */ +fun Method.indexOfFirstLiteralInstruction(literal: Double) = implementation?.let { + val floatBits = literal.toRawBits().toLong() + it.instructions.indexOfFirst { instruction -> + (instruction as? WideLiteralInstruction)?.wideLiteral == floatBits + } +} ?: -1 + +/** + * Find the index of the first literal instruction with the given double value, + * or throw an exception if not found. + * + * @return the first literal instruction with the value, or throws [PatchException] if not found. + */ +fun Method.indexOfFirstLiteralInstructionOrThrow(literal: Double): Int { + val index = indexOfFirstLiteralInstruction(literal) + if (index < 0) throw PatchException("Could not find literal double: $literal") return index } From b31b0eb39f1abdf7794fdaf97912c0b8ec9c4056 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 18 Feb 2025 22:11:50 +0200 Subject: [PATCH 55/64] refactor: Use map instead of list to lookup resource ids --- patches/api/patches.api | 3 +- .../misc/mapping/ResourceMappingPatch.kt | 52 +++++++++++-------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index b365d82e80..93b49ccfff 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -593,9 +593,8 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceElement { } public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { - public static final fun get (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)J + public static final fun getResourceId (Ljava/lang/String;Ljava/lang/String;)J public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun getResourceMappings ()Ljava/util/List; public static final fun resourceLiteral (Ljava/lang/String;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralFilter; public static synthetic fun resourceLiteral$default (Ljava/lang/String;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralFilter; } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index ca856f71f7..d47c26d3cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -7,13 +7,17 @@ import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.resourcePatch import org.w3c.dom.Element import java.lang.Runtime -import java.util.Collections import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -// TODO: Probably renaming the patch/this is a good idea. -lateinit var resourceMappings: List - private set +private lateinit var resourceMappings: Map + +/** + * @return A resource id of the given resource type and name. + * @throws PatchException if the resource is not found. + */ +fun getResourceId(type: String, name: String) = resourceMappings[type + name]?.id + ?: throw PatchException("Could not find resource type: $type name: $name") /** * Identical to [LiteralFilter] except uses a decoded resource literal value. @@ -25,30 +29,34 @@ fun resourceLiteral( type: String, name: String, maxBefore: Int = METHOD_MAX_INSTRUCTIONS, -) = literal({ resourceMappings[type, name] }, null, maxBefore) +) = literal({ getResourceId(type, name) }, null, maxBefore) val resourceMappingPatch = resourcePatch { - val resourceMappings = Collections.synchronizedList(mutableListOf()) - execute { + val mappings : Map val threadCount = Runtime.getRuntime().availableProcessors() val threadPoolExecutor = Executors.newFixedThreadPool(threadCount) // Save the file in memory to concurrently read from it. val resourceXmlFile = get("res/values/public.xml").readBytes() - for (threadIndex in 0 until threadCount) { - threadPoolExecutor.execute thread@{ - document(resourceXmlFile.inputStream()).use { document -> - - val resources = document.documentElement.childNodes - val resourcesLength = resources.length - val jobSize = resourcesLength / threadCount - + document(resourceXmlFile.inputStream()).use { document -> + // Need to synchronize while building the map, but after it's built + // no synchronization is needed. Don't use a synchronized map and + // instead only synchronize while building. + val lock = Object() + val resources = document.documentElement.childNodes + val resourcesLength = resources.length + val jobSize = resourcesLength / threadCount + mappings = HashMap(2 * resourcesLength) + + for (threadIndex in 0 until threadCount) { + threadPoolExecutor.execute thread@{ val batchStart = jobSize * threadIndex val batchEnd = jobSize * (threadIndex + 1) - element@ for (i in batchStart until batchEnd) { + + for (i in batchStart until batchEnd) { // Prevent out of bounds. if (i >= resourcesLength) return@thread @@ -62,7 +70,11 @@ val resourceMappingPatch = resourcePatch { val id = node.getAttribute("id").substring(2).toLong(16) - resourceMappings.add(ResourceElement(typeAttribute, nameAttribute, id)) + val resourceElement = ResourceElement(typeAttribute, nameAttribute, id) + + synchronized(lock) { + mappings[typeAttribute + nameAttribute] = resourceElement + } } } } @@ -70,12 +82,8 @@ val resourceMappingPatch = resourcePatch { threadPoolExecutor.also { it.shutdown() }.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS) - app.revanced.patches.shared.misc.mapping.resourceMappings = resourceMappings + resourceMappings = mappings } } -operator fun List.get(type: String, name: String) = resourceMappings.firstOrNull { - it.type == type && it.name == name -}?.id ?: throw PatchException("Could not find resource type: $type name: $name") - data class ResourceElement internal constructor(val type: String, val name: String, val id: Long) From 8421499a7448995f9375fd2cd78b7eda8f5c8cf2 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 18 Feb 2025 22:12:33 +0200 Subject: [PATCH 56/64] refactor: Use map resource lookup --- .../spotify/navbar/PremiumNavbarTabPatch.kt | 5 ++-- .../links/ChangeLinkSharingDomainPatch.kt | 5 ++-- .../youtube/ad/general/HideAdsPatch.kt | 7 +++--- .../endscreencards/HideEndscreenCardsPatch.kt | 5 ++-- .../hide/general/HideLayoutComponentsPatch.kt | 23 +++++++++---------- .../hide/infocards/HideInfoCardsPatch.kt | 7 +++--- .../hide/shorts/HideShortsComponentsPatch.kt | 7 +++--- .../DisableSuggestedVideoEndScreenPatch.kt | 7 +++--- .../layout/miniplayer/MiniplayerPatch.kt | 15 ++++++------ .../CustomPlayerOverlayOpacityPatch.kt | 7 +++--- .../BackgroundPlaybackPatch.kt | 5 ++-- .../playercontrols/PlayerControlsPatch.kt | 7 +++--- .../RestoreOldVideoQualityMenuPatch.kt | 11 ++++----- .../kotlin/app/revanced/util/BytecodeUtils.kt | 5 ++-- 14 files changed, 51 insertions(+), 65 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt index c633f33fec..4f194c582e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt @@ -3,9 +3,8 @@ package app.revanced.patches.spotify.navbar import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings internal var premiumTabId = -1L private set @@ -14,7 +13,7 @@ private val premiumNavbarTabResourcePatch = resourcePatch { dependsOn(resourceMappingPatch) execute { - premiumTabId = resourceMappings["id", "premium_tab"] + premiumTabId = getResourceId("id", "premium_tab") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt index 4e42200ade..c5026315d4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt @@ -6,9 +6,8 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.stringOption -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.twitter.misc.extension.sharedExtensionPatch import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @@ -21,7 +20,7 @@ internal val changeLinkSharingDomainResourcePatch = resourcePatch { dependsOn(resourceMappingPatch) execute { - tweetShareLinkTemplateId = resourceMappings["string", "tweet_share_link"] + tweetShareLinkTemplateId = getResourceId("string", "tweet_share_link") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt index 3e634e1624..ae6cc33bd0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt @@ -7,9 +7,8 @@ import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.fix.verticalscroll.verticalScrollPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.ad.getpremium.hideGetPremiumPatch import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fixBackToExitGesturePatch @@ -59,8 +58,8 @@ private val hideAdsResourcePatch = resourcePatch { addLithoFilter("Lapp/revanced/extension/youtube/patches/components/AdsFilter;") - adAttributionId = resourceMappings["id", "ad_attribution"] - fullScreenEngagementAdContainer = resourceMappings["id", "fullscreen_engagement_ad_container"] + adAttributionId = getResourceId("id", "ad_attribution") + fullScreenEngagementAdContainer = getResourceId("id", "fullscreen_engagement_ad_container") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt index 3f51e9d511..155e7d7c05 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt @@ -6,9 +6,8 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen @@ -36,7 +35,7 @@ private val hideEndscreenCardsResourcePatch = resourcePatch { SwitchPreference("revanced_hide_endscreen_cards"), ) - fun idOf(name: String) = resourceMappings["layout", "endscreen_element_layout_$name"] + fun idOf(name: String) = getResourceId("layout", "endscreen_element_layout_$name") layoutCircle = idOf("circle") layoutIcon = idOf("icon") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index a0ef7bebba..bf7238a53a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -13,9 +13,8 @@ import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch @@ -48,30 +47,30 @@ private val hideLayoutComponentsResourcePatch = resourcePatch { dependsOn(resourceMappingPatch) execute { - albumCardId = resourceMappings[ + albumCardId = getResourceId( "layout", "album_card", - ] + ) - crowdfundingBoxId = resourceMappings[ + crowdfundingBoxId = getResourceId( "layout", "donation_companion", - ] + ) - relatedChipCloudMarginId = resourceMappings[ + relatedChipCloudMarginId = getResourceId( "layout", "related_chip_cloud_reduced_margins", - ] + ) - filterBarHeightId = resourceMappings[ + filterBarHeightId = getResourceId( "dimen", "filter_bar_height", - ] + ) - barContainerHeightId = resourceMappings[ + barContainerHeightId = getResourceId( "dimen", "bar_container_height", - ] + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index c3cbee9639..2b98425d8b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -8,9 +8,8 @@ import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter @@ -37,10 +36,10 @@ private val hideInfocardsResourcePatch = resourcePatch { SwitchPreference("revanced_hide_info_cards"), ) - drawerResourceId = resourceMappings[ + drawerResourceId = getResourceId( "id", "info_cards_drawer_header", - ] + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 76786063b7..f0fc781a8e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -9,9 +9,8 @@ import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch @@ -132,10 +131,10 @@ private val hideShortsComponentsResourcePatch = resourcePatch { } } - reelPlayerRightPivotV2Size = resourceMappings[ + reelPlayerRightPivotV2Size = getResourceId( "dimen", "reel_player_right_pivot_v2_size", - ] + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt index a3ecc84ea5..f3f4d47f9a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt @@ -6,9 +6,8 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen @@ -32,10 +31,10 @@ internal val disableSuggestedVideoEndScreenResourcePatch = resourcePatch { SwitchPreference("revanced_disable_suggested_video_end_screen"), ) - sizeAdjustableLiteAutoNavOverlay = resourceMappings[ + sizeAdjustableLiteAutoNavOverlay = getResourceId( "layout", "size_adjustable_lite_autonav_overlay", - ] + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 86f2d970a5..ee0b0b44d6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -13,9 +13,8 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.* @@ -47,22 +46,22 @@ private val miniplayerResourcePatch = resourcePatch { execute { // Resource id is not used during patching, but is used by extension. // Verify the resource is present while patching. - resourceMappings[ + getResourceId( "id", "modern_miniplayer_subtitle_text", - ] + ) // Only required for exactly 19.16 if (!is_19_17_or_greater) { - ytOutlinePictureInPictureWhite24 = resourceMappings[ + ytOutlinePictureInPictureWhite24 = getResourceId( "drawable", "yt_outline_picture_in_picture_white_24", - ] + ) - ytOutlineXWhite24 = resourceMappings[ + ytOutlineXWhite24 = getResourceId( "drawable", "yt_outline_x_white_24", - ] + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt index 98cb3eb00b..52378615be 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt @@ -6,9 +6,8 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.settings.PreferenceScreen @@ -33,10 +32,10 @@ private val customPlayerOverlayOpacityResourcePatch = resourcePatch { TextPreference("revanced_player_overlay_opacity", inputType = InputType.NUMBER), ) - scrimOverlayId = resourceMappings[ + scrimOverlayId = getResourceId( "id", "scrim_overlay", - ] + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt index a817b68da7..36bdf010af 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt @@ -6,9 +6,8 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch @@ -27,7 +26,7 @@ private val backgroundPlaybackResourcePatch = resourcePatch { dependsOn(resourceMappingPatch, addResourcesPatch) execute { - prefBackgroundAndOfflineCategoryId = resourceMappings["string", "pref_background_and_offline_category"] + prefBackgroundAndOfflineCategoryId = getResourceId("string", "pref_background_and_offline_category") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt index 836ba870d5..b2aac43ab5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt @@ -8,9 +8,8 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.Document import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_35_or_greater @@ -61,8 +60,8 @@ val playerControlsResourcePatch = resourcePatch { execute { val targetResourceName = "youtube_controls_bottom_ui_container.xml" - heatseekerViewstub = resourceMappings["id", "heatseeker_viewstub"] - fullscreenButton = resourceMappings["id", "fullscreen_button"] + heatseekerViewstub = getResourceId("id", "heatseeker_viewstub") + fullscreenButton = getResourceId("id", "fullscreen_button") bottomTargetDocument = document("res/layout/$targetResourceName") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt index bddec94af2..11e95b6bab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt @@ -7,9 +7,8 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter @@ -40,15 +39,15 @@ private val restoreOldVideoQualityMenuResourcePatch = resourcePatch { ) // Used for the old type of the video quality menu. - videoQualityBottomSheetListFragmentTitle = resourceMappings[ + videoQualityBottomSheetListFragmentTitle = getResourceId( "layout", "video_quality_bottom_sheet_list_fragment_title", - ] + ) - videoQualityQuickMenuAdvancedMenuDescription = resourceMappings[ + videoQualityQuickMenuAdvancedMenuDescription = getResourceId( "string", "video_quality_quick_menu_advanced_menu_description", - ] + ) } } diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index c3855edafa..d41d70d8e5 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -11,9 +11,8 @@ import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.util.proxy.mutableTypes.MutableClass import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.Instruction @@ -104,7 +103,7 @@ internal fun MutableMethod.addInstructionsAtControlFlowLabel( * @see [indexOfFirstResourceIdOrThrow], [indexOfFirstLiteralInstructionReversed] */ fun Method.indexOfFirstResourceId(resourceName: String): Int { - val resourceId = resourceMappings["id", resourceName] + val resourceId = getResourceId("id", resourceName) return indexOfFirstLiteralInstruction(resourceId) } From 58ab98f7195bd7ea34f50705950821d32d56a38c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 18 Feb 2025 22:16:12 +0200 Subject: [PATCH 57/64] fix: Remove deprecated and non functional legacy code --- patches/api/patches.api | 40 ------------------- .../ChangeDataDirectoryLocationPatch.kt | 19 --------- .../permanentshuffle/Fingerprints.kt | 19 --------- .../permanentshuffle/PermanentShufflePatch.kt | 26 ------------ .../patches/nyx/misc/pro/Fingerprints.kt | 9 ----- .../patches/nyx/misc/pro/UnlockProPatch.kt | 20 ---------- .../fix/video/FixVideoDownloadsPatch.kt | 18 --------- .../shared/misc/settings/SettingsPatch.kt | 8 ---- .../patches/vsco/misc/pro/Fingerprints.kt | 11 ----- .../patches/vsco/misc/pro/UnlockProPatch.kt | 17 -------- .../windyapp/misc/unlockpro/Fingerprints.kt | 10 ----- .../windyapp/misc/unlockpro/UnlockProPatch.kt | 22 ---------- .../layout/tablet/EnableTabletLayoutPatch.kt | 9 ----- .../fix/playback/SpoofVideoStreamsPatch.kt | 9 ----- .../fix/playback/UserAgentClientSpoofPatch.kt | 9 ----- .../misc/playservice/VersionCheckPatch.kt | 12 ------ 16 files changed, 258 deletions(-) delete mode 100644 patches/src/main/kotlin/app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index 93b49ccfff..2401cc3b2d 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -56,10 +56,6 @@ public final class app/revanced/patches/all/misc/debugging/EnableAndroidDebuggin public static final fun getEnableAndroidDebuggingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatchKt { - public static final fun getChangeDataDirectoryLocationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/all/misc/directory/documentsprovider/ExportInternalDataDocumentsProviderPatchKt { public static final fun getExportInternalDataDocumentsProviderPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } @@ -288,10 +284,6 @@ public final class app/revanced/patches/music/interaction/permanentrepeat/Perman public static final fun getPermanentRepeatPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatchKt { - public static final fun getPermanentShufflePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/music/layout/compactheader/HideCategoryBarKt { public static final fun getHideCategoryBar ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -348,10 +340,6 @@ public final class app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatchKt { public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/nyx/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatchKt { public static final fun getFixCrashPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -515,10 +503,6 @@ public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/ public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatchKt { - public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatchKt { public static final fun getDisableScreenshotPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -601,7 +585,6 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatch public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt { public static final fun settingsPatch (Ljava/util/List;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun settingsPatch (Lkotlin/Pair;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; public static synthetic fun settingsPatch$default (Ljava/util/List;Ljava/util/Set;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; } @@ -1021,10 +1004,6 @@ public final class app/revanced/patches/twitter/misc/links/SanitizeSharingLinksP public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatchKt { public static final fun getFirebaseGetCertPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1033,10 +1012,6 @@ public final class app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnloc public static final fun getPromoCodeUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/ad/general/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1215,10 +1190,6 @@ public final class app/revanced/patches/youtube/layout/startupshortsreset/Disabl public static final fun getDisableResumingShortsOnStartupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatchKt { - public static final fun getEnableTabletLayoutPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/theme/LithoColorHookPatchKt { public static final fun getLithoColorHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getLithoColorOverrideHook ()Lkotlin/jvm/functions/Function2; @@ -1264,14 +1235,6 @@ public final class app/revanced/patches/youtube/misc/extension/SharedExtensionPa public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatchKt { - public static final fun getSpoofVideoStreamsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatchKt { - public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/misc/fix/playbackspeed/FIxPlaybackSpeedWhilePlayingPatchKt { public static final fun getFixPlaybackSpeedWhilePlayingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1322,9 +1285,6 @@ public final class app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPa public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPatchKt { public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun is_19_03_or_greater ()Z - public static final fun is_19_04_or_greater ()Z - public static final fun is_19_16_or_greater ()Z public static final fun is_19_17_or_greater ()Z public static final fun is_19_18_or_greater ()Z public static final fun is_19_23_or_greater ()Z diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatch.kt deleted file mode 100644 index 8046c11fc3..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatch.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.revanced.patches.all.misc.directory - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.all.misc.directory.documentsprovider.exportInternalDataDocumentsProviderPatch - -@Suppress("unused") -@Deprecated( - "Superseded by internalDataDocumentsProviderPatch", - ReplaceWith("internalDataDocumentsProviderPatch"), -) -val changeDataDirectoryLocationPatch = bytecodePatch( - // name = "Change data directory location", - description = "Changes the data directory in the application from " + - "the app internal storage directory to /sdcard/android/data accessible by root-less devices." + - "Using this patch can cause unexpected issues with some apps.", - use = false, -) { - dependsOn(exportInternalDataDocumentsProviderPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt deleted file mode 100644 index 78ed24b762..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.revanced.patches.music.interaction.permanentshuffle - -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint - -internal val disableShuffleFingerprint by fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - opcodes( - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.SGET_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL - ) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatch.kt deleted file mode 100644 index e27749495b..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatch.kt +++ /dev/null @@ -1,26 +0,0 @@ -package app.revanced.patches.music.interaction.permanentshuffle - -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch no longer works and will be removed in the future.") -@Suppress("unused") -val permanentShufflePatch = bytecodePatch( - description = "Permanently remember your shuffle preference " + - "even if the playlist ends or another track is played.", - use = false, -) { - compatibleWith( - "com.google.android.apps.youtube.music"( - "6.45.54", - "6.51.53", - "7.01.53", - "7.02.52", - "7.03.52", - ), - ) - - execute { - disableShuffleFingerprint.method.addInstruction(0, "return-void") - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt deleted file mode 100644 index 85b5bddb30..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.nyx.misc.pro - -import app.revanced.patcher.fingerprint - -internal val checkProFingerprint by fingerprint { - custom { method, classDef -> - classDef.endsWith("BillingManager;") && method.name == "isProVersion" - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt deleted file mode 100644 index 179e745e08..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt +++ /dev/null @@ -1,20 +0,0 @@ -package app.revanced.patches.nyx.misc.pro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch will be removed in the future.") -@Suppress("unused") -val unlockProPatch = bytecodePatch { - compatibleWith("com.awedea.nyx") - - execute { - checkProFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch.kt deleted file mode 100644 index 28ad4a0dbe..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch.kt +++ /dev/null @@ -1,18 +0,0 @@ -package app.revanced.patches.reddit.customclients.syncforreddit.fix.video - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated( - message = "Patch was move to a different package", - ReplaceWith("app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.video.fixVideoDownloadsPatch") -) -@Suppress("unused") -val fixVideoDownloadsPatch = bytecodePatch { - dependsOn(app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.video.fixVideoDownloadsPatch) - - compatibleWith( - "com.laurencedawson.reddit_sync", - "com.laurencedawson.reddit_sync.pro", - "com.laurencedawson.reddit_sync.dev", - ) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt index d6d9df94cc..6566992957 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt @@ -6,20 +6,12 @@ import app.revanced.patches.all.misc.resources.addResource import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.BasePreference -import app.revanced.patches.shared.misc.settings.preference.IntentPreference import app.revanced.util.ResourceGroup import app.revanced.util.copyResources import app.revanced.util.getNode import app.revanced.util.insertFirst import org.w3c.dom.Node -// TODO: Delete this on next major version bump. -@Deprecated("Use non deprecated settings patch function") -fun settingsPatch ( - rootPreference: Pair, - preferences: Set, -) = settingsPatch(listOf(rootPreference), preferences) - /** * A resource patch that adds settings to a settings fragment. * diff --git a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt deleted file mode 100644 index e0d6679c7f..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.vsco.misc.pro - -import app.revanced.patcher.fingerprint - -internal val revCatSubscriptionFingerprint by fingerprint { - returns("V") - strings("use_debug_subscription_settings") - custom { _, classDef -> - classDef.endsWith("/RevCatSubscriptionSettingsRepository;") - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt deleted file mode 100644 index be0278dd9e..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt +++ /dev/null @@ -1,17 +0,0 @@ -package app.revanced.patches.vsco.misc.pro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch is deprecated because it does not work anymore and will be removed in the future.") -@Suppress("unused") -val unlockProPatch = bytecodePatch( - description = "Unlocks pro features.", -) { - compatibleWith("com.vsco.cam"("345")) - - execute { - // Set isSubscribed to true. - revCatSubscriptionFingerprint.method.addInstruction(0, "const p1, 0x1") - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt deleted file mode 100644 index 997c0ec00c..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.windyapp.misc.unlockpro - -import app.revanced.patcher.fingerprint - -internal val checkProFingerprint by fingerprint { - returns("I") - custom { method, classDef -> - classDef.endsWith("RawUserData;") && method.name == "isPro" - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch.kt deleted file mode 100644 index c0323c72ed..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch.kt +++ /dev/null @@ -1,22 +0,0 @@ -package app.revanced.patches.windyapp.misc.unlockpro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch no longer works and will be removed in the future.") -@Suppress("unused") -val unlockProPatch = bytecodePatch( - description = "Unlocks all pro features.", -) { - compatibleWith("co.windyapp.android") - - execute { - checkProFingerprint.method.addInstructions( - 0, - """ - const/16 v0, 0x1 - return v0 - """, - ) - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt deleted file mode 100644 index c04f5e99c7..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.layout.tablet - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.layout.formfactor.changeFormFactorPatch - -@Deprecated("Use 'Change form factor' instead.") -val enableTabletLayoutPatch = bytecodePatch { - dependsOn(changeFormFactorPatch) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt deleted file mode 100644 index 89e7cc08f8..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.misc.fix.playback - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Use app.revanced.patches.youtube.misc.spoof.spoofVideoStreamsPatch instead.") -@Suppress("unused") -val spoofVideoStreamsPatch = bytecodePatch { - dependsOn(app.revanced.patches.youtube.misc.spoof.spoofVideoStreamsPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt deleted file mode 100644 index eb4c9492be..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.misc.fix.playback - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Use app.revanced.patches.youtube.misc.spoof.userAgentClientSpoofPatch instead.") -@Suppress("unused") -val userAgentClientSpoofPatch = bytecodePatch { - dependsOn(app.revanced.patches.youtube.misc.spoof.userAgentClientSpoofPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index 8dc3b83b5a..f02b377cfd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -5,15 +5,6 @@ package app.revanced.patches.youtube.misc.playservice import app.revanced.patcher.patch.resourcePatch import app.revanced.util.findElementByAttributeValueOrThrow -@Deprecated("19.16.39 is the lowest supported version") -var is_19_03_or_greater = false - private set -@Deprecated("19.16.39 is the lowest supported version") -var is_19_04_or_greater = false - private set -@Deprecated("19.16.39 is the lowest supported version") -var is_19_16_or_greater = false - private set var is_19_17_or_greater = false private set var is_19_18_or_greater = false @@ -67,9 +58,6 @@ val versionCheckPatch = resourcePatch( } // All bug fix releases always seem to use the same play store version as the minor version. - is_19_03_or_greater = 240402000 <= playStoreServicesVersion - is_19_04_or_greater = 240502000 <= playStoreServicesVersion - is_19_16_or_greater = 241702000 <= playStoreServicesVersion is_19_17_or_greater = 241802000 <= playStoreServicesVersion is_19_18_or_greater = 241902000 <= playStoreServicesVersion is_19_23_or_greater = 242402000 <= playStoreServicesVersion From f82c817d32d062f318541fc7896d7da223fc6241 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 18 Feb 2025 22:18:52 +0200 Subject: [PATCH 58/64] refactor: Add method to check if a resource exists --- patches/api/patches.api | 1 + .../patches/shared/misc/mapping/ResourceMappingPatch.kt | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/patches/api/patches.api b/patches/api/patches.api index 2401cc3b2d..422b8bd73f 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -579,6 +579,7 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceElement { public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { public static final fun getResourceId (Ljava/lang/String;Ljava/lang/String;)J public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun hasResourceId (Ljava/lang/String;Ljava/lang/String;)Z public static final fun resourceLiteral (Ljava/lang/String;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralFilter; public static synthetic fun resourceLiteral$default (Ljava/lang/String;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralFilter; } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index d47c26d3cf..9e22573370 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -19,6 +19,11 @@ private lateinit var resourceMappings: Map fun getResourceId(type: String, name: String) = resourceMappings[type + name]?.id ?: throw PatchException("Could not find resource type: $type name: $name") +/** + * @return If the resource exists. + */ +fun hasResourceId(type: String, name: String) = resourceMappings[type + name] != null + /** * Identical to [LiteralFilter] except uses a decoded resource literal value. * From fed59e1e90bc7045cb163b2d536dcda507b5300b Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 19 Feb 2025 08:44:37 +0200 Subject: [PATCH 59/64] refactor: Remove multi-threaded resource reading as it's faster without this (130ms with thread executor, 95ms without). --- patches/api/patches.api | 2 + .../misc/mapping/ResourceMappingPatch.kt | 67 +++++++------------ 2 files changed, 26 insertions(+), 43 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 422b8bd73f..15a571e0a6 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -563,6 +563,7 @@ public final class app/revanced/patches/shared/misc/hex/Replacement$Companion { } public final class app/revanced/patches/shared/misc/mapping/ResourceElement { + public fun (Ljava/lang/String;Ljava/lang/String;J)V public final fun component1 ()Ljava/lang/String; public final fun component2 ()Ljava/lang/String; public final fun component3 ()J @@ -577,6 +578,7 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceElement { } public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { + public static final fun getResourceElements ()Ljava/util/Collection; public static final fun getResourceId (Ljava/lang/String;Ljava/lang/String;)J public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; public static final fun hasResourceId (Ljava/lang/String;Ljava/lang/String;)Z diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index 9e22573370..a8c9ed998a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -6,11 +6,15 @@ import app.revanced.patcher.literal import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.resourcePatch import org.w3c.dom.Element -import java.lang.Runtime -import java.util.concurrent.Executors -import java.util.concurrent.TimeUnit +import java.util.Collections -private lateinit var resourceMappings: Map +data class ResourceElement(val type: String, val name: String, val id: Long) + +private lateinit var resourceMappings: MutableMap + +private fun setResourceId(type: String, name: String, id: Long) { + resourceMappings[type + name] = ResourceElement(type, name, id) +} /** * @return A resource id of the given resource type and name. @@ -19,6 +23,11 @@ private lateinit var resourceMappings: Map fun getResourceId(type: String, name: String) = resourceMappings[type + name]?.id ?: throw PatchException("Could not find resource type: $type name: $name") +/** + * @return All resource elements. If a single resource id is needed instead use [getResourceId]. + */ +fun getResourceElements() = Collections.unmodifiableCollection(resourceMappings.values) + /** * @return If the resource exists. */ @@ -39,56 +48,28 @@ fun resourceLiteral( val resourceMappingPatch = resourcePatch { execute { - val mappings : Map - val threadCount = Runtime.getRuntime().availableProcessors() - val threadPoolExecutor = Executors.newFixedThreadPool(threadCount) - - // Save the file in memory to concurrently read from it. + val start = System.currentTimeMillis() val resourceXmlFile = get("res/values/public.xml").readBytes() document(resourceXmlFile.inputStream()).use { document -> - // Need to synchronize while building the map, but after it's built - // no synchronization is needed. Don't use a synchronized map and - // instead only synchronize while building. - val lock = Object() val resources = document.documentElement.childNodes val resourcesLength = resources.length - val jobSize = resourcesLength / threadCount - mappings = HashMap(2 * resourcesLength) + resourceMappings = HashMap(2 * resourcesLength) - for (threadIndex in 0 until threadCount) { - threadPoolExecutor.execute thread@{ - val batchStart = jobSize * threadIndex - val batchEnd = jobSize * (threadIndex + 1) + for (i in 0 until resourcesLength) { + val node = resources.item(i) + if (node !is Element || node.nodeName != "public") continue - for (i in batchStart until batchEnd) { - // Prevent out of bounds. - if (i >= resourcesLength) return@thread + val nameAttribute = node.getAttribute("name") + if (nameAttribute.startsWith("APKTOOL")) continue - val node = resources.item(i) - if (node !is Element) continue + val typeAttribute = node.getAttribute("type") + val id = node.getAttribute("id").substring(2).toLong(16) - val nameAttribute = node.getAttribute("name") - val typeAttribute = node.getAttribute("type") - - if (node.nodeName != "public" || nameAttribute.startsWith("APKTOOL")) continue - - val id = node.getAttribute("id").substring(2).toLong(16) - - val resourceElement = ResourceElement(typeAttribute, nameAttribute, id) - - synchronized(lock) { - mappings[typeAttribute + nameAttribute] = resourceElement - } - } - } + setResourceId(typeAttribute, nameAttribute, id) } } - threadPoolExecutor.also { it.shutdown() }.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS) - - resourceMappings = mappings + println("time: " + (System.currentTimeMillis() - start)) } } - -data class ResourceElement internal constructor(val type: String, val name: String, val id: Long) From 3b64bf2650689a2f62931b2f0c7b330939946780 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 19 Feb 2025 08:44:54 +0200 Subject: [PATCH 60/64] fix: Remove debugging code --- .../patches/shared/misc/mapping/ResourceMappingPatch.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index a8c9ed998a..3f9ee37242 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -48,7 +48,6 @@ fun resourceLiteral( val resourceMappingPatch = resourcePatch { execute { - val start = System.currentTimeMillis() val resourceXmlFile = get("res/values/public.xml").readBytes() document(resourceXmlFile.inputStream()).use { document -> @@ -69,7 +68,5 @@ val resourceMappingPatch = resourcePatch { setResourceId(typeAttribute, nameAttribute, id) } } - - println("time: " + (System.currentTimeMillis() - start)) } } From 0033e8dcb943b1c4192e23f367e298c132057a69 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 20 Feb 2025 12:09:14 +0200 Subject: [PATCH 61/64] refactor: Simplify --- .../hide/shorts/HideShortsComponentsPatch.kt | 9 +-- .../ReturnYouTubeDislikePatch.kt | 25 +++----- .../layout/shortsplayer/Fingerprints.kt | 23 ++++--- .../OpenShortsInRegularPlayerPatch.kt | 34 +++++----- .../misc/playercontrols/Fingerprints.kt | 38 ++++++----- .../playercontrols/PlayerControlsPatch.kt | 63 +++++++------------ 6 files changed, 86 insertions(+), 106 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index f0fc781a8e..7f2d154af0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -27,8 +27,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -private var reelPlayerRightPivotV2Size = -1L - internal val hideShortsAppShortcutOption = booleanOption( key = "hideShortsAppShortcut", default = false, @@ -130,11 +128,6 @@ private val hideShortsComponentsResourcePatch = resourcePatch { shortsItem.parentNode.removeChild(shortsItem) } } - - reelPlayerRightPivotV2Size = getResourceId( - "dimen", - "reel_player_right_pivot_v2_size", - ) } } @@ -182,7 +175,7 @@ val hideShortsComponentsPatch = bytecodePatch( addLithoFilter(FILTER_CLASS_DESCRIPTOR) forEachLiteralValueInstruction( - reelPlayerRightPivotV2Size, + getResourceId("dimen", "reel_player_right_pivot_v2_size") ) { literalInstructionIndex -> val targetIndex = indexOfFirstInstructionOrThrow(literalInstructionIndex) { getReference()?.name == "getDimensionPixelSize" diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 1afd256aed..26b6fb6f39 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -106,7 +106,7 @@ val returnYouTubeDislikePatch = bytecodePatch( // region Hook code for creation and cached lookup of text Spans. // Alternatively the hook can be made at tht it fails to update the Span when the user dislikes, - // // since the underlying (likes only) tee creation of Spans in TextComponentSpec, + // since the underlying (likes only) tee creation of Spans in TextComponentSpec, // And it works in all situations excepxt did not change. // This hook handles all situations, as it's where the created Spans are stored and later reused. // Find the field name of the conversion context. @@ -225,14 +225,9 @@ val returnYouTubeDislikePatch = bytecodePatch( // region Hook rolling numbers. - // Do this last to allow patching old unsupported versions (if the user really wants), - // On older unsupported version this will fail to match and throw an exception, - // but everything will still work correctly anyway. - val dislikesIndex = rollingNumberSetterFingerprint.instructionMatches.last().index - rollingNumberSetterFingerprint.method.apply { val insertIndex = 1 - + val dislikesIndex = rollingNumberSetterFingerprint.instructionMatches.last().index val charSequenceInstanceRegister = getInstruction(0).registerA val charSequenceFieldReference = @@ -293,15 +288,15 @@ val returnYouTubeDislikePatch = bytecodePatch( ) } } + // The rolling number Span is missing styling since it's initially set as a String. // Modify the UI text view and use the styled like/dislike Span. // Initial TextView is set in this method. - val initiallyCreatedTextViewMethod = rollingNumberTextViewFingerprint.method // Videos less than 24 hours after uploaded, like counts will be updated in real time. // Whenever like counts are updated, TextView is set in this method. arrayOf( - initiallyCreatedTextViewMethod, + rollingNumberTextViewFingerprint.method, rollingNumberTextViewAnimationUpdateFingerprint.method, ).forEach { insertMethod -> insertMethod.apply { @@ -309,17 +304,15 @@ val returnYouTubeDislikePatch = bytecodePatch( getReference()?.name == "setText" } - val textViewRegister = - getInstruction(setTextIndex).registerC - val textSpanRegister = - getInstruction(setTextIndex).registerD + val textViewRegister = getInstruction(setTextIndex).registerC + val textSpanRegister = getInstruction(setTextIndex).registerD addInstructions( setTextIndex, """ - invoke-static {v$textViewRegister, v$textSpanRegister}, $EXTENSION_CLASS_DESCRIPTOR->updateRollingNumber(Landroid/widget/TextView;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; - move-result-object v$textSpanRegister - """, + invoke-static {v$textViewRegister, v$textSpanRegister}, $EXTENSION_CLASS_DESCRIPTOR->updateRollingNumber(Landroid/widget/TextView;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; + move-result-object v$textSpanRegister + """ ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt index e6198077b1..680d8c86a7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt @@ -2,6 +2,8 @@ package app.revanced.patches.youtube.layout.shortsplayer import app.revanced.patcher.fingerprint import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags /** @@ -14,6 +16,10 @@ internal val playbackStartFeatureFlagFingerprint by fingerprint { "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;", ) instructions( + methodCall( + definingClass = "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;", + returnType = "Ljava/lang/String;" + ), literal(45380134L) ) } @@ -30,11 +36,12 @@ internal val shortsPlaybackIntentLegacyFingerprint by fingerprint { "Z", "Ljava/util/Map;" ) - strings( + instructions( + methodCall(returnType = "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;"), // None of these strings are unique. - "com.google.android.apps.youtube.app.endpoint.flags", - "ReelWatchFragmentArgs", - "reels_fragment_descriptor" + string("com.google.android.apps.youtube.app.endpoint.flags"), + string("ReelWatchFragmentArgs"), + string("reels_fragment_descriptor") ) } @@ -47,10 +54,10 @@ internal val shortsPlaybackIntentFingerprint by fingerprint { "J", "Ljava/lang/String;" ) - strings( + instructions( // None of these strings are unique. - "com.google.android.apps.youtube.app.endpoint.flags", - "ReelWatchFragmentArgs", - "reels_fragment_descriptor" + string("com.google.android.apps.youtube.app.endpoint.flags"), + string("ReelWatchFragmentArgs"), + string("reels_fragment_descriptor") ) } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt index b1851ce138..fbdae9ee85 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt @@ -11,8 +11,6 @@ import app.revanced.patches.youtube.layout.player.fullscreen.openVideosFullscree import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater -import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint @@ -68,14 +66,11 @@ val openShortsInRegularPlayerPatch = bytecodePatch( ) // Find the obfuscated method name for PlaybackStartDescriptor.videoId() - val playbackStartVideoIdMethodName = playbackStartFeatureFlagFingerprint.method.let { - val stringMethodIndex = it.indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" - && reference.returnType == "Ljava/lang/String;" + val playbackStartVideoIdMethodName = playbackStartFeatureFlagFingerprint.let { + val stringMethodIndex = it.instructionMatches.first().index + it.method.let { + navigate(it).to(stringMethodIndex).stop().name } - - navigate(it).to(stringMethodIndex).stop().name } fun extensionInstructions(playbackStartRegister: Int, freeRegister: Int) = @@ -100,18 +95,17 @@ val openShortsInRegularPlayerPatch = bytecodePatch( """ ) } else { - shortsPlaybackIntentLegacyFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow { - getReference()?.returnType == - "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" - } - val freeRegister = getInstruction(index).registerC - val playbackStartRegister = getInstruction(index + 1).registerA + shortsPlaybackIntentLegacyFingerprint.let { + it.method.apply { + val index = it.instructionMatches.first().index + val freeRegister = getInstruction(index).registerC + val playbackStartRegister = getInstruction(index + 1).registerA - addInstructionsWithLabels( - index + 2, - extensionInstructions(playbackStartRegister, freeRegister) - ) + addInstructionsWithLabels( + index + 2, + extensionInstructions(playbackStartRegister, freeRegister) + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt index 608a675552..10fb649a69 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt @@ -1,19 +1,13 @@ package app.revanced.patches.youtube.misc.playercontrols +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode import app.revanced.patches.shared.misc.mapping.resourceLiteral -import app.revanced.util.containsLiteralInstruction import com.android.tools.smali.dexlib2.AccessFlags - -internal val playerTopControlsInflateFingerprint by fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - instructions( - resourceLiteral("id", "controls_layout_stub") - ) -} +import com.android.tools.smali.dexlib2.Opcode internal val playerControlsExtensionHookListenersExistFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) @@ -35,11 +29,24 @@ internal val playerControlsExtensionHookFingerprint by fingerprint { } } +internal val playerTopControlsInflateFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters() + instructions( + resourceLiteral("id", "controls_layout_stub"), + methodCall("Landroid/view/ViewStub;", "inflate"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) + ) +} + internal val playerBottomControlsInflateFingerprint by fingerprint { returns("Ljava/lang/Object;") parameters() instructions( - resourceLiteral("id", "bottom_ui_container_stub") + resourceLiteral("id", "bottom_ui_container_stub"), + methodCall("Landroid/view/ViewStub;", "inflate"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) ) } @@ -47,10 +54,11 @@ internal val overlayViewInflateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;") - custom { methodDef, _ -> - methodDef.containsLiteralInstruction(fullscreenButton) && - methodDef.containsLiteralInstruction(heatseekerViewstub) - } + instructions( + resourceLiteral("id", "heatseeker_viewstub"), + resourceLiteral("id", "fullscreen_button"), + checkCast("Landroid/widget/ImageView;") + ) } /** diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt index b2aac43ab5..5527ef5a2e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt @@ -39,14 +39,7 @@ internal lateinit var addTopControl: (String) -> Unit lateinit var addBottomControl: (String) -> Unit private set -internal var heatseekerViewstub = -1L - private set -internal var fullscreenButton = -1L - private set - val playerControlsResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - /** * The element to the left of the element being added. */ @@ -60,9 +53,6 @@ val playerControlsResourcePatch = resourcePatch { execute { val targetResourceName = "youtube_controls_bottom_ui_container.xml" - heatseekerViewstub = getResourceId("id", "heatseeker_viewstub") - fullscreenButton = getResourceId("id", "fullscreen_button") - bottomTargetDocument = document("res/layout/$targetResourceName") val bottomTargetElement: Node = bottomTargetDocument.getElementsByTagName( @@ -222,29 +212,28 @@ val playerControlsPatch = bytecodePatch( dependsOn( playerControlsResourcePatch, sharedExtensionPatch, + resourceMappingPatch // Used by fingerprints. ) execute { - fun MutableMethod.indexOfFirstViewInflateOrThrow() = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Landroid/view/ViewStub;" && - reference.name == "inflate" - } - - playerBottomControlsInflateFingerprint.method.apply { - inflateBottomControlMethod = this + playerBottomControlsInflateFingerprint.let { + it.method.apply { + inflateBottomControlMethod = this - val inflateReturnObjectIndex = indexOfFirstViewInflateOrThrow() + 1 - inflateBottomControlRegister = getInstruction(inflateReturnObjectIndex).registerA - inflateBottomControlInsertIndex = inflateReturnObjectIndex + 1 + val inflateReturnObjectIndex = it.instructionMatches.last().index + inflateBottomControlRegister = getInstruction(inflateReturnObjectIndex).registerA + inflateBottomControlInsertIndex = inflateReturnObjectIndex + 1 + } } - playerTopControlsInflateFingerprint.method.apply { - inflateTopControlMethod = this + playerTopControlsInflateFingerprint.let { + it.method.apply { + inflateTopControlMethod = this - val inflateReturnObjectIndex = indexOfFirstViewInflateOrThrow() + 1 - inflateTopControlRegister = getInstruction(inflateReturnObjectIndex).registerA - inflateTopControlInsertIndex = inflateReturnObjectIndex + 1 + val inflateReturnObjectIndex = it.instructionMatches.last().index + inflateTopControlRegister = getInstruction(inflateReturnObjectIndex).registerA + inflateTopControlInsertIndex = inflateReturnObjectIndex + 1 + } } visibilityMethod = controlsOverlayVisibilityFingerprint.match( @@ -253,21 +242,17 @@ val playerControlsPatch = bytecodePatch( // Hook the fullscreen close button. Used to fix visibility // when seeking and other situations. - overlayViewInflateFingerprint.method.apply { - val resourceIndex = indexOfFirstLiteralInstructionReversedOrThrow(fullscreenButton) + overlayViewInflateFingerprint.let { + it.method.apply { + val index = it.instructionMatches.last().index + val register = getInstruction(index).registerA - val index = indexOfFirstInstructionOrThrow(resourceIndex) { - opcode == Opcode.CHECK_CAST && - getReference()?.type == - "Landroid/widget/ImageView;" + addInstruction( + index + 1, + "invoke-static { v$register }, " + + "$EXTENSION_CLASS_DESCRIPTOR->setFullscreenCloseButton(Landroid/widget/ImageView;)V", + ) } - val register = getInstruction(index).registerA - - addInstruction( - index + 1, - "invoke-static { v$register }, " + - "$EXTENSION_CLASS_DESCRIPTOR->setFullscreenCloseButton(Landroid/widget/ImageView;)V", - ) } visibilityImmediateCallbacksExistMethod = playerControlsExtensionHookListenersExistFingerprint.method From 8e160f1d9f0144b920dfbc899b0476f94d302395 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 21 Feb 2025 09:10:58 +0200 Subject: [PATCH 62/64] refactor: Simplify --- .../patches/shared/misc/mapping/ResourceMappingPatch.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index 3f9ee37242..36b0ce0920 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -48,16 +48,14 @@ fun resourceLiteral( val resourceMappingPatch = resourcePatch { execute { - val resourceXmlFile = get("res/values/public.xml").readBytes() - - document(resourceXmlFile.inputStream()).use { document -> + document("res/values/public.xml").use { document -> val resources = document.documentElement.childNodes val resourcesLength = resources.length resourceMappings = HashMap(2 * resourcesLength) for (i in 0 until resourcesLength) { - val node = resources.item(i) - if (node !is Element || node.nodeName != "public") continue + val node = resources.item(i) as? Element ?: continue + if (node.nodeName != "public") continue val nameAttribute = node.getAttribute("name") if (nameAttribute.startsWith("APKTOOL")) continue From 2038f9739bd19f3aa00461bf3e2f0c2e2f8047e0 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 22 Feb 2025 12:39:44 +0200 Subject: [PATCH 63/64] Simplify with instruction filters --- .../layout/spoofappversion/Fingerprints.kt | 29 +++++------ .../spoofappversion/SpoofAppVersionPatch.kt | 51 +++++-------------- 2 files changed, 25 insertions(+), 55 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt index 1b60192c5f..855486174a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt @@ -1,28 +1,25 @@ package app.revanced.patches.youtube.layout.spoofappversion +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val toolBarButtonFingerprint = fingerprint { +internal val toolBarButtonFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Landroid/view/MenuItem;") - custom { method, _ -> - method.containsLiteralInstruction(menuItemView) && - indexOfGetDrawableInstruction(method) >= 0 - } -} - -internal fun indexOfGetDrawableInstruction(method: Method) = method.indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Landroid/content/res/Resources;" && - reference.name == "getDrawable" + instructions( + resourceLiteral("id", "menu_item_view"), + methodCall(returnType = "I", opcode = Opcode.INVOKE_INTERFACE), + opcode(Opcode.MOVE_RESULT, maxAfter = 0), // Value is zero if resource does not exist. + fieldAccess(type = "Landroid/widget/ImageView;", opcode = Opcode.IGET_OBJECT, maxAfter = 6), + methodCall("Landroid/content/res/Resources;", "getDrawable", maxAfter = 8), + methodCall("Landroid/widget/ImageView;", "setImageDrawable", maxAfter = 4) + ) } internal val spoofAppVersionFingerprint by fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index 7f8271fa85..86ed3f6af0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -4,13 +4,10 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch @@ -18,25 +15,7 @@ import app.revanced.patches.youtube.misc.playservice.is_19_17_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstInstructionReversedOrThrow -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference - -internal var menuItemView = -1L - private set - -internal val spoofAppVersionResourcePatch = resourcePatch { - dependsOn( - resourceMappingPatch - ) - - execute { - menuItemView = resourceMappings["id", "menu_item_view"] - } -} private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/spoof/SpoofAppVersionPatch;" @@ -48,7 +27,7 @@ val spoofAppVersionPatch = bytecodePatch( "Patching 19.16.39 includes additional older spoofing targets.", ) { dependsOn( - spoofAppVersionResourcePatch, + resourceMappingPatch, sharedExtensionPatch, settingsPatch, addResourcesPatch, @@ -93,24 +72,18 @@ val spoofAppVersionPatch = bytecodePatch( * or earlier the Library tab can crash due to missing image resources trying to load. * As a temporary workaround, do not set an image in the toolbar when the enum name is UNKNOWN. */ - toolBarButtonFingerprint.method.apply { - val getDrawableIndex = indexOfGetDrawableInstruction(this) - val enumOrdinalIndex = indexOfFirstInstructionReversedOrThrow(getDrawableIndex) { - opcode == Opcode.INVOKE_INTERFACE && - getReference()?.returnType == "I" - } - val insertIndex = enumOrdinalIndex + 2 - val insertRegister = getInstruction(insertIndex - 1).registerA - val jumpIndex = indexOfFirstInstructionOrThrow(insertIndex) { - opcode == Opcode.INVOKE_VIRTUAL && - getReference()?.name == "setImageDrawable" - } + 1 + toolBarButtonFingerprint.let { + it.method.apply { + val imageResourceIndex = it.instructionMatches[2].index + val insertRegister = getInstruction(imageResourceIndex).registerA + val jumpIndex = it.instructionMatches.last().index + 1 - addInstructionsWithLabels( - insertIndex, - "if-eqz v$insertRegister, :ignore", - ExternalLabel("ignore", getInstruction(jumpIndex)) - ) + addInstructionsWithLabels( + imageResourceIndex + 1, + "if-eqz v$insertRegister, :ignore", + ExternalLabel("ignore", getInstruction(jumpIndex)) + ) + } } val insertIndex = spoofAppVersionFingerprint.instructionMatches.first().index + 1 From ced3706d757e2a0a35548aed7db0cc50807f6910 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 22 Feb 2025 17:51:35 +0200 Subject: [PATCH 64/64] refactor --- .../spoofappversion/SpoofAppVersionPatch.kt | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index 86ed3f6af0..7cac670faa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -67,35 +67,39 @@ val spoofAppVersionPatch = bytecodePatch( ) /** - * If a user really wants to spoof to very old versions with the latest app target - * they can modify the import/export spoof version. But when spoofing the 19.20.xx - * or earlier the Library tab can crash due to missing image resources trying to load. - * As a temporary workaround, do not set an image in the toolbar when the enum name is UNKNOWN. + * Shorts player is broken when spoofing to very old versions. + * But if a user still really wants to they can modify the import/export spoof version. + * But when spoofing the 19.20.xx or earlier the Library tab can crash due to missing + * image resources trying to load. As a temporary workaround, do not set an image + * in the toolbar when the enum name is UNKNOWN. */ toolBarButtonFingerprint.let { it.method.apply { val imageResourceIndex = it.instructionMatches[2].index - val insertRegister = getInstruction(imageResourceIndex).registerA + val register = getInstruction(imageResourceIndex).registerA val jumpIndex = it.instructionMatches.last().index + 1 addInstructionsWithLabels( imageResourceIndex + 1, - "if-eqz v$insertRegister, :ignore", + "if-eqz v$register, :ignore", ExternalLabel("ignore", getInstruction(jumpIndex)) ) } } - val insertIndex = spoofAppVersionFingerprint.instructionMatches.first().index + 1 - val buildOverrideNameRegister = - spoofAppVersionFingerprint.method.getInstruction(insertIndex - 1).registerA + spoofAppVersionFingerprint.let { + it.method.apply { + val index = it.instructionMatches.first().index + val register = getInstruction(index).registerA - spoofAppVersionFingerprint.method.addInstructions( - insertIndex, - """ - invoke-static {v$buildOverrideNameRegister}, $EXTENSION_CLASS_DESCRIPTOR->getYouTubeVersionOverride(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$buildOverrideNameRegister - """ - ) + addInstructions( + index + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getYouTubeVersionOverride(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$register + """ + ) + } + } } }