mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-05-23 18:37:14 +02:00
fix(YouTube/Return YouTube Dislike): match to official ReVanced code
This commit is contained in:
parent
99b1b90ba6
commit
64a1057009
@ -2,28 +2,28 @@ package app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber
|
||||
|
||||
import app.revanced.extensions.exception
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber.fingerprints.RollingNumberSetterFingerprint
|
||||
import app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber.fingerprints.RollingNumberTextViewFingerprint
|
||||
import app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber.fingerprints.RollingNumberTypeFingerprint
|
||||
import app.revanced.patches.youtube.utils.settings.SettingsPatch
|
||||
import app.revanced.util.integrations.Constants.UTILS_PATH
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
import com.android.tools.smali.dexlib2.iface.reference.Reference
|
||||
|
||||
@Patch(dependencies = [SettingsPatch::class])
|
||||
object ReturnYouTubeDislikeRollingNumberPatch : BytecodePatch(
|
||||
setOf(
|
||||
RollingNumberTextViewFingerprint,
|
||||
RollingNumberTypeFingerprint
|
||||
RollingNumberSetterFingerprint,
|
||||
RollingNumberTextViewFingerprint
|
||||
)
|
||||
) {
|
||||
private const val CONVERSION_CONTEXT_PARAMETER = 2
|
||||
@ -43,7 +43,7 @@ object ReturnYouTubeDislikeRollingNumberPatch : BytecodePatch(
|
||||
*/
|
||||
if (SettingsPatch.upward1841) {
|
||||
|
||||
RollingNumberTypeFingerprint.result?.let {
|
||||
RollingNumberSetterFingerprint.result?.let {
|
||||
it.mutableMethod.apply {
|
||||
val rollingNumberClassIndex = it.scanResult.patternScanResult!!.startIndex
|
||||
val rollingNumberClassReference =
|
||||
@ -51,42 +51,41 @@ object ReturnYouTubeDislikeRollingNumberPatch : BytecodePatch(
|
||||
val rollingNumberClass =
|
||||
context.findClass(rollingNumberClassReference.toString())!!.mutableClass
|
||||
|
||||
/**
|
||||
* This class handles RollingNumber.
|
||||
* Pass an instance of this class to integrations to use Java Reflection.
|
||||
*/
|
||||
lateinit var charSequenceFieldReference: Reference
|
||||
|
||||
rollingNumberClass.methods.find { method -> method.name == "<init>" }
|
||||
?.apply {
|
||||
val rollingNumberFieldIndex =
|
||||
implementation!!.instructions.indexOfFirst { instruction ->
|
||||
instruction.opcode == Opcode.IPUT_OBJECT
|
||||
}
|
||||
val rollingNumberFieldName =
|
||||
(getInstruction<ReferenceInstruction>(rollingNumberFieldIndex).reference as FieldReference).name
|
||||
|
||||
addInstructions(
|
||||
1, """
|
||||
const-string v0, "$rollingNumberFieldName"
|
||||
invoke-static {p0, v0}, $INTEGRATIONS_RYD_CLASS_DESCRIPTOR->initialize(Ljava/lang/Object;Ljava/lang/String;)V
|
||||
"""
|
||||
)
|
||||
charSequenceFieldReference = getInstruction<ReferenceInstruction>(rollingNumberFieldIndex).reference
|
||||
} ?: throw PatchException("RollingNumberClass not found!")
|
||||
|
||||
/**
|
||||
* RollingNumber is initialized in this method.
|
||||
* This method also contains information about ConversionContext.
|
||||
*/
|
||||
addInstruction(
|
||||
1,
|
||||
"invoke-static {p$CONVERSION_CONTEXT_PARAMETER}, $INTEGRATIONS_RYD_CLASS_DESCRIPTOR->onRollingNumberTextLoaded(Ljava/lang/Object;)V"
|
||||
val insertIndex = rollingNumberClassIndex + 1
|
||||
|
||||
val charSequenceInstanceRegister =
|
||||
getInstruction<OneRegisterInstruction>(rollingNumberClassIndex).registerA
|
||||
|
||||
val registerCount = implementation!!.registerCount
|
||||
|
||||
// This register is being overwritten, so it is free to use.
|
||||
val freeRegister = registerCount - 1
|
||||
val conversionContextRegister = registerCount - parameters.size + 1
|
||||
|
||||
addInstructions(
|
||||
insertIndex, """
|
||||
iget-object v$freeRegister, v$charSequenceInstanceRegister, $charSequenceFieldReference
|
||||
invoke-static {v$conversionContextRegister, v$freeRegister}, $INTEGRATIONS_RYD_CLASS_DESCRIPTOR->onRollingNumberLoaded(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;
|
||||
move-result-object v$freeRegister
|
||||
iput-object v$freeRegister, v$charSequenceInstanceRegister, $charSequenceFieldReference
|
||||
"""
|
||||
)
|
||||
}
|
||||
} ?: throw RollingNumberTypeFingerprint.exception
|
||||
} ?: throw RollingNumberSetterFingerprint.exception
|
||||
|
||||
/**
|
||||
* TextView with RollingNumber.
|
||||
* Apply spanned text to TextView.
|
||||
*/
|
||||
// The rolling number Span is missing styling since it's initially set as a String.
|
||||
// Modify the UI text view and use the styled like/dislike Span.
|
||||
RollingNumberTextViewFingerprint.result?.let {
|
||||
// Initial TextView is set in this method.
|
||||
val initiallyCreatedTextViewMethod = it.mutableMethod
|
||||
@ -108,10 +107,14 @@ object ReturnYouTubeDislikeRollingNumberPatch : BytecodePatch(
|
||||
}
|
||||
val textViewRegister =
|
||||
getInstruction<FiveRegisterInstruction>(setTextIndex).registerC
|
||||
val textSpanRegister =
|
||||
getInstruction<FiveRegisterInstruction>(setTextIndex).registerD
|
||||
|
||||
addInstruction(
|
||||
setTextIndex + 1,
|
||||
"invoke-static {v$textViewRegister}, $INTEGRATIONS_RYD_CLASS_DESCRIPTOR->updateRollingNumberTextView(Landroid/widget/TextView;)V"
|
||||
addInstructions(
|
||||
setTextIndex, """
|
||||
invoke-static {v$textViewRegister, v$textSpanRegister}, $INTEGRATIONS_RYD_CLASS_DESCRIPTOR->updateRollingNumber(Landroid/widget/TextView;Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
|
||||
move-result-object v$textSpanRegister
|
||||
"""
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.Opcode
|
||||
/**
|
||||
* This fingerprint is compatible with YouTube v18.29.38+
|
||||
*/
|
||||
object RollingNumberTypeFingerprint : MethodFingerprint(
|
||||
object RollingNumberSetterFingerprint : MethodFingerprint(
|
||||
opcodes = listOf(
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.IGET,
|
@ -21,6 +21,6 @@ object RollingNumberTextViewFingerprint : MethodFingerprint(
|
||||
Opcode.RETURN_VOID
|
||||
),
|
||||
customFingerprint = custom@{ _, classDef ->
|
||||
classDef.methods.count() == 4
|
||||
classDef.superclass == "Landroid/support/v7/widget/AppCompatTextView;"
|
||||
}
|
||||
)
|
Loading…
x
Reference in New Issue
Block a user