# -*- coding: utf-8 -*- r'''钉住"每个面板都必须挂到 root 上"。 == 为什么需要 == 设置页第一版**一片空白**。根因很隐蔽: buildSettingsPanel() 建了 settingsPanel,往里面加了标题、 中转服务器、配对码、已配对设备、关于…… 全都在,一个都不少 但是 —— **没有人 root.addView(settingsPanel)** 于是 showOnly(settingsPanel) 把它设成 VISIBLE 也没用: 它压根不在视图树里。用户点「设置」进去看到的是**全白**。 对照一下,另外四个面板都有 root.addView(...),唯独新加的这个漏了。 这类"建了但没挂"的错**只在运行时表现为空白,编译完全不报**, 所以必须用断言钉住。 == 这个测试查什么 == 对每一个面板字段声明(connectPanel / controlPanel / mirrorPanel / lanPanel / settingsPanel 这类),都要求源码里存在对应的 root.addView(那个字段, ...)。 另外查 showOnly() 的数组里有没有把新面板带上 —— 那是另一个 同源的坑(面板建了也挂了,但切换时不藏它,就一直盖在最上面, 上一版手表「局域网连上后没反应」就是这么来的)。 ''' from __future__ import annotations import re import sys from pathlib import Path ROOT = Path(__file__).resolve().parent.parent SRC = (ROOT / "android" / "src" / "com" / "lanremote" / "watch" / "MainActivity.java") passed = 0 failed = 0 def check(name, ok, detail=""): global passed, failed if ok: passed += 1 print(" [PASS] " + name) else: failed += 1 print(" [FAIL] " + name + ((" —— " + str(detail)) if detail else "")) def main() -> int: print("=" * 60) print(" 每个面板都必须挂到 root 上,并且纳入 showOnly()") print("=" * 60) check("MainActivity.java 存在", SRC.is_file(), SRC) if not SRC.is_file(): return 1 src = SRC.read_text(encoding="utf-8") # ---- 一、找出所有面板字段 ---- # 形如: private FrameLayout xxxPanel; 或者带初始化 panels = re.findall(r"private\s+FrameLayout\s+(\w*[Pp]anel)\s*[;=]", src) panels = sorted(set(panels)) print(" ---- 一、发现的面板字段 ----") for p in panels: print(" %s" % p) check("至少发现 3 个面板", len(panels) >= 3, "只找到 %s" % panels) # ---- 二、每个都必须有 root.addView ---- print(" ---- 二、每个面板都挂到 root 了 ----") added = set(re.findall(r"root\.addView\(\s*(\w+)\s*,", src)) for p in panels: check("%s 有 root.addView" % p, p in added, "只建了没挂 —— 运行时表现是「进去一片空白」,编译不报错") # ---- 三、每个都必须出现在 showOnly 的数组里 ---- print(" ---- 三、每个面板都在 showOnly() 里 ----") m = re.search(r"private void showOnly\(View keep\)\s*\{(.{0,600}?)\n \}", src, re.S) check("能找到 showOnly()", bool(m), "找不到方法体") if m: body = m.group(1) arr = re.search(r"View\[\]\s*all\s*=\s*\{(.*?)\}", body, re.S) check("showOnly 里有个数组", bool(arr), "形状变了") listed = set() if arr: listed = {x.strip() for x in arr.group(1).split(",") if x.strip()} for p in panels: check("%s 在 showOnly 数组里" % p, p in listed, "切换时不藏它 -> 会一直盖在最上面(上一版" "「局域网连上后没反应」就是这个原因)") # ---- 四、settingsPanel 必须初始 GONE(否则会盖住首页)---- print(" ---- 四、settingsPanel 初始是隐藏的 ----") check("settingsPanel.setVisibility(View.GONE)", re.search(r"settingsPanel\.setVisibility\(View\.GONE\)", src) is not None, "没有初始隐藏 -> 一开始就盖在首页上") print() print("=" * 60) print(" 通过 %d 项,失败 %d 项" % (passed, failed)) return 0 if failed == 0 else 1 if __name__ == "__main__": sys.exit(main())