# -*- coding: utf-8 -*- r'''修「局域网连上后没反应,得推出去点设备才能连」。 == 根因 == 手表上有**四个**面板,靠手工 setVisibility 切换: connectPanel 首页(连接页) controlPanel 控制面板 mirrorPanel 投屏 lanPanel 局域网连接页 ← 后加的 而 showControlPanel() 只藏了前两个: private void showControlPanel() { connectPanel.setVisibility(View.GONE); controlPanel.setVisibility(View.VISIBLE); if (mirrorPanel != null) mirrorPanel.setVisibility(View.GONE); ... } **没藏 lanPanel。** 于是用户从「局域网连接」页面填完配对码、连接成功之后: connect() 成功 -> showControlPanel() -> 控制面板显示了 但 lanPanel 还在最上层 -> 用户看到的还是局域网页面 表现就是用户说的:「提示连上了,但没反应,得推出去到设备列表 点击设备才能连接」—— 推出去(返回)把 lanPanel 收掉,才看到底下 的控制面板/设备列表。 同样的漏藏在另外两处(切投屏的时候也忘了藏 lanPanel)。 == 修法 == 不逐处补 setVisibility —— 那样每加一个面板就会再漏一次 (这次就是加 lanPanel 时漏的)。改成**一个统一入口**: private void showOnly(View keep) // 藏掉所有面板,只留一个 所有切换都走它。以后再加面板,只要在 showOnly 的列表里加一行, 所有切换点自动都对。 ''' from __future__ import annotations import re import sys from pathlib import Path SRC = (Path(__file__).resolve().parent.parent / "android" / "src" / "com" / "lanremote" / "watch" / "MainActivity.java") HELPER = ''' /** * 只显示一个面板,其余全部隐藏。 * *
为什么要有这个:原来每个切换点都手写一串 setVisibility, * 加第四个面板(lanPanel)时漏补了几处 —— 于是「局域网连接页」 * 填完码连上了,{@link #showControlPanel()} 也执行了, * 但局域网页还盖在最上层,用户看到的是"连上了但没反应", * 得推出去才看到底下的控制面板。 * *
以后加面板只需要往这个方法里加一行,所有切换点自动都对。 */ private void showOnly(View keep) { View[] all = {connectPanel, controlPanel, mirrorPanel, lanPanel}; for (View v : all) { if (v != null) { v.setVisibility(v == keep ? View.VISIBLE : View.GONE); } } } ''' def main() -> int: text = SRC.read_text(encoding="utf-8") ok = True # ---- 1. 插入 showOnly 帮助方法(放在 showControlPanel 之前)---- anchor = " private void showControlPanel() {" if "private void showOnly(View keep)" in text: print(" • showOnly 已经存在") elif anchor not in text: print(" ✗ 找不到 showControlPanel") return 1 else: text = text.replace(anchor, HELPER + anchor, 1) print(" ✓ 插入 showOnly()") # ---- 2. showControlPanel 改用 showOnly ---- old_ctrl = """ private void showControlPanel() { connectPanel.setVisibility(View.GONE); controlPanel.setVisibility(View.VISIBLE); if (mirrorPanel != null) { mirrorPanel.setVisibility(View.GONE); } getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); }""" new_ctrl = """ private void showControlPanel() { // ⚠ 必须走 showOnly —— 原来这里手写 setVisibility,漏了 lanPanel, // 导致"局域网连上后没反应、要推出去点设备"。 showOnly(controlPanel); getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); }""" if old_ctrl in text: text = text.replace(old_ctrl, new_ctrl, 1) print(" ✓ showControlPanel 改用 showOnly") else: print(" ! showControlPanel 的形状和预期不一样,用逐行方式改") # 退化:把它函数体里的四行拆掉,换成 showOnly m = re.search(r"( private void showControlPanel\(\) \{\n)(.*?)(\n \})", text, re.S) if m: body = m.group(2) # 保留 setSoftInputMode 那行 keep = [ln for ln in body.splitlines() if "setSoftInputMode" in ln] newbody = (" showOnly(controlPanel);\n" + "\n".join(keep)) text = text[:m.start(2)] + newbody + text[m.end(2):] print(" ✓ 已替换(退化方式)") else: ok = False # ---- 3. 另外两处切投屏的地方也要藏 lanPanel ---- # 形态:connectPanel.GONE / controlPanel.GONE / mirrorPanel.VISIBLE pat_mirror = re.compile( r" connectPanel\.setVisibility\(View\.GONE\);\n" r" controlPanel\.setVisibility\(View\.GONE\);\n" r" mirrorPanel\.setVisibility\(View\.VISIBLE\);") def repl_mirror(m): return " showOnly(mirrorPanel);" n_mirror = len(pat_mirror.findall(text)) if n_mirror: text = pat_mirror.sub(repl_mirror, text) print(" ✓ %d 处切投屏改用 showOnly" % n_mirror) else: print(" • 没找到切投屏的那两处(可能已经改过)") # ---- 4. showLanPanel 也走 showOnly ---- pat_lan = re.compile( r" connectPanel\.setVisibility\(View\.GONE\);\n" r" controlPanel\.setVisibility\(View\.GONE\);\n" r"(\s*)mirrorPanel\.setVisibility\(View\.GONE\);\n" r"(\s*)lanPanel\.setVisibility\(View\.VISIBLE\);") if pat_lan.search(text): text = pat_lan.sub(" showOnly(lanPanel);", text) print(" ✓ showLanPanel 改用 showOnly") if not ok: print(" 有地方没匹配上,没有写回") return 1 SRC.write_text(text, encoding="utf-8", newline="\n") print() print(" 已写回 MainActivity.java") # 自检:还有没有裸的 panel setVisibility(除了 showOnly 内部和首页初始化) leftovers = [] for i, line in enumerate(text.splitlines(), 1): s = line.strip() if re.match(r"^(connectPanel|controlPanel|mirrorPanel|lanPanel)" r"\.setVisibility", s): leftovers.append((i, s)) print() print(" ── 剩下的裸 setVisibility(%d 处)──" % len(leftovers)) for ln, s in leftovers: print(" 第 %d 行: %s" % (ln, s)) return 0 if __name__ == "__main__": sys.exit(main())