From 64a105700913a125d233b6d5a4348c50c93d5bc3 Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Sat, 18 Nov 2023 02:04:56 +0900 Subject: [PATCH] fix(YouTube/Return YouTube Dislike): match to official ReVanced code --- .../ReturnYouTubeDislikeRollingNumberPatch.kt | 71 ++++++++++--------- ...t.kt => RollingNumberSetterFingerprint.kt} | 2 +- .../RollingNumberTextViewFingerprint.kt | 2 +- 3 files changed, 39 insertions(+), 36 deletions(-) rename src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/{RollingNumberTypeFingerprint.kt => RollingNumberSetterFingerprint.kt} (89%) diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/ReturnYouTubeDislikeRollingNumberPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/ReturnYouTubeDislikeRollingNumberPatch.kt index e77eb403d..b7c7ccee3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/ReturnYouTubeDislikeRollingNumberPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/ReturnYouTubeDislikeRollingNumberPatch.kt @@ -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 == "" } ?.apply { val rollingNumberFieldIndex = implementation!!.instructions.indexOfFirst { instruction -> instruction.opcode == Opcode.IPUT_OBJECT } - val rollingNumberFieldName = - (getInstruction(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(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(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(setTextIndex).registerC + val textSpanRegister = + getInstruction(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 + """ ) } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTypeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberSetterFingerprint.kt similarity index 89% rename from src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTypeFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberSetterFingerprint.kt index 785e98933..560eee0b6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTypeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberSetterFingerprint.kt @@ -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, diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTextViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTextViewFingerprint.kt index 0af040cca..ba8a76f27 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTextViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTextViewFingerprint.kt @@ -21,6 +21,6 @@ object RollingNumberTextViewFingerprint : MethodFingerprint( Opcode.RETURN_VOID ), customFingerprint = custom@{ _, classDef -> - classDef.methods.count() == 4 + classDef.superclass == "Landroid/support/v7/widget/AppCompatTextView;" } ) \ No newline at end of file