fix(YouTube/Return YouTube Dislike): match to official ReVanced code

This commit is contained in:
inotia00 2023-11-18 02:04:56 +09:00
parent 99b1b90ba6
commit 64a1057009
3 changed files with 39 additions and 36 deletions

View File

@ -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
"""
)
}
}

View File

@ -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,

View File

@ -21,6 +21,6 @@ object RollingNumberTextViewFingerprint : MethodFingerprint(
Opcode.RETURN_VOID
),
customFingerprint = custom@{ _, classDef ->
classDef.methods.count() == 4
classDef.superclass == "Landroid/support/v7/widget/AppCompatTextView;"
}
)