fix(youtube): improve patching speed (#2514)
This commit is contained in:
parent
e9fb849d5f
commit
77bb761b0b
|
@ -57,17 +57,28 @@ internal fun MutableMethod.injectHideViewCall(
|
||||||
"invoke-static { v$viewRegister }, $classDescriptor->$targetMethod(Landroid/view/View;)V"
|
"invoke-static { v$viewRegister }, $classDescriptor->$targetMethod(Landroid/view/View;)V"
|
||||||
)
|
)
|
||||||
|
|
||||||
internal fun MutableMethod.findIndexForIdResource(resourceName: String): Int {
|
internal fun Method.findIndexForIdResource(resourceName: String): Int {
|
||||||
fun getIdResourceId(resourceName: String) = ResourceMappingPatch.resourceMappings.single {
|
fun getIdResourceId(resourceName: String) = ResourceMappingPatch.resourceMappings.single {
|
||||||
it.type == "id" && it.name == resourceName
|
it.type == "id" && it.name == resourceName
|
||||||
}.id
|
}.id
|
||||||
|
|
||||||
val resourceId = getIdResourceId(resourceName)
|
return indexOfFirstConstantInstructionValue(getIdResourceId(resourceName))
|
||||||
return implementation!!.instructions.indexOfFirst {
|
}
|
||||||
if (it.opcode != Opcode.CONST) return@indexOfFirst false
|
|
||||||
|
|
||||||
val literal = (it as WideLiteralInstruction).wideLiteral
|
/**
|
||||||
|
* @return the first constant instruction with the value, or -1 if not found.
|
||||||
|
*/
|
||||||
|
fun Method.indexOfFirstConstantInstructionValue(constantValue: Long): Int {
|
||||||
|
return implementation?.let {
|
||||||
|
it.instructions.indexOfFirst { instruction ->
|
||||||
|
instruction.opcode == Opcode.CONST && (instruction as WideLiteralInstruction).wideLiteral == constantValue
|
||||||
|
}
|
||||||
|
} ?: -1
|
||||||
|
}
|
||||||
|
|
||||||
return@indexOfFirst resourceId == literal
|
/**
|
||||||
}
|
* @return if the method contains a constant with the given value.
|
||||||
}
|
*/
|
||||||
|
fun Method.containsConstantInstructionValue(constantValue: Long): Boolean {
|
||||||
|
return indexOfFirstConstantInstructionValue(constantValue) >= 0
|
||||||
|
}
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
package app.revanced.patches.music.misc.androidauto.fingerprints
|
package app.revanced.patches.music.misc.androidauto.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import app.revanced.patches.music.misc.androidauto.patch.BypassCertificateChecksPatch
|
|
||||||
|
|
||||||
|
|
||||||
object CheckCertificateFingerprint : MethodFingerprint(
|
object CheckCertificateFingerprint : MethodFingerprint(
|
||||||
"Z",
|
returnType = "Z",
|
||||||
strings = listOf("No match") // Unique in combination with boolean return type
|
parameters = listOf("Ljava/lang/String;"),
|
||||||
|
strings = listOf("X509", "Failed to get public key.", "Failed to get certificate.")
|
||||||
)
|
)
|
|
@ -1,10 +1,13 @@
|
||||||
package app.revanced.patches.shared.fingerprints
|
package app.revanced.patches.shared.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
object WatchWhileActivityFingerprint : MethodFingerprint(
|
object WatchWhileActivityFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
|
parameters = listOf(),
|
||||||
customFingerprint = { methodDef, _ ->
|
customFingerprint = { methodDef, _ ->
|
||||||
methodDef.definingClass.endsWith("WatchWhileActivity;") && methodDef.name == "<init>"
|
methodDef.definingClass.endsWith("WatchWhileActivity;")
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
package app.revanced.patches.shared.misc.fix.verticalscroll.fingerprints
|
package app.revanced.patches.shared.misc.fix.verticalscroll.fingerprints
|
||||||
|
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object CanScrollVerticallyFingerprint : MethodFingerprint(
|
object CanScrollVerticallyFingerprint : MethodFingerprint(
|
||||||
"Z",
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
returnType = "Z",
|
||||||
parameters = emptyList(),
|
parameters = emptyList(),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.MOVE_RESULT,
|
Opcode.MOVE_RESULT,
|
||||||
|
|
|
@ -53,6 +53,7 @@ class SettingsPatch : BytecodePatch(
|
||||||
} - 6
|
} - 6
|
||||||
|
|
||||||
|
|
||||||
|
// fixme: instead use Method.indexOfFirstConstantInstructionValue()
|
||||||
val copyrightPolicyIndex = instructions.indexOfFirst {
|
val copyrightPolicyIndex = instructions.indexOfFirst {
|
||||||
(it as? WideLiteralInstruction)?.wideLiteral == copyrightPolicyLabelId
|
(it as? WideLiteralInstruction)?.wideLiteral == copyrightPolicyLabelId
|
||||||
} + 2
|
} + 2
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
package app.revanced.patches.youtube.ad.getpremium.bytecode.fingerprints
|
package app.revanced.patches.youtube.ad.getpremium.bytecode.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object GetPremiumViewFingerprint : MethodFingerprint(
|
object GetPremiumViewFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf("I", "I"),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.ADD_INT_2ADDR,
|
Opcode.ADD_INT_2ADDR,
|
||||||
Opcode.ADD_INT_2ADDR,
|
Opcode.ADD_INT_2ADDR,
|
||||||
|
|
|
@ -1,23 +1,12 @@
|
||||||
package app.revanced.patches.youtube.interaction.seekbar.fingerprints
|
package app.revanced.patches.youtube.interaction.seekbar.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
import app.revanced.patches.youtube.interaction.seekbar.patch.EnableSeekbarTappingResourcePatch
|
import app.revanced.patches.youtube.interaction.seekbar.patch.EnableSeekbarTappingResourcePatch
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
|
object AccessibilityPlayerProgressTimeFingerprint : LiteralValueFingerprint(
|
||||||
object AccessibilityPlayerProgressTimeFingerprint : MethodFingerprint(
|
|
||||||
returnType = "L",
|
returnType = "L",
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = EnableSeekbarTappingResourcePatch.accessibilityPlayerProgressTime
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
|
||||||
if (instruction.opcode != Opcode.CONST) return@any false
|
|
||||||
|
|
||||||
val wideLiteral = (instruction as WideLiteralInstruction).wideLiteral
|
|
||||||
|
|
||||||
EnableSeekbarTappingResourcePatch.accessibilityPlayerProgressTime == wideLiteral
|
|
||||||
} ?: false
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,10 +1,13 @@
|
||||||
package app.revanced.patches.youtube.interaction.swipecontrols.fingerprints
|
package app.revanced.patches.youtube.interaction.swipecontrols.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
object SwipeControlsHostActivityFingerprint : MethodFingerprint(
|
object SwipeControlsHostActivityFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
|
parameters = listOf(),
|
||||||
customFingerprint = { methodDef, _ ->
|
customFingerprint = { methodDef, _ ->
|
||||||
methodDef.definingClass == "Lapp/revanced/integrations/swipecontrols/SwipeControlsHostActivity;" && methodDef.name == "<init>"
|
methodDef.definingClass == "Lapp/revanced/integrations/swipecontrols/SwipeControlsHostActivity;"
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
package app.revanced.patches.youtube.layout.autocaptions.fingerprints
|
package app.revanced.patches.youtube.layout.autocaptions.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
|
||||||
@FuzzyPatternScanMethod(3)
|
|
||||||
object StartVideoInformerFingerprint : MethodFingerprint(
|
object StartVideoInformerFingerprint : MethodFingerprint(
|
||||||
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf("L", "L", "L", "L"), listOf(
|
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf("L", "L", "L", "L"), listOf(
|
||||||
Opcode.INVOKE_STATIC,
|
Opcode.INVOKE_STATIC,
|
||||||
|
|
|
@ -6,7 +6,10 @@ import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object SubtitleButtonControllerFingerprint : MethodFingerprint(
|
object SubtitleButtonControllerFingerprint : MethodFingerprint(
|
||||||
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf("L"), listOf(
|
returnType = "V",
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
parameters = listOf("Lcom/google/android/libraries/youtube/player/subtitles/model/SubtitleTrack;"),
|
||||||
|
opcodes = listOf(
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.IGET_OBJECT,
|
||||||
Opcode.IF_NEZ,
|
Opcode.IF_NEZ,
|
||||||
Opcode.RETURN_VOID,
|
Opcode.RETURN_VOID,
|
||||||
|
@ -16,5 +19,8 @@ object SubtitleButtonControllerFingerprint : MethodFingerprint(
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.IGET_OBJECT,
|
||||||
)
|
),
|
||||||
|
customFingerprint = { methodDef, _ ->
|
||||||
|
methodDef.definingClass.endsWith("SubtitleButtonController;")
|
||||||
|
}
|
||||||
)
|
)
|
|
@ -14,5 +14,8 @@ object SubtitleTrackFingerprint : MethodFingerprint(
|
||||||
Opcode.MOVE_RESULT,
|
Opcode.MOVE_RESULT,
|
||||||
Opcode.RETURN,
|
Opcode.RETURN,
|
||||||
),
|
),
|
||||||
strings = listOf("DISABLE_CAPTIONS_OPTION")
|
strings = listOf("DISABLE_CAPTIONS_OPTION"),
|
||||||
|
customFingerprint = { methodDef, _ ->
|
||||||
|
methodDef.definingClass.endsWith("SubtitleTrack;")
|
||||||
|
}
|
||||||
)
|
)
|
|
@ -1,5 +1,6 @@
|
||||||
package app.revanced.patches.youtube.layout.buttons.autoplay.patch
|
package app.revanced.patches.youtube.layout.buttons.autoplay.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.findIndexForIdResource
|
||||||
import app.revanced.extensions.toErrorResult
|
import app.revanced.extensions.toErrorResult
|
||||||
import app.revanced.patcher.annotation.Description
|
import app.revanced.patcher.annotation.Description
|
||||||
import app.revanced.patcher.annotation.Name
|
import app.revanced.patcher.annotation.Name
|
||||||
|
@ -23,7 +24,6 @@ import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
import org.jf.dexlib2.iface.instruction.Instruction
|
import org.jf.dexlib2.iface.instruction.Instruction
|
||||||
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
import org.jf.dexlib2.iface.reference.MethodReference
|
import org.jf.dexlib2.iface.reference.MethodReference
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
|
@ -48,15 +48,8 @@ class HideAutoplayButtonPatch : BytecodePatch(
|
||||||
LayoutConstructorFingerprint.result?.mutableMethod?.apply {
|
LayoutConstructorFingerprint.result?.mutableMethod?.apply {
|
||||||
val layoutGenMethodInstructions = implementation!!.instructions
|
val layoutGenMethodInstructions = implementation!!.instructions
|
||||||
|
|
||||||
// resolve the offsets such as ...
|
// resolve the offsets of where to insert the branch instructions and ...
|
||||||
val autoNavPreviewStubId = ResourceMappingPatch.resourceMappings.single {
|
val insertIndex = findIndexForIdResource("autonav_preview_stub")
|
||||||
it.name == "autonav_preview_stub"
|
|
||||||
}.id
|
|
||||||
|
|
||||||
// where to insert the branch instructions and ...
|
|
||||||
val insertIndex = layoutGenMethodInstructions.indexOfFirst {
|
|
||||||
(it as? WideLiteralInstruction)?.wideLiteral == autoNavPreviewStubId
|
|
||||||
}
|
|
||||||
|
|
||||||
// where to branch away
|
// where to branch away
|
||||||
val branchIndex =
|
val branchIndex =
|
||||||
|
|
|
@ -1,15 +1,13 @@
|
||||||
package app.revanced.patches.youtube.layout.buttons.navigation.fingerprints
|
package app.revanced.patches.youtube.layout.buttons.navigation.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patches.youtube.layout.buttons.navigation.patch.ResolvePivotBarFingerprintsPatch
|
import app.revanced.patches.youtube.layout.buttons.navigation.patch.ResolvePivotBarFingerprintsPatch
|
||||||
import org.jf.dexlib2.Opcode
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
object InitializeButtonsFingerprint : MethodFingerprint(
|
object InitializeButtonsFingerprint : LiteralValueFingerprint(
|
||||||
customFingerprint = { methodDef, _ ->
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
methodDef.implementation?.instructions?.any {
|
returnType = "V",
|
||||||
it.opcode == Opcode.CONST && (it as WideLiteralInstruction).wideLiteral ==
|
parameters = listOf(),
|
||||||
ResolvePivotBarFingerprintsPatch.imageOnlyTabResourceId
|
literal = ResolvePivotBarFingerprintsPatch.imageOnlyTabResourceId
|
||||||
} == true
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -5,5 +5,5 @@ import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object PlayerControlsVisibilityModelFingerprint : MethodFingerprint(
|
object PlayerControlsVisibilityModelFingerprint : MethodFingerprint(
|
||||||
opcodes = listOf(Opcode.INVOKE_DIRECT_RANGE),
|
opcodes = listOf(Opcode.INVOKE_DIRECT_RANGE),
|
||||||
strings = listOf("hasNext", "hasPrevious", "Missing required properties:")
|
strings = listOf("Missing required properties:", "hasNext", "hasPrevious")
|
||||||
)
|
)
|
|
@ -1,11 +1,13 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.albumcards.bytecode.fingerprints
|
package app.revanced.patches.youtube.layout.hide.albumcards.bytecode.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patches.youtube.layout.hide.albumcards.resource.patch.AlbumCardsResourcePatch
|
import app.revanced.patches.youtube.layout.hide.albumcards.resource.patch.AlbumCardsResourcePatch
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object AlbumCardsFingerprint : MethodFingerprint(
|
object AlbumCardsFingerprint : LiteralValueFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
|
@ -14,10 +16,5 @@ object AlbumCardsFingerprint : MethodFingerprint(
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.CHECK_CAST,
|
Opcode.CHECK_CAST,
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = AlbumCardsResourcePatch.albumCardId
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
|
||||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
|
||||||
(instruction as? WideLiteralInstruction)?.wideLiteral == AlbumCardsResourcePatch.albumCardId
|
|
||||||
} == true
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,11 +1,13 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.breakingnews.bytecode.fingerprints
|
package app.revanced.patches.youtube.layout.hide.breakingnews.bytecode.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patches.youtube.layout.hide.breakingnews.resource.patch.BreakingNewsResourcePatch
|
import app.revanced.patches.youtube.layout.hide.breakingnews.resource.patch.BreakingNewsResourcePatch
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object BreakingNewsFingerprint : MethodFingerprint(
|
object BreakingNewsFingerprint : LiteralValueFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
Opcode.CONST_4,
|
Opcode.CONST_4,
|
||||||
|
@ -14,10 +16,5 @@ object BreakingNewsFingerprint : MethodFingerprint(
|
||||||
Opcode.CHECK_CAST,
|
Opcode.CHECK_CAST,
|
||||||
Opcode.IPUT_OBJECT,
|
Opcode.IPUT_OBJECT,
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = BreakingNewsResourcePatch.horizontalCardListId
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
|
||||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
|
||||||
(instruction as? WideLiteralInstruction)?.wideLiteral == BreakingNewsResourcePatch.horizontalCardListId
|
|
||||||
} == true
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,20 +1,17 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.crowdfundingbox.bytecode.fingerprints
|
package app.revanced.patches.youtube.layout.hide.crowdfundingbox.bytecode.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patches.youtube.layout.hide.crowdfundingbox.resource.patch.CrowdfundingBoxResourcePatch
|
import app.revanced.patches.youtube.layout.hide.crowdfundingbox.resource.patch.CrowdfundingBoxResourcePatch
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object CrowdfundingBoxFingerprint : MethodFingerprint(
|
object CrowdfundingBoxFingerprint : LiteralValueFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.IPUT_OBJECT,
|
Opcode.IPUT_OBJECT,
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = CrowdfundingBoxResourcePatch.crowdfundingBoxId
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
|
||||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
|
||||||
(instruction as? WideLiteralInstruction)?.wideLiteral == CrowdfundingBoxResourcePatch.crowdfundingBoxId
|
|
||||||
} == true
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,11 +1,11 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.endscreencards.bytecode.fingerprints
|
package app.revanced.patches.youtube.layout.hide.endscreencards.bytecode.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
import app.revanced.patches.youtube.layout.hide.endscreencards.resource.patch.HideEndscreenCardsResourcePatch
|
import app.revanced.patches.youtube.layout.hide.endscreencards.resource.patch.HideEndscreenCardsResourcePatch
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object LayoutCircleFingerprint : MethodFingerprint(
|
object LayoutCircleFingerprint : LiteralValueFingerprint(
|
||||||
|
returnType = "Landroid/view/View;",
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
Opcode.CONST_4,
|
Opcode.CONST_4,
|
||||||
|
@ -13,10 +13,5 @@ object LayoutCircleFingerprint : MethodFingerprint(
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.CHECK_CAST,
|
Opcode.CHECK_CAST,
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = HideEndscreenCardsResourcePatch.layoutCircle
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
|
||||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
|
||||||
(instruction as? WideLiteralInstruction)?.wideLiteral == HideEndscreenCardsResourcePatch.layoutCircle
|
|
||||||
} == true
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,11 +1,11 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.endscreencards.bytecode.fingerprints
|
package app.revanced.patches.youtube.layout.hide.endscreencards.bytecode.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
import app.revanced.patches.youtube.layout.hide.endscreencards.resource.patch.HideEndscreenCardsResourcePatch
|
import app.revanced.patches.youtube.layout.hide.endscreencards.resource.patch.HideEndscreenCardsResourcePatch
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object LayoutIconFingerprint : MethodFingerprint(
|
object LayoutIconFingerprint : LiteralValueFingerprint(
|
||||||
|
returnType = "Landroid/view/View;",
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.CONST_4,
|
Opcode.CONST_4,
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
|
@ -13,10 +13,5 @@ object LayoutIconFingerprint : MethodFingerprint(
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.CHECK_CAST,
|
Opcode.CHECK_CAST,
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = HideEndscreenCardsResourcePatch.layoutIcon
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
|
||||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
|
||||||
(instruction as? WideLiteralInstruction)?.wideLiteral == HideEndscreenCardsResourcePatch.layoutIcon
|
|
||||||
} == true
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,11 +1,11 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.endscreencards.bytecode.fingerprints
|
package app.revanced.patches.youtube.layout.hide.endscreencards.bytecode.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
import app.revanced.patches.youtube.layout.hide.endscreencards.resource.patch.HideEndscreenCardsResourcePatch
|
import app.revanced.patches.youtube.layout.hide.endscreencards.resource.patch.HideEndscreenCardsResourcePatch
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object LayoutVideoFingerprint : MethodFingerprint(
|
object LayoutVideoFingerprint : LiteralValueFingerprint(
|
||||||
|
returnType = "Landroid/view/View;",
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
Opcode.CONST_4,
|
Opcode.CONST_4,
|
||||||
|
@ -13,10 +13,5 @@ object LayoutVideoFingerprint : MethodFingerprint(
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.CHECK_CAST,
|
Opcode.CHECK_CAST,
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = HideEndscreenCardsResourcePatch.layoutVideo
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
|
||||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
|
||||||
(instruction as? WideLiteralInstruction)?.wideLiteral == HideEndscreenCardsResourcePatch.layoutVideo
|
|
||||||
} == true
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,14 +1,19 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.filterbar.fingerprints
|
package app.revanced.patches.youtube.layout.hide.filterbar.fingerprints
|
||||||
|
|
||||||
import app.revanced.patches.youtube.layout.hide.filterbar.patch.HideFilterBarResourcePatch.Companion.filterBarHeightId
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patches.youtube.layout.hide.filterbar.patch.HideFilterBarResourcePatch
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object FilterBarHeightFingerprint : LiteralOpcodesFingerprint(
|
object FilterBarHeightFingerprint : LiteralValueFingerprint(
|
||||||
|
returnType = "V",
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.MOVE_RESULT,
|
Opcode.MOVE_RESULT,
|
||||||
Opcode.IPUT
|
Opcode.IPUT
|
||||||
),
|
),
|
||||||
filterBarHeightId
|
literal = HideFilterBarResourcePatch.filterBarHeightId
|
||||||
)
|
)
|
|
@ -1,19 +0,0 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.filterbar.fingerprints
|
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
import org.jf.dexlib2.Opcode
|
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
|
|
||||||
abstract class LiteralOpcodesFingerprint(opcodes: List<Opcode>, literal: Long) : MethodFingerprint(
|
|
||||||
opcodes = opcodes,
|
|
||||||
customFingerprint = { methodDef, _ ->
|
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
|
||||||
if (instruction.opcode != Opcode.CONST) return@any false
|
|
||||||
|
|
||||||
val wideLiteral = (instruction as WideLiteralInstruction).wideLiteral
|
|
||||||
|
|
||||||
literal == wideLiteral
|
|
||||||
} ?: false
|
|
||||||
}
|
|
||||||
)
|
|
|
@ -1,13 +1,18 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.filterbar.fingerprints
|
package app.revanced.patches.youtube.layout.hide.filterbar.fingerprints
|
||||||
|
|
||||||
import app.revanced.patches.youtube.layout.hide.filterbar.patch.HideFilterBarResourcePatch.Companion.relatedChipCloudMarginId
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patches.youtube.layout.hide.filterbar.patch.HideFilterBarResourcePatch
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object RelatedChipCloudFingerprint : LiteralOpcodesFingerprint(
|
object RelatedChipCloudFingerprint : LiteralValueFingerprint(
|
||||||
|
returnType = "V",
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.MOVE_RESULT_OBJECT
|
Opcode.MOVE_RESULT_OBJECT
|
||||||
),
|
),
|
||||||
relatedChipCloudMarginId
|
literal = HideFilterBarResourcePatch.relatedChipCloudMarginId
|
||||||
)
|
)
|
|
@ -1,9 +1,14 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.filterbar.fingerprints
|
package app.revanced.patches.youtube.layout.hide.filterbar.fingerprints
|
||||||
|
|
||||||
import app.revanced.patches.youtube.layout.hide.filterbar.patch.HideFilterBarResourcePatch.Companion.barContainerHeightId
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patches.youtube.layout.hide.filterbar.patch.HideFilterBarResourcePatch
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object SearchResultsChipBarFingerprint : LiteralOpcodesFingerprint(
|
object SearchResultsChipBarFingerprint : LiteralValueFingerprint(
|
||||||
|
returnType = "V",
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
@ -11,5 +16,5 @@ object SearchResultsChipBarFingerprint : LiteralOpcodesFingerprint(
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.MOVE_RESULT_OBJECT
|
Opcode.MOVE_RESULT_OBJECT
|
||||||
),
|
),
|
||||||
barContainerHeightId
|
literal = HideFilterBarResourcePatch.barContainerHeightId
|
||||||
)
|
)
|
|
@ -1,19 +1,19 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.floatingmicrophone.fingerprints
|
package app.revanced.patches.youtube.layout.hide.floatingmicrophone.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import app.revanced.patches.youtube.layout.hide.floatingmicrophone.patch.HideFloatingMicrophoneButtonResourcePatch
|
import app.revanced.patches.youtube.layout.hide.floatingmicrophone.patch.HideFloatingMicrophoneButtonResourcePatch
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object ShowFloatingMicrophoneButtonFingerprint : MethodFingerprint(
|
object ShowFloatingMicrophoneButtonFingerprint : LiteralValueFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf(),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.IGET_BOOLEAN,
|
Opcode.IGET_BOOLEAN,
|
||||||
Opcode.IF_EQZ,
|
Opcode.IF_EQZ,
|
||||||
Opcode.RETURN_VOID
|
Opcode.RETURN_VOID
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = HideFloatingMicrophoneButtonResourcePatch.fabButtonId
|
||||||
methodDef.implementation?.instructions?.any {
|
|
||||||
(it as? WideLiteralInstruction)?.wideLiteral == HideFloatingMicrophoneButtonResourcePatch.fabButtonId
|
|
||||||
} == true
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -5,7 +5,8 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
object InfocardsIncognitoFingerprint : MethodFingerprint(
|
object InfocardsIncognitoFingerprint : MethodFingerprint(
|
||||||
"Ljava/lang/Boolean;",
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
returnType = "Ljava/lang/Boolean;",
|
||||||
|
parameters = listOf("L", "J"),
|
||||||
strings = listOf("vibrator")
|
strings = listOf("vibrator")
|
||||||
)
|
)
|
|
@ -1,19 +1,15 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.infocards.fingerprints
|
package app.revanced.patches.youtube.layout.hide.infocards.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import app.revanced.patches.youtube.layout.hide.infocards.resource.patch.HideInfocardsResourcePatch
|
import app.revanced.patches.youtube.layout.hide.infocards.resource.patch.HideInfocardsResourcePatch
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object InfocardsMethodCallFingerprint : MethodFingerprint(
|
object InfocardsMethodCallFingerprint : LiteralValueFingerprint(
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.IGET_OBJECT,
|
||||||
Opcode.INVOKE_INTERFACE,
|
Opcode.INVOKE_INTERFACE,
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
strings = listOf("Missing ControlsOverlayPresenter for InfoCards to work."),
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
literal = HideInfocardsResourcePatch.drawerResourceId
|
||||||
(instruction as? WideLiteralInstruction)?.wideLiteral == HideInfocardsResourcePatch.drawerResourceId
|
|
||||||
} == true
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,13 +1,12 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.loadmorebutton.bytecode.fingerprints
|
package app.revanced.patches.youtube.layout.hide.loadmorebutton.bytecode.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import app.revanced.patches.youtube.layout.hide.loadmorebutton.resource.patch.HideLoadMoreButtonResourcePatch
|
import app.revanced.patches.youtube.layout.hide.loadmorebutton.resource.patch.HideLoadMoreButtonResourcePatch
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object HideLoadMoreButtonFingerprint : MethodFingerprint(
|
object HideLoadMoreButtonFingerprint : LiteralValueFingerprint(
|
||||||
returnType = "V",
|
returnType = "V",
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
parameters = listOf("L", "L", "L", "L"),
|
parameters = listOf("L", "L", "L", "L"),
|
||||||
|
@ -17,13 +16,5 @@ object HideLoadMoreButtonFingerprint : MethodFingerprint(
|
||||||
Opcode.INVOKE_STATIC,
|
Opcode.INVOKE_STATIC,
|
||||||
Opcode.MOVE_RESULT_OBJECT
|
Opcode.MOVE_RESULT_OBJECT
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = HideLoadMoreButtonResourcePatch.expandButtonDownId
|
||||||
methodDef.implementation?.instructions?.any {
|
|
||||||
if (it.opcode != Opcode.CONST) return@any false
|
|
||||||
|
|
||||||
val literal = (it as WideLiteralInstruction).wideLiteral
|
|
||||||
|
|
||||||
literal == HideLoadMoreButtonResourcePatch.expandButtonDownId
|
|
||||||
} ?: false
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,11 +1,12 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.personalinformation.bytecode.fingerprints
|
package app.revanced.patches.youtube.layout.hide.personalinformation.bytecode.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import app.revanced.patches.youtube.layout.hide.personalinformation.resource.patch.HideEmailAddressResourcePatch
|
import app.revanced.patches.youtube.layout.hide.personalinformation.resource.patch.HideEmailAddressResourcePatch
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object AccountSwitcherAccessibilityLabelFingerprint : MethodFingerprint(
|
object AccountSwitcherAccessibilityLabelFingerprint : LiteralValueFingerprint(
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf("L", "Ljava/lang/Object;"),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.IGET_OBJECT,
|
||||||
|
@ -15,10 +16,5 @@ object AccountSwitcherAccessibilityLabelFingerprint : MethodFingerprint(
|
||||||
Opcode.APUT_OBJECT,
|
Opcode.APUT_OBJECT,
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = HideEmailAddressResourcePatch.accountSwitcherAccessibilityLabelId
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
|
||||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
|
||||||
(instruction as? WideLiteralInstruction)?.wideLiteral == HideEmailAddressResourcePatch.accountSwitcherAccessibilityLabelId
|
|
||||||
} == true
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,13 +1,12 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.player.overlay.bytecode.fingerprints
|
package app.revanced.patches.youtube.layout.hide.player.overlay.bytecode.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import app.revanced.patches.youtube.layout.hide.player.overlay.resource.patch.HidePlayerOverlayResourcePatch
|
import app.revanced.patches.youtube.layout.hide.player.overlay.resource.patch.HidePlayerOverlayResourcePatch
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object CreatePlayerOverviewFingerprint : MethodFingerprint(
|
object CreatePlayerOverviewFingerprint : LiteralValueFingerprint(
|
||||||
returnType = "V",
|
returnType = "V",
|
||||||
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
|
@ -16,13 +15,5 @@ object CreatePlayerOverviewFingerprint : MethodFingerprint(
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.CHECK_CAST
|
Opcode.CHECK_CAST
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = HidePlayerOverlayResourcePatch.scrimOverlayId
|
||||||
methodDef.implementation?.instructions?.any {
|
|
||||||
if (it.opcode != Opcode.CONST) return@any false
|
|
||||||
|
|
||||||
val literal = (it as WideLiteralInstruction).wideLiteral
|
|
||||||
|
|
||||||
literal == HidePlayerOverlayResourcePatch.scrimOverlayId
|
|
||||||
} ?: false
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,5 +1,6 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.player.overlay.bytecode.patch
|
package app.revanced.patches.youtube.layout.hide.player.overlay.bytecode.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.indexOfFirstConstantInstructionValue
|
||||||
import app.revanced.extensions.toErrorResult
|
import app.revanced.extensions.toErrorResult
|
||||||
import app.revanced.patcher.annotation.Description
|
import app.revanced.patcher.annotation.Description
|
||||||
import app.revanced.patcher.annotation.Name
|
import app.revanced.patcher.annotation.Name
|
||||||
|
@ -16,7 +17,6 @@ import app.revanced.patches.youtube.layout.hide.player.overlay.annotations.HideP
|
||||||
import app.revanced.patches.youtube.layout.hide.player.overlay.bytecode.fingerprints.CreatePlayerOverviewFingerprint
|
import app.revanced.patches.youtube.layout.hide.player.overlay.bytecode.fingerprints.CreatePlayerOverviewFingerprint
|
||||||
import app.revanced.patches.youtube.layout.hide.player.overlay.resource.patch.HidePlayerOverlayResourcePatch
|
import app.revanced.patches.youtube.layout.hide.player.overlay.resource.patch.HidePlayerOverlayResourcePatch
|
||||||
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@Name("hide-player-overlay")
|
@Name("hide-player-overlay")
|
||||||
|
@ -28,11 +28,8 @@ class HidePlayerOverlayPatch : BytecodePatch(listOf(CreatePlayerOverviewFingerpr
|
||||||
override fun execute(context: BytecodeContext): PatchResult {
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
CreatePlayerOverviewFingerprint.result?.let { result ->
|
CreatePlayerOverviewFingerprint.result?.let { result ->
|
||||||
result.mutableMethod.apply {
|
result.mutableMethod.apply {
|
||||||
val viewRegisterIndex = implementation!!.instructions.indexOfFirst {
|
val viewRegisterIndex =
|
||||||
val literal = (it as? WideLiteralInstruction)?.wideLiteral
|
indexOfFirstConstantInstructionValue(HidePlayerOverlayResourcePatch.scrimOverlayId) + 3
|
||||||
|
|
||||||
literal == HidePlayerOverlayResourcePatch.scrimOverlayId
|
|
||||||
} + 3
|
|
||||||
val viewRegister = getInstruction<OneRegisterInstruction>(viewRegisterIndex).registerA
|
val viewRegister = getInstruction<OneRegisterInstruction>(viewRegisterIndex).registerA
|
||||||
|
|
||||||
val insertIndex = viewRegisterIndex + 1
|
val insertIndex = viewRegisterIndex + 1
|
||||||
|
|
|
@ -1,19 +1,13 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.shorts.bytecode.fingerprints
|
package app.revanced.patches.youtube.layout.hide.shorts.bytecode.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import app.revanced.patches.youtube.layout.hide.shorts.resource.patch.HideShortsComponentsResourcePatch
|
import app.revanced.patches.youtube.layout.hide.shorts.resource.patch.HideShortsComponentsResourcePatch
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object CreateShortsButtonsFingerprint : MethodFingerprint(
|
object CreateShortsButtonsFingerprint : LiteralValueFingerprint(
|
||||||
|
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
parameters = listOf("Z", "Z", "L"),
|
parameters = listOf("Z", "Z", "L"),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = HideShortsComponentsResourcePatch.reelPlayerRightLargeIconSize
|
||||||
methodDef.implementation?.instructions?.any {
|
|
||||||
if (it.opcode != Opcode.CONST) return@any false
|
|
||||||
|
|
||||||
val literal = (it as WideLiteralInstruction).wideLiteral
|
|
||||||
|
|
||||||
literal == HideShortsComponentsResourcePatch.reelPlayerRightLargeIconSize
|
|
||||||
} ?: false
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,19 +1,13 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.shorts.bytecode.fingerprints
|
package app.revanced.patches.youtube.layout.hide.shorts.bytecode.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import app.revanced.patches.youtube.layout.hide.shorts.resource.patch.HideShortsComponentsResourcePatch
|
import app.revanced.patches.youtube.layout.hide.shorts.resource.patch.HideShortsComponentsResourcePatch
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object ReelConstructorFingerprint : MethodFingerprint(
|
object ReelConstructorFingerprint : LiteralValueFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
opcodes = listOf(Opcode.INVOKE_VIRTUAL),
|
opcodes = listOf(Opcode.INVOKE_VIRTUAL),
|
||||||
customFingerprint = { method, _ ->
|
literal = HideShortsComponentsResourcePatch.reelMultipleItemShelfId
|
||||||
method.implementation?.instructions?.any {
|
|
||||||
if (it.opcode != Opcode.CONST) return@any false
|
|
||||||
|
|
||||||
val literal = (it as WideLiteralInstruction).wideLiteral
|
|
||||||
|
|
||||||
literal == HideShortsComponentsResourcePatch.reelMultipleItemShelfId
|
|
||||||
} ?: false
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,25 +1,28 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.time.fingerprints
|
package app.revanced.patches.youtube.layout.hide.time.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
|
||||||
@FuzzyPatternScanMethod(3)
|
|
||||||
object TimeCounterFingerprint : MethodFingerprint(
|
object TimeCounterFingerprint : MethodFingerprint(
|
||||||
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf(), listOf(
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
parameters = listOf(),
|
||||||
|
returnType = "V",
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.SUB_LONG_2ADDR,
|
||||||
|
Opcode.INVOKE_STATIC,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.IGET_OBJECT,
|
||||||
Opcode.IGET_WIDE,
|
Opcode.IGET_WIDE,
|
||||||
Opcode.CONST_WIDE_16,
|
Opcode.INVOKE_STATIC,
|
||||||
Opcode.CMP_LONG,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.IF_LEZ,
|
Opcode.INVOKE_INTERFACE,
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.RETURN_VOID,
|
||||||
Opcode.IF_EQZ,
|
),
|
||||||
Opcode.INVOKE_VIRTUAL,
|
customFingerprint = { _, classDef ->
|
||||||
Opcode.MOVE_RESULT,
|
// On older devices this fingerprint resolves very slowly.
|
||||||
Opcode.IF_EQZ,
|
// Speed this up by checking for the number of methods.
|
||||||
Opcode.GOTO,
|
classDef.methods.count() == 14
|
||||||
)
|
}
|
||||||
)
|
)
|
|
@ -1,5 +1,6 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.time.patch
|
package app.revanced.patches.youtube.layout.hide.time.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.toErrorResult
|
||||||
import app.revanced.patcher.annotation.Description
|
import app.revanced.patcher.annotation.Description
|
||||||
import app.revanced.patcher.annotation.Name
|
import app.revanced.patcher.annotation.Name
|
||||||
import app.revanced.patcher.annotation.Version
|
import app.revanced.patcher.annotation.Version
|
||||||
|
@ -38,7 +39,8 @@ class HideTimestampPatch : BytecodePatch(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
TimeCounterFingerprint.result!!.mutableMethod.addInstructionsWithLabels(
|
TimeCounterFingerprint.result?.apply {
|
||||||
|
mutableMethod.addInstructionsWithLabels(
|
||||||
0,
|
0,
|
||||||
"""
|
"""
|
||||||
invoke-static { }, Lapp/revanced/integrations/patches/HideTimestampPatch;->hideTimestamp()Z
|
invoke-static { }, Lapp/revanced/integrations/patches/HideTimestampPatch;->hideTimestamp()Z
|
||||||
|
@ -48,7 +50,8 @@ class HideTimestampPatch : BytecodePatch(
|
||||||
:hide_time
|
:hide_time
|
||||||
nop
|
nop
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
|
} ?: return TimeCounterFingerprint.toErrorResult()
|
||||||
|
|
||||||
return PatchResultSuccess()
|
return PatchResultSuccess()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package app.revanced.patches.youtube.layout.panels.fullscreen.remove.fingerprints
|
package app.revanced.patches.youtube.layout.panels.fullscreen.remove.fingerprints
|
||||||
|
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object FullscreenViewAdderParentFingerprint : MethodFingerprint(
|
object FullscreenViewAdderParentFingerprint : MethodFingerprint(
|
||||||
parameters = listOf("L", "L"),
|
returnType = "V",
|
||||||
|
parameters = listOf("Landroid/content/Context;", "Landroid/view/View;"),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.GOTO,
|
Opcode.GOTO,
|
||||||
Opcode.IGET_BOOLEAN,
|
Opcode.IGET_BOOLEAN,
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
package app.revanced.patches.youtube.layout.panels.popup.fingerprints
|
package app.revanced.patches.youtube.layout.panels.popup.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
|
||||||
@FuzzyPatternScanMethod(3)
|
|
||||||
object EngagementPanelControllerFingerprint : MethodFingerprint(
|
object EngagementPanelControllerFingerprint : MethodFingerprint(
|
||||||
returnType = "L",
|
returnType = "L",
|
||||||
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints
|
package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import app.revanced.patches.youtube.layout.returnyoutubedislike.resource.patch.ReturnYouTubeDislikeResourcePatch
|
import app.revanced.patches.youtube.layout.returnyoutubedislike.resource.patch.ReturnYouTubeDislikeResourcePatch
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object DislikesOldLayoutTextViewFingerprint : MethodFingerprint(
|
object DislikesOldLayoutTextViewFingerprint : LiteralValueFingerprint(
|
||||||
returnType = "V",
|
returnType = "V",
|
||||||
parameters = listOf("L"),
|
parameters = listOf("L"),
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
@ -19,10 +18,5 @@ object DislikesOldLayoutTextViewFingerprint : MethodFingerprint(
|
||||||
Opcode.IF_NEZ, // textview register
|
Opcode.IF_NEZ, // textview register
|
||||||
Opcode.GOTO,
|
Opcode.GOTO,
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = ReturnYouTubeDislikeResourcePatch.oldUIDislikeId
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
|
||||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
|
||||||
(instruction as? WideLiteralInstruction)?.wideLiteral == ReturnYouTubeDislikeResourcePatch.oldUIDislikeId
|
|
||||||
} == true
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,9 +1,12 @@
|
||||||
package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints
|
package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object ShortsTextViewFingerprint : MethodFingerprint(
|
object ShortsTextViewFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL,
|
||||||
returnType = "V",
|
returnType = "V",
|
||||||
parameters = listOf("L", "L"),
|
parameters = listOf("L", "L"),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
|
|
|
@ -6,7 +6,9 @@ import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object SetWordmarkHeaderFingerprint : MethodFingerprint(
|
object SetWordmarkHeaderFingerprint : MethodFingerprint(
|
||||||
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf("L"),
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf("Landroid/widget/ImageView;"),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.IGET_OBJECT,
|
||||||
Opcode.INVOKE_STATIC,
|
Opcode.INVOKE_STATIC,
|
||||||
|
@ -17,6 +19,5 @@ object SetWordmarkHeaderFingerprint : MethodFingerprint(
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.IGET_OBJECT,
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
Opcode.INVOKE_STATIC,
|
Opcode.INVOKE_STATIC,
|
||||||
),
|
)
|
||||||
customFingerprint = { methodDef, _ -> methodDef.parameterTypes.first() == "Landroid/widget/ImageView;" }
|
|
||||||
)
|
)
|
|
@ -1,15 +1,15 @@
|
||||||
package app.revanced.patches.youtube.layout.seekbar.bytecode.fingerprints
|
package app.revanced.patches.youtube.layout.seekbar.bytecode.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.extensions.containsConstantInstructionValue
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import app.revanced.patches.youtube.layout.seekbar.resource.SeekbarColorResourcePatch
|
import app.revanced.patches.youtube.layout.seekbar.resource.SeekbarColorResourcePatch
|
||||||
import app.revanced.util.patch.indexOfFirstConstantInstruction
|
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
object CreateDarkThemeSeekbarFingerprint : MethodFingerprint(
|
object CreateDarkThemeSeekbarFingerprint : MethodFingerprint(
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
customFingerprint = { method, _ ->
|
customFingerprint = { method, _ ->
|
||||||
method.indexOfFirstConstantInstruction(SeekbarColorResourcePatch.inlineTimeBarColorizedBarPlayedColorDarkId) != -1
|
method.containsConstantInstructionValue(SeekbarColorResourcePatch.inlineTimeBarColorizedBarPlayedColorDarkId)
|
||||||
&& method.indexOfFirstConstantInstruction(SeekbarColorResourcePatch.inlineTimeBarPlayedNotHighlightedColorId) != -1
|
&& method.containsConstantInstructionValue(SeekbarColorResourcePatch.inlineTimeBarPlayedNotHighlightedColorId)
|
||||||
}
|
}
|
||||||
)
|
)
|
|
@ -5,5 +5,8 @@ import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object SetSeekbarClickedColorFingerprint : MethodFingerprint(
|
object SetSeekbarClickedColorFingerprint : MethodFingerprint(
|
||||||
opcodes = listOf(Opcode.CONST_HIGH16),
|
opcodes = listOf(Opcode.CONST_HIGH16),
|
||||||
strings = listOf("YOUTUBE", "PREROLL", "POSTROLL")
|
strings = listOf("YOUTUBE", "PREROLL", "POSTROLL"),
|
||||||
|
customFingerprint = { methodDef, _ ->
|
||||||
|
methodDef.definingClass.endsWith("ControlsOverlayStyle;")
|
||||||
|
}
|
||||||
)
|
)
|
|
@ -1,5 +1,6 @@
|
||||||
package app.revanced.patches.youtube.layout.seekbar.bytecode.patch
|
package app.revanced.patches.youtube.layout.seekbar.bytecode.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.indexOfFirstConstantInstructionValue
|
||||||
import app.revanced.extensions.toErrorResult
|
import app.revanced.extensions.toErrorResult
|
||||||
import app.revanced.patcher.annotation.Description
|
import app.revanced.patcher.annotation.Description
|
||||||
import app.revanced.patcher.annotation.Version
|
import app.revanced.patcher.annotation.Version
|
||||||
|
@ -19,7 +20,6 @@ import app.revanced.patches.youtube.layout.seekbar.resource.SeekbarColorResource
|
||||||
import app.revanced.patches.youtube.layout.theme.bytecode.patch.LithoColorHookPatch
|
import app.revanced.patches.youtube.layout.theme.bytecode.patch.LithoColorHookPatch
|
||||||
import app.revanced.patches.youtube.layout.theme.bytecode.patch.LithoColorHookPatch.Companion.lithoColorOverrideHook
|
import app.revanced.patches.youtube.layout.theme.bytecode.patch.LithoColorHookPatch.Companion.lithoColorOverrideHook
|
||||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||||
import app.revanced.util.patch.indexOfFirstConstantInstruction
|
|
||||||
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ class SeekbarColorBytecodePatch : BytecodePatch(
|
||||||
) {
|
) {
|
||||||
override fun execute(context: BytecodeContext): PatchResult {
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
CreateDarkThemeSeekbarFingerprint.result?.mutableMethod?.apply {
|
CreateDarkThemeSeekbarFingerprint.result?.mutableMethod?.apply {
|
||||||
var registerIndex = indexOfFirstConstantInstruction(SeekbarColorResourcePatch.inlineTimeBarColorizedBarPlayedColorDarkId) + 2
|
var registerIndex = indexOfFirstConstantInstructionValue(SeekbarColorResourcePatch.inlineTimeBarColorizedBarPlayedColorDarkId) + 2
|
||||||
var colorRegister = (getInstruction(registerIndex) as OneRegisterInstruction).registerA
|
var colorRegister = (getInstruction(registerIndex) as OneRegisterInstruction).registerA
|
||||||
addInstructions(
|
addInstructions(
|
||||||
registerIndex + 1,
|
registerIndex + 1,
|
||||||
|
@ -42,7 +42,7 @@ class SeekbarColorBytecodePatch : BytecodePatch(
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
|
|
||||||
registerIndex = indexOfFirstConstantInstruction(SeekbarColorResourcePatch.inlineTimeBarPlayedNotHighlightedColorId) + 2
|
registerIndex = indexOfFirstConstantInstructionValue(SeekbarColorResourcePatch.inlineTimeBarPlayedNotHighlightedColorId) + 2
|
||||||
colorRegister = (getInstruction(registerIndex) as OneRegisterInstruction).registerA
|
colorRegister = (getInstruction(registerIndex) as OneRegisterInstruction).registerA
|
||||||
addInstructions(
|
addInstructions(
|
||||||
registerIndex + 1,
|
registerIndex + 1,
|
||||||
|
|
|
@ -8,7 +8,7 @@ import org.jf.dexlib2.Opcode
|
||||||
object AppendTimeFingerprint : MethodFingerprint(
|
object AppendTimeFingerprint : MethodFingerprint(
|
||||||
"V",
|
"V",
|
||||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
listOf("L", "L", "L"),
|
listOf("Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;"),
|
||||||
listOf(
|
listOf(
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints
|
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
|
||||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
import org.jf.dexlib2.AccessFlags
|
|
||||||
import org.jf.dexlib2.Opcode
|
|
||||||
|
|
||||||
|
|
||||||
@FuzzyPatternScanMethod(2)
|
|
||||||
object MiniPlayerDimensionsCalculatorFingerprint : MethodFingerprint(
|
|
||||||
"V",
|
|
||||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
|
||||||
listOf("L"),
|
|
||||||
listOf(
|
|
||||||
Opcode.INVOKE_DIRECT,
|
|
||||||
Opcode.MOVE_RESULT,
|
|
||||||
Opcode.IF_NEZ,
|
|
||||||
Opcode.FLOAT_TO_DOUBLE,
|
|
||||||
Opcode.CONST_WIDE_HIGH16,
|
|
||||||
Opcode.CMPL_DOUBLE,
|
|
||||||
)
|
|
||||||
)
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object MiniPlayerDimensionsCalculatorParentFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf("F"),
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.CONST_HIGH16,
|
||||||
|
Opcode.ADD_FLOAT_2ADDR,
|
||||||
|
Opcode.MUL_FLOAT,
|
||||||
|
Opcode.CONST_4,
|
||||||
|
Opcode.INVOKE_STATIC,
|
||||||
|
Opcode.MOVE_RESULT,
|
||||||
|
Opcode.FLOAT_TO_INT,
|
||||||
|
Opcode.INVOKE_INTERFACE,
|
||||||
|
Opcode.RETURN_VOID,
|
||||||
|
)
|
||||||
|
)
|
|
@ -8,7 +8,7 @@ import org.jf.dexlib2.Opcode
|
||||||
object MiniPlayerResponseModelSizeCheckFingerprint : MethodFingerprint(
|
object MiniPlayerResponseModelSizeCheckFingerprint : MethodFingerprint(
|
||||||
"L",
|
"L",
|
||||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
listOf("L", "L"),
|
listOf("Ljava/lang/Object;", "Ljava/lang/Object;"),
|
||||||
listOf(
|
listOf(
|
||||||
Opcode.RETURN_OBJECT,
|
Opcode.RETURN_OBJECT,
|
||||||
Opcode.CHECK_CAST,
|
Opcode.CHECK_CAST,
|
||||||
|
|
|
@ -32,7 +32,7 @@ import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
class TabletMiniPlayerPatch : BytecodePatch(
|
class TabletMiniPlayerPatch : BytecodePatch(
|
||||||
listOf(
|
listOf(
|
||||||
MiniPlayerDimensionsCalculatorFingerprint,
|
MiniPlayerDimensionsCalculatorParentFingerprint,
|
||||||
MiniPlayerResponseModelSizeCheckFingerprint,
|
MiniPlayerResponseModelSizeCheckFingerprint,
|
||||||
MiniPlayerOverrideParentFingerprint
|
MiniPlayerOverrideParentFingerprint
|
||||||
)
|
)
|
||||||
|
@ -48,7 +48,8 @@ class TabletMiniPlayerPatch : BytecodePatch(
|
||||||
)
|
)
|
||||||
|
|
||||||
// First resolve the fingerprints via the parent fingerprint.
|
// First resolve the fingerprints via the parent fingerprint.
|
||||||
val miniPlayerClass = MiniPlayerDimensionsCalculatorFingerprint.result!!.classDef
|
MiniPlayerDimensionsCalculatorParentFingerprint.result ?: return MiniPlayerDimensionsCalculatorParentFingerprint.toErrorResult()
|
||||||
|
val miniPlayerClass = MiniPlayerDimensionsCalculatorParentFingerprint.result!!.classDef
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* No context parameter method.
|
* No context parameter method.
|
||||||
|
|
|
@ -6,7 +6,10 @@ import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object LithoThemeFingerprint : MethodFingerprint(
|
object LithoThemeFingerprint : MethodFingerprint(
|
||||||
"V", AccessFlags.PROTECTED or AccessFlags.FINAL, listOf("L"), listOf(
|
returnType = "V",
|
||||||
|
accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL,
|
||||||
|
parameters = listOf("Landroid/graphics/Rect;"),
|
||||||
|
opcodes = listOf(
|
||||||
Opcode.APUT,
|
Opcode.APUT,
|
||||||
Opcode.NEW_INSTANCE,
|
Opcode.NEW_INSTANCE,
|
||||||
Opcode.INVOKE_DIRECT,
|
Opcode.INVOKE_DIRECT,
|
||||||
|
@ -22,5 +25,8 @@ object LithoThemeFingerprint : MethodFingerprint(
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.IGET_OBJECT,
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.RETURN_VOID
|
Opcode.RETURN_VOID
|
||||||
)
|
),
|
||||||
|
customFingerprint = { methodDef, _ ->
|
||||||
|
methodDef.name == "onBoundsChange"
|
||||||
|
}
|
||||||
)
|
)
|
|
@ -1,9 +1,13 @@
|
||||||
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object OnBackPressedFingerprint : MethodFingerprint(
|
object OnBackPressedFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.RETURN_VOID
|
Opcode.RETURN_VOID
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object RecyclerViewScrollingFingerprint : MethodFingerprint(
|
object RecyclerViewScrollingFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf(),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.IGET_OBJECT,
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.IGET_OBJECT,
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object RecyclerViewTopScrollingParentFingerprint : MethodFingerprint(
|
object RecyclerViewTopScrollingParentFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
|
parameters = listOf("L", "L", "Landroid/view/ViewGroup;", "Landroid/view/ViewGroup;"),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.INVOKE_DIRECT,
|
Opcode.INVOKE_DIRECT,
|
||||||
Opcode.IPUT_OBJECT,
|
Opcode.IPUT_OBJECT,
|
||||||
|
@ -14,7 +18,4 @@ object RecyclerViewTopScrollingParentFingerprint : MethodFingerprint(
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.NEW_INSTANCE
|
Opcode.NEW_INSTANCE
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
|
||||||
methodDef.name == "<init>"
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,6 +1,8 @@
|
||||||
package app.revanced.patches.youtube.misc.integrations.fingerprints
|
package app.revanced.patches.youtube.misc.integrations.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint
|
import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Old API activity to embed YouTube into 3rd party Android apps.
|
* Old API activity to embed YouTube into 3rd party Android apps.
|
||||||
|
@ -10,6 +12,9 @@ import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.
|
||||||
* https://developers.google.com/youtube/android/player
|
* https://developers.google.com/youtube/android/player
|
||||||
*/
|
*/
|
||||||
object StandalonePlayerActivityFingerprint : IntegrationsFingerprint(
|
object StandalonePlayerActivityFingerprint : IntegrationsFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf("L"),
|
||||||
customFingerprint = { methodDef, _ ->
|
customFingerprint = { methodDef, _ ->
|
||||||
methodDef.definingClass == "Lcom/google/android/youtube/api/StandalonePlayerActivity;"
|
methodDef.definingClass == "Lcom/google/android/youtube/api/StandalonePlayerActivity;"
|
||||||
&& methodDef.name == "onCreate"
|
&& methodDef.name == "onCreate"
|
||||||
|
|
|
@ -9,5 +9,5 @@ object ComponentContextParserFingerprint : MethodFingerprint(
|
||||||
Opcode.IPUT_OBJECT,
|
Opcode.IPUT_OBJECT,
|
||||||
Opcode.NEW_INSTANCE
|
Opcode.NEW_INSTANCE
|
||||||
),
|
),
|
||||||
strings = listOf("Component was not found %s because it was removed due to duplicate converter bindings")
|
strings = listOf("Component was not found %s because it was removed due to duplicate converter bindings.")
|
||||||
)
|
)
|
|
@ -1,11 +1,13 @@
|
||||||
package app.revanced.patches.youtube.misc.litho.filter.fingerprints
|
package app.revanced.patches.youtube.misc.litho.filter.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
object LithoFilterFingerprint : MethodFingerprint(
|
object LithoFilterFingerprint : MethodFingerprint(
|
||||||
customFingerprint = custom@{ method, classDef ->
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC or AccessFlags.CONSTRUCTOR,
|
||||||
if (method.name != "<clinit>") return@custom false
|
returnType = "V",
|
||||||
|
customFingerprint = { _, classDef ->
|
||||||
classDef.type.endsWith("LithoFilterPatch;")
|
classDef.type.endsWith("LithoFilterPatch;")
|
||||||
}
|
}
|
||||||
)
|
)
|
|
@ -1,13 +1,10 @@
|
||||||
package app.revanced.patches.youtube.misc.minimizedplayback.fingerprints
|
package app.revanced.patches.youtube.misc.minimizedplayback.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
|
||||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
|
||||||
object MinimizedPlaybackManagerFingerprint : MethodFingerprint(
|
object MinimizedPlaybackManagerFingerprint : MethodFingerprint(
|
||||||
"Z",
|
"Z",
|
||||||
AccessFlags.PUBLIC or AccessFlags.STATIC,
|
AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||||
|
|
|
@ -1,16 +1,14 @@
|
||||||
package app.revanced.patches.youtube.misc.minimizedplayback.fingerprints
|
package app.revanced.patches.youtube.misc.minimizedplayback.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
|
||||||
@FuzzyPatternScanMethod(2)
|
|
||||||
object MinimizedPlaybackSettingsFingerprint : MethodFingerprint(
|
object MinimizedPlaybackSettingsFingerprint : MethodFingerprint(
|
||||||
"L",
|
returnType = "L",
|
||||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
parameters = listOf(),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.MOVE_RESULT,
|
Opcode.MOVE_RESULT,
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
package app.revanced.patches.youtube.misc.minimizedplayback.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class fingerprint for [MinimizedPlaybackSettingsFingerprint]
|
||||||
|
*/
|
||||||
|
object MinimizedPlaybackSettingsParentFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
|
parameters = listOf("Landroid/content/Context;", "Landroid/support/v4/media/session/MediaSessionCompat"),
|
||||||
|
strings = listOf("sessionToken must not be null")
|
||||||
|
)
|
|
@ -8,6 +8,7 @@ import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.data.toMethodWalker
|
import app.revanced.patcher.data.toMethodWalker
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.PatchResult
|
import app.revanced.patcher.patch.PatchResult
|
||||||
import app.revanced.patcher.patch.PatchResultSuccess
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
@ -21,6 +22,7 @@ import app.revanced.patches.youtube.misc.minimizedplayback.annotations.Minimized
|
||||||
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.KidsMinimizedPlaybackPolicyControllerFingerprint
|
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.KidsMinimizedPlaybackPolicyControllerFingerprint
|
||||||
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackManagerFingerprint
|
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackManagerFingerprint
|
||||||
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackSettingsFingerprint
|
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackSettingsFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackSettingsParentFingerprint
|
||||||
import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch
|
import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch
|
||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
||||||
|
@ -35,7 +37,7 @@ import org.jf.dexlib2.iface.reference.MethodReference
|
||||||
class MinimizedPlaybackPatch : BytecodePatch(
|
class MinimizedPlaybackPatch : BytecodePatch(
|
||||||
listOf(
|
listOf(
|
||||||
MinimizedPlaybackManagerFingerprint,
|
MinimizedPlaybackManagerFingerprint,
|
||||||
MinimizedPlaybackSettingsFingerprint,
|
MinimizedPlaybackSettingsParentFingerprint,
|
||||||
KidsMinimizedPlaybackPolicyControllerFingerprint
|
KidsMinimizedPlaybackPolicyControllerFingerprint
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
|
@ -60,6 +62,8 @@ class MinimizedPlaybackPatch : BytecodePatch(
|
||||||
} ?: return MinimizedPlaybackManagerFingerprint.toErrorResult()
|
} ?: return MinimizedPlaybackManagerFingerprint.toErrorResult()
|
||||||
|
|
||||||
// Enable minimized playback option in YouTube settings
|
// Enable minimized playback option in YouTube settings
|
||||||
|
MinimizedPlaybackSettingsParentFingerprint.result ?: return MinimizedPlaybackSettingsParentFingerprint.toErrorResult()
|
||||||
|
MinimizedPlaybackSettingsFingerprint.resolve(context, MinimizedPlaybackSettingsParentFingerprint.result!!.classDef)
|
||||||
MinimizedPlaybackSettingsFingerprint.result?.apply {
|
MinimizedPlaybackSettingsFingerprint.result?.apply {
|
||||||
val booleanCalls = method.implementation!!.instructions.withIndex()
|
val booleanCalls = method.implementation!!.instructions.withIndex()
|
||||||
.filter { ((it.value as? ReferenceInstruction)?.reference as? MethodReference)?.returnType == "Z" }
|
.filter { ((it.value as? ReferenceInstruction)?.reference as? MethodReference)?.returnType == "Z" }
|
||||||
|
|
|
@ -5,42 +5,33 @@ import app.revanced.patcher.annotation.Name
|
||||||
import app.revanced.patcher.annotation.Version
|
import app.revanced.patcher.annotation.Version
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.PatchResult
|
import app.revanced.patcher.patch.PatchResult
|
||||||
import app.revanced.patcher.patch.PatchResultSuccess
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
import app.revanced.patcher.patch.annotations.DependsOn
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
|
|
||||||
import app.revanced.patches.youtube.misc.playercontrols.annotation.PlayerControlsCompatibility
|
import app.revanced.patches.youtube.misc.playercontrols.annotation.PlayerControlsCompatibility
|
||||||
import app.revanced.patches.youtube.misc.playercontrols.fingerprints.BottomControlsInflateFingerprint
|
import app.revanced.patches.youtube.misc.playercontrols.fingerprints.BottomControlsInflateFingerprint
|
||||||
import app.revanced.patches.youtube.misc.playercontrols.fingerprints.PlayerControlsVisibilityFingerprint
|
import app.revanced.patches.youtube.misc.playercontrols.fingerprints.PlayerControlsVisibilityFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.playercontrols.resource.patch.BottomControlsResourcePatch
|
||||||
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
|
|
||||||
@Name("player-controls-bytecode-patch")
|
@Name("player-controls-bytecode-patch")
|
||||||
@DependsOn([ResourceMappingPatch::class])
|
@DependsOn([BottomControlsResourcePatch::class])
|
||||||
@Description("Manages the code for the player controls of the YouTube player.")
|
@Description("Manages the code for the player controls of the YouTube player.")
|
||||||
@PlayerControlsCompatibility
|
@PlayerControlsCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
class PlayerControlsBytecodePatch : BytecodePatch(
|
class PlayerControlsBytecodePatch : BytecodePatch(
|
||||||
listOf(PlayerControlsVisibilityFingerprint)
|
listOf(PlayerControlsVisibilityFingerprint, BottomControlsInflateFingerprint)
|
||||||
) {
|
) {
|
||||||
override fun execute(context: BytecodeContext): PatchResult {
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
showPlayerControlsFingerprintResult = PlayerControlsVisibilityFingerprint.result!!
|
showPlayerControlsFingerprintResult = PlayerControlsVisibilityFingerprint.result!!
|
||||||
|
|
||||||
bottomUiContainerResourceId = ResourceMappingPatch
|
|
||||||
.resourceMappings
|
|
||||||
.single { it.type == "id" && it.name == "bottom_ui_container_stub" }.id
|
|
||||||
|
|
||||||
// TODO: another solution is required, this is hacky
|
|
||||||
listOf(BottomControlsInflateFingerprint).resolve(context, context.classes)
|
|
||||||
inflateFingerprintResult = BottomControlsInflateFingerprint.result!!
|
inflateFingerprintResult = BottomControlsInflateFingerprint.result!!
|
||||||
|
|
||||||
return PatchResultSuccess()
|
return PatchResultSuccess()
|
||||||
}
|
}
|
||||||
|
|
||||||
internal companion object {
|
internal companion object {
|
||||||
var bottomUiContainerResourceId: Long = 0
|
|
||||||
|
|
||||||
lateinit var showPlayerControlsFingerprintResult: MethodFingerprintResult
|
lateinit var showPlayerControlsFingerprintResult: MethodFingerprintResult
|
||||||
|
|
||||||
|
|
|
@ -1,21 +1,19 @@
|
||||||
package app.revanced.patches.youtube.misc.playercontrols.fingerprints
|
package app.revanced.patches.youtube.misc.playercontrols.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import app.revanced.patches.youtube.misc.playercontrols.bytecode.patch.PlayerControlsBytecodePatch
|
import app.revanced.patches.youtube.misc.playercontrols.resource.patch.BottomControlsResourcePatch
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object BottomControlsInflateFingerprint : MethodFingerprint(
|
object BottomControlsInflateFingerprint : LiteralValueFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL or AccessFlags.SYNTHETIC,
|
||||||
|
returnType = "L",
|
||||||
|
parameters = listOf(),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.CHECK_CAST,
|
Opcode.CHECK_CAST,
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.MOVE_RESULT_OBJECT
|
Opcode.MOVE_RESULT_OBJECT
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = BottomControlsResourcePatch.bottomUiContainerResourceId
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
|
||||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
|
||||||
(instruction as? WideLiteralInstruction)?.wideLiteral == PlayerControlsBytecodePatch.bottomUiContainerResourceId
|
|
||||||
} == true
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,10 +1,12 @@
|
||||||
package app.revanced.patches.youtube.misc.playercontrols.fingerprints
|
package app.revanced.patches.youtube.misc.playercontrols.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
object PlayerControlsVisibilityFingerprint : MethodFingerprint(
|
object PlayerControlsVisibilityFingerprint : MethodFingerprint(
|
||||||
"V",
|
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
parameters = listOf("Z", "Z"),
|
parameters = listOf("Z", "Z"),
|
||||||
customFingerprint = { methodDef, _ ->
|
customFingerprint = { methodDef, _ ->
|
||||||
methodDef.definingClass.endsWith("YouTubeControlsOverlay;")
|
methodDef.definingClass.endsWith("YouTubeControlsOverlay;")
|
||||||
|
|
|
@ -8,22 +8,30 @@ import app.revanced.patcher.data.ResourceContext
|
||||||
import app.revanced.patcher.patch.PatchResult
|
import app.revanced.patcher.patch.PatchResult
|
||||||
import app.revanced.patcher.patch.PatchResultSuccess
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
import app.revanced.patcher.patch.ResourcePatch
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
|
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
|
||||||
import app.revanced.patches.youtube.misc.playercontrols.annotation.PlayerControlsCompatibility
|
import app.revanced.patches.youtube.misc.playercontrols.annotation.PlayerControlsCompatibility
|
||||||
import java.io.Closeable
|
import java.io.Closeable
|
||||||
|
|
||||||
@Name("bottom-controls-resource-patch")
|
@Name("bottom-controls-resource-patch")
|
||||||
@Description("Manages the resources for the bottom controls of the YouTube player.")
|
@Description("Manages the resources for the bottom controls of the YouTube player.")
|
||||||
@PlayerControlsCompatibility
|
@PlayerControlsCompatibility
|
||||||
|
@DependsOn([ResourceMappingPatch::class])
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
class BottomControlsResourcePatch : ResourcePatch, Closeable {
|
class BottomControlsResourcePatch : ResourcePatch, Closeable {
|
||||||
override fun execute(context: ResourceContext): PatchResult {
|
override fun execute(context: ResourceContext): PatchResult {
|
||||||
resourceContext = context
|
resourceContext = context
|
||||||
targetXmlEditor = context.xmlEditor[TARGET_RESOURCE]
|
targetXmlEditor = context.xmlEditor[TARGET_RESOURCE]
|
||||||
|
|
||||||
|
bottomUiContainerResourceId = ResourceMappingPatch.resourceMappings
|
||||||
|
.single { it.type == "id" && it.name == "bottom_ui_container_stub" }.id
|
||||||
|
|
||||||
return PatchResultSuccess()
|
return PatchResultSuccess()
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
internal var bottomUiContainerResourceId : Long = -1
|
||||||
|
|
||||||
internal const val TARGET_RESOURCE_NAME = "youtube_controls_bottom_ui_container.xml"
|
internal const val TARGET_RESOURCE_NAME = "youtube_controls_bottom_ui_container.xml"
|
||||||
private const val TARGET_RESOURCE = "res/layout/$TARGET_RESOURCE_NAME"
|
private const val TARGET_RESOURCE = "res/layout/$TARGET_RESOURCE_NAME"
|
||||||
|
|
||||||
|
@ -33,8 +41,6 @@ class BottomControlsResourcePatch : ResourcePatch, Closeable {
|
||||||
// The element to which to add the new elements to
|
// The element to which to add the new elements to
|
||||||
private var lastLeftOf = "fullscreen_button"
|
private var lastLeftOf = "fullscreen_button"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add new controls to the bottom of the YouTube player.
|
* Add new controls to the bottom of the YouTube player.
|
||||||
* @param hostYouTubeControlsBottomUiResourceName The hosting resource name containing the elements.
|
* @param hostYouTubeControlsBottomUiResourceName The hosting resource name containing the elements.
|
||||||
|
|
|
@ -1,8 +1,13 @@
|
||||||
package app.revanced.patches.youtube.misc.settings.bytecode.fingerprints
|
package app.revanced.patches.youtube.misc.settings.bytecode.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
object LicenseActivityFingerprint : MethodFingerprint(
|
object LicenseActivityFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf("L"),
|
||||||
customFingerprint = { methodDef, _ ->
|
customFingerprint = { methodDef, _ ->
|
||||||
methodDef.definingClass.endsWith("LicenseActivity;") && methodDef.name == "onCreate"
|
methodDef.definingClass.endsWith("LicenseActivity;") && methodDef.name == "onCreate"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +1,15 @@
|
||||||
package app.revanced.patches.youtube.misc.settings.bytecode.fingerprints
|
package app.revanced.patches.youtube.misc.settings.bytecode.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import app.revanced.patches.youtube.misc.settings.resource.patch.SettingsResourcePatch
|
import app.revanced.patches.youtube.misc.settings.resource.patch.SettingsResourcePatch
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object SetThemeFingerprint : MethodFingerprint(
|
object SetThemeFingerprint : LiteralValueFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
returnType = "L",
|
returnType = "L",
|
||||||
|
parameters = listOf(),
|
||||||
opcodes = listOf(Opcode.RETURN_OBJECT),
|
opcodes = listOf(Opcode.RETURN_OBJECT),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = SettingsResourcePatch.appearanceStringId
|
||||||
methodDef.implementation?.instructions?.any { instruction ->
|
|
||||||
if (instruction.opcode != Opcode.CONST) return@any false
|
|
||||||
|
|
||||||
val wideLiteral = (instruction as WideLiteralInstruction).wideLiteral
|
|
||||||
|
|
||||||
SettingsResourcePatch.appearanceStringId == wideLiteral
|
|
||||||
} ?: false
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,9 +1,14 @@
|
||||||
package app.revanced.patches.youtube.video.information.fingerprints
|
package app.revanced.patches.youtube.video.information.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object OnPlaybackSpeedItemClickFingerprint : MethodFingerprint(
|
object OnPlaybackSpeedItemClickFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf("L", "L", "I", "J"),
|
||||||
customFingerprint = { methodDef, _ -> methodDef.name == "onItemClick" },
|
customFingerprint = { methodDef, _ -> methodDef.name == "onItemClick" },
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
|
|
@ -1,11 +1,15 @@
|
||||||
package app.revanced.patches.youtube.video.oldqualitylayout.fingerprints
|
package app.revanced.patches.youtube.video.oldqualitylayout.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import app.revanced.patches.youtube.video.oldqualitylayout.patch.OldQualityLayoutResourcePatch
|
import app.revanced.patches.youtube.video.oldqualitylayout.patch.OldQualityLayoutResourcePatch
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
object QualityMenuViewInflateFingerprint : MethodFingerprint(
|
object QualityMenuViewInflateFingerprint : LiteralValueFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
parameters = listOf("L", "L", "L"),
|
||||||
|
returnType = "L",
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.INVOKE_SUPER,
|
Opcode.INVOKE_SUPER,
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
|
@ -22,13 +26,5 @@ object QualityMenuViewInflateFingerprint : MethodFingerprint(
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.CHECK_CAST
|
Opcode.CHECK_CAST
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literal = OldQualityLayoutResourcePatch.videoQualityBottomSheetListFragmentTitle
|
||||||
methodDef.implementation?.instructions?.any {
|
|
||||||
if (it.opcode != Opcode.CONST) return@any false
|
|
||||||
|
|
||||||
val literal = (it as WideLiteralInstruction).wideLiteral
|
|
||||||
|
|
||||||
literal == OldQualityLayoutResourcePatch.videoQualityBottomSheetListFragmentTitle
|
|
||||||
} ?: false
|
|
||||||
}
|
|
||||||
)
|
)
|
|
@ -1,19 +1,18 @@
|
||||||
package app.revanced.patches.youtube.video.speed.custom.fingerprints
|
package app.revanced.patches.youtube.video.speed.custom.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
@FuzzyPatternScanMethod(2)
|
|
||||||
object SpeedArrayGeneratorFingerprint : MethodFingerprint(
|
object SpeedArrayGeneratorFingerprint : MethodFingerprint(
|
||||||
"[L",
|
returnType = "[L",
|
||||||
AccessFlags.PUBLIC or AccessFlags.STATIC,
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||||
|
parameters = listOf("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;"),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.IF_NEZ,
|
Opcode.IF_NEZ,
|
||||||
Opcode.SGET_OBJECT,
|
Opcode.SGET_OBJECT,
|
||||||
Opcode.GOTO,
|
Opcode.GOTO_16,
|
||||||
Opcode.INVOKE_INTERFACE,
|
Opcode.INVOKE_INTERFACE,
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.IGET_OBJECT,
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
package app.revanced.patches.youtube.video.videoid.fingerprint
|
package app.revanced.patches.youtube.video.videoid.fingerprint
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
@FuzzyPatternScanMethod(2)
|
|
||||||
object VideoIdFingerprint : MethodFingerprint(
|
object VideoIdFingerprint : MethodFingerprint(
|
||||||
returnType = "V",
|
returnType = "V",
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
package app.revanced.util.patch
|
|
||||||
|
|
||||||
import org.jf.dexlib2.Opcode
|
|
||||||
import org.jf.dexlib2.iface.Method
|
|
||||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the first constant instruction with the resource id, or -1 if not found.
|
|
||||||
*/
|
|
||||||
fun Method.indexOfFirstConstantInstruction(constantValue: Long): Int {
|
|
||||||
return implementation?.let {
|
|
||||||
it.instructions.indexOfFirst { instruction ->
|
|
||||||
instruction.opcode == Opcode.CONST && (instruction as WideLiteralInstruction).wideLiteral == constantValue
|
|
||||||
}
|
|
||||||
} ?: -1
|
|
||||||
}
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package app.revanced.util.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.containsConstantInstructionValue
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
abstract class LiteralValueFingerprint(
|
||||||
|
returnType: String? = null,
|
||||||
|
accessFlags: Int? = null,
|
||||||
|
parameters: Iterable<String>? = null,
|
||||||
|
opcodes: Iterable<Opcode>? = null,
|
||||||
|
strings: Iterable<String>? = null,
|
||||||
|
literal: Long
|
||||||
|
) : MethodFingerprint(
|
||||||
|
returnType = returnType,
|
||||||
|
accessFlags = accessFlags,
|
||||||
|
parameters = parameters,
|
||||||
|
opcodes = opcodes,
|
||||||
|
strings = strings,
|
||||||
|
customFingerprint = { methodDef, _ ->
|
||||||
|
methodDef.containsConstantInstructionValue(literal)
|
||||||
|
}
|
||||||
|
)
|
Loading…
Reference in a new issue