# -*- coding: utf-8 -*- """断言安卓端的这次改造真的到位了。 用户要求: 1. 去掉老版本那些「搜索局域网」的东西 2. 电脑和手表在同一网络 -> 切局域网直连 3. 不在同一网络 -> 继续用中转 4. 局域网连不上了 -> 无缝切回中转 这些是 Java 代码,没法在这里跑起来,但可以**源码级断言**: 关键代码在不在、老代码清没清干净。 """ from __future__ import annotations import re import sys from pathlib import Path ROOT = Path(__file__).resolve().parent.parent WATCH = ROOT / "android" / "src" / "com" / "lanremote" / "watch" MAIN = WATCH / "MainActivity.java" RELAY_T = WATCH / "RelayTransport.java" "TlsCompat.java" CLIENT = WATCH / "RemoteClient.java" JSON = WATCH / "Json.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)) def main() -> int: main_src = MAIN.read_text(encoding="utf-8") relay_src = RELAY_T.read_text(encoding="utf-8") client_src = CLIENT.read_text(encoding="utf-8") json_src = JSON.read_text(encoding="utf-8") print("一、老版本的局域网搜索要清干净") # 只查真的按钮,不查注释 —— # 代码里留了一句说明这个按钮被删了的注释,别把它当按钮。 check("没有「自动搜索电脑」按钮", 'bigButton("自动搜索电脑"' not in main_src and '"自动搜索电脑"' not in re.sub(r'//[^\n]*', '', main_src)) check("没有 startDiscovery 方法", "private void startDiscovery" not in main_src) check("没有任何 startDiscovery 调用", "startDiscovery(" not in main_src) check("没有 showFound 方法", "private void showFound" not in main_src) check("没有 connectToFound 方法", "private void connectToFound" not in main_src) check("没有「正在搜索同一 WiFi 下的电脑」提示", "正在搜索同一 WiFi" not in main_src) print() print("二、同网络 -> 切局域网直连") check("有同网段判断方法", "private boolean sameSubnet" in main_src) check("有挑同网段地址的方法", "private String pickSameSubnet" in main_src) check("有取本机 IPv4 的方法", "private java.util.List localIpv4List" in main_src) check("连上中转后会试着切直连", "切换成局域网直连" in main_src) check("直连失败会退回中转", "直连失败,退回中转" in main_src) check("不在同一网络时明确说继续用中转", "电脑不在同一网络,继续用中转" in main_src) check("同网段判断用的是 /24(比前三段)", "left[0].equals(right[0])" in main_src and "left[1].equals(right[1])" in main_src and "left[2].equals(right[2])" in main_src) print() print("三、局域网断了 -> 无缝切回中转") check("有切中转的方法", "private void switchToRelay" in main_src) check("断线时会判断是不是局域网", "if (lanDirect && !autoSwitching)" in main_src) check("切之前给用户提示", "正在切到中转服务器" in main_src) check("切成功会提示连接恢复", "已切到中转服务器,连接恢复" in main_src) check("中转也断了会重试", "次自动重连" in main_src) check("重试有上限(不会无限)", "autoRetry < 3" in main_src) check("防重入(不会同时切两次)", "autoSwitching" in main_src) print() print("四、配对码要持久化(令牌直连时切中转也需要它)") check("有存配对码的方法", "private void rememberPairingCode" in main_src) check("有读配对码的方法", "private String savedPairingCode" in main_src) check("连接时会记住配对码", "rememberPairingCode(code);" in main_src) check("没给码时会读上次的", "lastCode = savedPairingCode();" in main_src) print() print("五、中转要把电脑的局域网信息带给手表") check("RelayTransport 有 lanIps 字段", "private java.util.List lanIps" in relay_src) check("RelayTransport 解析 lanIps", 'Json.stringList(reply, "lanIps")' in relay_src) check("RelayTransport 解析 port", 'Json.integer(reply, "port", 0)' in relay_src) check("RemoteClient 暴露 relayLanIps", "public java.util.List relayLanIps()" in client_src) check("RemoteClient 暴露 relayLanPort", "public int relayLanPort()" in client_src) check("Json 有 stringList", "public static List stringList" in json_src) print() print("六、界面上的显示要对得上") check("连上后标注「局域网」或「中转」", "(局域网)" in main_src and "(中转)" in main_src) print() print("=" * 62) print(f"通过 {passed} 项,失败 {failed} 项") return 0 if failed == 0 else 1 if __name__ == "__main__": raise SystemExit(main())