This commit is contained in:
LisoUseInAIKyrios 2025-11-17 14:47:06 +02:00
parent 9671c7499d
commit 41b31dd56c
26 changed files with 146 additions and 86 deletions

View file

@ -835,8 +835,8 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatch
public static final fun getResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)J public static final fun getResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)J
public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
public static final fun hasResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)Z public static final fun hasResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)Z
public static final fun resourceLiteral (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralFilter; public static final fun resourceLiteral (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;Lapp/revanced/patcher/InstructionLocation;)Lapp/revanced/patcher/LiteralFilter;
public static synthetic fun resourceLiteral$default (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralFilter; public static synthetic fun resourceLiteral$default (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;Lapp/revanced/patcher/InstructionLocation;ILjava/lang/Object;)Lapp/revanced/patcher/LiteralFilter;
} }
public final class app/revanced/patches/shared/misc/mapping/ResourceType : java/lang/Enum { public final class app/revanced/patches/shared/misc/mapping/ResourceType : java/lang/Enum {

View file

@ -1,5 +1,7 @@
package app.revanced.patches.shared.layout.theme package app.revanced.patches.shared.layout.theme
import app.revanced.patcher.InstructionLocation.MatchAfterImmediately
import app.revanced.patcher.InstructionLocation.MatchAfterWithin
import app.revanced.patcher.fieldAccess import app.revanced.patcher.fieldAccess
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.methodCall import app.revanced.patcher.methodCall
@ -21,18 +23,18 @@ internal val lithoOnBoundsChangeFingerprint = fingerprint {
definingClass = "this", definingClass = "this",
name = "isStateful", name = "isStateful",
returnType = "Z", returnType = "Z",
maxAfter = 5 location = MatchAfterWithin(5)
), ),
fieldAccess( fieldAccess(
opcode = Opcode.IGET_OBJECT, opcode = Opcode.IGET_OBJECT,
definingClass = "this", definingClass = "this",
type = "Landroid/graphics/Paint", type = "Landroid/graphics/Paint",
maxAfter = 5 location = MatchAfterWithin(5)
), ),
methodCall( methodCall(
smali = "Landroid/graphics/Paint;->setColor(I)V", smali = "Landroid/graphics/Paint;->setColor(I)V",
maxAfter = 0 location = MatchAfterImmediately()
) )
) )
custom { method, _ -> custom { method, _ ->

View file

@ -1,6 +1,6 @@
package app.revanced.patches.shared.misc.mapping package app.revanced.patches.shared.misc.mapping
import app.revanced.patcher.InstructionFilter.Companion.METHOD_MAX_INSTRUCTIONS import app.revanced.patcher.InstructionLocation
import app.revanced.patcher.LiteralFilter import app.revanced.patcher.LiteralFilter
import app.revanced.patcher.literal import app.revanced.patcher.literal
import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.PatchException
@ -77,8 +77,8 @@ fun hasResourceId(type: ResourceType, name: String) = resourceMappings[type.valu
fun resourceLiteral( fun resourceLiteral(
type: ResourceType, type: ResourceType,
name: String, name: String,
maxBefore: Int = METHOD_MAX_INSTRUCTIONS, location : InstructionLocation = InstructionLocation.MatchAfterAnywhere()
) = literal({ getResourceId(type, name) }, null, maxBefore) ) = literal({ getResourceId(type, name) }, null, location)
val resourceMappingPatch = resourcePatch { val resourceMappingPatch = resourcePatch {

View file

@ -1,5 +1,7 @@
package app.revanced.patches.shared.misc.privacy package app.revanced.patches.shared.misc.privacy
import app.revanced.patcher.InstructionLocation.MatchAfterImmediately
import app.revanced.patcher.InstructionLocation.MatchAfterWithin
import app.revanced.patcher.checkCast import app.revanced.patcher.checkCast
import app.revanced.patcher.fieldAccess import app.revanced.patcher.fieldAccess
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
@ -13,15 +15,15 @@ internal val youTubeCopyTextFingerprint = fingerprint {
parameters("L", "Ljava/util/Map;") parameters("L", "Ljava/util/Map;")
instructions( instructions(
opcode(Opcode.IGET_OBJECT), opcode(Opcode.IGET_OBJECT),
string("text/plain", maxAfter = 2), string("text/plain", location = MatchAfterWithin(2)),
methodCall( methodCall(
smali = "Landroid/content/ClipData;->newPlainText(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/content/ClipData;", smali = "Landroid/content/ClipData;->newPlainText(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/content/ClipData;",
maxAfter = 2 location = MatchAfterWithin(2)
), ),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 2), opcode(Opcode.MOVE_RESULT_OBJECT, location = MatchAfterWithin(2)),
methodCall( methodCall(
smali = "Landroid/content/ClipboardManager;->setPrimaryClip(Landroid/content/ClipData;)V", smali = "Landroid/content/ClipboardManager;->setPrimaryClip(Landroid/content/ClipData;)V",
maxAfter = 2 location = MatchAfterWithin(2)
) )
) )
} }
@ -36,18 +38,18 @@ internal val youTubeSystemShareSheetFingerprint = fingerprint {
methodCall( methodCall(
smali = "Ljava/util/List;->iterator()Ljava/util/Iterator;", smali = "Ljava/util/List;->iterator()Ljava/util/Iterator;",
maxAfter = 4 location = MatchAfterWithin(4)
), ),
fieldAccess( fieldAccess(
opcode = Opcode.IGET_OBJECT, opcode = Opcode.IGET_OBJECT,
type = "Ljava/lang/String;", type = "Ljava/lang/String;",
maxAfter = 15 location = MatchAfterWithin(15)
), ),
methodCall( methodCall(
smali = "Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;", smali = "Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;",
maxAfter = 15 location = MatchAfterWithin(15)
) )
) )
} }
@ -57,8 +59,8 @@ internal val youTubeShareSheetFingerprint = fingerprint {
parameters("L", "Ljava/util/Map;") parameters("L", "Ljava/util/Map;")
instructions( instructions(
opcode(Opcode.IGET_OBJECT), opcode(Opcode.IGET_OBJECT),
checkCast("Ljava/lang/String;", maxAfter = 0), checkCast("Ljava/lang/String;", location = MatchAfterImmediately()),
opcode(Opcode.GOTO, maxAfter = 0), opcode(Opcode.GOTO, location = MatchAfterImmediately()),
methodCall(smali = "Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;"), methodCall(smali = "Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;"),

View file

@ -1,5 +1,7 @@
package app.revanced.patches.youtube.interaction.seekbar package app.revanced.patches.youtube.interaction.seekbar
import app.revanced.patcher.InstructionLocation.MatchAfterImmediately
import app.revanced.patcher.InstructionLocation.MatchAfterWithin
import app.revanced.patcher.fieldAccess import app.revanced.patcher.fieldAccess
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.literal import app.revanced.patcher.literal
@ -121,12 +123,12 @@ internal val seekbarTappingFingerprint = fingerprint {
literal(Int.MAX_VALUE), literal(Int.MAX_VALUE),
newInstance("Landroid/graphics/Point;"), newInstance("Landroid/graphics/Point;"),
methodCall(smali = "Landroid/graphics/Point;-><init>(II)V", maxAfter = 0), methodCall(smali = "Landroid/graphics/Point;-><init>(II)V", location = MatchAfterImmediately()),
methodCall(smali = "Lj\$/util/Optional;->of(Ljava/lang/Object;)Lj\$/util/Optional;", maxAfter = 0), methodCall(smali = "Lj\$/util/Optional;->of(Ljava/lang/Object;)Lj\$/util/Optional;", location = MatchAfterImmediately()),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), opcode(Opcode.MOVE_RESULT_OBJECT, location = MatchAfterImmediately()),
fieldAccess(opcode = Opcode.IPUT_OBJECT, type = "Lj\$/util/Optional;", maxAfter = 0), fieldAccess(opcode = Opcode.IPUT_OBJECT, type = "Lj\$/util/Optional;", location = MatchAfterImmediately()),
opcode(Opcode.INVOKE_VIRTUAL, maxAfter = 10) opcode(Opcode.INVOKE_VIRTUAL, location = MatchAfterWithin(10))
) )
custom { method, _ -> method.name == "onTouchEvent" } custom { method, _ -> method.name == "onTouchEvent" }
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.layout.buttons.navigation package app.revanced.patches.youtube.layout.buttons.navigation
import app.revanced.patcher.InstructionLocation.MatchAfterImmediately
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.literal import app.revanced.patcher.literal
import app.revanced.patcher.methodCall import app.revanced.patcher.methodCall
@ -12,7 +13,7 @@ internal val addCreateButtonViewFingerprint = fingerprint {
instructions( instructions(
string("Android Wear"), string("Android Wear"),
opcode(Opcode.IF_EQZ), opcode(Opcode.IF_EQZ),
string("Android Automotive", maxAfter = 0), string("Android Automotive", location = MatchAfterImmediately()),
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.layout.formfactor package app.revanced.patches.youtube.layout.formfactor
import app.revanced.patcher.InstructionLocation.*
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.fieldAccess import app.revanced.patcher.fieldAccess
@ -56,7 +57,7 @@ val changeFormFactorPatch = bytecodePatch(
fieldAccess( fieldAccess(
definingClass = formFactorEnumConstructorFingerprint.originalClassDef.type, definingClass = formFactorEnumConstructorFingerprint.originalClassDef.type,
type = "I", type = "I",
maxAfter = 50 location = MatchAfterWithin(50)
) )
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.layout.hide.general package app.revanced.patches.youtube.layout.hide.general
import app.revanced.patcher.InstructionLocation.*
import app.revanced.patcher.StringMatchType import app.revanced.patcher.StringMatchType
import app.revanced.patcher.checkCast import app.revanced.patcher.checkCast
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
@ -23,7 +24,7 @@ internal val hideShowMoreButtonFingerprint = fingerprint {
instructions( instructions(
resourceLiteral(ResourceType.LAYOUT, "expand_button_down"), resourceLiteral(ResourceType.LAYOUT, "expand_button_down"),
methodCall(smali = "Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;"), methodCall(smali = "Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;"),
opcode(Opcode.MOVE_RESULT_OBJECT, 0) opcode(Opcode.MOVE_RESULT_OBJECT, location = MatchAfterImmediately())
) )
} }
@ -41,8 +42,9 @@ internal val parseElementFromBufferFingerprint = fingerprint {
instructions( instructions(
opcode(Opcode.IGET_OBJECT), opcode(Opcode.IGET_OBJECT),
// IGET_BOOLEAN // 20.07+ // IGET_BOOLEAN // 20.07+
opcode(Opcode.INVOKE_INTERFACE, maxAfter = 1), opcode(Opcode.INVOKE_INTERFACE, location = MatchAfterWithin(1)),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), opcode(Opcode.MOVE_RESULT_OBJECT, location = MatchAfterImmediately()),
string("Failed to parse Element", matchType = StringMatchType.STARTS_WITH) string("Failed to parse Element", matchType = StringMatchType.STARTS_WITH)
) )
} }
@ -135,8 +137,8 @@ internal val showFloatingMicrophoneButtonFingerprint = fingerprint {
parameters() parameters()
instructions( instructions(
resourceLiteral(ResourceType.ID, "fab"), resourceLiteral(ResourceType.ID, "fab"),
checkCast("/FloatingActionButton;", maxAfter = 10), checkCast("/FloatingActionButton;", location = MatchAfterWithin(10)),
opcode(Opcode.IGET_BOOLEAN, maxAfter = 10) opcode(Opcode.IGET_BOOLEAN, location = MatchAfterWithin(15))
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.layout.hide.shorts package app.revanced.patches.youtube.layout.hide.shorts
import app.revanced.patcher.InstructionLocation.*
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.literal import app.revanced.patcher.literal
import app.revanced.patcher.methodCall import app.revanced.patcher.methodCall
@ -29,17 +30,17 @@ internal val renderBottomNavigationBarFingerprint = fingerprint {
returns("V") returns("V")
parameters("Ljava/lang/String;") parameters("Ljava/lang/String;")
instructions( instructions(
opcode(Opcode.IGET_OBJECT, maxAfter = 0), opcode(Opcode.IGET_OBJECT, MatchFirst()),
opcode(Opcode.MONITOR_ENTER, maxAfter = 0), opcode(Opcode.MONITOR_ENTER, MatchAfterImmediately()),
opcode(Opcode.IGET_OBJECT, maxAfter = 0), opcode(Opcode.IGET_OBJECT, MatchAfterImmediately()),
opcode(Opcode.IF_EQZ, maxAfter = 0), opcode(Opcode.IF_EQZ, MatchAfterImmediately()),
opcode(Opcode.INVOKE_INTERFACE, maxAfter = 0), opcode(Opcode.INVOKE_INTERFACE, MatchAfterImmediately()),
opcode(Opcode.MONITOR_EXIT), opcode(Opcode.MONITOR_EXIT),
opcode(Opcode.RETURN_VOID, maxAfter = 0), opcode(Opcode.RETURN_VOID, MatchAfterImmediately()),
opcode(Opcode.MOVE_EXCEPTION, maxAfter = 0), opcode(Opcode.MOVE_EXCEPTION, MatchAfterImmediately()),
opcode(Opcode.MONITOR_EXIT, maxAfter = 0), opcode(Opcode.MONITOR_EXIT, MatchAfterImmediately()),
opcode(Opcode.THROW, maxAfter = 0), opcode(Opcode.THROW, MatchAfterImmediately()),
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.layout.hide.time package app.revanced.patches.youtube.layout.hide.time
import app.revanced.patcher.InstructionLocation.*
import app.revanced.patcher.fieldAccess import app.revanced.patcher.fieldAccess
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.methodCall import app.revanced.patcher.methodCall
@ -16,17 +17,17 @@ internal val timeCounterFingerprint = fingerprint {
methodCall( methodCall(
opcode = Opcode.INVOKE_STATIC, opcode = Opcode.INVOKE_STATIC,
returnType = "Ljava/lang/CharSequence;", returnType = "Ljava/lang/CharSequence;",
maxAfter = 0 location = MatchAfterImmediately()
), ),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), opcode(Opcode.MOVE_RESULT_OBJECT, location = MatchAfterImmediately()),
fieldAccess(opcode = Opcode.IGET_WIDE, type = "J", maxAfter = 0), fieldAccess(opcode = Opcode.IGET_WIDE, type = "J", location = MatchAfterImmediately()),
fieldAccess(opcode = Opcode.IGET_WIDE, type = "J", maxAfter = 0), fieldAccess(opcode = Opcode.IGET_WIDE, type = "J", location = MatchAfterImmediately()),
opcode(Opcode.SUB_LONG_2ADDR, maxAfter = 0), opcode(Opcode.SUB_LONG_2ADDR, location = MatchAfterImmediately()),
methodCall( methodCall(
opcode = Opcode.INVOKE_STATIC, opcode = Opcode.INVOKE_STATIC,
returnType = "Ljava/lang/CharSequence;", returnType = "Ljava/lang/CharSequence;",
maxAfter = 5 location = MatchAfterWithin(5)
) )
) )
} }

View file

@ -2,6 +2,7 @@
package app.revanced.patches.youtube.layout.miniplayer package app.revanced.patches.youtube.layout.miniplayer
import app.revanced.patcher.InstructionLocation.MatchAfterWithin
import app.revanced.patcher.checkCast import app.revanced.patcher.checkCast
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.literal import app.revanced.patcher.literal
@ -105,7 +106,7 @@ internal val miniplayerModernForwardButtonFingerprint = fingerprint {
parameters() parameters()
instructions( instructions(
resourceLiteral(ResourceType.ID, "modern_miniplayer_forward_button"), resourceLiteral(ResourceType.ID, "modern_miniplayer_forward_button"),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 5) opcode(Opcode.MOVE_RESULT_OBJECT, MatchAfterWithin(5))
) )
} }
@ -114,7 +115,7 @@ internal val miniplayerModernOverlayViewFingerprint = fingerprint {
parameters() parameters()
instructions( instructions(
resourceLiteral(ResourceType.ID, "scrim_overlay"), resourceLiteral(ResourceType.ID, "scrim_overlay"),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 5) opcode(Opcode.MOVE_RESULT_OBJECT, MatchAfterWithin(5))
) )
} }
@ -127,7 +128,7 @@ internal val miniplayerModernRewindButtonFingerprint = fingerprint {
parameters() parameters()
instructions( instructions(
resourceLiteral(ResourceType.ID, "modern_miniplayer_rewind_button"), resourceLiteral(ResourceType.ID, "modern_miniplayer_rewind_button"),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 5) opcode(Opcode.MOVE_RESULT_OBJECT, MatchAfterWithin(5))
) )
} }
@ -140,7 +141,7 @@ internal val miniplayerModernActionButtonFingerprint = fingerprint {
parameters() parameters()
instructions( instructions(
resourceLiteral(ResourceType.ID, "modern_miniplayer_overlay_action_button"), resourceLiteral(ResourceType.ID, "modern_miniplayer_overlay_action_button"),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 5) opcode(Opcode.MOVE_RESULT_OBJECT, MatchAfterWithin(5))
) )
} }
@ -161,7 +162,7 @@ internal val miniplayerOverrideFingerprint = fingerprint {
methodCall( methodCall(
parameters = listOf("Landroid/content/Context;"), parameters = listOf("Landroid/content/Context;"),
returnType = "Z", returnType = "Z",
maxAfter = 10 location = MatchAfterWithin(10)
) )
) )
} }
@ -216,4 +217,3 @@ internal val miniplayerSetIconsFingerprint = fingerprint {
resourceLiteral(ResourceType.DRAWABLE, "yt_fill_pause_black_36") resourceLiteral(ResourceType.DRAWABLE, "yt_fill_pause_black_36")
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.layout.player.fullscreen package app.revanced.patches.youtube.layout.player.fullscreen
import app.revanced.patcher.InstructionLocation.MatchAfterWithin
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.literal import app.revanced.patcher.literal
import app.revanced.patcher.opcode import app.revanced.patcher.opcode
@ -15,8 +16,8 @@ internal val openVideosFullscreenPortraitFingerprint = fingerprint {
instructions( instructions(
opcode(Opcode.MOVE_RESULT), // Conditional check to modify. opcode(Opcode.MOVE_RESULT), // Conditional check to modify.
// Open videos fullscreen portrait feature flag. // Open videos fullscreen portrait feature flag.
literal(45666112L, maxAfter = 5), // Cannot be more than 5. literal(45666112L, location = MatchAfterWithin(5)), // Cannot be more than 5.
opcode(Opcode.MOVE_RESULT, maxAfter = 10), opcode(Opcode.MOVE_RESULT, location = MatchAfterWithin(10)),
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.layout.player.overlay package app.revanced.patches.youtube.layout.player.overlay
import app.revanced.patcher.InstructionLocation.MatchAfterWithin
import app.revanced.patcher.checkCast import app.revanced.patcher.checkCast
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.ResourceType
@ -9,6 +10,6 @@ internal val createPlayerOverviewFingerprint = fingerprint {
returns("V") returns("V")
instructions( instructions(
resourceLiteral(ResourceType.ID, "scrim_overlay"), resourceLiteral(ResourceType.ID, "scrim_overlay"),
checkCast("Landroid/widget/ImageView;", maxAfter = 10) checkCast("Landroid/widget/ImageView;", location = MatchAfterWithin(10))
) )
} }

View file

@ -1,14 +1,16 @@
package app.revanced.patches.youtube.layout.seekbar package app.revanced.patches.youtube.layout.seekbar
import app.revanced.patcher.InstructionLocation.MatchAfterImmediately
import app.revanced.patcher.InstructionLocation.MatchAfterWithin
import app.revanced.patcher.anyInstruction import app.revanced.patcher.anyInstruction
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patches.youtube.shared.YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE
import app.revanced.patcher.literal import app.revanced.patcher.literal
import app.revanced.patcher.methodCall import app.revanced.patcher.methodCall
import app.revanced.patcher.opcode import app.revanced.patcher.opcode
import app.revanced.patcher.string import app.revanced.patcher.string
import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.ResourceType
import app.revanced.patches.shared.misc.mapping.resourceLiteral import app.revanced.patches.shared.misc.mapping.resourceLiteral
import app.revanced.patches.youtube.shared.YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
@ -86,8 +88,8 @@ internal val playerLinearGradientFingerprint = fingerprint {
instructions( instructions(
resourceLiteral(ResourceType.COLOR, "yt_youtube_magenta"), resourceLiteral(ResourceType.COLOR, "yt_youtube_magenta"),
opcode(Opcode.FILLED_NEW_ARRAY, maxAfter = 5), opcode(Opcode.FILLED_NEW_ARRAY, location = MatchAfterWithin(5)),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) opcode(Opcode.MOVE_RESULT_OBJECT, location = MatchAfterImmediately())
) )
} }
@ -100,7 +102,7 @@ internal val playerLinearGradientLegacyFingerprint = fingerprint {
resourceLiteral(ResourceType.COLOR, "yt_youtube_magenta"), resourceLiteral(ResourceType.COLOR, "yt_youtube_magenta"),
opcode(Opcode.FILLED_NEW_ARRAY), opcode(Opcode.FILLED_NEW_ARRAY),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), opcode(Opcode.MOVE_RESULT_OBJECT, MatchAfterImmediately()),
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.layout.shortsautoplay package app.revanced.patches.youtube.layout.shortsautoplay
import app.revanced.patcher.InstructionLocation.*
import app.revanced.patcher.fieldAccess import app.revanced.patcher.fieldAccess
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.methodCall import app.revanced.patcher.methodCall
@ -43,8 +44,20 @@ internal val reelPlaybackFingerprint = fingerprint {
parameters("J") parameters("J")
returns("V") returns("V")
instructions( instructions(
fieldAccess(definingClass = "Ljava/util/concurrent/TimeUnit;", name = "MILLISECONDS"), fieldAccess(
methodCall(name = "<init>", parameters = listOf("I", "L", "L"), maxAfter = 15), definingClass = "Ljava/util/concurrent/TimeUnit;",
methodCall(opcode = Opcode.INVOKE_VIRTUAL, parameters = listOf("L"), returnType = "I", maxAfter = 5) name = "MILLISECONDS"
),
methodCall(
name = "<init>",
parameters = listOf("I", "L", "L"),
location = MatchAfterWithin(15)
),
methodCall(
opcode = Opcode.INVOKE_VIRTUAL,
parameters = listOf("L"),
returnType = "I",
location = MatchAfterWithin(5)
)
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.layout.sponsorblock package app.revanced.patches.youtube.layout.sponsorblock
import app.revanced.patcher.InstructionLocation.*
import app.revanced.patcher.checkCast import app.revanced.patcher.checkCast
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.methodCall import app.revanced.patcher.methodCall
@ -22,7 +23,7 @@ internal val appendTimeFingerprint = fingerprint {
resourceLiteral(ResourceType.STRING, "total_time"), resourceLiteral(ResourceType.STRING, "total_time"),
methodCall(smali = "Landroid/content/res/Resources;->getString(I[Ljava/lang/Object;)Ljava/lang/String;"), methodCall(smali = "Landroid/content/res/Resources;->getString(I[Ljava/lang/Object;)Ljava/lang/String;"),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) opcode(Opcode.MOVE_RESULT_OBJECT, MatchAfterImmediately())
) )
} }
@ -31,7 +32,7 @@ internal val controlsOverlayFingerprint = fingerprint {
parameters() parameters()
instructions( instructions(
resourceLiteral(ResourceType.ID, "inset_overlay_view_layout"), resourceLiteral(ResourceType.ID, "inset_overlay_view_layout"),
checkCast("Landroid/widget/FrameLayout;", maxAfter = 20) checkCast("Landroid/widget/FrameLayout;", MatchAfterWithin(20))
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.layout.spoofappversion package app.revanced.patches.youtube.layout.spoofappversion
import app.revanced.patcher.InstructionLocation.*
import app.revanced.patcher.fieldAccess import app.revanced.patcher.fieldAccess
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.methodCall import app.revanced.patcher.methodCall
@ -15,10 +16,10 @@ internal val toolBarButtonFingerprint = fingerprint {
instructions( instructions(
resourceLiteral(ResourceType.ID, "menu_item_view"), resourceLiteral(ResourceType.ID, "menu_item_view"),
methodCall(returnType = "I", opcode = Opcode.INVOKE_INTERFACE), methodCall(returnType = "I", opcode = Opcode.INVOKE_INTERFACE),
opcode(Opcode.MOVE_RESULT, maxAfter = 0), opcode(Opcode.MOVE_RESULT, MatchAfterImmediately()),
fieldAccess(type = "Landroid/widget/ImageView;", opcode = Opcode.IGET_OBJECT, maxAfter = 6), fieldAccess(type = "Landroid/widget/ImageView;", opcode = Opcode.IGET_OBJECT, location = MatchAfterWithin(6)),
methodCall("Landroid/content/res/Resources;", "getDrawable", maxAfter = 8), methodCall("Landroid/content/res/Resources;", "getDrawable", location = MatchAfterWithin(8)),
methodCall("Landroid/widget/ImageView;", "setImageDrawable", maxAfter = 4) methodCall("Landroid/widget/ImageView;", "setImageDrawable", location = MatchAfterWithin(4))
) )
custom { method, _ -> custom { method, _ ->
// 20.37+ has second parameter of "Landroid/content/Context;" // 20.37+ has second parameter of "Landroid/content/Context;"

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.layout.startupshortsreset package app.revanced.patches.youtube.layout.startupshortsreset
import app.revanced.patcher.InstructionLocation.*
import app.revanced.patcher.StringMatchType import app.revanced.patcher.StringMatchType
import app.revanced.patcher.checkCast import app.revanced.patcher.checkCast
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
@ -19,10 +20,10 @@ internal val userWasInShortsAlternativeFingerprint = fingerprint {
parameters("Ljava/lang/Object;") parameters("Ljava/lang/Object;")
instructions( instructions(
checkCast("Ljava/lang/Boolean;"), checkCast("Ljava/lang/Boolean;"),
methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z", maxAfter = 0), methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z", location = MatchAfterImmediately()),
opcode(Opcode.MOVE_RESULT, maxAfter = 0), opcode(Opcode.MOVE_RESULT, MatchAfterImmediately()),
// 20.40+ string was merged into another string and is a partial match. // 20.40+ string was merged into another string and is a partial match.
string("userIsInShorts: ", matchType = StringMatchType.CONTAINS, maxAfter = 15) string("userIsInShorts: ", matchType = StringMatchType.CONTAINS, location = MatchAfterWithin(15))
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.misc.fix.backtoexitgesture package app.revanced.patches.youtube.misc.fix.backtoexitgesture
import app.revanced.patcher.InstructionLocation.*
import app.revanced.patcher.checkCast import app.revanced.patcher.checkCast
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.literal import app.revanced.patcher.literal
@ -26,10 +27,10 @@ internal val recyclerViewTopScrollingFingerprint = fingerprint {
parameters() parameters()
instructions( instructions(
methodCall(smali = "Ljava/util/Iterator;->next()Ljava/lang/Object;"), methodCall(smali = "Ljava/util/Iterator;->next()Ljava/lang/Object;"),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), opcode(Opcode.MOVE_RESULT_OBJECT, MatchAfterImmediately()),
checkCast("Landroid/support/v7/widget/RecyclerView;", maxAfter = 0), checkCast("Landroid/support/v7/widget/RecyclerView;", MatchAfterImmediately()),
literal(0, maxAfter = 0), literal(0, location = MatchAfterImmediately()),
methodCall(definingClass = "Landroid/support/v7/widget/RecyclerView;", maxAfter = 0), methodCall(definingClass = "Landroid/support/v7/widget/RecyclerView;", location = MatchAfterImmediately()),
opcode(Opcode.GOTO, maxAfter = 0) opcode(Opcode.GOTO, MatchAfterImmediately())
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.misc.gms package app.revanced.patches.youtube.misc.gms
import app.revanced.patcher.InstructionLocation.*
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.methodCall import app.revanced.patcher.methodCall
import app.revanced.patcher.opcode import app.revanced.patcher.opcode
@ -16,7 +17,7 @@ internal val specificNetworkErrorViewControllerFingerprint = fingerprint {
resourceLiteral(ResourceType.DRAWABLE, "ic_offline_no_content_upside_down"), resourceLiteral(ResourceType.DRAWABLE, "ic_offline_no_content_upside_down"),
resourceLiteral(ResourceType.STRING, "offline_no_content_body_text_not_offline_eligible"), resourceLiteral(ResourceType.STRING, "offline_no_content_body_text_not_offline_eligible"),
methodCall(name = "getString", returnType = "Ljava/lang/String;"), methodCall(name = "getString", returnType = "Ljava/lang/String;"),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) opcode(Opcode.MOVE_RESULT_OBJECT, location = MatchAfterImmediately())
) )
} }
@ -30,6 +31,6 @@ internal val loadingFrameLayoutControllerFingerprint = fingerprint {
resourceLiteral(ResourceType.DRAWABLE, "ic_offline_no_content_upside_down"), resourceLiteral(ResourceType.DRAWABLE, "ic_offline_no_content_upside_down"),
resourceLiteral(ResourceType.STRING, "offline_no_content_body_text_not_offline_eligible"), resourceLiteral(ResourceType.STRING, "offline_no_content_body_text_not_offline_eligible"),
methodCall(name = "getString", returnType = "Ljava/lang/String;"), methodCall(name = "getString", returnType = "Ljava/lang/String;"),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) opcode(Opcode.MOVE_RESULT_OBJECT, MatchAfterImmediately())
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.misc.navigation package app.revanced.patches.youtube.misc.navigation
import app.revanced.patcher.InstructionLocation.MatchAfterWithin
import app.revanced.patcher.checkCast import app.revanced.patcher.checkCast
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.methodCall import app.revanced.patcher.methodCall
@ -35,7 +36,7 @@ internal val appCompatToolbarBackButtonFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Landroid/graphics/drawable/Drawable;") returns("Landroid/graphics/drawable/Drawable;")
parameters() parameters()
custom { methodDef, classDef -> custom { _, classDef ->
classDef.type == "Landroid/support/v7/widget/Toolbar;" classDef.type == "Landroid/support/v7/widget/Toolbar;"
} }
} }
@ -143,7 +144,7 @@ internal val imageEnumConstructorFingerprint = fingerprint {
internal val setEnumMapFingerprint = fingerprint { internal val setEnumMapFingerprint = fingerprint {
instructions( instructions(
resourceLiteral(ResourceType.DRAWABLE, "yt_fill_bell_black_24"), resourceLiteral(ResourceType.DRAWABLE, "yt_fill_bell_black_24"),
methodCall(smali = "Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;", maxAfter = 10), methodCall(smali = "Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;", location = MatchAfterWithin(10)),
methodCall(smali = "Ljava/util/EnumMap;->put(Ljava/lang/Enum;Ljava/lang/Object;)Ljava/lang/Object;", maxAfter = 10) methodCall(smali = "Ljava/util/EnumMap;->put(Ljava/lang/Enum;Ljava/lang/Object;)Ljava/lang/Object;", location = MatchAfterWithin(10))
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.misc.playercontrols package app.revanced.patches.youtube.misc.playercontrols
import app.revanced.patcher.InstructionLocation.MatchAfterImmediately
import app.revanced.patcher.checkCast import app.revanced.patcher.checkCast
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.literal import app.revanced.patcher.literal
@ -68,7 +69,7 @@ internal val playerTopControlsInflateFingerprint = fingerprint {
instructions( instructions(
resourceLiteral(ResourceType.ID, "controls_layout_stub"), resourceLiteral(ResourceType.ID, "controls_layout_stub"),
methodCall("Landroid/view/ViewStub;", "inflate"), methodCall("Landroid/view/ViewStub;", "inflate"),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) opcode(Opcode.MOVE_RESULT_OBJECT, MatchAfterImmediately())
) )
} }
@ -78,7 +79,7 @@ internal val playerBottomControlsInflateFingerprint = fingerprint {
instructions( instructions(
resourceLiteral(ResourceType.ID, "bottom_ui_container_stub"), resourceLiteral(ResourceType.ID, "bottom_ui_container_stub"),
methodCall("Landroid/view/ViewStub;", "inflate"), methodCall("Landroid/view/ViewStub;", "inflate"),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) opcode(Opcode.MOVE_RESULT_OBJECT, MatchAfterImmediately())
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.misc.playertype package app.revanced.patches.youtube.misc.playertype
import app.revanced.patcher.InstructionLocation.MatchAfterWithin
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.opcode import app.revanced.patcher.opcode
import app.revanced.patcher.string import app.revanced.patcher.string
@ -30,7 +31,7 @@ internal val reelWatchPagerFingerprint = fingerprint {
returns("Landroid/view/View;") returns("Landroid/view/View;")
instructions( instructions(
resourceLiteral(ResourceType.ID, "reel_watch_player"), resourceLiteral(ResourceType.ID, "reel_watch_player"),
opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 10) opcode(Opcode.MOVE_RESULT_OBJECT, location = MatchAfterWithin(10))
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.misc.settings package app.revanced.patches.youtube.misc.settings
import app.revanced.patcher.InstructionLocation.MatchAfterWithin
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.literal import app.revanced.patcher.literal
import app.revanced.patcher.opcode import app.revanced.patcher.opcode
@ -31,7 +32,7 @@ internal val cairoFragmentConfigFingerprint = fingerprint {
returns("Z") returns("Z")
instructions( instructions(
literal(45532100L), literal(45532100L),
opcode(Opcode.MOVE_RESULT, 10) opcode(Opcode.MOVE_RESULT, location = MatchAfterWithin(10))
) )
} }

View file

@ -1,5 +1,6 @@
package app.revanced.patches.youtube.shared package app.revanced.patches.youtube.shared
import app.revanced.patcher.InstructionLocation.MatchAfterImmediately
import app.revanced.patcher.fieldAccess import app.revanced.patcher.fieldAccess
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.literal import app.revanced.patcher.literal
@ -104,7 +105,7 @@ internal val seekbarFingerprint = fingerprint {
internal val seekbarOnDrawFingerprint = fingerprint { internal val seekbarOnDrawFingerprint = fingerprint {
instructions( instructions(
methodCall(smali = "Ljava/lang/Math;->round(F)I"), methodCall(smali = "Ljava/lang/Math;->round(F)I"),
opcode(Opcode.MOVE_RESULT, maxAfter = 0) opcode(Opcode.MOVE_RESULT, location = MatchAfterImmediately())
) )
custom { method, _ -> method.name == "onDraw" } custom { method, _ -> method.name == "onDraw" }
} }
@ -127,6 +128,6 @@ internal val videoQualityChangedFingerprint = fingerprint {
newInstance("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;"), newInstance("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;"),
opcode(Opcode.IGET_OBJECT), opcode(Opcode.IGET_OBJECT),
opcode(Opcode.CHECK_CAST), opcode(Opcode.CHECK_CAST),
fieldAccess(type = "I", opcode = Opcode.IGET, maxAfter = 0), // Video resolution (human readable). fieldAccess(type = "I", opcode = Opcode.IGET, location = MatchAfterImmediately()), // Video resolution (human readable).
) )
} }

View file

@ -1,5 +1,8 @@
package app.revanced.patches.youtube.video.information package app.revanced.patches.youtube.video.information
import app.revanced.patcher.InstructionFilter
import app.revanced.patcher.InstructionLocation
import app.revanced.patcher.InstructionLocation.MatchAfterWithin
import app.revanced.patcher.fieldAccess import app.revanced.patcher.fieldAccess
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.patcher.literal import app.revanced.patcher.literal
@ -9,7 +12,10 @@ import app.revanced.patches.youtube.shared.videoQualityChangedFingerprint
import app.revanced.util.getReference import app.revanced.util.getReference
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.instruction.Instruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.FieldReference
import com.android.tools.smali.dexlib2.iface.reference.StringReference
internal val createVideoPlayerSeekbarFingerprint = fingerprint { internal val createVideoPlayerSeekbarFingerprint = fingerprint {
returns("V") returns("V")
@ -48,6 +54,21 @@ internal val playerInitFingerprint = fingerprint {
internal val seekFingerprint = fingerprint { internal val seekFingerprint = fingerprint {
instructions( instructions(
string("Attempting to seek during an ad"), string("Attempting to seek during an ad"),
object : InstructionFilter {
override fun matches(
enclosingMethod: Method,
instruction: Instruction
): Boolean {
TODO("Not yet implemented")
}
override val location: InstructionLocation = InstructionLocation.MatchFirst()
},
// Custom inline filter. Uses default match anywhere after the previous filter.
{ _, instruction ->
instruction.getReference<StringReference>()?.string?.let { it.length > 10 } ?: false
}
) )
} }
@ -129,7 +150,7 @@ internal val videoEndFingerprint = fingerprint {
parameters = listOf(), parameters = listOf(),
returnType = "V" returnType = "V"
), ),
literal(45368273L, maxAfter = 5), literal(45368273L, location = MatchAfterWithin(5)),
string("Attempting to seek when video is not playing"), string("Attempting to seek when video is not playing"),
) )
} }