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.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
|
||||||
|
"""
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
@ -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;"
|
||||||
}
|
}
|
||||||
)
|
)
|
Loading…
x
Reference in New Issue
Block a user