Skip to content

Commit

Permalink
fix(ryd): Update rolling number patch points
Browse files Browse the repository at this point in the history
  • Loading branch information
LisoUseInAIKyrios committed Jan 10, 2024
1 parent e0633a0 commit 46f28df
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.fingerprint.MethodFingerprint
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchException
Expand All @@ -18,7 +17,7 @@ import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.Lik
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RemoveLikeFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureAnimatedTextFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureStaticLabelFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureTextParentFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureStaticLabelParentFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberSetterFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberTextViewFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.ShortsTextViewFingerprint
Expand Down Expand Up @@ -55,11 +54,7 @@ import com.android.tools.smali.dexlib2.iface.reference.TypeReference
compatiblePackages = [
CompatiblePackage(
"com.google.android.youtube", [
"18.38.44",
"18.43.45",
"18.44.41",
"18.45.41",
"18.45.43"
"18.49.36"
]
)
]
Expand All @@ -76,7 +71,8 @@ object ReturnYouTubeDislikePatch : BytecodePatch(
DislikeFingerprint,
RemoveLikeFingerprint,
RollingNumberSetterFingerprint,
RollingNumberMeasureTextParentFingerprint,
RollingNumberMeasureStaticLabelParentFingerprint,
RollingNumberMeasureAnimatedTextFingerprint,
RollingNumberTextViewFingerprint,
RollingNumberTextViewAnimationUpdateFingerprint
)
Expand Down Expand Up @@ -276,37 +272,30 @@ object ReturnYouTubeDislikePatch : BytecodePatch(

// Rolling Number text views use the measured width of the raw string for layout.
// Modify the measure text calculation to include the left drawable separator if needed.
RollingNumberMeasureAnimatedTextFingerprint.also {
if (!it.resolve(context, RollingNumberMeasureTextParentFingerprint.result!!.classDef))
throw it.exception
}.result?.also {
RollingNumberMeasureAnimatedTextFingerprint.result?.also {
val scanResult = it.scanResult.patternScanResult!!
// Additional check to verify the opcodes are at the start of the method
if (scanResult.startIndex != 0) throw PatchException("Unexpected opcode location")
val endIndex = scanResult.endIndex
it.mutableMethod.apply {
val returnInstructionIndex = it.scanResult.patternScanResult!!.endIndex
val measuredTextWidthRegister =
getInstruction<OneRegisterInstruction>(returnInstructionIndex).registerA
val measuredTextWidthRegister = getInstruction<OneRegisterInstruction>(endIndex).registerA

replaceInstruction( // Replace instruction to preserve control flow label.
returnInstructionIndex,
"invoke-static {p1, v$measuredTextWidthRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F"
)
addInstructions(
returnInstructionIndex + 1,
"""
move-result v$measuredTextWidthRegister
return v$measuredTextWidthRegister
endIndex + 1,
"""
invoke-static {p1, v$measuredTextWidthRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F
move-result v$measuredTextWidthRegister
"""
)
}
} ?: throw RollingNumberMeasureAnimatedTextFingerprint.exception

// Additional text measurement method. Used if YouTube decides not to animate the likes count
// and sometimes used for initial video load.
RollingNumberMeasureStaticLabelFingerprint.also {
if (!it.resolve(context, RollingNumberMeasureTextParentFingerprint.result!!.classDef))
throw it.exception
}.result?.also {
RollingNumberMeasureStaticLabelFingerprint.resolve(context, RollingNumberMeasureStaticLabelParentFingerprint.resultOrThrow().classDef)
RollingNumberMeasureStaticLabelFingerprint.result?.also {
val measureTextIndex = it.scanResult.patternScanResult!!.startIndex + 1
it.mutableMethod.apply {
val measureTextIndex = it.scanResult.patternScanResult!!.startIndex + 1
val freeRegister = getInstruction<TwoRegisterInstruction>(0).registerA

addInstructions(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,24 @@ import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode

/**
* Resolves to class found in [RollingNumberMeasureTextParentFingerprint].
*/
internal object RollingNumberMeasureAnimatedTextFingerprint : MethodFingerprint(
returnType = "F",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("Ljava/lang/String;"),
returnType = "Lj\$/util/Optional;",
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
parameters = listOf(
"L",
"Ljava/lang/String;",
"L"
),
opcodes = listOf(
Opcode.INVOKE_VIRTUAL,
Opcode.IGET, // First instruction of method
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.CONST_HIGH16,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT,
Opcode.ADD_FLOAT_2ADDR,
Opcode.ADD_INT_LIT8,
Opcode.GOTO,
Opcode.RETURN
Opcode.CONST_4,
Opcode.AGET,
Opcode.CONST_4,
Opcode.CONST_4, // Measured text width
)
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode

/**
* Resolves to class found in [RollingNumberMeasureTextParentFingerprint].
* Resolves to class found in [RollingNumberMeasureStaticLabelParentFingerprint].
*/
internal object RollingNumberMeasureStaticLabelFingerprint : MethodFingerprint(
returnType = "F",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags

internal object RollingNumberMeasureTextParentFingerprint : MethodFingerprint(
internal object RollingNumberMeasureStaticLabelParentFingerprint : MethodFingerprint(
returnType = "Ljava/lang/String;",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf(),
Expand Down

0 comments on commit 46f28df

Please sign in to comment.