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.extensions.exception
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.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.annotation.Patch 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.RollingNumberTextViewFingerprint
import app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber.fingerprints.RollingNumberTypeFingerprint
import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch
import app.revanced.util.integrations.Constants.UTILS_PATH import app.revanced.util.integrations.Constants.UTILS_PATH
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c 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.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.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.MethodReference
import com.android.tools.smali.dexlib2.iface.reference.Reference
@Patch(dependencies = [SettingsPatch::class]) @Patch(dependencies = [SettingsPatch::class])
object ReturnYouTubeDislikeRollingNumberPatch : BytecodePatch( object ReturnYouTubeDislikeRollingNumberPatch : BytecodePatch(
setOf( setOf(
RollingNumberTextViewFingerprint, RollingNumberSetterFingerprint,
RollingNumberTypeFingerprint RollingNumberTextViewFingerprint
) )
) { ) {
private const val CONVERSION_CONTEXT_PARAMETER = 2 private const val CONVERSION_CONTEXT_PARAMETER = 2
@ -43,7 +43,7 @@ object ReturnYouTubeDislikeRollingNumberPatch : BytecodePatch(
*/ */
if (SettingsPatch.upward1841) { if (SettingsPatch.upward1841) {
RollingNumberTypeFingerprint.result?.let { RollingNumberSetterFingerprint.result?.let {
it.mutableMethod.apply { it.mutableMethod.apply {
val rollingNumberClassIndex = it.scanResult.patternScanResult!!.startIndex val rollingNumberClassIndex = it.scanResult.patternScanResult!!.startIndex
val rollingNumberClassReference = val rollingNumberClassReference =
@ -51,42 +51,41 @@ object ReturnYouTubeDislikeRollingNumberPatch : BytecodePatch(
val rollingNumberClass = val rollingNumberClass =
context.findClass(rollingNumberClassReference.toString())!!.mutableClass context.findClass(rollingNumberClassReference.toString())!!.mutableClass
/** lateinit var charSequenceFieldReference: Reference
* This class handles RollingNumber.
* Pass an instance of this class to integrations to use Java Reflection.
*/
rollingNumberClass.methods.find { method -> method.name == "<init>" } rollingNumberClass.methods.find { method -> method.name == "<init>" }
?.apply { ?.apply {
val rollingNumberFieldIndex = val rollingNumberFieldIndex =
implementation!!.instructions.indexOfFirst { instruction -> implementation!!.instructions.indexOfFirst { instruction ->
instruction.opcode == Opcode.IPUT_OBJECT instruction.opcode == Opcode.IPUT_OBJECT
} }
val rollingNumberFieldName = charSequenceFieldReference = getInstruction<ReferenceInstruction>(rollingNumberFieldIndex).reference
(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
"""
)
} ?: throw PatchException("RollingNumberClass not found!") } ?: throw PatchException("RollingNumberClass not found!")
/** val insertIndex = rollingNumberClassIndex + 1
* RollingNumber is initialized in this method.
* This method also contains information about ConversionContext. val charSequenceInstanceRegister =
*/ getInstruction<OneRegisterInstruction>(rollingNumberClassIndex).registerA
addInstruction(
1, val registerCount = implementation!!.registerCount
"invoke-static {p$CONVERSION_CONTEXT_PARAMETER}, $INTEGRATIONS_RYD_CLASS_DESCRIPTOR->onRollingNumberTextLoaded(Ljava/lang/Object;)V"
// 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
/** // The rolling number Span is missing styling since it's initially set as a String.
* TextView with RollingNumber. // Modify the UI text view and use the styled like/dislike Span.
* Apply spanned text to TextView.
*/
RollingNumberTextViewFingerprint.result?.let { RollingNumberTextViewFingerprint.result?.let {
// Initial TextView is set in this method. // Initial TextView is set in this method.
val initiallyCreatedTextViewMethod = it.mutableMethod val initiallyCreatedTextViewMethod = it.mutableMethod
@ -108,10 +107,14 @@ object ReturnYouTubeDislikeRollingNumberPatch : BytecodePatch(
} }
val textViewRegister = val textViewRegister =
getInstruction<FiveRegisterInstruction>(setTextIndex).registerC getInstruction<FiveRegisterInstruction>(setTextIndex).registerC
val textSpanRegister =
getInstruction<FiveRegisterInstruction>(setTextIndex).registerD
addInstruction( addInstructions(
setTextIndex + 1, setTextIndex, """
"invoke-static {v$textViewRegister}, $INTEGRATIONS_RYD_CLASS_DESCRIPTOR->updateRollingNumberTextView(Landroid/widget/TextView;)V" 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+ * This fingerprint is compatible with YouTube v18.29.38+
*/ */
object RollingNumberTypeFingerprint : MethodFingerprint( object RollingNumberSetterFingerprint : MethodFingerprint(
opcodes = listOf( opcodes = listOf(
Opcode.CHECK_CAST, Opcode.CHECK_CAST,
Opcode.IGET, Opcode.IGET,

View File

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