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:
@ -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(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user