Repository navigation
WeKite 3.78:面板收起兜底 v4(跟着宿主监听器走 + 全量记账)
WeKite 3.78
只改一件事:「点聊天区收起面板/键盘」的兜底重做(第 4 版),并且把「为什么没收」做成日志。
3.77 那次我判断错在哪
读了你的 3.77 日志(01:45:00–01:47:20,507 行):
- 三条钩子都装上了(外层
MMChattingListView -> MMPullDownView.onTouchEvent、内层ScrollControlRecyclerView -> ScrollControlRecyclerView.onTouchEvent), - 但整段窗口一次
panel collapse fired都没有 —— 也就是说钩子要么没被叫到、要么状态判断全不成立,而上一版那条「原生监听器收到触摸」的日志被我删掉了,导致这份日志没法自证「到底有没有点到」。 - 另外那句
innerInOuterTree=true说明我上一版「点消息不经过外层」的解释不成立(内层列表确实在外层子树里),所以真因还没找到 —— 这也是它比 3.76 更差的原因:3.76 至少偶尔还能收。
这次(v4)怎么改
- 不再猜哪个视图:直接从宿主自己的
View.mListenerInfo.mOnTouchListener取出微信那个收面板监听器实例,钩它自己的onTouch—— 触发点和微信原生收起完全同点。3.77 里这个入口在「监听器还没装上」时被我静默跳过了,现在改成「下一帧重试 + 失败写日志」,没有静默分支。 onTouchEvent与dispatchTouchEvent都挂(3.76 那版靠dispatchTouchEvent收到过 20 次触摸,3.77 只挂onTouchEvent是倒退)。- 每条钩子前 8 次调用都记账:
panel collapse touch [源]: action=… view=… ty=… ime=… kbFrame=…⇒ 下一次的日志无论「钩子没被叫到」还是「判据不成立」都能直接看出来。 - 键盘判据两条并用(insets + 可见帧差),避免单一信号失灵就把整个判定静默跳过。
- 结构取证:列出本页所有自带
OnTouchListener的视图(类名 + 身份哈希 + 监听器类名 + 是否已注册),用来判「微信的收面板监听器到底挂在哪个对象上」。 - 动作仍是微信自己的收起入口 + 键盘可见时补一手系统 IME 收起。
请你这样测(这次日志一定能定位)
- 覆盖安装后重启微信。
- 进聊天页 → 点输入框让键盘弹出 → 点聊天区(消息之间、列表下方空白都算)。
- 不管收没收,都导出日志给我。日志里会出现下面几类行,判读方式:
panel collapse guard installed on native listener …—— 最关键的那条钩子装上了;touch-listener hosts (…)—— 本页带触摸监听器的视图清单(能看出原生监听器挂在谁身上);panel collapse touch [源]: action=… ty=… ime=… kbFrame=…—— 我们的钩子确实被叫到了,并给出当时的展开态;panel collapse fired: …—— 判定成立、已经执行了收起动作。
- 如果这三类一行都没有,说明那一下的触摸根本没走这些路径 —— 那我会改用「拿你的日志直接比对微信原生监听器流」的方式定位。
装机注意
- 没动任何 DEX 锚点,不会弹「DEX 缓存更新」,直接覆盖安装。
- 设置里「恢复底栏模糊」已在 3.77 删除(属预期)。