feat(kakaotalk): update ShowDeletedOrHiddenMessagePatch to handle date and chat log checks

Something's wrong, chatLog is fetched twice, performance degradation expected, fix needed
This commit is contained in:
2025-05-28 15:09:45 +09:00
parent 21b69efddf
commit 38987cfb46

View File

@ -1,11 +1,13 @@
package app.revanced.patches.kakaotalk.chatlog package app.revanced.patches.kakaotalk.chatlog
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.extensions.InstructionExtensions.instructions
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.kakaotalk.chatlog.fingerprints.chatLogFingerprint
import app.revanced.patches.kakaotalk.chatlog.fingerprints.createChatLogViewHolderFromRealFingerprint import app.revanced.patches.kakaotalk.chatlog.fingerprints.createChatLogViewHolderFromRealFingerprint
import app.revanced.util.getReference import app.revanced.util.getReference
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.BuilderInstruction35c import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction35c
import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@ -21,31 +23,49 @@ val showDeletedOrHiddenMessagePatch = bytecodePatch(
val method = createChatLogViewHolderFromRealFingerprint.method val method = createChatLogViewHolderFromRealFingerprint.method
val insns = method.instructions val insns = method.instructions
val modifyInst = insns val chatLogClass = chatLogFingerprint.classDef
println("ChatLog class: ${chatLogClass.type}")
val dateInst = insns
.filterIsInstance<BuilderInstruction35c>() .filterIsInstance<BuilderInstruction35c>()
.filter { it.opcode == Opcode.INVOKE_VIRTUAL } .filter { it.opcode == Opcode.INVOKE_VIRTUAL }
.find { .find {
it.getReference<MethodReference>()?.name == "setModify" it.getReference<MethodReference>()?.name == "setDate"
} }
val modifyIndex = insns.indexOf(modifyInst ?: return@execute) val dateIndex = insns.indexOf(dateInst ?: return@execute)
println("Modify index: $modifyIndex") val chatLogRegister = insns
.filterIsInstance<BuilderInstruction21c>()
.filter { it.opcode == Opcode.CHECK_CAST }
.find {
it.reference == chatLogClass
}?.registerA ?: error("ChatLog class ${chatLogClass.type} not found")
method.addInstructions( println(chatLogRegister)
modifyIndex,
println("Date index: $dateIndex")
method.addInstructionsWithLabels(
dateIndex + 1,
""" """
invoke-virtual/range {p0 .. p0}, LOe/f2;->u0()LKe/S;
move-result-object v12
instance-of v13, v12, ${chatLogClass.type}
if-eqz v13, :is_not_chat_log
check-cast v12, ${chatLogClass.type}
goto :fuck
:is_not_chat_log
const/4 v12, 0x0 const/4 v12, 0x0
if-eqz v14, :skip_get_deleted_flag :fuck
iget-boolean v12, v14, LXo/c;->isRealDeleted:Z nop
:skip_get_deleted_flag
invoke-virtual {v4, v12}, Lcom/kakao/talk/widget/chatlog/ChatInfoView;->setDeleted(Z)V
const/4 v12, 0x0 iget-boolean v10, v12, ${chatLogClass.type}->isRealDeleted:Z
if-eqz v14, :skip_get_hidden_flag invoke-virtual {v4, v10}, Lcom/kakao/talk/widget/chatlog/ChatInfoView;->setDeleted(Z)V
iget-boolean v12, v14, LXo/c;->isHidden:Z
:skip_get_hidden_flag iget-boolean v10, v12, ${chatLogClass.type}->isHidden:Z
invoke-virtual {v4, v12}, Lcom/kakao/talk/widget/chatlog/ChatInfoView;->setHidden(Z)V invoke-virtual {v4, v10}, Lcom/kakao/talk/widget/chatlog/ChatInfoView;->setHidden(Z)V
""".trimIndent() """.trimIndent(),
) )
} }
} }