From 4295b482a150c1784fff6c88198854bdfaa28926 Mon Sep 17 00:00:00 2001 From: xmz7891 Date: Wed, 7 Oct 2026 23:02:44 +0800 Subject: [PATCH] =?UTF-8?q?2.0.0=EF=BC=9A=E5=AE=89=E8=A3=85=E6=97=B6?= =?UTF-8?q?=E5=8F=AF=E8=AE=BE=E4=B8=AD=E8=BD=AC=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=20+=20=E6=89=8B=E8=A1=A8=E7=AB=AF=E6=96=B0=E5=A2=9E=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=A1=B5=20+=20=E4=B8=AD=E8=BD=AC=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E7=95=99=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按用户定的版本规矩,这一轮既有新内容又有重构,所以升第二位: 1.9.0 -> 2.0.0(最后一位清 0)。 == 一、安装时就能设中转服务器(用户要求)== 安装向导那一页现在是两个输入框:配对码 + 中转服务器。 装的时候是"第一次设置",最该一次把地址填好,不然装完还得去 双击 exe 找设置窗口,很容易漏。 只填域名就行(自动补 https://),留空 = 只走局域网。 批量静默部署同样支持: ykxmz-setup-2.0.0.exe /VERYSILENT /CODE=246810 /RELAY=relay.你的域名 为此新增了一个 --relay-url 参数: --relay 连接一次、打印状态、然后退出(人工排查用) --relay-url 只写进配置,不连接、不退出(安装流程用) 用错那个的话,安装包的命令链会在中间就 return,后面的 --silent 根本跑不到 —— 所以必须分开。 == 二、手表端新增「设置」页(用户要求)== 用户原话:"安卓端加一个设置,各种设置就在这里面调"。 以前设置散在首页(只有一个"中转设置"按钮),现在统一收进设置页: * 中转服务器(填写 / 一键清空) * 记住的配对码(显示 / 清除) * 已配对的电脑(看数量 / 清空,带二次确认) * 关于(版本号从 APK 读,不会和代码对不上) == 三、中转地址默认留空 + 一次性迁移(用户报的问题)== 用户原话:"安卓端为什么还是默认填的我的中转站,以后改成手动填"。 代码里的默认值早就是空的了,但用户看到的还是那个地址 —— 因为**老版本 1.5.0 把作者的域名硬编码成了默认值**,第一次运行就 存进了 SharedPreferences。装新 APK 不会清偏好,所以那个值一直留着。 用户其实从来没"选"过这个地址,是程序硬塞的。 所以加了 migrateLegacyRelay():存的值如果正好等于当时内置的域名, 就当成没设过、清掉。只清完全相等的,用户手填的不会动。 == 四、两个测试自身的毛病 == * test_lan_optimize 那条"没有把旧公网域名当默认值"太粗 —— 它查的是源码里任何位置,于是迁移注释里引用那行老代码就把它判红了。 改成先剥掉注释再查(断言要测的是"有没有把它当默认值")。 * test_image_modes 偶发红:它开真实 Tk 全屏窗口,在全量套件里跑 偶尔起不来(单独跑 19/19 全过)。加了有界重试。 偶发红的测试会让"全量通过"失去意义。 == 五、新增防复发断言 == _tests/test_relay_default_blank.py(15 项,回归阶段 3a3b): * 默认值必须是空串 * 除了迁移清单,源码里不许有写死的中转域名 * 迁移必须真的被调用(不是只定义) * 迁移必须是 remove,不能换成另一个硬编码值 * Windows 端的默认也得是空 理由:用户说过"这个中转站我就自己用,不对外" —— 值得用断言钉死。 == 六、顺手修的 == * release_all.py 崩在 Gitee 那一步:Gitee 的 GET /releases/tags/{tag} 在"标签存在、但还没发行版"时返回的是 **HTTP 200 + JSON null**(不是 404),于是 .get("id") 直接 AttributeError。发 1.9.0 时踩到,已改成容忍 None。 * installer/build_installer.py 里 license-combined.txt 是从 docs/ 三份文档重新生成的,所以光改生成物没用(下次构建又变回去)。 改成在 build_license() 里统一注入当前版本。 * ExE 文件属性里的版本(version_info.txt)从 1.7.1 起就一直没跟上。 全量回归 43 个阶段全部通过。 --- _build/CHANGELOG.md | 30 ++ _build/_cmsg_200.txt | 77 ++++ _build/add_watch_settings.py | 401 ++++++++++++++++++ _build/deploy_release.py | 123 ++++++ _build/fix_license_version.py | 24 +- _build/package_remote.py | 2 +- .../com/lanremote/watch/DeviceStore.class | Bin 0 -> 5214 bytes .../com/lanremote/watch/MainActivity$1.class | Bin 0 -> 806 bytes .../com/lanremote/watch/MainActivity$10.class | Bin 0 -> 904 bytes .../lanremote/watch/MainActivity$100.class | Bin 0 -> 942 bytes .../lanremote/watch/MainActivity$101.class | Bin 0 -> 702 bytes .../lanremote/watch/MainActivity$102.class | Bin 0 -> 580 bytes .../lanremote/watch/MainActivity$103.class | Bin 0 -> 982 bytes .../lanremote/watch/MainActivity$104.class | Bin 0 -> 580 bytes .../lanremote/watch/MainActivity$105.class | Bin 0 -> 1620 bytes .../lanremote/watch/MainActivity$106.class | Bin 0 -> 741 bytes .../lanremote/watch/MainActivity$107$1.class | Bin 0 -> 3147 bytes .../lanremote/watch/MainActivity$107.class | Bin 0 -> 2267 bytes .../lanremote/watch/MainActivity$108.class | Bin 0 -> 1946 bytes .../lanremote/watch/MainActivity$109.class | Bin 0 -> 1223 bytes .../com/lanremote/watch/MainActivity$11.class | Bin 0 -> 816 bytes .../lanremote/watch/MainActivity$110.class | Bin 0 -> 957 bytes .../lanremote/watch/MainActivity$111.class | Bin 0 -> 1486 bytes .../lanremote/watch/MainActivity$112$1.class | Bin 0 -> 1483 bytes .../lanremote/watch/MainActivity$112.class | Bin 0 -> 1467 bytes .../lanremote/watch/MainActivity$113.class | Bin 0 -> 1518 bytes .../lanremote/watch/MainActivity$114.class | Bin 0 -> 945 bytes .../lanremote/watch/MainActivity$115.class | Bin 0 -> 985 bytes .../lanremote/watch/MainActivity$116.class | Bin 0 -> 911 bytes .../lanremote/watch/MainActivity$117$1.class | Bin 0 -> 2000 bytes .../lanremote/watch/MainActivity$117.class | Bin 0 -> 1027 bytes .../lanremote/watch/MainActivity$118.class | Bin 0 -> 1504 bytes .../lanremote/watch/MainActivity$119.class | Bin 0 -> 922 bytes .../com/lanremote/watch/MainActivity$12.class | Bin 0 -> 1133 bytes .../lanremote/watch/MainActivity$120.class | Bin 0 -> 723 bytes .../lanremote/watch/MainActivity$121.class | Bin 0 -> 2273 bytes .../lanremote/watch/MainActivity$122.class | Bin 0 -> 2140 bytes .../lanremote/watch/MainActivity$123.class | Bin 0 -> 1719 bytes .../lanremote/watch/MainActivity$124.class | Bin 0 -> 1361 bytes .../lanremote/watch/MainActivity$125.class | Bin 0 -> 554 bytes .../lanremote/watch/MainActivity$126.class | Bin 0 -> 555 bytes .../lanremote/watch/MainActivity$127.class | Bin 0 -> 828 bytes .../lanremote/watch/MainActivity$128.class | Bin 0 -> 1936 bytes .../lanremote/watch/MainActivity$129.class | Bin 0 -> 940 bytes .../com/lanremote/watch/MainActivity$13.class | Bin 0 -> 651 bytes .../com/lanremote/watch/MainActivity$14.class | Bin 0 -> 929 bytes .../com/lanremote/watch/MainActivity$15.class | Bin 0 -> 983 bytes .../com/lanremote/watch/MainActivity$16.class | Bin 0 -> 620 bytes .../com/lanremote/watch/MainActivity$17.class | Bin 0 -> 615 bytes .../com/lanremote/watch/MainActivity$18.class | Bin 0 -> 615 bytes .../com/lanremote/watch/MainActivity$19.class | Bin 0 -> 615 bytes .../com/lanremote/watch/MainActivity$2.class | Bin 0 -> 1400 bytes .../com/lanremote/watch/MainActivity$20.class | Bin 0 -> 616 bytes .../com/lanremote/watch/MainActivity$21.class | Bin 0 -> 618 bytes .../com/lanremote/watch/MainActivity$22.class | Bin 0 -> 615 bytes .../com/lanremote/watch/MainActivity$23.class | Bin 0 -> 750 bytes .../com/lanremote/watch/MainActivity$24.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$25.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$26.class | Bin 0 -> 622 bytes .../com/lanremote/watch/MainActivity$27.class | Bin 0 -> 622 bytes .../com/lanremote/watch/MainActivity$28.class | Bin 0 -> 618 bytes .../com/lanremote/watch/MainActivity$29.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$3.class | Bin 0 -> 1454 bytes .../com/lanremote/watch/MainActivity$30.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$31.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$32.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$33.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$34.class | Bin 0 -> 770 bytes .../com/lanremote/watch/MainActivity$35.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$36.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$37.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$38.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$39.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$4.class | Bin 0 -> 719 bytes .../com/lanremote/watch/MainActivity$40.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$41.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$42.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$43.class | Bin 0 -> 868 bytes .../com/lanremote/watch/MainActivity$44.class | Bin 0 -> 721 bytes .../com/lanremote/watch/MainActivity$45.class | Bin 0 -> 749 bytes .../com/lanremote/watch/MainActivity$46.class | Bin 0 -> 745 bytes .../com/lanremote/watch/MainActivity$47.class | Bin 0 -> 752 bytes .../com/lanremote/watch/MainActivity$48.class | Bin 0 -> 647 bytes .../com/lanremote/watch/MainActivity$49.class | Bin 0 -> 648 bytes .../com/lanremote/watch/MainActivity$5.class | Bin 0 -> 649 bytes .../com/lanremote/watch/MainActivity$50.class | Bin 0 -> 651 bytes .../com/lanremote/watch/MainActivity$51.class | Bin 0 -> 650 bytes .../com/lanremote/watch/MainActivity$52.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$53.class | Bin 0 -> 545 bytes .../com/lanremote/watch/MainActivity$54.class | Bin 0 -> 881 bytes .../com/lanremote/watch/MainActivity$55.class | Bin 0 -> 868 bytes .../com/lanremote/watch/MainActivity$56.class | Bin 0 -> 875 bytes .../com/lanremote/watch/MainActivity$57.class | Bin 0 -> 873 bytes .../lanremote/watch/MainActivity$58$1.class | Bin 0 -> 992 bytes .../com/lanremote/watch/MainActivity$58.class | Bin 0 -> 936 bytes .../com/lanremote/watch/MainActivity$59.class | Bin 0 -> 867 bytes .../com/lanremote/watch/MainActivity$6.class | Bin 0 -> 649 bytes .../com/lanremote/watch/MainActivity$60.class | Bin 0 -> 859 bytes .../com/lanremote/watch/MainActivity$61.class | Bin 0 -> 859 bytes .../com/lanremote/watch/MainActivity$62.class | Bin 0 -> 864 bytes .../com/lanremote/watch/MainActivity$63.class | Bin 0 -> 706 bytes .../lanremote/watch/MainActivity$64$1.class | Bin 0 -> 1638 bytes .../lanremote/watch/MainActivity$64$2.class | Bin 0 -> 1142 bytes .../com/lanremote/watch/MainActivity$64.class | Bin 0 -> 1539 bytes .../com/lanremote/watch/MainActivity$65.class | Bin 0 -> 698 bytes .../com/lanremote/watch/MainActivity$66.class | Bin 0 -> 683 bytes .../com/lanremote/watch/MainActivity$67.class | Bin 0 -> 1473 bytes .../lanremote/watch/MainActivity$68$1.class | Bin 0 -> 974 bytes .../lanremote/watch/MainActivity$68$2.class | Bin 0 -> 1121 bytes .../com/lanremote/watch/MainActivity$68.class | Bin 0 -> 2106 bytes .../com/lanremote/watch/MainActivity$69.class | Bin 0 -> 654 bytes .../com/lanremote/watch/MainActivity$7.class | Bin 0 -> 649 bytes .../com/lanremote/watch/MainActivity$70.class | Bin 0 -> 996 bytes .../com/lanremote/watch/MainActivity$71.class | Bin 0 -> 916 bytes .../com/lanremote/watch/MainActivity$72.class | Bin 0 -> 1002 bytes .../com/lanremote/watch/MainActivity$73.class | Bin 0 -> 952 bytes .../com/lanremote/watch/MainActivity$74.class | Bin 0 -> 1103 bytes .../com/lanremote/watch/MainActivity$75.class | Bin 0 -> 1113 bytes .../lanremote/watch/MainActivity$76$1$1.class | Bin 0 -> 1201 bytes .../lanremote/watch/MainActivity$76$1.class | Bin 0 -> 1351 bytes .../com/lanremote/watch/MainActivity$76.class | Bin 0 -> 1504 bytes .../com/lanremote/watch/MainActivity$77.class | Bin 0 -> 1102 bytes .../lanremote/watch/MainActivity$78$1.class | Bin 0 -> 1623 bytes .../com/lanremote/watch/MainActivity$78.class | Bin 0 -> 1846 bytes .../lanremote/watch/MainActivity$79$1$1.class | Bin 0 -> 1176 bytes .../lanremote/watch/MainActivity$79$1.class | Bin 0 -> 2076 bytes .../com/lanremote/watch/MainActivity$79.class | Bin 0 -> 1515 bytes .../com/lanremote/watch/MainActivity$8.class | Bin 0 -> 556 bytes .../lanremote/watch/MainActivity$80$1$1.class | Bin 0 -> 1020 bytes .../lanremote/watch/MainActivity$80$1.class | Bin 0 -> 1558 bytes .../com/lanremote/watch/MainActivity$80.class | Bin 0 -> 2403 bytes .../com/lanremote/watch/MainActivity$81.class | Bin 0 -> 1376 bytes .../com/lanremote/watch/MainActivity$82.class | Bin 0 -> 798 bytes .../com/lanremote/watch/MainActivity$83.class | Bin 0 -> 1238 bytes .../com/lanremote/watch/MainActivity$84.class | Bin 0 -> 1139 bytes .../com/lanremote/watch/MainActivity$85.class | Bin 0 -> 1027 bytes .../lanremote/watch/MainActivity$86$1.class | Bin 0 -> 1897 bytes .../com/lanremote/watch/MainActivity$86.class | Bin 0 -> 2075 bytes .../com/lanremote/watch/MainActivity$87.class | Bin 0 -> 1395 bytes .../com/lanremote/watch/MainActivity$88.class | Bin 0 -> 559 bytes .../com/lanremote/watch/MainActivity$89.class | Bin 0 -> 652 bytes .../lanremote/watch/MainActivity$9$1.class | Bin 0 -> 1222 bytes .../com/lanremote/watch/MainActivity$9.class | Bin 0 -> 1120 bytes .../com/lanremote/watch/MainActivity$90.class | Bin 0 -> 832 bytes .../com/lanremote/watch/MainActivity$91.class | Bin 0 -> 1217 bytes .../lanremote/watch/MainActivity$92$1.class | Bin 0 -> 1180 bytes .../com/lanremote/watch/MainActivity$92.class | Bin 0 -> 1468 bytes .../com/lanremote/watch/MainActivity$93.class | Bin 0 -> 554 bytes .../com/lanremote/watch/MainActivity$94.class | Bin 0 -> 647 bytes .../com/lanremote/watch/MainActivity$95.class | Bin 0 -> 647 bytes .../com/lanremote/watch/MainActivity$96.class | Bin 0 -> 1310 bytes .../com/lanremote/watch/MainActivity$97.class | Bin 0 -> 2276 bytes .../com/lanremote/watch/MainActivity$98.class | Bin 0 -> 1033 bytes .../com/lanremote/watch/MainActivity$99.class | Bin 0 -> 5444 bytes .../lanremote/watch/MainActivity$Act.class | Bin 0 -> 458 bytes .../lanremote/watch/MainActivity$TabDef.class | Bin 0 -> 634 bytes .../com/lanremote/watch/MainActivity.class | Bin 0 -> 81460 bytes _tests/test_apk_contents.py | 2 +- _tests/test_image_modes.py | 45 +- _tests/test_lan_optimize.py | 14 +- _tests/test_package_remote.py | 8 +- _tests/test_relay_default_blank.py | 144 +++++++ _tests/verify_all.ps1 | 6 + android/AndroidManifest.xml | 2 +- android/build_apk.ps1 | 4 +- .../src/com/lanremote/watch/DeviceStore.java | 5 + .../src/com/lanremote/watch/MainActivity.java | 255 ++++++++++- docs/AFTER-INSTALL.txt | 6 +- docs/BEFORE-INSTALL.txt | 4 +- installer/license-combined.txt | 14 +- installer/ykxmz.iss | 117 ++++- relay/relay.py | 2 +- windows/lanremote/__init__.py | 2 +- windows/run_agent.py | 52 ++- windows/version_info.txt | 4 +- 175 files changed, 1287 insertions(+), 56 deletions(-) create mode 100644 _build/_cmsg_200.txt create mode 100644 _build/add_watch_settings.py create mode 100644 _build/deploy_release.py create mode 100644 _tests/out_app/com/lanremote/watch/DeviceStore.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$10.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$100.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$101.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$102.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$103.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$104.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$105.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$106.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$107$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$107.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$108.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$109.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$11.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$110.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$111.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$112$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$112.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$113.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$114.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$115.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$116.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$117$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$117.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$118.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$119.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$12.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$120.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$121.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$122.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$123.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$124.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$125.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$126.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$127.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$128.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$129.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$13.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$14.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$15.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$16.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$17.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$18.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$19.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$2.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$20.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$21.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$22.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$23.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$24.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$25.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$26.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$27.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$28.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$29.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$3.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$30.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$31.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$32.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$33.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$34.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$35.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$36.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$37.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$38.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$39.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$4.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$40.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$41.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$42.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$43.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$44.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$45.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$46.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$47.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$48.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$49.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$5.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$50.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$51.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$52.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$53.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$54.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$55.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$56.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$57.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$58$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$58.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$59.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$6.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$60.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$61.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$62.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$63.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$64$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$64$2.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$64.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$65.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$66.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$67.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$68$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$68$2.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$68.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$69.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$7.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$70.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$71.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$72.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$73.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$74.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$75.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$76$1$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$76$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$76.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$77.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$78$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$78.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$79$1$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$79$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$79.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$8.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$80$1$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$80$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$80.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$81.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$82.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$83.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$84.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$85.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$86$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$86.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$87.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$88.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$89.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$9$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$9.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$90.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$91.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$92$1.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$92.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$93.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$94.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$95.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$96.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$97.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$98.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$99.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$Act.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity$TabDef.class create mode 100644 _tests/out_app/com/lanremote/watch/MainActivity.class create mode 100644 _tests/test_relay_default_blank.py diff --git a/_build/CHANGELOG.md b/_build/CHANGELOG.md index 97a9ab8..2d4880e 100644 --- a/_build/CHANGELOG.md +++ b/_build/CHANGELOG.md @@ -1,3 +1,33 @@ +## 2.0.0 + +- **安装时就能设中转服务器**:安装向导那一页现在是两个输入框 —— + **配对码**和**中转服务器**。装的时候是"第一次设置",那时候最该一次 + 把地址填好,不然装完还得去双击 exe 找设置窗口,很容易漏。 + 只填域名就行(自动补 `https://`),留空 = 只走局域网。 + 批量部署同样支持:`/VERYSILENT /CODE=246810 /RELAY=relay.你的域名` + +- **手表端新增「设置」页**:以前设置散在首页(只有一个"中转设置"按钮), + 现在统一收进来,在里面调: + - **中转服务器**(填写 / 一键清空) + - **记住的配对码**(显示 / 清除) + - **已配对的电脑**(看数量 / 清空) + - **关于**(版本号 + 连接顺序说明) + +- **中转地址改成手动填,默认留空**:以前有一版把作者的服务器地址写死成 + 默认值,第一次运行就存进了偏好设置,装新版本也不会清 —— + 看起来就像"默认还是别人的中转站"。现在默认是空的, + 并且会做**一次性迁移**把那个旧的内置地址清掉 + (只清完全相等的,你自己填的不会动)。 + +- **修「局域网连上后要推出去点设备才能控制」**:手表上有四个页面, + 切换时靠手工藏上一页,新加的「局域网连接」页漏藏了 —— + 所以从它连上之后控制面板其实已经显示,却被盖住看不见。 + +- **修「双击 exe 没反应」**:装完之后双击现在会打开设置窗口。 + +- 新增**版本号一致性检查**和**中转地址默认值检查**两道断言, + 防止这类"漏改一处"的问题再出现。 + ## 1.9.0 - **被控端终于有设置窗口了**:装完之后双击 `ykxmz.exe` 就能打开,里面可以改 diff --git a/_build/_cmsg_200.txt b/_build/_cmsg_200.txt new file mode 100644 index 0000000..6a6e123 --- /dev/null +++ b/_build/_cmsg_200.txt @@ -0,0 +1,77 @@ +2.0.0:安装时可设中转服务器 + 手表端新增设置页 + 中转默认留空 + +按用户定的版本规矩,这一轮既有新内容又有重构,所以升第二位: +1.9.0 -> 2.0.0(最后一位清 0)。 + +== 一、安装时就能设中转服务器(用户要求)== + +安装向导那一页现在是两个输入框:配对码 + 中转服务器。 +装的时候是"第一次设置",最该一次把地址填好,不然装完还得去 +双击 exe 找设置窗口,很容易漏。 + +只填域名就行(自动补 https://),留空 = 只走局域网。 +批量静默部署同样支持: + ykxmz-setup-2.0.0.exe /VERYSILENT /CODE=246810 /RELAY=relay.你的域名 + +为此新增了一个 --relay-url 参数: + --relay 连接一次、打印状态、然后退出(人工排查用) + --relay-url 只写进配置,不连接、不退出(安装流程用) +用错那个的话,安装包的命令链会在中间就 return,后面的 --silent +根本跑不到 —— 所以必须分开。 + +== 二、手表端新增「设置」页(用户要求)== + +用户原话:"安卓端加一个设置,各种设置就在这里面调"。 +以前设置散在首页(只有一个"中转设置"按钮),现在统一收进设置页: + * 中转服务器(填写 / 一键清空) + * 记住的配对码(显示 / 清除) + * 已配对的电脑(看数量 / 清空,带二次确认) + * 关于(版本号从 APK 读,不会和代码对不上) + +== 三、中转地址默认留空 + 一次性迁移(用户报的问题)== + +用户原话:"安卓端为什么还是默认填的我的中转站,以后改成手动填"。 + +代码里的默认值早就是空的了,但用户看到的还是那个地址 —— +因为**老版本 1.5.0 把作者的域名硬编码成了默认值**,第一次运行就 +存进了 SharedPreferences。装新 APK 不会清偏好,所以那个值一直留着。 +用户其实从来没"选"过这个地址,是程序硬塞的。 + +所以加了 migrateLegacyRelay():存的值如果正好等于当时内置的域名, +就当成没设过、清掉。只清完全相等的,用户手填的不会动。 + +== 四、两个测试自身的毛病 == + +* test_lan_optimize 那条"没有把旧公网域名当默认值"太粗 —— + 它查的是源码里任何位置,于是迁移注释里引用那行老代码就把它判红了。 + 改成先剥掉注释再查(断言要测的是"有没有把它当默认值")。 + +* test_image_modes 偶发红:它开真实 Tk 全屏窗口,在全量套件里跑 + 偶尔起不来(单独跑 19/19 全过)。加了有界重试。 + 偶发红的测试会让"全量通过"失去意义。 + +== 五、新增防复发断言 == + +_tests/test_relay_default_blank.py(15 项,回归阶段 3a3b): + * 默认值必须是空串 + * 除了迁移清单,源码里不许有写死的中转域名 + * 迁移必须真的被调用(不是只定义) + * 迁移必须是 remove,不能换成另一个硬编码值 + * Windows 端的默认也得是空 + +理由:用户说过"这个中转站我就自己用,不对外" —— 值得用断言钉死。 + +== 六、顺手修的 == + +* release_all.py 崩在 Gitee 那一步:Gitee 的 + GET /releases/tags/{tag} 在"标签存在、但还没发行版"时返回的是 + **HTTP 200 + JSON null**(不是 404),于是 .get("id") 直接 + AttributeError。发 1.9.0 时踩到,已改成容忍 None。 + +* installer/build_installer.py 里 license-combined.txt 是从 + docs/ 三份文档重新生成的,所以光改生成物没用(下次构建又变回去)。 + 改成在 build_license() 里统一注入当前版本。 + +* ExE 文件属性里的版本(version_info.txt)从 1.7.1 起就一直没跟上。 + +全量回归 43 个阶段全部通过。 diff --git a/_build/add_watch_settings.py b/_build/add_watch_settings.py new file mode 100644 index 0000000..df8671d --- /dev/null +++ b/_build/add_watch_settings.py @@ -0,0 +1,401 @@ +# -*- coding: utf-8 -*- +r'''安卓端:中转地址改成"手动填" + 加一个设置页。 + +== 用户报的问题 == + +「安卓端为什么还是默认填的我的中转站,以后改成手动填, + 安卓端加一个设置,各种设置就在这里面调」 + +== 根因 == + +代码里的默认值**已经改成空**了: + + private static final String DEFAULT_RELAY_URL = ""; + +但你手表上看到的还是 `https://relay.xxmxxs.top` —— 因为 +**老版本 1.5.0 把作者的域名硬编码成默认值**(git 历史里查到了): + + private static final String DEFAULT_RELAY_URL = "https://relay.xxmxxs.top"; + +第一次运行它就 `setRelayUrl(默认值)` 存进了 SharedPreferences。 +装新 APK **不会清偏好设置**,所以那个值一直留着。 + +**用户从来没"选"过这个地址** —— 是程序硬塞的。所以正确做法是 +**一次性迁移**:如果存的就是当时内置的那个域名,当成没设过,清掉。 + +== 做的事 == + +1. 迁移:把老版本硬塞的那个域名从偏好里清掉 +2. 新增「设置」页,把散落的设置收进来: + * 中转服务器(手动填 / 清空) + * 记住的配对码(看 / 清) + * 已配对设备(看数量 / 清空) + * 关于(版本号、连接方式说明) +3. 首页那个「中转设置(跨网络用)」按钮改成「设置」,进设置页 +4. settingsPanel 纳入 showOnly(),避免再出现"面板漏藏"那类问题 +''' +from __future__ import annotations + +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +SRC = (ROOT / "android" / "src" / "com" / "lanremote" / "watch" + / "MainActivity.java") + + +# ====================================================================== +# 1. 迁移 + 面板字段 +# ====================================================================== +MIGRATION = ''' /** + * 老版本硬塞进来的中转地址,要清掉。 + * + *

1.5.0 那版把作者的域名写死成默认值: + *

+     *     private static final String DEFAULT_RELAY_URL = "https://relay.xxmxxs.top";
+     * 
+ * 而且第一次运行就存进了 SharedPreferences。装新 APK 不会清偏好, + * 所以用户会看到「默认还是那个中转站」—— 其实他从来没选过。 + * + *

现在默认值是空串(跨网络要自己填)。这里做一次性迁移: + * 存的值如果正好是当时内置的那个域名,就当成没设过,清掉。 + * + *

⚠ 只在**完全等于**内置值时清 —— 用户自己手填的地址不能动。 + */ + private static final String[] LEGACY_BAKED_IN_RELAYS = { + "https://relay.xxmxxs.top", + "http://relay.xxmxxs.top", + }; + + private void migrateLegacyRelay() { + String saved = getSharedPreferences("lanremote", MODE_PRIVATE) + .getString("relay_url", ""); + if (saved == null) { + return; + } + String trimmed = saved.trim(); + for (String legacy : LEGACY_BAKED_IN_RELAYS) { + if (legacy.equalsIgnoreCase(trimmed)) { + // 这是老版本硬塞的,不是用户选的 —— 清掉,让他自己填 + getSharedPreferences("lanremote", MODE_PRIVATE).edit() + .remove("relay_url").apply(); + appendLog("已清掉旧版本内置的中转地址(不是你自己填的)"); + return; + } + } + } + +''' + + +SETTINGS_BUILD = ''' /** + * 「设置」页。用户要求:"安卓端加一个设置,各种设置就在这里面调"。 + * + *

以前设置散在首页(一个「中转设置」按钮)和别处, + * 现在统一收到这里。 + */ + private void buildSettingsPanel() { + settingsPanel = new FrameLayout(this); + settingsPanel.setBackgroundColor(C_BG); + + ScrollView scroll = new ScrollView(this); + scroll.setBackgroundColor(C_BG); + LinearLayout box = new LinearLayout(this); + box.setOrientation(LinearLayout.VERTICAL); + box.setPadding(dp(10), dp(12), dp(10), dp(12)); + scroll.addView(box, new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); + settingsPanel.addView(scroll, new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + + LinearLayout top = new LinearLayout(this); + top.setOrientation(LinearLayout.HORIZONTAL); + top.setGravity(Gravity.CENTER_VERTICAL); + box.addView(top, new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); + + TextView title = new TextView(this); + title.setText("设置"); + title.setTextColor(C_FG); + title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); + title.setTypeface(null, android.graphics.Typeface.BOLD); + top.addView(title, new LinearLayout.LayoutParams( + 0, ViewGroup.LayoutParams.WRAP_CONTENT, 1f)); + top.addView(smallButton("返回", C_CARD, new Runnable() { + @Override + public void run() { + hideSettingsPanel(); + } + })); + + // ================= 中转服务器 ================= + settingsRelayValue = new TextView(this); + settingsRelayValue.setTextColor(C_DIM); + settingsRelayValue.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); + settingsRelayValue.setPadding(0, dp(6), 0, dp(4)); + + box.addView(sectionTitle("中转服务器")); + box.addView(hintText("手表和电脑不在同一个网络时(比如在办公室管教室)" + + "才需要填。填你自己那台的地址,比如 relay.你的域名。\\n" + + "只在一个 WiFi 里用就留空 —— 那样直接连,最快也不耗流量。")); + box.addView(settingsRelayValue); + + Button editRelay = bigButton("填写中转服务器", C_ACCENT, 14); + editRelay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + promptRelayUrl(); + } + }); + box.addView(editRelay); + + Button clearRelay = bigButton("清空中转服务器(只走局域网)", C_CARD, 13); + clearRelay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + setRelayUrl(""); + refreshSettingsPanel(); + toast("已清空 —— 以后只走局域网"); + } + }); + box.addView(clearRelay); + + // ================= 配对码 ================= + settingsCodeValue = new TextView(this); + settingsCodeValue.setTextColor(C_DIM); + settingsCodeValue.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); + settingsCodeValue.setPadding(0, dp(6), 0, dp(4)); + + box.addView(sectionTitle("记住的配对码")); + box.addView(hintText("手表会记住最近一次用的配对码," + + "下次连接自动带上,不用重复输。")); + box.addView(settingsCodeValue); + + Button clearCode = bigButton("清除记住的配对码", C_CARD, 13); + clearCode.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + getSharedPreferences("lanremote", MODE_PRIVATE).edit() + .remove("paired_code").apply(); + refreshSettingsPanel(); + toast("已清除"); + } + }); + box.addView(clearCode); + + // ================= 已配对设备 ================= + settingsDevicesValue = new TextView(this); + settingsDevicesValue.setTextColor(C_DIM); + settingsDevicesValue.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); + settingsDevicesValue.setPadding(0, dp(6), 0, dp(4)); + + box.addView(sectionTitle("已配对的电脑")); + box.addView(hintText("配对过的电脑会出现在首页列表里,点一下就能连。" + + "换电脑或者想重新配对时可以清空。")); + box.addView(settingsDevicesValue); + + Button clearDevices = bigButton("清空已配对的电脑", C_DANGER, 13); + clearDevices.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new android.app.AlertDialog.Builder(MainActivity.this) + .setTitle("清空已配对的电脑?") + .setMessage("清掉之后首页列表就空了," + + "需要重新输配对码连接。") + .setPositiveButton("清空", new android.content.DialogInterface.OnClickListener() { + @Override + public void onClick(android.content.DialogInterface d, int w) { + store.clearDevices(); + refreshDeviceList(); + refreshSettingsPanel(); + toast("已清空"); + } + }) + .setNegativeButton("取消", null) + .show(); + } + }); + box.addView(clearDevices); + + // ================= 关于 ================= + box.addView(sectionTitle("关于")); + box.addView(hintText("ykxmz 手表端 版本 " + appVersion() + + "\\n\\n" + + "连接顺序:先试局域网直连(同一个 WiFi,几毫秒);" + + "连不上再走中转(跨网络,受线路影响)。")); + } + + /** 一行小节标题 */ + private TextView sectionTitle(String text) { + TextView v = new TextView(this); + v.setText(text); + v.setTextColor(C_FG); + v.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); + v.setTypeface(null, android.graphics.Typeface.BOLD); + v.setPadding(0, dp(14), 0, 0); + return v; + } + + /** 一行灰色说明 */ + private TextView hintText(String text) { + TextView v = new TextView(this); + v.setText(text); + v.setTextColor(C_DIM); + v.setTextSize(TypedValue.COMPLEX_UNIT_SP, 11); + v.setLineSpacing(0, 1.25f); + v.setPadding(0, dp(4), 0, 0); + return v; + } + + /** 版本号。从 PackageManager 读,和构建脚本里的版本天然一致, + * 不用在代码里再写一份(写两份必然有一份会忘改)。 */ + private String appVersion() { + try { + return getPackageManager() + .getPackageInfo(getPackageName(), 0).versionName; + } catch (Exception e) { + return "?"; + } + } + + /** 把设置页上的文字刷新成当前值 */ + private void refreshSettingsPanel() { + if (settingsRelayValue == null) { + return; + } + String relay = relayUrl(); + settingsRelayValue.setText(relay.isEmpty() + ? "现在是:空(只走局域网)" + : "现在是:" + relay); + settingsRelayValue.setTextColor(relay.isEmpty() ? C_DIM : C_OK); + + String code = savedPairingCode(); + settingsCodeValue.setText((code == null || code.isEmpty()) + ? "现在没有记住的配对码" + : "记住的是:" + code); + + int n = store.devices() == null ? 0 : store.devices().size(); + settingsDevicesValue.setText("已配对 " + n + " 台电脑"); + } + + private void showSettingsPanel() { + refreshSettingsPanel(); + showOnly(settingsPanel); + } + + private void hideSettingsPanel() { + showConnectPanel(); + } + +''' + + +def patch(text: str, old: str, new: str, label: str, results: list) -> str: + if old not in text: + results.append(("✗", label, "找不到锚点")) + return text + if text.count(old) != 1: + results.append(("!", label, "锚点出现 %d 次" % text.count(old))) + results.append(("✓", label, "")) + return text.replace(old, new, 1) + + +def main() -> int: + text = SRC.read_text(encoding="utf-8") + results: list = [] + + # ---- 1. 面板字段声明 ---- + text = patch( + text, + " private FrameLayout lanPanel;", + " private FrameLayout lanPanel;\n" + " // ---- 设置页(用户要求:各种设置收在一个页面里调)----\n" + " private FrameLayout settingsPanel;\n" + " private TextView settingsRelayValue;\n" + " private TextView settingsCodeValue;\n" + " private TextView settingsDevicesValue;", + "声明 settingsPanel 和各显示控件", results) + + # ---- 2. 插入迁移函数(放在 relayUrl 之前)---- + text = patch( + text, " private String relayUrl() {", + MIGRATION + " private String relayUrl() {", + "插入 migrateLegacyRelay()", results) + + # ---- 3. buildSettingsPanel 等方法(插在 buildLanPanel 之前)---- + text = patch( + text, " private void buildLanPanel() {", + SETTINGS_BUILD + " private void buildLanPanel() {", + "插入 buildSettingsPanel() 等", results) + + # ---- 4. 建面板的地方也要建它 ---- + text = patch( + text, " buildLanPanel();", + " buildLanPanel();\n buildSettingsPanel();", + "构建时创建 settingsPanel", results) + + # ---- 5. showOnly 纳入 settingsPanel ---- + text = patch( + text, + " View[] all = {connectPanel, controlPanel, mirrorPanel, lanPanel};", + " View[] all = {connectPanel, controlPanel, mirrorPanel, lanPanel,\n" + " settingsPanel};", + "settingsPanel 纳入 showOnly()", results) + + # ---- 6. 首页那个按钮改成「设置」 ---- + text = patch( + text, + ''' Button relayButton = bigButton("中转设置(跨网络用)", C_ACCENT, 14);''', + ''' Button relayButton = bigButton("设置", C_ACCENT, 14);''', + "首页按钮文案改成「设置」", results) + + text = patch( + text, + ''' public void onClick(View view) { + promptRelayUrl(); + } + }); + box.addView(relayButton);''', + ''' public void onClick(View view) { + showSettingsPanel(); + } + }); + box.addView(relayButton);''', + "首页按钮改成打开设置页", results) + + # ---- 7. 启动时做迁移 ---- + # 找 onCreate 里合适的位置:appendLog 第一次出现之前太早, + # 用 "store = " 初始化之后 + import re + m = re.search(r"( store = new DeviceStore\(this\);\n)", text) + if m: + text = (text[:m.end()] + + " // 老版本硬塞的中转地址要清掉(见 migrateLegacyRelay)\n" + " migrateLegacyRelay();\n" + + text[m.end():]) + results.append(("✓", "启动时调用迁移", "")) + else: + results.append(("✗", "启动时调用迁移", "找不到 store 初始化那行")) + + # ---- 输出 ---- + print(" ── 补丁结果 ──") + for mark, label, note in results: + print(" %s %s%s" % (mark, label, (" —— " + note) if note else "")) + + if any(m == "✗" for m, _l, _n in results): + print() + print(" 有锚点没匹配,没有写回") + return 1 + + if not any(m == "✗" for m, _l, _n in results): + SRC.write_text(text, encoding="utf-8", newline="\n") + print() + print(" 已写回 MainActivity.java") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/_build/deploy_release.py b/_build/deploy_release.py new file mode 100644 index 0000000..ba53a90 --- /dev/null +++ b/_build/deploy_release.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- +r'''把某个版本的成品和官网代码传到中转服务器。 + +用法: + python _build/deploy_release.py 1.9.0 + python _build/deploy_release.py 1.9.0 --code-only # 只更新官网代码 + python _build/deploy_release.py 1.9.0 --files-only # 只传成品文件 + +== 为什么写成脚本文件而不是 python -c == + +这一轮我在 PowerShell 里用 `python -c @"..."@` 写带引号和 $ 的 +Python 代码,失败了四五次(PowerShell 会插值、会吃掉 $、嵌套引号 +转义一层套一层)。凡是超过两行的 Python,一律写成 .py 文件再跑。 + +== 官网上"最新版"是怎么来的 == + +relay.py 的 _list_downloads() 按 **mtime 倒序** 返回文件, +landing.py 的 _version() 取**第一个**能匹配到 x.y.z 的文件名。 + +所以"上传哪个版本,官网就显示哪个版本" —— 不用改任何代码。 +按顺序传 1.9.0、再传 2.0.0,官网就会先显示 1.9.0、再显示 2.0.0。 +''' +from __future__ import annotations + +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(ROOT / "_build")) + +from devssh import upload, run # noqa: E402 + +REMOTE_DIR = "/root/lanremote-relay" +DL_DIR = REMOTE_DIR + "/downloads" + +# 要传的成品(和 dist/ 里的文件名一致) +ARTIFACTS = [ + "ykxmz-setup-{v}.exe", + "ykxmz-watch-{v}.apk", + "ykxmz-watch-{v}-说明.txt", + "ykxmz-server-{v}.zip", +] + +# 官网/服务端代码 +CODE = ["relay.py", "admin.py", "landing.py", "showcase.py"] + + +def main() -> int: + args = [a for a in sys.argv[1:] if a] + if not args: + print(__doc__) + return 1 + version = args[0] + code_only = "--code-only" in args + files_only = "--files-only" in args + + print("=" * 62) + print(" 部署 %s 到中转服务器" % version) + print("=" * 62) + + # ---------------- 成品 ---------------- + if not code_only: + print() + print(" ── 1. 上传成品到 downloads/ ──") + for tpl in ARTIFACTS: + name = tpl.format(v=version) + local = ROOT / "dist" / name + if not local.is_file(): + print(" [跳过] %s 不存在" % name) + continue + upload(str(local), "%s/%s" % (DL_DIR, name)) + print(" ✓ %-34s %10d 字节" % (name, local.stat().st_size)) + + # ---------------- 代码 ---------------- + if not files_only: + print() + print(" ── 2. 更新官网/服务端代码 ──") + for name in CODE: + local = ROOT / "relay" / name + if not local.is_file(): + print(" [跳过] %s 不存在" % name) + continue + upload(str(local), "%s/%s" % (REMOTE_DIR, name)) + print(" ✓ %s" % name) + + print() + print(" ── 3. 语法检查 + 重启 ──") + out = run( + "cd %s && python3 - <<'PY'\n" + "import ast\n" + "for f in %r:\n" + " ast.parse(open(f, encoding='utf-8').read())\n" + "print('语法 OK')\n" + "PY" % (REMOTE_DIR, tuple(CODE)), + timeout=90) + print(" " + out[1].strip().splitlines()[-1]) + + out = run("systemctl restart lanremote-relay && sleep 4 && " + "systemctl is-active lanremote-relay && " + "grep -m1 '^VERSION' %s/relay.py" % REMOTE_DIR, timeout=120) + for ln in out[1].strip().splitlines(): + print(" " + ln) + + # ---------------- 复核 ---------------- + print() + print(" ── 4. 复核:官网现在显示哪个版本 ──") + out = run( + "curl -s -H 'Cache-Control: no-cache' http://127.0.0.1:8080/v1/downloads", + timeout=60) + print(" " + out[1].strip()[:400]) + + out = run("curl -s -H 'Cache-Control: no-cache' http://127.0.0.1:8080/ " + "| grep -o '最新版 [0-9.]*' | head -1", timeout=60) + print(" 官网首页角标: " + out[1].strip()) + + print() + print(" 提示:官网 / 走 max-age=60,公网可能需要等一分钟才刷新;") + print(" 下载链接带 604800 缓存,换版本号正好会换 URL。") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/_build/fix_license_version.py b/_build/fix_license_version.py index 9d2d054..ac7801d 100644 --- a/_build/fix_license_version.py +++ b/_build/fix_license_version.py @@ -18,12 +18,34 @@ r'''修 license-combined.txt 里那份**没过期的**协议版本号。 ''' from __future__ import annotations +import re import sys from pathlib import Path ROOT = Path(__file__).resolve().parent.parent FILE = ROOT / "installer" / "license-combined.txt" -NEW = "1.9.0" + + +def current_version() -> str: + """从**单一来源**读版本号。 + + ⚠ 这里原来是写死的 NEW = "1.9.0"。升到 2.0.0 那次它把已经 + 改好的 license 又**改回了 1.9.0** —— 因为整个升级流程是: + bump_version_generic.py 改一批 + fix_license_version.py 再"修"一遍 <- 用写死的旧版本覆盖 + 写死的常量就是这样:改版本号时忘了改这里,它就成了回退操作。 + + 现在统一从 _build/package_remote.py 的 VERSION 读 —— + 那个是打包脚本用的版本号,本来就是单一来源。 + """ + text = (ROOT / "_build" / "package_remote.py").read_text(encoding="utf-8") + m = re.search(r'VERSION\s*=\s*"([^"]+)"', text) + if not m: + raise SystemExit(" ✗ 从 package_remote.py 里读不到 VERSION") + return m.group(1) + + +NEW = current_version() def main() -> int: diff --git a/_build/package_remote.py b/_build/package_remote.py index 2dd7044..44db0b6 100644 --- a/_build/package_remote.py +++ b/_build/package_remote.py @@ -17,7 +17,7 @@ import zipfile from pathlib import Path ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote") -VERSION = "1.9.0" +VERSION = "2.0.0" NAME = f"ykxmz-{VERSION}" AGENT_SRC = ROOT / "dist_exe" / "ykxmz" diff --git a/_tests/out_app/com/lanremote/watch/DeviceStore.class b/_tests/out_app/com/lanremote/watch/DeviceStore.class new file mode 100644 index 0000000000000000000000000000000000000000..c3e145210bffb6364bb363050b28ca3383e143be GIT binary patch literal 5214 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 S!Si^5e*<(FWkYz;U;7`g8A|*B literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$1.class b/_tests/out_app/com/lanremote/watch/MainActivity$1.class new file mode 100644 index 0000000000000000000000000000000000000000..cd3e994ff0b40bf37449dc40226d989384cf53a2 GIT binary patch literal 806 zcma)4O>Yx15PeQUHoINYH0ArNrKBYZ5}OJn4nasLfD|dEQVYF1j+?k_>}uC7>JQ+@ za0G!G^-u}8@jrlnff%QtA}-5e?U~t`_uhEs>(8TO0Qb@Kkwe}?A;cLJ8J2_@M={rl z92+a6*W8Lxw8oWwEUemB_Mo=PP_!eJ)>@R^%SvwtD8cs-gqT6dP}$-8+z||;_5O|& zme3w5t?VO)e7&(%LYV;pDwy+74Ka^%42xMT3;`EHrX;FGvL4j4b@fh#Y}!QWVcU^k zVDP^kzW+XX^W*K2Q*kN8Whdbe{%Wh`;VMJK^&l~75DBBL)HZsecx;AUa*}N>WNlq{ zVkKVnR7$^P!m#`wq8eKag^n3WhS{Fd^7-DlFOwI%A5+9LCy-O94ElE0K?R#;FA?&Y za^-V>Pw}qno=Bc*5u22{Uz2uZ1|gQ+kjlG>8SmN+8S{geNz4#-HTBSmd78@9L!DtE zLjYm_^8#3;O)G)n3RtD$wv84rN8b#tQS>@lOXRyq(7f{zta%9U9eE5l=q%C=9Mic# zNGJLCC_7Kl`Q`_(>e&fqr^fjSE}j;arzxM{<1?!GLf%a($r0Htx(hVp8dk`v{w61r KB;H1&=>GzP)J(?iCgMa>Y-8*5(*$iO6egeCoYb&#M?M)WN%XS zv5*phIPd^G0}?z5V%8uPkwYwbXLj`MZ+1N6Z@<2L1#pa`0t{qKWG&>7XV~+ji5q${ z=95Tq_tH~-;GTIxzVMZp33X*3wHWd$5Q$CBZg-XbR3})oP(YDkZRUk`5G9JC(!KCz zo=!D#dny)klqxL?H*xE)@S4C8@VPexl z4Om28U3+@vw|4c}so-p!)K?Y5Q1pDCCy9O1qUzr@R+qnA zW@kCH9BKAV>@w_lau`Qq=*|Scbo;c}=dv9Nf7}&`;*!S<*>*JK4C`GX`J3rvz~i^x zAf!m4Cq~j!)0liS`g4q-+UPDpPn&%ztrtyWpT8FRZ28}wAL`FY8D2?0j1p?q8CO9x zv~Zw5ayjPjW1a*r`Aqm+-;2TONV;1)^pb=pCR|c2B_-g0wV+Ndt%Ax%u2j+^1CXVG zNG3SkjPH0vzJV>;J;oDSHSL&w3eDei<^-D)Yfh*+f##@u#=UDwQR|E!*f4$~gGS0~ Y!XcZb8QaHG@+zd!H2v)05UqUSH#`{9QUCw| literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$100.class b/_tests/out_app/com/lanremote/watch/MainActivity$100.class new file mode 100644 index 0000000000000000000000000000000000000000..17aa0a91b516c1bcc542ad9075941c42b4511a6d GIT binary patch literal 942 zcmah|U279T6g`u~Y?4mRCRVG~kD9J#n|`FN6@`eRr9vT9Fd~Y+Y&S!)WjkATXQRIR z;-lb`;2-c!NIy`~cmIdlH~)cnrzu28p$ohB&fI&?xpU|2kH4S40a(PfED}f>NO2rP zn!$2|jjHd+P;3NBR9`sCZC6(vPu_8r*YVUVYkqEyA+6e8WRX*l6ratxV{ z<6BC+R1C%Xy3=tqSF74kp(k6l95{vz9OuZxWH9>)57yR&OGW9Mp7hi$hNM0D*g%nC zw4c;Nxf^?aQ-nDbFr2|jBKrMqYwz{jpKm_yb-TYleE;+Hy$+6YoW>b~bT&7IY%9GTN$Jyo&qj$lrTZlQ$g>H z3?ufTxnsD@aRp_D+yUEyCcADQeN6)=t?3C*(){`pei%#Xtoec=wG=eTk9vCX;vc>$g*_(AR+~<3e^sp91FP0U<7ix zBP89rb;zuG?Z(RUNuHb3D+6DVQiMys6GbAzILVHK!A8O~wfX?EBy!Syg5EsJWGm!p zo76j%sV%U|^cIZD4u(F_7Q+;M(`3P)V4C~{Oj^zCe|7O~q;wP$l`hy96rS$jL~&#r vr)X`M_Abtnzm4%-Sbe~p?tni-i9aXi*?rh5=E$ZD3=ff1#9p7EQdMNg`$zL6`^+#iOG0}hfL4u%+VgYdc8@+?ErG^Ng!8Kx_P2y-r6 zq#SUL5u_P1%if9?M{1OA)s}^CNbRyz(p+J%@`dUUG7RNtYc<-~_`3VF_pH0O^Wgi( z$Gz^WXniwUdl;>~-P`Vd+kMkpe-b@<89m?pvijQk`JzES4C5RJF~N}Xd|zmtyLi4# zF)!r@=dARDEtycN#@s@o>fkU#w*TdJM=7t?5)5bmL$Xk1u;+t1!AC1niJP5vO@w#; z2v}i9F}O=XC-lV)8EcOHeKO}_S0Y|lek;(FXHl4DQ0JJ!X@+#5u1W0&N>K|%ona#X z?+?WOe1Rb0e9O~XXyV$x+jIyllZlUYcHIP)G>@dJjpXvJ`h z#w1nnyEGn0dLN&M74L!<-@(d`X2-UX?K9k1i)*B~A>0YVC2$g_sM^GuBsX%RnN5|R EUx1;#GXMYp literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$102.class b/_tests/out_app/com/lanremote/watch/MainActivity$102.class new file mode 100644 index 0000000000000000000000000000000000000000..d3ed7522fde7158d1bd4b2607f94d2a34b9c315b GIT binary patch literal 580 zcmah`YfAz_6g^kX)paVf_d8+(HAstspa`M|1XfVt_jMd{LT6!jH0)mmMbU?TKtC$F zOM!iJVCFvN+;i{D`TG9&1h9+MED}gMNC}J}P4HyUskD6)s!m{4< zlQ3PZ4cgz@kP8kPG1QLkVludSK-piZs``(Y)__h88zH`_n-}a90($yA&3w|qE&oiI5Wx+@a8QykzweY zY;_^4LPa*&IA!<=-CaL_8d#hT`yXN zJa<%dARNL$BHpZ)w?3EZ&&!+Zj~lh8_41qVFW>!q@@(ttt43|*N2wH-!QC1Tp@%4p zr6n%%41@aQ-`Lq?lWT{Lv@;yha1_TF!iH&b*G-IF&QRk0dh5)SIVs_|lyHKfSI_;Q zD1@bXFYQBV zQvtF$*@*#$*lxA%6ooKm3w)o+&oKDM?L38dOj?59DlX1)=k7Lu;uHntJ8c&oli#!? zX6N3i9FnYb@rE!9woCn=;@-TS*J!RUFhp!IVY#L)1dR`;rgs0Usl>14D8v~r7_Q4* z#A(!JnNncUs2q2CCqDYyagMx$bm}8pdeqdwM<}T^w7n;bVTjfM?a&_4nnq+Negca0 zLQj2w@(CUH*3cP?RnR5vDh^lB8#_s61*c;DRh-#HQzehKLM>Y*j0|D;FpLq}{e(D* Mi*%A&{j}5f2PVS@3jhEB literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$104.class b/_tests/out_app/com/lanremote/watch/MainActivity$104.class new file mode 100644 index 0000000000000000000000000000000000000000..1873f4a02d0d8b484835774678d84e7ead32e284 GIT binary patch literal 580 zcmah`+e!m55Ixh@Zrw(0>-{dWLR-OBP!JSByns*@RQkS6gH36(u$wA=gP`9cD2fk$ zfFC8!qEO!&Nam6=XC^sc-yfdm1dJQ;K=9p8ki8(3Aj^Q~-E&U|eS zq}8|D-g}$XEkfG1bmUbDtF=J|yDl;qcHjzRAqcs)f9uCBZYmdzwvv|F_O#JMlkx<{&4KM}e?1h@X)4rBqSm?QB6E9$U^LQ+@%xW2BFEV;=DcM?4{k8O9_qi#fI_)?^+_ L?73VUcjNT~7RZB% literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$105.class b/_tests/out_app/com/lanremote/watch/MainActivity$105.class new file mode 100644 index 0000000000000000000000000000000000000000..bbf00a72999ca13e128faa9e247a9639558ce7a8 GIT binary patch literal 1620 zcmbVM&2JM&6#tFw#ve=)$26q{+D5?y+xf6@0XrCILLkN9K#QqE!l9b1N6AoUH`-k% zLh7NHa^yx;qJn6p9(yPPCxWQl5aPmL5yXxEfcA}T8lw~?Vx^t;X5Qy--h1=x^~1jb z9KsbpJPbXCHJ_{q)0Xp=E0asYHRh5NLYbq6s}_}eEeIbz@S}~xj{rk-EB)xf)M17; zcTPFc6hm)eD}$Vl5aQSY&JbD@m8dO+W0?$*!d0;-bau1JqH8O2HWxw%I{gT9bRohJ z-cYzOb5$BHMLwoX<(^>h#^R+A7(V3a#zzc0gkea>iDr+a(hPmEtrMG$PiqGsb9{o` zEeZp}pfL?H?0J(|6M3tezSJZ~3I|&<7}go=-%bW4KfYktwNd&;Z=9^EN?F<=q|q6` z5o({8kMF#=@yGhgy%#_KxxV(}tF>h<%yJClC^d>$SdeC!VKBD2&*Gbon(nD=X&mD? z4r;N0Yc*n1m&G=l$SnYy)j3t^=C*QSF?G67FGtREeKD7|g;D0=Ac zLZ0Xa;tmk?675X%KY%we@BqQY3fljoBZjYOZ6gYP6W#H_?N~R>m^~8O6 zy{p(cshL&mdV;-8u7*9!n88QKSl)R2pO zxr&ii@u|1Os~Fcpig|WY=j^HH+=n3L{0oBo7JB$H2KcWS=C?7z@8COr7eDad@Du+X eMY8b0Gms`6m+IEvqEtU)n8Y-3y03ji>H8Oq`mq-P literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$106.class b/_tests/out_app/com/lanremote/watch/MainActivity$106.class new file mode 100644 index 0000000000000000000000000000000000000000..f8cd3cb7df284f59d438571d486418cef8ce281d GIT binary patch literal 741 zcma))ZEF)j5Xb+Mi@D~qwQ1^O>O+m!+D0(fB7!J_6h$Ga&`O2A+iaF*+smHZL&dM+ zw-6MIFZ=+$6IA>(;%r(l@6v;vnVp^a?d;8b|NHeDfcv;pMG2mdvcNf12%$-pO1IJ3VRaQ?w~A3;r>{>A zytJ@{*_~Xf!=8M5>J4_1B31giak=x8t-9yv40>i&oMguC_jEo?1_H~j4~^`MA# zSK4jOwmKw;m)7cZGnQGVGc56J%z&^6s@L6o@W_;S)zD<`b+%f(cb=eq_cN&d1^!3g z5pJ-ou!i`-@+QP-{0oj|FBaRMK;AKC-#FtK3m+IUwk|tBX$)wf%z&S$ieFd|ztI$b dxFo;>HCfym2expVb(y;vVuh`M`K}`V{s9o{u3rEE literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$107$1.class b/_tests/out_app/com/lanremote/watch/MainActivity$107$1.class new file mode 100644 index 0000000000000000000000000000000000000000..29ef5f809af0b63017c9f0a242313c6929b98bf2 GIT binary patch literal 3147 zcmbVOZBtW66n>U~3An2mv5H!y6p_#(0bfW&Q9#h}W-Amcw$)2=g{$EPlN-?1)|b|b zRov&(Xk)eY3&H6Ew(fLU}yTpKS9)Q{D97so=rj$8XPjsOzt^*_Uv=cdCuOw z``16e{03khZkmz7P~i6Um3tN4ulD&2wR})9+`Z+kil*1P4Q)U(j%FhhS!T@PFvG%7 zJez+}g}th%f?*|cY8fYoV=g$u+yTW~6bQQAY9PSCy5!tEj`_%Cm?!5B zXu9I<@EuZh25ZYfWk8WN^pv+7eogO*U|Bg9N`DdeZ&UhIiL{90h3QBQe!tJ3gC)o} zV=2cnEN93~pziEGsJaa*X_KaFMh%0h#MYUO6yiK^9JXYDDu=x?i~3K$jn||@8OIuwCn7lP=|*U> zHA#R9j!LXe0;sT4eXG()(bg%~ujkl+s>FKddYQnEG}fm!-j-_0ffF0esOH#&&C}W% z-7E}dEzr={Zyb&EHA31Jj;*Loq(l`_NeyYFWSg-u+tdNgt+pFJzZ&UkJ;ydQB=DVU zCH{uA@DtlIw%H|z+c|c?l?1pU?H;&t(2N!{S~=RVlVRmd8#$=}28$u(q;eR8t+qg8;1gp* z1E2~tZ8!T@hX|Z`y3zOc%tQ1 zksKWVD+gEfs5{AVDtUJ~=)ISrKH@lykCQ?<(>;S-HkSoM42z!bwJQBF zkDPX2(C=0oHJR#yql(MgWp@^N2{gQA8x&A0m>jMD!uep#L&lBKa9<4w7?77L>j+0#oVo5oDK^ zjX;#^Gb;WCGkAdo literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$107.class b/_tests/out_app/com/lanremote/watch/MainActivity$107.class new file mode 100644 index 0000000000000000000000000000000000000000..324d757da6203f92338581182706f39823601b01 GIT binary patch literal 2267 zcma)8TTdHD6#mAywapF?Q!b_?q0~@pE{2dmumcUD5J(M_OGraXn`PPJ4Q3bZuA%t> zl`2KbL!KI`>O-Z9hqezO8)67JS>2BH zF|=jM9Y_leK^Y;08A3ZsF6Nk@YAi9mQx-I0W~se z1ve-JsOGvBMg(;d-jGp`28P-*S#xU-G}R#+ujz*Fj52sTWnEbiSIl5{7F%Btr<{qgjBY!cp;_ta;|t0=dX92x zI~_!v!DDWQ(S>daJu-TcWN0cS@|JB<&iK|$Gsn<=Z0xC|VoO)zD?#)#_}y#^Vt@fc z&lMSipbYlfj>T}Zyr5#yCE^^!FhkhZtR2moRkpMs(xh6mEYk{NgmV4QgC7om`Tp>? zuU|d>_VAnUUOjpu;a!G0H*Iw@IXyS=nW}9&x@m}<8Iy4X<7YWDbVcOMY6Uq{VD3`Z zGIy1=oR%(N9>25_J_x-NGA418TscnuA))qa1#06N#aOpYeLZQ~$tfD=DBu#N89GWu z^S_7^>knfJ?~BKrVYpvjp@5ZOPXtVjPHO*QQ77?^A>KlgQNQmP9srTRrB%|opow}~#(=n_#s(dIVpn+z0-JayI9R!6IJZBm2Na8u9S?bsU8dJWb!FeK8)T*gT zf)#n|1=>>ns6W!_JwRflI!$Gi(qcsIV}J@}E&lWfpS4!p(;0unqD?lEfaw<@NqG<*$jiADMs uA{Oau_zR&M5=Lui-zRP~?n5E!BZOMRI*poXMMPTsG^&0Zfe>kRfByi9pjlb~ literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$108.class b/_tests/out_app/com/lanremote/watch/MainActivity$108.class new file mode 100644 index 0000000000000000000000000000000000000000..4bdfccbf7b1794baecdbf615fd3c0a72867dd789 GIT binary patch literal 1946 zcma)7?NS?67=BI?*bsJY2vM-Dm12tdAPv~o(gvz+Boqu_Nu`o1bh9~zh0ShecY}Hf z&UgX((-|Fp|35L-^w+mTe zAt<8{A%^}P)ri%&lDs~cpa?rF+06uidJCo~PU%ngP}Q;%p>Gey_d z&1yD;Fa{(YA7WP`ZD5E^-Y_{*Q) z?!Nf(I{|r9#uRQb1YN6XlOY;!hoBl6LsrH#W~c}p*JhaO?qa*s9gu_gfT4%mwq*x# zmqBild;Zhji>E(}TFc4!2(!fexQcFyBAR-oB2vwYZRwSaXt*THq@HZm4<1mWrJrE zB?&7GgIK(;31T0}Sru=R=_X%l)XLm`D4eJHRn)7d>NafJ`|Sp`nNoCBZJXwt zry=199eLbNOh_odG|5hiJ5;n9w#M_iz#V8!`BibB=IE@c8J0tHagn>5Rz*e?n-p1x z8ZKwmYLq&f?A>c$I3&-TCbx5j>NwoN2+i&=7#_hN4vP^EkfZ_aN%~^YH1pAK5Njk$ zv>PWGAQ?@j_Q8_l`;e09ee@>}ac+;!86MNxOA<;6pVQulDE<4wTLr=&^j07k$){jP zc%6h4#f1aBRY*nN@gL#J%*7utnu?^JA-#5p3@P*fR7*TB3uwJ#MRUhihF_&F>^8fnT>Jt) zoA{#fQR5>a;bKI6HSv2G@X2proZUiDXo5}l%-NpV|NQ36%=h1)z5=+3Yycj3CHNGy zpp_w}nTx5aYFK>H6g;)83T-}>S9N1j6Z(=aR%1iyF@{z#uiLRSLvQY+4>C>!zk&c{ zhL$C@8siLIxdnAeP3dN8b}qZ3@tV+0!}U}Y1aXQX;CNQm60b6Z8{ULfNfm^p8Qhq=-M*90Ms>xM2S7`*XBQO0R>OE{z8EY2}>Hi^z4SGdS?+g2+? z7>Os2NA=?ZgR=YO>3cvs_ltiz~#W)@s}+ zGYrI!iyx1-FO%`(D$zxMyj$Pfc>nA38%OfGg1D24Uzm-UGLq<%(63+sgACD=>OzXD zrct`F;WQO;Bz|%wn=lvsppT_}HiuzY!3_uCKz%5kmT-%Tcz8*V>V~0~s&vb_|Bia3 zRhpqN_@>P=skY~IgFmbZJXPO(&&W1XimMMkTXF5S(*>m(!kOTd+6!JZL%Y@>nH0Y8%g$Uf+hPm zAteVk(U#ms`#Sy4FiLAHSp)^fXzxLU-tM@oqwoS=SF@PhfV73KZ}5lDe}KIInj_10 z(DQT~muTCzg=jcNOCLR3xb_i=CJw2C!y$*k<1&OD&fqe-gDV&fuHs4XIWlxA!P7n? bVVp1~T<3eZPu54RHHinblL^;Jntp!(+r~K@ literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$11.class b/_tests/out_app/com/lanremote/watch/MainActivity$11.class new file mode 100644 index 0000000000000000000000000000000000000000..50239a22689e55a5c12967a1256e15b9ad24331a GIT binary patch literal 816 zcmah{%Wl&^6g}gZxJe9ol|sv_v~EdEi(82eDndd5q)IMb1ZBZ);ta{O&RDW1srpZB zkP?Ad@Bw@V5_|^Yju#XuNU=0?u1DwId+y`=@2}qgJcVC^g@Oay#WfTewxeVm#9XCf zoM;hTa2<_;6E4-uNXx0zm)_waLs5@p<{dC>h0FLyCc%n}63PtDl*it=xMXOAXMD;{ zreV<4sZ_(9=(@OWh$Taed0)h3R8ezKchNwTp?2kV+CLMKCNa;YlKKThq1En{aT99} zZn?OPb%xDl@)*iIibR%q&km@b5d5h9p6cl) zlQa@hWh^h!)+B#br&_gIm>PRz4R zWDZ)yT1d*!{7+5Tq_J1Quz^CYW~L7i(r|O6U8D80=rpiSc$cg_LYr{ae>?~C_vUc? z{W&WBXWaNi?+o|oE)v4}f%{}zXwu&U%Ej^s`zYiw>;8-a%*cO+$``EKAOE_S4Z-?} gs`ZP=5Az^f*e0}Tb3E*l)gX?MX1)zPLc3V{1F{#xDgXcg literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$110.class b/_tests/out_app/com/lanremote/watch/MainActivity$110.class new file mode 100644 index 0000000000000000000000000000000000000000..12b476960ba24d83f0f5c832f141240b6915ecfb GIT binary patch literal 957 zcma)5U279T6g|_V+0ACtrdzA^JI1u;!!}8+zC;8GEml$$HUy#%ve^vH#?5ZnomBf1 zL{NMc`~$uTQH!9y`#%(ag?Kj&7)u~N?99D)@0@$)+&kZYfBp(!6E~umK}bSa#VjHW zY18c%Y{T(**A=|*)DUL7uxnV(ZBtnLmN-b4N=1fvOq206`OWa}zWwLbzbC{QqP_Y2*pLAV#mb1qoS^ieHCk}@B4`rMn z!|b+XoMezq+v+{`xsb8U5ElHIP;drkC7e@n9v2vvClS8uyAGka%??SBc~m{lv79{$ z^@U}V9KEuPBt!Ja^LM`ngP(7|DM;b6gtUqktTH4g)fiWiA!e8+_x<$7W|3sv&P>-6r>HM$@K< z-M(k?Z7VpwFfPn`pga}Xa!lLxsolF=wB449Yr*U+ z_B@w5U!fj1UBheD+y^Fuy5l(9tJsF`bARamy&jS@-!d4kfF%;ajMLc9&=*6NqB*is zWTPx|CI zUY=3joIzl8)OY^}j=#e3q|^aRow_qgc2CZp^PTg3yWf9(`U;>6H}@cb3JH}8s!+`k zHk^gHrQ0rFa0HJ((uFY>pVUoz$PnhDDISLti3CHnm@~a_2SZD;+y+fX5PKxZ3TmJ* z)XnRQx}Rb;K9!#5hM;KurfrG=hKfjZT1GAQN~lv%j}Svsx%dnm=^Umt5p#dG%mc9(S&9REecK|{EymqqGYHvbjxCBjueF)FU}Ff zDe@M4NdysLfL};VK^x8xR8P1JSBqop0G<-AY0qlAErm3BItxxdf$a+7ATs0vH9bBv zz5m6GZf9J_%)}ipevRf9cQpy;7*3UHb+IzT2^k4=`BLj<(8?$DeCG;t{ z0F5EE8y2-Q>v$yJhC<`=O}Le_Z9Q#qEqYhNMTUKO_Dv@~HZ`(j@T@Q$JBUFBW%JpK z&8I6rS66?${pR;Xs}`M>FhZql>+ug*hSvW`6P>1# zhn);(*qbzMem%F4=I(93TGEi4BhjlVp&JiL(*>)Xa&oT0M@`?QekWV)J_-snVjGs@ zk+>$gm~%1;ru<8y_5r7hhmK-4?dWcXx;19o+#R-b&*L7Qk^o&Q3|GMF>imm~PEUZI z8jOT5*QH|SU2V^CejCG{P~)fJ4Bzl6XO3H>smnV@9=NlenWk_2)c PH)s|rR7O*hdVc%{yjF{= literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$112$1.class b/_tests/out_app/com/lanremote/watch/MainActivity$112$1.class new file mode 100644 index 0000000000000000000000000000000000000000..0c22a1c4a0e48a64f59b1f939e63e7f9aac808af GIT binary patch literal 1483 zcma)6OHUI~6#j0DOer%`izxU+EYOEiQ1De$u;PnW6EPUv4Z{QmhZ&ujV%WKGfsc*G z7~M!rbm77WAQ7$6jfroU{sJv!5J1XmeQBzY?o57bDmPh4i%F*;_LbIKi7a}A9D@9bmNBg;Lf;1RC)jzB% z4#jTQ49z*f;0}g*%i%|*fYlv1g27>tE_1vD^JE;7|=S@IYs--~)k z9)uXgx#{#=dSX6(H~aJ<=Qtu_8@3aR^1uK?Rd9*ld|qOqbKEW}q8YqE$gWe@8EOiq zxeUimU8fvsra|T&>}2rIU%r~T{y1~%N#@$4JV^rD7=p#P$X8;Z#Y<(pn-|L-hDdQj z^2dk-&iy_SF|;$37g%j;=Cocc?j^S5`UP75uj8Vr3B-p?(^joqLa3Vki z9t$+kQ!Qwe7#B4GhW&8)e7t7>B&k7B&vMaMfrBJFNNXhN<}2aI3|M&E421AYluyzU zLnqCpBq6=WA<|v&(I4TYxr6@4X_vd}4!?l#3ac3I!AClKfwlgPv)DYDMt$E)G$tbc z;46e(I2*~EHj%nuxFeEAYad13HH*DGuqzk14ju~p0iyH~)zT-_NMEo;`iijh4Q37YG~@p9Xx`gBul7C9m8?b>T)_MG&oW|TJr)Yh^9oT_b+YLnKA$X literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$112.class b/_tests/out_app/com/lanremote/watch/MainActivity$112.class new file mode 100644 index 0000000000000000000000000000000000000000..3a6586d64a9fa9b80708dd98f77163ce32da9167 GIT binary patch literal 1467 zcma)6OHUI~7(KTXrVKM!>iZR;7Ho?$RzMyDC?X2jN@5KLU6^4yk&D9&=}b`<{s1?c zxNz&zH9ml7F!8bS7x>t?F~L7!{BEhCR7{;@=04`$?>pyw=iX1hUcUvx=g)F4c9J2QuC_s!5kkEL zSwRC7hVY!RXowWIw8@z{%k(MQ0C%`Q#84AYOvz}(4hdleO^7fwSBuZkV3?-md9lvE zlZ5C(ygH=Bwo9%QIgi-fa(q36U4+M+&xNpuL0)vZY2CEB=gZiK{Spo+IEX_G`?kY3 z;kgd&c4y{D(fEyYC1pLaF;(!nP3kV_wNwmxI=;(jMvH`~f}@E2gMB$phM;NKHbYCi zBIHD6ju6^N>LL+Oh#XgtKyp*Qu3jNuXJwo+@L504om*SLr%4g2a3hW@IDrmQs#J^~ z5v=#WYGF9JyvuW%>uF=ux2?P`fp)iTCvBw{V<{OLP6=~$GW1nXC=9HZX;ow(Y}bv` z5_%N$qK_f+Hz<;N!S%?ldrJ}(J$$9$IL3@^>51zSbcUV9T60$$pB%kwS_?jRoe%~Y zl=X)zKOQ~#`Siv5gXcoAGYZaPcvJuGl#nc4ok0nGF@32d8+^8A)e}<^Mu^I$`~HAs zX#I~gi7BEy;^r)d9ck`ZmkaYVR{pABOXkiO$l_|&H_Y4Q;L@y|bqjgZy1>Pfrt(^K z2ow}()G=+>BO7Hbf7Z<@$cRg!eu0~}r^Fc}p~fA@%8%HF=UE;dhXCCl4ClbYVR1*% zF$vJyfb%pvO1&tJ#f+S6e+8CYfwV*;x(Mi7M=jJf`d)-mTK|}$)X=~2Ibx`AJMOV#i05bL+TfdsoyY0dn5$zOX!yg&o~VOn7}1! TgXE4hE>ka3;znI^dGYxTsYHgd literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$113.class b/_tests/out_app/com/lanremote/watch/MainActivity$113.class new file mode 100644 index 0000000000000000000000000000000000000000..1e8a11aad903aa69f87fb2b62c2c24eae6164816 GIT binary patch literal 1518 zcma)6TT|0O6#f{Q>?AM-==6KB$amOC7M{)XXHid-mj0p+b}`iZQ``%8GPLQ{e$ZqD(I7!q z&lN<7+{zBRpm<8^i_%*(heYd)elmFJmJ%N!YAl3$`+BTn*o_ z=Q{MaJ2_2^Mlb1=C2O%IQ_<%(v76WGs2TJec_3p4c1mbdunXaTRKF4@L%=j_n_*|P zBIIyojvyiob&ip7#aG@A0(#1yT82OxdCX!KOQ|Ki?B7Fo6l>RdU>KANR=MhmC(4l_C zN%bdE>URvNKQN{)VwimCw*H2cgkBl7I75aS=t$ETAi<1ajAo&7r8K4EPe@*G0_L`K^lDt;~CmS+K}L4&OPVM`T5Rw&;9x5+YbO0+>IfGu!M+;DMT4E zrrRyrhU4+BD|qpRAVlc1=GLuE*I zi~}QRv0r@B>~K?1wR@IhiTe!UY_6^#ff)%&6|>OJgzLhyoP7q#^0&G@F&M@_m2r_2 zv)hs}Pl|60WGpa51b-`~ z0`r8HYOXFJ%dj@7d1lAy^~FQOY1!OkSox3MxjON=>9#n-OwDrm<9@fvy*;C8lSgu$ zVMT_y>^M{m)4DLs=S1CUhN8QD&*a-ykUl#~%z8jRHQ91Z+x6+Pce!Z0Efu$e&589q zm+oCR=;qZO$Kl?lZTLR-hvvVbkfNQI!Eh5SnGE)tRy{;t969plNlTL*c$9qMGg$sB zqz_~<6i7ztL}H%gEv%i!?@^T?zEJpr={H!-e*%-fLvDn%3wk4>&FPIP?ULSz7W5-5 zYS)f%Jt!C&7EB;a1s5SDmXJ>@W1aqlsVj-%FsOtwoe@H{K~ECUPSKG{Go*1Rs{94% C>FS*T literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$115.class b/_tests/out_app/com/lanremote/watch/MainActivity$115.class new file mode 100644 index 0000000000000000000000000000000000000000..e3f2b2878f9f2d4be0bb8d8f1ba5c198f7343647 GIT binary patch literal 985 zcma)5TTc^F5dID=-DO!ySw-;w(xE{QfvshX%>qmhJ;)bp*hJgy4b0qtU*PO0!>FR zbcWQry#Lz8;bh(Pt4EpZt?Y$T8cVE8Rd;3nsS%$de&!mR)xS(KI z#|TClhK{<+-O%@lz^|^8I+=%yhsQ5x_ft(NTvDo0R$KXs7f>;L}Ddx4u1v3!cY=S=SCj9=5{2_rfqOyb6Xq zSSl4QJ^cq=^z>q!vJ>QuQXFNpT>cYS?hBL;6fqRYCg?IBw#yv87!n6`zIF z3d92+z(*m*@K8h^BC(P^i?Vs=kcWje* zU{j?h9UlR%cqj*`AY=$H5{^bEQdnYsp|r9u8S;(h&_@+lJzNWL9XA+itF$nzaUo=u zMbDqLNqw)eTK=-gXg{~P(hDu*)`EEWN$@BvsB@`(Q)I@VTPs#VpA3}zmMt_C4PS2I~2WFlM z`Bu47>wh=?k?RE!zR@Bv88z!r+Nl`_*ha(<(3Ou>I(u(U-M#9KUc}LV}!~!sEAQy&i(g3nF&@|&YS{2+Pdz-vE*}RLi9-f1>_Rit8 zzF_S$g&6M8UL=ch8+XaiA*9ni+^5}v_Xz61Ve5>rX9T7773&vh-_eyHqf$Pg%+235 aYIs1lK%=^a9rCJ_<3zb{1G{JxOTPfwOX`FG literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$117$1.class b/_tests/out_app/com/lanremote/watch/MainActivity$117$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f55d673a98f71366d335a9a34881463a6923452b GIT binary patch literal 2000 zcma)7Yj4wL6n@@ZYB#uUYUrShZH0vrC(sZsEnpafu9uXg-5M51U}KKsrEVR&vYl>2 z>i)p?Vfzo0_8EywG{kx=k}b7|M>T}-vL~KGl~$x z0wNNk7-5((+(yRM9nWmIftmS64~)%BLARVcMquq)!FP#lc0Q417zs8lpEEQ0!>DN7 zk0@ajF@__%x}6}chVIlDl>C;yt8=IIOfm2*r>?~yVN8H5VH|OW`2L0U>XvB)4R zSiwgO;iOs`g@U63j!BrrI}F_P&>Y@oaFOB6& z%hxZGi>2gnAL_s>8|^|Y*p}%8nuzx)W1~?MF-?rubVQtC5V}~#kic01GZM}r$#7y& zl&ik$kg8kVBA}9wda&<6tEnAPGq7wb{Eil-J^|R1pJF(V3j$^(WI!nm#Gp4?hKQlt zHpA)U0h6l-eTcZk5OTM90#_tl#T+SDU6+*49#rm$xZ5oiwIbpg71R%EZZi;Zg8|&s zO$oQad&CbshUMXw`fYb3?QKpGA9sA2o+siiPt&cL+}|e>7O_P2u$;iGo8U z+tk#GfHK3;_KL9FOm2PgTf^K5ESF~E5f$pMpWpoX`WKGt7ZSe2ll{@Wn&rUehi9qv zN8XYA-=C(I1n88+{W&^X zJ>tiTfo^Qm%y!RWMYri0=90xPPV`oLmPbhD79GQOecHGMGuU)%61G7jC%8_|*=Z8w zlf964r;Udr33xb02-Qgt!X_-D X5&F1op+Ve9I#G!7hvUkhLWleZ2VoLU literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$117.class b/_tests/out_app/com/lanremote/watch/MainActivity$117.class new file mode 100644 index 0000000000000000000000000000000000000000..02d0ecb3fcf5bc7a7b56cee772edcd20c64b24ab GIT binary patch literal 1027 zcma)5>rN9v6#k~I-FCYyMY#xGsI_1(z_w~)NDT%FL=4qv4T=8SPA9O~&NjQVRUXC1 zAW`v>_y9hX@ytRLf32JBT+jK=_nkTC=dW)+0NlsDJW@y-$XK|9EJKC+LucU1Kn#5) zoOiC`hfc@!P&{(St`2eFJntO| zt_ba+Cq1>nkgnGDP1u+;P_!_G%m0{nRp7}32Ez-tha+_y+rKd}jTr;87Upo3p_Igj zq2O{Z!mzTw-XsN2tH}~-dok%qc>{<0l1D)xq;j_33mz#y=!#(ManUxgz_6S|KxeSh zGBJIKx7k(6$4 zAPCpM62oeumR&iD)Du_s2O?ltN)|%U44EyzPq8QWJSm<9EAhmoXy4%tc;* z)G|zTmCN6D+|jv*+4ZAL08e*7pFTcRV zH{+9!hNyrN_1)iLPCm1f>i? z&0dU|s^#d5wx`EdR8O0arBuVZrg_G);XMh)<2?+e-n`)k+Zh^@hiy0R(XoK*yQYju6Y!#->?jCfT1W9o)#gaQb3i2V+b&uKP)~&xvFWp>jpb|+X>M~ z=x|8keO;!uYfhMkZh49y)r3b|%=mGFq1dn<*dpq1Qotz*r*Vd%Za-w>u5Hmidv<}i z4Bbx_7ORAJOj*w`iPt5igxWw?-)j-)(IB8vLKA`q)SZuzKxwLJGBkt=LXH>aC`St} z2nb0CBf?Oz4Qdwwp`FvI2`#xWd7aq>n{VPIv`V;$Hii<_r4ksL4&J((g;XG;T|yj} z7{pw|x_Q5Pj?^#J$~d->iP>&!l-8#1C;~bO^?pq#)N3#F*iOkx3My9fsrOukV622#3km2|?|ArkKn;d?u=}VqrTYg+) zkhVT-Zf(B#`Tgy$r|&so2?^IRyr=N4IA<(*1jh1&m-ZaPn#+~*Z&oEdE#L-~vM1AB zunf&dNE4o>k`s1DXQ)gXmOhbPoYkE>yjs$glciaxNPDXGkaUu>ifKFRX!?l3U5@3q zs*R(dK*N@1+Ad*E>E67Zk#L)z8-91*UKyh?B%a1BOLr2c>bkm1W81qDZL?^^t=fv=l_bL6w$wl$VadZRFr&$ zf2JsKJUvq!s7Y_2wi;*GP@jwjYCfachYdtiJFc-!bj(Cr*U`0xp1bcLC%HXvHM)VJ zRh|ih7{UOd;knO2pxjHSmmeW2I~bH-U`T$3g!~*S`6ZI%L+A5v3<($z2~vs-K1^Ve U-o>PkTbQC%AXgqON#@(vUmDzuS2z(X|h$RO(?=iw3@h9FMH(TFQ8#)%Qp z2X5kFw9ln_78^O0=3~%oK4x&tP^LkHVY9Qyp=Bd1dB~%{P@3{lpvC)%NX=f-7YwXj zfQKtCiXKYv8T=zY|<-L$+Ew%;PGqxw!7(29_^MSo9@-CF8e3 z2W=z9{4Fndn%&ke01HFNs|{F`Dgj6_1iss=>Z6!=&$_hLBa-Ry|z+9?~QnxiqypehV=!Vp-N|ib!II>g;eH&VGSAIw_*bbNz)|r4E-gn z6IRH&PnfkQVf_RwTs?sse#7Ojbi}Yht3!z5Cv1|Pfls?F1hiIYzeBE;&JT~l>c=P( vy5Dj0+`C}!i=R;{exbMbPC2$ID3BwqRZ%Bv<&1?)Qu7XWDd9E3$jSc!1l{A@ literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$12.class b/_tests/out_app/com/lanremote/watch/MainActivity$12.class new file mode 100644 index 0000000000000000000000000000000000000000..85330c6959490efdb4acb12c01d8a7fffe649998 GIT binary patch literal 1133 zcma)6TTc@~6#iygyR@vd6!9(~6nX*K7B84!OiaO~Ns+`F-lyB49oX(ByF(2>z{D3H zeelf(pS?u{P4ox&Kbpv+iI+FySxN$Gld_wgZ|2OIbG~!toc;3q<7WWZa5D-GAst}@ zClFznu-v9;bH@`+R|)eWS60JZ=F+)iDcO>0D^-|dh^U72Q+bB*axeXbz(JpZC}IqH zi`%IUvBi)quk#iUJk`yL@}yH=h{3=~9Rmj9NH8Q06;`V2!cye+mUN`L%@E3DS7S(G zNXIDy!#K?_){6*3KesI5`>8@cPt=z(y}4(*sw|3@v_wU@o*>d^aZbm10~c_SVYC~I zBl-+RklB{#$QXt*|0kjo+lYZtj2&T3v>7Ik!+Nz3<7B$M^S1r?`QEb^dyk&9Uw!!c z@^$;u(;#gr1Cy9yh#e$kF0ed*49nfP>c}vd+^Ko4teKYUDB&n`QF7a@muTUwaZ99D zoT4qQjk5Gke0&9?f;Pb8J8E9xfJ2*;NXu z;%<7DxGMuwgGUQ@HmE0Zxa3&2>r=rk3)OII2Ig>;VTg#YNw0bTuiHs?xt(q~pldBT z6jssZzAtebP@Fgn$Bn4yCDh3$R&=QHDV*o-ib5b&Fw*zQbV#P|&g$-L#Q!7c ztB|1h;1BReiFcBR2nt!)Id}KYy>rez^XvDIp8y`ARYeJoi?WXks4#>gP1-TnnM_h6 z+aI_Q?}MF=Lg76zug^6&%?U)_hdqG1MnK4m0__khwWd&m;ru z*}U)LB5Dk4HlL`35}W;VKH-+js68;5(xW2}0XAH0`q)B)Ay{sBH9VKX5U(dnEAy1W zX&s(=*v4fSSA1N>4nuPlQwE<4A@e-!cDfxB_qerMUGHC-ho>%fNx+ic>q2Wjj7e2_ zp}O8zTD~ljq0HVa64ikkX>N*)HaS_L8N5MSWJ11Bwr=BZ4<6XgG|cB(#A!~GIgw_Z zp7}VyZJOabCEhNowp;(DM?!mA%j`Jjc`kD_$$WEz{|q;1tq`L22{$P&p+R5G`MT)f*err*N)4t| nKgIfYTv}Fp_RQL6)N5bh;MTmy9`*^#WNe5#6nWIcGNb1YhSs9E literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$121.class b/_tests/out_app/com/lanremote/watch/MainActivity$121.class new file mode 100644 index 0000000000000000000000000000000000000000..011dbc1725f3d8bcf6d824613bc244fbb0713136 GIT binary patch literal 2273 zcma)7+fy4=82=qe*btT_1X>DO3z$|CXhUc#&{Px8nlcu32!@6RJFPW;NCyJ5qc|+!F%d`5$k14fAA=|-5{hL7BJCaR3?;^b7oF%5&@JK&q6~)$ zz1py4=nSs7VQ36Tw{P6Flz-iHaN2{X=!8zGAmC|+y1m%R#$jJZ)sl+oMGxxu&?llF z&r(Fm=`_(}I9`C*Hiw*W-Zn#Q1}R4x?|=CA)>}8Yz4Ic5FiatC8`%pPYFqNpM>+kN zh!I?%Ahv9i;aqWk`HTx#_TYI2w_=)x>A{$T?(Xt~l@EBDToiE$6ZDkZq1DMFi=MKO z^K)xRG`Ji8h7~?fIj$*YRKSZ2$BLch^(PSVViMCl^k*2N#V_QCq6O$uvcH6v1-v5S zRmhZN1jVUId$8#F(}qPwqAvF($1=Ju$2BDyoaT;5h)6=&%dyiD?ul4&UPUAd4+#TD}+_XJhkadlRg z?TktDQZqxTRyl6Vi3LhiM?-)?smklz>$K%C*-1VDR0DDf^G>XL$Bm4cPzF_QzdARB zPVn=DVn9!5hD9A=M6u_Lq=>7yMo=?QLmbj|#q8H)%Tg>fQtLPf zhS%Ws`FO7aNK!9yB()hwQfF}_wMr^`CG^!}j-*PnE|Pq;G1R&W7HV6C5IVk!icr04 z6;+{n_bU9MbsShG9fo-t%Sb}{8VfWpK?D8MoRO@t8rtQ>^-gGojIBV}z$3BNFHpIO zrYZm9>p1!u-`PM5i3<9vT5Hj^h7%)g{!^tJc(Uj4`)F?SpWQ^y)H2cu_XPDo6@g%NBRx7r9Y4&8%=Qki3S1s tU+5K(W-|iJf5^W~Aj32?i718bxGIB1k}gWTE4WTGKWXsC;J?YN_!lfDZ_xk% literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$122.class b/_tests/out_app/com/lanremote/watch/MainActivity$122.class new file mode 100644 index 0000000000000000000000000000000000000000..5536ccfee77333f4e215738ab08045eb700b483b GIT binary patch literal 2140 zcma)7>r)$56#w14ZU_rY(_+ELl(s1*yu$mnlv*j2V1P<^NKxyu*^;H3UCb`6`c)n6 zKcF8w;*9u3XX+@V*80^M{|)^_#yJ=N7R@p;v-u4=Av*KpsD^!4{M1l)|_M0y!6Bx@-s zAp}v!5t2|3iJ@s*y{ifrTk*xsZC!K8+Js>l?j(aZ8e0va5i&=Ugi{DJwAHfDP_Js5 z?l_Twv0jR3CR#hBSk)^_Ma)yCp8-$7$*d( zLm6YZcocB?y_1k97}%8{h*~~N&FaF?D-y2aRdVRKIfm=CaX&K?Mb}5k2_i0xPfM7= zbp~!&uD+#{gG;p?Bw`6c`h-iIPt$i?!?uFB$sqml*(bj}KKT99&;R`5Ymv4$CA@{V zkEg&;pU7LXHVoxtVM~&yy(+O)j&}&kaTos^Y_YnvQcU^;dCE>xE67R1(ie8Kn|f|p zpd}XOc4<^Jq+C_IL%c3ZIkrf2+)X6sFeoQga?Wvw!Lu<(v`N{!IZdCT24^@`UgREO zikwednrS=K%JaILvC|TE#5|UrjD4>(Q-rQVDNb0Ho|`gN$I%@cNFEyC47b3Vn#4zf z29<~Y^-xK=NvjLA7m`p%=MP{Vhu{xs$Dq+OKyS!B^h`r4-DlsCl+)R_9p8iH(cpiA z;JP<_I<@W#H>dJAdj>BZ;9RmZd?}BY=er)Eli>;a7D}t1>c@TFVSlr~wB5tCu4exu z40w>o$atW;+20!Y1;Mbg52-Z}z8qHaxRPr1mE^pxB%bo-aqZ(9ANkpS;jk3Q>|-R? zJGxtahgdkk>udXHOp256dS@OR4+RoDz#i5Jt-v-3nXvW4ClBD9JcxFA2)*(!#^n*r z%A;73$6(6i_>lJZ);}~9GNDV^5aKLsP9){_OOXmptTxKx%Y~L%T-RjJEF83o##RvSdi-v)<#{SzVMsLXXkEi=cwIqC$4Q)GIMEO2VkmraBWfGegv{-p;&gJi zvYn$=qbmf{czVa{p3>Ucdy(u|1FBWM-es#r-in z9R*O;5;Y;n`1F3`9>m>tu4Y$NoM#x~K_CJZ7Z~)NuOIGwv;EtHt=}I#lwRM`F@=ki zco+o?*9SX&K1>(%vx8*fZ5UTZB@}_wAa; zt?a6T1%@NLJaR>0VR`lohc_cv_$uE2ryD!pe)a3qZONu39XGJN$CJr%S+wHd9Qxqz zWb|xQD_c?UA*Hg%?7zV>O#QDg*$Ne5M$~De7)96TH(HGv4{pl*iHv1;&9|dgKzclA z5y1|YBip%8{OR7%%AyrGe2z%VaJaXZXC+2*I_o>02x&bn@n~Jtb$pCZXpu>VcdU-} z*1kLX5|zH-`#hNO>@egZQnUqiFnoYmGAWlKK$3Q@Br*LAlt`9IJ3}%qPjdOkV7al! zP;yUjV2h3zZqj?0B#b*)Aw7m9eN}ef(s+wpN@F|s2&|36%8$^iar1b&nlN81SBK1( z%hh4}Pbs(Y>QTJ0jnl=vnUA;e=66Wt&2e+0jmf2s^`)nnuI9#`;GJz;yY)Q|73I0P zm~W%FB|#A870eR|32T(Hf>A@laF93Zm^3)9823;znpiP>R1ASnjn8n4?rMntfzmYv e^Q7S;I*Fl*RgwuB!`rw+nn`D}GV+=3h`#{DJj_f0 literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$124.class b/_tests/out_app/com/lanremote/watch/MainActivity$124.class new file mode 100644 index 0000000000000000000000000000000000000000..d42295d1f1fec06d0d979176acb757bceb09386c GIT binary patch literal 1361 zcma)6TTc^F5dKbE*`+KjRFI3eidEYxwB_Qhcmn~!7L*zi!_#(qLKl}^(rz*S0OK_p z-+b{+z3`DVZV{ICgN0GWDt;FaK0 zunTnzA>Ce#nVMDLi?+jKw>3x4$I_Z%UD6$6*>LWJ5`6;;s#kk zJ^T#y%bFP~YRf#w(3D!xmbI8+$HokkyD&vTBbpdw0kgD4&JZZ0h|+v4;}i^Q-bFSm zXhEQY%$jzV!814PM=RPS>`~B;4u)p;0@rmqyTEmahz}W-;hbmih9k2Qx)|F3fXeZQ zONN=_1wT5`CSyN?^zGA&tvAnu;>|$?K^&qu+R_rYD2twOEx}05t4hqIjKdT!xb<@7 z`}Ie#q#qGPB^+090zC}DovO~@*L0m1i=nWc}sIj1v>Q>N*1M%aWwr_ zT3f0h{29Ac(78}NL(BHT>J^+R=%}Tec9C?R=1$(uDY%B~lu=%@awea!sPS}G_77CF zS8@!KhIEMeqNJAJEAqwCncLZ=K@Xssg)^&Tc@??DGWO}eXy^BF#I ziU-m6kiH;6hJ8fm&2{Vz>|4VDdTt;S=%!^2p$&uuBG9{m_-o8=NB3_-50>}p=G_gP z67I>r+^ZLyE5oEUT&SMM1#OQ@yGx|4K7^z`LPULxLG=mp>QmfTpW!N@>fjmtff;y_ Wa(&X6BI_ebPt#jaF-hZO>GunOnpq*$zaDE^Le87akWS1=@xye>hmC6zdf zhPLppza5$%DF)-pi+o3%$T+s}cQc!DHA*~Ij_U2}-F_dWlD zE8#Mjr%DO`$mKyG0+i?wX)sKK<@50|=spReEQ(~EC8@uXofeg$BL!~__VNXW}Sq-{@91MoSkdJxXqHmqsL*ax}ZC@%G9xx=UwXTjC zjhHvJ0cu-Jp*fB|F$FP_Bzt{J^z9$ z;S%vvrG$Uv@*ofa%Cw0L7-qo=g?JmZpak6Vi t{*~TE7(el4Lb4)LzXyB5^#ABLB(X&P1eUQvn4;0IVx1(N^5RZ(J^^HUeB=NC literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$127.class b/_tests/out_app/com/lanremote/watch/MainActivity$127.class new file mode 100644 index 0000000000000000000000000000000000000000..1a36ee405f62cfc45fd81b9e9e5392528c84da8f GIT binary patch literal 828 zcmah{+iuf95IviOxJe9lOSxZq!EK#@Fd!s^j1UlkRLP|hL3!WUt7KbeE!pctd=?TF zf(Jf;pFo2DK+Lu(i6~MYJTo58nR8}5-+zDo2H-I|4OCFIP_uCkbp|ia#zD$eF2_q1Me3!QezviMQo= zAoBNSCWb~&4i(pBPO+7pP%>Qhqceg+)2G?X$~+ctq`@xF@BY4-j~HI7IL!*FhI>Mf zvc$qB!}_BCV8g=}L#r6`G<{WSohgPF{@gS@om0{KR0p@WkSA%nfE zXm#C`7lkM+_@w#FT%`G*Rb!p5!UnAY71uS#0g$H~q_eEhxa-uMHBRLy1p literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$128.class b/_tests/out_app/com/lanremote/watch/MainActivity$128.class new file mode 100644 index 0000000000000000000000000000000000000000..9c58ae67422767b3b66a04881ed7cbfef7ce91af GIT binary patch literal 1936 zcma)7T~ixX7=8{3*=<Ph+w@;%2*l#kVYDD3K~>NS zjiJ4se}*RAFu3PMPoL|ih=ybJLyGUZWva?~&@#F0r)2D-c#L8}#sLP!GhEK?>z=Q> zzKlck>E@Cb#{GvttM0v@^&>{nm_G z@aJW8lFd6M-J(>75yepn#}vGX7{j66GBN5oHU;D47pQizYg+(n$xUrwmVDEqIxeLe zsqA#=UxslUCnTIykOZY|*F0~{2t&}&EsLQeRzvyU<>+<{8K)Q;oJB$4jDoZ1CF8u~ zknz#&##Qfc2Dh0+N|i)E0~gyRd5xrGiW>Gq7p7S9`*OZjk;8ueyU{Kdfwux z_^gB(hP~CEFr8$2a_E-9mweN)W#mNGt5yGf<+I8McSX{!DR>iaZD##!kH}i4K8alj z)F?fPnu6QyFFyH^EUlBipvPHoQmy0J)& zSY4Gs2Sale?r}Fsn1AAotVxoTl66Y1!G}%Zt95H#PYQcN9I_3|@u-8wxj*j|6cojA z8*!GnJ#GpuU)F6-EvTezo4bRS?s?opJDvYB7~Td`Rq+p?!=ZuhCfuM^okpEB7c1ee z#J6Bw>yXxH#*n9Hh~9|&K~DopZ9kJ}HAvq+>ADA2Mzbpa2sszf_GWWIZGSe`s2$Aa zLQ)yeWOI`Cd^RVyvR|q*HKcW9bE>5FiD?-x>_hxM5}Ab76DZ^K`L<8dlF<6Jb7iDf z(Uj0GXcuWXA%NP-7@Vmgj(m@?T-S-Vb&TJ~<(XBqWW)#UjYJu znu)`oI1>2_$0L8^0*%v=e{d!8FK$F0!i+qEtC9`va{p)A@KZOg|WQe$EoNFXg3YB0nYvz<=p)a`7uJ4JmW zf0Ot@O!NVK3ZKMy7f2)xrcSc+adYoE=bpVke}DS{U=y3;h#_tuVPOnO28a8-vgfKm z^n5MK?_AA0<%TQOGp^;S)E}I+^(}^^?#R%oFy!i^3aTbj7&l;An1ID#cimGrqBtoZ zw7P<8LVF^W)K3}W`NENjTbMFnTbM?gVQ~~b!-UJZ2t#LMt3rx)@}ngcZcI76=(*-e zp>#Ec4C&#$b_#chBIJP(>P@KqzKL1P8MtR*9t#Y!HwoMeeMRMdt4o&VU)6_ut`;ss z11&wWw_hEjzd@_?%fup<4CE{iQ+27t{-Di6# zsM+)f0T(+m;+VcZUZqF{0c|Vp`Jq%N4WT=J+rs+A>_kD)kU`)F&s`;`ZEII45!5_4 z3`I!Z#c0|X9)j6+G|}W~jJ^pJC|aajj^0tkEUtbAD}IG>MlXg{+LLs`&d~k{)>Zy% zLW%O7;wP|kOpbj=>NuXBX&xuix0~m$lCMB m*>hO77x0+k24XFPvJgj!o-veBp)*0VzlIIEnFJNl()t5gV&z}} literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$13.class b/_tests/out_app/com/lanremote/watch/MainActivity$13.class new file mode 100644 index 0000000000000000000000000000000000000000..7555230cca347673d6d8d1879cf174764a8dc264 GIT binary patch literal 651 zcmah`U279T6g@W^v&m+)Nm}c7P2vhkgl=1Xs|XSlgwzU3-Y2s|Gj%fqyOR`umY}rw z;1B4JD&9dsu@4!T`*ApP?wxxtuYUXl@B;k?DhNVUW86TE@I=~0nhR5?g>@=D6Hd<4 zBcaV}>GVpwFUkIMLe0%}nd}kzlXd*V2z4|2VRe?Sv^q8W{R*e(MG*rE@rCuBxX4yq5VxIY!4>agbs&OLiEut3#r~}&u{-b z#9coGR()e+ZcA-Wj+C3*EXE^0qV{a5^K5L5D{THj7?l&^cZT~J=b|iC8KTRqYeiY` zzy8tX?bboq1hraz!@Tqg-zGYY-sY&!xksYWv+tnMIl`};@vqp{*dy3sdk1&_@Dui) uUmtw~UEtd)nwWr1#Bkx=uuNdeGHZ4Rh_B)! zm}n%i@#De=@S%)ns7$`;V{R0PMp}BLT}s(!m9!7&iQH;09bp zVi0QKj=A=GZi7qp$k%ct_3P5!K0`|PWL(;1Sg+5@_e_B~2Wey&=0-dyX&(0(iuEHt z;-*yBeLhr*w*%p2;9%ayMF%*iTe}Kla(-qo17-}6VkHLAWs6DlS$FYcQ+#!y0?8Na` zJF!ah<$z%siG1FS89<(fndUn|Zw@!fuTXTGyk%CZTgPD4?PJ*0PsmPaiH3)4iae~h zSfeNRq@mWUTkdS|3ofCMeOa f1(qeVd6IaGP(Xfgc5PchmxN!_g%QqAnTDLfEg+YRo5fTa@MM_Dfpxigk5^r&KC3};KpM^w) z;J^V14*V#@IBnI6i-jfc%+Aitdo#29`_H%U0G?v6jtVRrRTq~~W7vxIEKIq|#7r9z z9&r;V;Xaq@Wo+a^nvdR-XACuy$lQC(u-Py3j|zYl7j-xcjRjA=IMF&68ADJS>~&9k zBL^-n+qmMQi55fakS};aa~clDhaxsa>A6(WykM~W&ZvPkT(xn{#dX|Z@XJV^;ZPc_ z4rKg+q3ZWKBOA9ELarv6mXk2n$_Qn`SCXfC+M`YOp2xx)sBTIzeVNm7QP{vQtt=|_ zIO7y`M#QG8CxW5bmrA^y&&DEq$HysI>O(nI+{`o5ZGA$7VcYMQkdCN224|?}SuEbj zBGu}}F+VCgOn|Rdoa$Vv>Ao3OVzq+v qK&L>me!{VS5yHkYyp0DWtJs7`$e<)v;kEqM$m-V|;@rV*t^OB#ZUl({ literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$16.class b/_tests/out_app/com/lanremote/watch/MainActivity$16.class new file mode 100644 index 0000000000000000000000000000000000000000..5e68f7871fbcde99693a0fe4873afbaf985bb167 GIT binary patch literal 620 zcma)3%Sr=55UkF|Y_eH3#`pUb!6+C7(Sst0CzFMd1IIgq&?DQ&}a<)jQ$0JmgVu;rS@SCzP(ljYvCO)=rvNGO*0Ht+cW`1ZT0@ z$fJi)xDLhLwMdNgP(q)JvX6cY5N0~HBNRmtNMkB%>#HnqbFs6+`j4bD8!LUeRc*K! zB9wnVP7|#~Gn9mde=t@XgzR2)!SLR?((*WIH)VYOP2j|dCU|F25(n}?rJQ}gC%lq& z<-&a(gppx6N7A;U3m?u9&3H@8kD#R|xc3|pM%m`r!+B>r2LBhHvy6WLmAjwO`xpNK2jh&$U;>luv%IY- MR>C#Rk@n*A1wqb|Pyhe` literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$17.class b/_tests/out_app/com/lanremote/watch/MainActivity$17.class new file mode 100644 index 0000000000000000000000000000000000000000..c720ca361bcf6b199e4b52b62cd3fcfe7d327d06 GIT binary patch literal 615 zcma)3%Sr=55UkF|Y}~Ax#P|CZA&FoV1P_WJq98;CBe`!jLo%|Nm7Ph%&k_{HgCF1r z=}qj#L&QrQnC|JG>guBV{p0$^e!nz-JDuJgW(Fu*H+k6i*oNaG1DBA!@p@j|p;ftT+z8(=+ksTl91^Tz zsh-9tA*oGx>mZAqjl7F-Ob}KEbs}Uu-xpdJc6PT}+g@?7xN2Wb%|ueQ_DgjeQ-pl~ z_)ygl`&`T_i(r3u3UJc z{2;@oMrqYC_nOovA_6FSeR!-0t;AVpX6;Vu@bIf Ij<^?}Z@)&6L;wH) literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$18.class b/_tests/out_app/com/lanremote/watch/MainActivity$18.class new file mode 100644 index 0000000000000000000000000000000000000000..3405c1c6dbebc851859b03c29c3dfb3a755c30a1 GIT binary patch literal 615 zcma)3T}uK{5Iy6XtLs*)eSeo3s6iSC1x6525LiKm@9TESD|$C}uSP#BD2g8X0sW(T zh-T@b=*2GFnLBgOoH@+AeZIT`sA4UJ7z`6}8zV>%);+&h?z$=vJztCRt*gCu`P7x_ zz|(Rd^<92@mypnH8Rjd5Tzwe6W+91`3Cl(rHo@t*12^h$T|RGhgr}KpPb#VR2}YsV zOk#`>zX`;^f`g2Stc?jw5>|(GBBWi<6JeO&u2xvvPGPvX`j4814y3xS6`Lle3E7{I zi@s8Bt1Ac_|6nXOS^lAa#qjaERN}1PYl-0Uo4^SAieNSTe&C5?8F6NQ4|gl-%7sVD z>-r(fITgC?U)flRMwg7n#7rT zjxtth^AS{ff_cvoVUBHrJ&bp@^RR#6Im`G5Pkj3GwYaJ^os>nLCJJS|Fhj&|Fnx+B%G ztL3fK5Bc4FLQJ=1kS`O~YoqW77UD>luxun@6Ve^$)(Jb@lrEYb;c8|(luGI&g0WR- z#4$mLDsitZq>(X^wK0h)LT*$iLegqR`zEn2{g@%b4LU!kesf_3HfeOH{ykTWwp+?}v17oI4$ z>jf;QE_B;#*;oxn7Z1n8OaZ|@Q%d;Nt`h_zK#q492VokNPKSHs)kgRxG0WLGeywvH zW~}1&GpP6i^N}OMJlhz17@uqxU=QIr%lIcycKj8ozxXd0SY$*5OIT(f;Wn0O-fn zMg-7cAZX$Pgc!PQFK;>A^+n!O!n(zkJ!NIMbT8OS&PX*I>thJ1DOrrANISig`hfNy zHqnR(L*op0V$v;?6hlXvyIJ3pS?iX}=7h3FvQk|a->ZQLOf(s2HqnA8L-Zz};TlrT z8lSu=Y_biVlde>Q3=Q$bjR;!tk%8SN_FykV+cs_)42q%yQ0#bOBf26R%74PwuW(p1fRn zT>a%~^}(D0>W#Lob-GxRPFDC4^r9(@PZ?S^+fa0Ua@xdaI72tf3kBh38G7RXk<@#l zx4!8rdeN={pEL3KX25-^lz}f8ta?}2o~wkbtYOI=FE>gX|2uAr*tk37NP9Xhi*zh} zhQa?+_qx}uEu6T)5FGNdg0f9ZSB#bNlfu8QTa2b)LgrkqNPdYQ1YpFq9j{1zoDpiu%bNH~k5zNQ_oyeX z35U;q?K=$Ss7r|tIlNdDMFV3D2kYr=1BiTYDI2rq; zCwhUnV?-OYBzb%hEO}xPMsf)s&Xb7YBCR2!z&wU%4IoOpVT{nKjejK5Akj>60Y(|S z%4jQN-x%#!PX%2)WgNXno@v{ftl-3NI9lT^;x+ROz27Y1lh*z+PLb}ZGR{^ophE|0 zp%1_yegVx`#9oxKA4^E!PxN6KX*|azI;D5*6%qzIy9vwXn&}mc5)D!teo1PecPT*M M`fm^!jE5TE0KwmakN^Mx literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$20.class b/_tests/out_app/com/lanremote/watch/MainActivity$20.class new file mode 100644 index 0000000000000000000000000000000000000000..a088f7ebfee4045d1715b5dd5feb83f318860b07 GIT binary patch literal 616 zcma)3TT22#6#kByYwMPm?)NeSHOPvfha!k52(%!>_jMa|WSx!OS)-p76h#mHfPPeU zmL8N|Y+&YG<~!f{IOp^0{R6-OHpUS{+(5#@7?Old$Lm#HTlu2rX;FQ!wbQBAZK+Nj zE&EbG7Wa1vN!^h_k)1+q6#mFW3gZS$3u#z{Y}fAFQHOT*y44kqX0~Igq&^|UOXX$? zlZ3Ip=Z5ztvd9_8TbRN$VSQ99LfUp55d_7(gIyMPSQ@RaHjvZMzEtg_a?`*pAwT%I z36-*2t{`mvgR$HsB+k4$hG%M0iL0>J68`NkLEH}&!EAV;?}!T-aps1nyAyTg!gJ-g zUchqdLU+773v1ErQqi24DIi#vN(ukWwSzzeSm!0CK$rn#v(X}Xw=uqH%yD*}y#mKk z#;k0=fGV#ro;V^b@S9|d_&2|cu!iuQW&ATJKk1y?+3xVtWz^7$%Z7CXgcRy8fW#IVunXUyIU%qupMq=}2|% zYB`kpv2a`=q;yY)g)(8MF%Dm|kjA75%SHw^A=`I`PTb+XbkpezS2NqGR8pT2jQwIe zjcI~8^u4bCpe$sOGm*D3i#fv9xMqZm=$ zay>s}IZdH^e%HokJiT;0DP{@@_LWj1sC!NriV$18#xw}?plmi?C2u#uH-kmaF7a!J z<2Yj-9KL`KUSU3QL|A5JZBmI49ZWvVdgL1fPqy;B(R2c_DSB>1}otj J=7@Xo`33`AkDmYl literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$22.class b/_tests/out_app/com/lanremote/watch/MainActivity$22.class new file mode 100644 index 0000000000000000000000000000000000000000..1e500a760393d0ec9efb45288c934ab6fcb917cb GIT binary patch literal 615 zcma)3+e*Vg5IxhhO`ArI^?tuqunM-8f)9!yMM0mY^s;_yK;D zIKc)mW{NF46=j`KNwW{LWgn?7+JX&#_v_mh0@2q zQFqEblxj6X*7Q_VsuI?l!|(?Va>(0oTom9EyjyW6k`CRFzC_9k})w;L~zfvmSLkWqDV$q$-I z+1_~uZNI>NaE^mnrf1Qskf(yAVon*D_9A>$z*zHPMDmLIcFk%fDgX- z(dti*U*_m4tW<&fI}z{7NTU@ zi$j%)X<|h0X=tKxZ#9(aR%GN%nrE#mR|y3(mb$e}Xbuj-_kDPnbKwUlA|O;J;ViTY zo4xy^iHHod-H=L}n}mG3GxSg_QvIr%4j561|>x99J^zkKoI)#snD-}sov2^S{=oWf~BV?WNlwh6^BiiFm! z%h#9L_@nm0&Ucd7wz_UosW$t6rS&hMGjws5P~R=mgG{M#6br)Qe@J$Q1ZO4LV0dL9 zl~~KBBauGbA;_m0*T`Q_vNRHRq~)yb^?1pu^26K8mY?%o6=s}l1h{A$=h-GPljcg^ zRZ65Qaj3P>Xz&DiAe;eJt9FWbuyXttagL)6J~jDnBYt=31E~8E?pwYQ&huK}9Zr$g zCW1fsB{(*UO7}geUfM#Xesl}RcOUtd&MBenl##~*Lvv_hk#~ptdI4=d`AlI&`TGt2 C^tqt` literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$24.class b/_tests/out_app/com/lanremote/watch/MainActivity$24.class new file mode 100644 index 0000000000000000000000000000000000000000..01a375a2f61cfb73c0d46808b2170b86a5910a15 GIT binary patch literal 545 zcmah`+e!jK82-lH+-==*wet}%12t$Zq?;lLDG0Qn!uxd`bYz`{Js3S!P!wJC06kRn zF9k(64$Oc2{`1G@+dF_Jwr7!nWl#>ODE_u`lPKl&e8Hf%fNh!!pq01d0;&tMJf#C6*E2DV7DC@!r;?+cA)cenrm literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$25.class b/_tests/out_app/com/lanremote/watch/MainActivity$25.class new file mode 100644 index 0000000000000000000000000000000000000000..a28b8b4201ac4bd43ea7dd70e60ca0a6e1445d35 GIT binary patch literal 545 zcmah`TT22#6#mBDTwS+Z&F&Y(4Ah{tD0(P@kb*!9DtsT;K}XhE*o)E63W}nKen3Ae zI!i&(ivu&?xqRm`=X`v=y#qMFW)>-E26PKENHc7?{@C%j3dGotgmcd$cj$DuRA+7^ zCo+1d?jJIwqoE9|O@>N)8voct23Z59g&Zsfd&DO^sW5P^dn4gSl~YC;%_TAu~NL}2?o98_X+ZCsl-)0 z?up>;+o1)qVlZ$0IB>;ryEZ zv^*Y$B1D->m~AIJptYpv=1?T-0!bCp6N}l{c?N5|z<4B$VUgZ6A#{qx609G7 lnUJi=G@ig-G5eogf`(=Cr?7%mLY*eQh7FQTic2cd`2vyucfbGu literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$26.class b/_tests/out_app/com/lanremote/watch/MainActivity$26.class new file mode 100644 index 0000000000000000000000000000000000000000..ec9951a35a1404df18a1fc35e5bc4f178da3040e GIT binary patch literal 622 zcma)3?Mebc6g}f^u5D|nm3@CJs6lHH5fnj0L0|-iC(CMf6H~y_RqLfhk=$iQr`{3 z#*l-g2L~yJwL$p8)(%5bw`E+YGOX4H;rCp)7;)fvNMn>C)8RMVbky=MnjH~nV%wKW z>H`L=RBoh@VQ^%Rw}fAD!I1MXjtPbl9t0we3!A%D65cHhRz9u$Xw`KjRco)@aF8d? zpO4GFQoPv}48?y?mKzNAQFu-8v6@ukyx(hz=<18Wiu#Jdt%v<65GT@bW`B=*!>Cf> zu?o6jOzoTr-43rkESbTi%n*nvX7Emx646nY$FYd9OdB$Tm;}pY%$8`q3A$-aQFfZV zRff=jolr=r_Iy%Vd$RJiy9Y@42yOWdD{-5onG;3Cv@G QtW710)C|dxXOpG#3AtI2bN~PV literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$27.class b/_tests/out_app/com/lanremote/watch/MainActivity$27.class new file mode 100644 index 0000000000000000000000000000000000000000..ac5ad4af385b5ca3c522e897f167774b25ed0880 GIT binary patch literal 622 zcma)3+e!m55IyOx-MVgV>-}!k7HkDqMNm)#5e1kC#^f+gNgtVkib-&+l>-iC(CMf6H~y_RqLfhk=$iQr`{2 z#(;yg2L~C3m45ir)(%5jw`E+~U|6p8!|%CpG33DWki{@VzQb?0>FC3x*L7qZnft;z1zdxU{*uLBhMM{gqE^KU#GiNp-zfX*if5 z&YzFVL@D0v3WoAOC@T#H`zUM?JXe!SoF~1eh_1c}tSC_oZaqw*K%7X!S@=Ebb)!m! z$13QCF|~6hbUSQ$STuvlm?02T%;23WC8DD)k7E&|NEy&mv-w6an%)3X`7+g9EabxVIyV1agfF&L#F4AJUvmzy=eEiuZZnH zNTCiHj7qhYK!%c~Jc>#?^=%TZSH`P0nm;;MDipG_Uu{{KBhH_P z%b}EByU!WQ|Dde47|i3~hTv08A^G`m(B|Rw7l9EDC4+qx3`3uv3eB1QZS$5^rN$HK z_k)PWIpeAu+&IW!X`Rf;CH NtkEzeLzzjDzE9RgBBJSL~kvDR>u8?P5B&H&I zs2;W$($Pq$YLlVdnT0<#kwMmgX(0!T!5+I)H>ogmuKQ!|MU?GCND-YfXtjFJ!~*gL zYzqYx8A`MAGvr*)<4RQzT21O`w>G<_de6WTL-Dtjn^;P>?{fyd9Sn%&J3{iSc+%(L z-M2#vW65CN265=|3z1+8e;2c#WTU`y>G^>Ya@gh3C>U7SO2*D4BT^>CU|mYd!?y1# z#T81l{|p!w!E8IZ0i7j9KZhb&mq{vBE6}h;{uI`+L0qSeZ(^Gylj4#}^u7S2Gk4?w literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$3.class b/_tests/out_app/com/lanremote/watch/MainActivity$3.class new file mode 100644 index 0000000000000000000000000000000000000000..17510b32e02f69cb279e35811546ce1507e72941 GIT binary patch literal 1454 zcma)6`A-u;6#gD9tdvC#QSk<>+HzRD2wFUlLyN5?ku<_@!*)Vf+a25;O89F`yins2 z6D^4*{sBgR_P;T{DGi55V3VDhefz!dz4y(V`S$DcR{$3=-H1AbEQD>;qk+)ls8XUR zJYSZSmWgGdokAibTyNCTZrRl<(F=qIU2ucwAfwYe!IKf}L8FC;jV9QH)(4_2On`+% zcK(5MG_#Gko~y4BLa}%*g1u<5&}yR%?SxL@<$dMm6J=K}Co)RA%9|)lkKI}pq&7(@ zFC&77GGFyiMbLr$77o}rh)zP=Hvb%x5G>)jC7~tZR4ktU3oz}gMd|C6(JD&$T)|-+ zv2fJJF;hYJjvic+BRoeI!`By|{xt4gHoDQn_P`NEd7p4PHo4o-Q5&Z=eP`==+srd( zc;hyD(MM!T@1lTQ%#-FiB!ua{iJTWy;giUsOe*l^;Pr8cpCq z8|QGIH-Q6h1rSoP4M{iIX57*?p5$)wGjT53xMW1H547-gt#<0PaGB8mpVYHu=?4X+ zwj~z6VSoP-!7xTlBVHwhc?WV9uK#O8qgii8Ejfj>8))fC-*n2(ogU9I>zK-OW3{AR zPu^WB%}akq%oo{WsdY-i;HE&;rZ!EP+|caLK2OHy2+jAja2{sFVvQ_vPc8Y5oOBIy z+t$;0)*LU6KjAq=6}a9)M(TpfTbLqr?Q~Xcq>dU|$7?%+!9of)i#q*@4p)#J-?^ zb`57MNK|lP6@6QvHY53E;7}DfJllR{4as$A=na$CRnr?nGpF|iQF_Mb?>R>31tw_~ zDSC-Cy+W4WAV+T@=^Y-?duaNAW%`H-W~fIf+IxmGo~+W{!fl?zNOA6WdDUK1g_o>d J2eJ)~zX2)|eggmi literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$30.class b/_tests/out_app/com/lanremote/watch/MainActivity$30.class new file mode 100644 index 0000000000000000000000000000000000000000..e267d22cb98fbde83c89c446ec6e7a4d1ae561ec GIT binary patch literal 545 zcmah`+e!jK82-lH+;!b@wet}%4K-+`x+{W^fU^T z6j5R*Ps`7c=bk5`sJh>3QAf4<^p+ZT1{N4fzpY#+O7WgA81#0~Csyc4B`%Y3PlUJM z4lPU+gLM-mp(oB|iY@+K%wC#}0?(A^2a!~Ru84<0-^NBdwwaDdnIZ=JLMaipeI7+3 zLYek&f?*!aanc*mSu*tVD3NuMqzdV&#cJ+8gEe1ZJd(z+L^MkrdX4BZ>>qrYI9Xvf gpTJ%*`yagn4J+i&U=?e`b=vqkHc7H5F0DlG3yT$Z+5i9m literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$31.class b/_tests/out_app/com/lanremote/watch/MainActivity$31.class new file mode 100644 index 0000000000000000000000000000000000000000..27c8327d8ab9459c43e7bc5a38df41d66667a8f8 GIT binary patch literal 545 zcmah`+e!jK82-lH+;!b@wet}%12t&1x+{W^fcWjmHi#wQF~t$t@=4g~{_ zjUq}6}eeED_BThh8JP4EqOPCQeqE hjVG{I%>GB$p<#vm8LVQBxK0~i$0kV@#if<#eF2ZIcj5p5 literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$32.class b/_tests/out_app/com/lanremote/watch/MainActivity$32.class new file mode 100644 index 0000000000000000000000000000000000000000..63e4e271dc12da0d642f68d1b158174a13223ce8 GIT binary patch literal 545 zcmah`+e!jK82-lH+;!b@wet}%12u5Px+{W^f9>{ZL@D0)1%uuR2E+5K68 z+o6StVz6$4B=p3&OtHnki)p6WDDX^qeh^7D?1^|33~X$rW1H!Slqq7cFO(8t$LCQb zB9v+WCKwjM94Ea2oh3s*j}lpzNve>ZTCB$YGg#vV#v^GAD@3!zp*M-H!v4XRiIWv( g;|c5)^Z(H?zFO{!%@Bjb+ literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$33.class b/_tests/out_app/com/lanremote/watch/MainActivity$33.class new file mode 100644 index 0000000000000000000000000000000000000000..6d75bffa51372c497fdf0364add21ad94c6cc71b GIT binary patch literal 545 zcmah`YfHjV7=DghPUp&L_bXxsYS2vkRsfU8DtHZ7ILr{?6Es_lL|xUxd zwopKkp)@N$L(cU)u2iMjYEVae)!8l8dIpvliodPg#8SF_pEKy~U_dP25t3iUlRgjc zz8zW^O9t~ch(nKGhy+{syO@I{8wH+A&kvN4!!D0T!N9^+GIk~zkuoU;>rzS{wtZJA zu27==XTY!sX4}aP=qxGvITXpdOj4Qj#A4R>pTX)cFdj)`SRtAw4*ihmDy$!Ti8xu2 hsXu|eV*Wq62@PxHPhlM!#C6*ECbmg3DK4o*?+cnpclZDR literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$34.class b/_tests/out_app/com/lanremote/watch/MainActivity$34.class new file mode 100644 index 0000000000000000000000000000000000000000..5e565731ea3a49f40e4b876037e77a7390528d3f GIT binary patch literal 770 zcma)4-D(p-6#gc=&2BfVN!P#H`V-TwW>YXlgT06dQY})E1 z1fRegeF1Moh*%W$-uJNdDa5l>Xefm`Fmuiv&iTIc_v_Es9{?Iynnn(W1=Gb8@(c?+ z9@e8!C1Mz-qW(HedB46MO7)nha#yB%{{03+KJ82GFEdnHXZbfB*qFB9xG2D7C=J5h zFk{%RKkp6%PYLazR5E?UU{r&Sjq{}NVb4a1!Pep47LVkP0}mH0Ty${>mliY@e>#}MyoGBnuHyzn z`81}0%##KvgY70JsZ03#VupPY6)O1M~)8RpDnMRzk+3Vfn?6l+RnU8McE=OV}k zXlKJBB+cMHRZ1kQQK+@hDAOj{V7LiZDrMV53znl>z%8;?NUP94vpBV-&tSDLus+d` zmX6*$Ntg|KeYpSpR|tiyn6Hh&roO}8G`w@|P17s3_c7yL*~ism04IYsA7IX0fq_K| V%i%WekThwcRn$mx2rf&2&Rccyy!p>QV?iCh4tks^1pT!0%aDOU5>m5h+v1U|lLDf~LpA zP=qMa{tYn9g4uR*13F8Jehx*l&XZIoJ+YYe?Psw13-m|Q7#4_Th$DSSbP?7MzC@g? iFzQcWubBRiK7xiN@~5zj72;{y_$t;(GAS;pMDGivYIqC) literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$36.class b/_tests/out_app/com/lanremote/watch/MainActivity$36.class new file mode 100644 index 0000000000000000000000000000000000000000..2ff9919856f11c58ab4bd30c473390bd5bbda80b GIT binary patch literal 545 zcmah`+e!jK82-lHTwS+Z?R-ScKn>cc@FojF3IZ*t@P1qe9a(2#4@Qp_6h#+3Ko1rD zOF_|%1M?rh|NQa!_730(TUn%_8PF}vAkDDt`eVoADiC8o63#u3+@aIqQk}VxoXF^* za@b%=B>vq{6_t?u~>SQMRU3GCF0@s{CZO)#)wOx&{^)iodPg#7gm=Cm8gW-zS!DOC_%2aZdzy z-wrK^6@z)}$AK#@WP&aHUCdsRjRMb=>-nKngN}%Xe&51IGIk~zkurr0)}>M+Xn8yg zMTipZKLdt&FxyUUKxawO&!I@xMUu*-Cl<55`wUipf$>Nh!xGUnap+B=%dmd%CE{d7 hrv3!>irN3@6KGf=e+sKuBd*iN*Re^GNpVRfdS9sncoYBt literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$37.class b/_tests/out_app/com/lanremote/watch/MainActivity$37.class new file mode 100644 index 0000000000000000000000000000000000000000..5a6c74e9622a5d0934d214005b060bada16e368b GIT binary patch literal 545 zcmah`+e!jK82-jJcU`w!?R-ScKn+@{z>6X%DG0Qn!uxR@bYz`{Js3S!P!wJC06kRn zF9k(64$Oc2{`1G@+dF_mY-N#xrXy`(1{sEJ*B?6`SAiJ&k#O#L@YZtJbuVa%Wlj4#}^u7SE1b89< literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$38.class b/_tests/out_app/com/lanremote/watch/MainActivity$38.class new file mode 100644 index 0000000000000000000000000000000000000000..733a485df7d4f4bbddf04ddffdd8f79224c814ba GIT binary patch literal 545 zcmah`YfHjV7=DghPUp&L_bXxsYS5zkAQVA}LZAf|exLK8N9Gx9XGT9OD2hJx1Nu?X zI|_=vc;LL(=e>V?zP$rD!A=$_Xa;l(b4WAndcnl;T^aI8pty7IDsSX;T_G<#C8k0> zRE`@AX*Cj2<&dG=nT0ogmuKQ!|Dav*xq)_J!TD8_Qv4Fe* z+d=_FhSIG33^~{HcobER8i&-;UUha$wVr_`hT?B4H?fp%-{%Z^GZ+xdcZB3u@ubhg zyKjdU#*)Fj4dT$_ZINILe;0F*WTU{A^!y+aa@gf+6bvkEC1Yoj5h+u|U|mYd!=~>> z5sy%!{b#_i2xi;K4d^T>`Z*NIx=d1;^u%J;_n*P)FEAcSV^|@YCJwztbQRVQzC@g? i$kd;}UNQe4-G+uW@~5zl4dOa&d=uLwnG}~)qW1-}op>q$ literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$39.class b/_tests/out_app/com/lanremote/watch/MainActivity$39.class new file mode 100644 index 0000000000000000000000000000000000000000..64e92ebdecfe3265bd6ec6830b33698243fea8fa GIT binary patch literal 545 zcmah`+e!jK82-lHTwS+Z?R-ScKn>ccZlnl8iUcjF@P1qe9a(2#4@Qp_6h#+3Ko1rD zOF_|%1M?rh|NQa!_730(TUn%_8PF}vAkDDt`eVoADiC8o63#u3+@aIqQk}VxoXF^* za@b%=B>vq{6_t?u~>SQMMDQWOT})Rcl=nbI2R8 zEfi2>C{4@HkmIf^!mx7C*r$$ms?%Glbqy>q6n|T}iIw6#PcZ0BzfUaRmP%a3$DXnH&h zMTipZKLdt&FxyUUKxawO&!I@xMUu*-Cl<55`wUipf$>Nh!xGUnap;#smtpfgc5Pjo>n7G@8p9qg&t^3l(=(e?$Q)Lie+VG&C{mIbak`r;-1PetZs zg&{m`&Q|&_LF;`&c{?2{Lan2XdRt5eDtqt5@^yN8WTY)J_UC(6#`|4)@H-at(jtr1 zj&{WQ-wk}?RC2jjCQi~^n^9NUaXR$zfUq*FodOTBN(iLU6KU0M!7bTncBC0*sUAjC ztq!9;oA%C||6NDCHb!OJiOh4AV}-{fz`cVPhHgp#BR>Ux9UiY5t~1_X?-66k?X(^r zfm$0!@LR{2`@~y>n`|qLpzpZFzK4+icq(jN@-s$`qTc!p|0{%p6VwSV-MdI%aMkGy jKArP0f8aJpN}!OzI8b=vqQwn?%mF0DlG3!oTyC;$Ke literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$41.class b/_tests/out_app/com/lanremote/watch/MainActivity$41.class new file mode 100644 index 0000000000000000000000000000000000000000..adcf96e8b3514f03047b28c3f3a9fef48de134cc GIT binary patch literal 545 zcmah`YfHjV7=DghZqAj{?pMSN)SxN(tq4L20xwX}_c;%GWS+q`jeb^86n*Fi^rNEp zP*C*61LwUy@BQQR?Hxc9dl{sl8PIJkAkDDvhZ8sOWW*<7!rgl>@kegQ6Y|_o#7ra) zyNpgP_|PcMRLZVRjPLumXI^x z*vO;6P@I>aA?x`*kK^)jqfQ+iROYu-y)&@FQ21@-dMc&Y4>*I~3J1h;Z6SGgI_dN1 z_S>OFQ^{c6gwx39mqKCle;0G4vQglL^n)-Ka@gU?C>+?>QDd8GM9LI1*jG~Ws1Nh!y3^vap+y5>#%?DMdD6ODwb95R&Kv+&0z3}khf7ILr{?6Es_lL|xUx*-ixDE_w6jiq$^K4(a`f&sC7TS$HtPx?H( z`*vtyEE&w(APzl#Arfri?_v&;Y!rAdJwH%F4m&&=1p^CP$=F6RB4ttx)}@p@Z27KI zT%kn!H^8t6X4}aP=qxGvITXpdOj4Qj#A4R>pTX)c&>u--SRtArj`R)DRaigx5^=J^ hs6TC27Qe0Ar-WRD#csKw6 literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$43.class b/_tests/out_app/com/lanremote/watch/MainActivity$43.class new file mode 100644 index 0000000000000000000000000000000000000000..8f1d16403762a88c446e113e6053f7b874f419ca GIT binary patch literal 868 zcma)4ZEMp|6n<`-HCY;68{g`C?J`X}UAwK{DuN6LN~d775+;n>^tz_BHzh91N3_zq7q zY}X%k2f~X9?Y1xd_zpwXu68t>B*h!`G!z)}F9eU1P;7;X)L=3wl8=Oj(+qkr7IJGG zgmI+dETN2f$VZWm63(l*VBjJyF_ezt_aF)+B?-C%hN4|<|D}|~{*Wpi6X6oBq~TW? zEPHeRb&7E7aDawu494EOx4UmX?tS>Q`})0(c~~kI3|z+zhVoG)rkhHIa?cY{WUVwC z)Yf(T_`V)uJw?-rLtk#UsvQ+o2J@idj}s|*cPJPZ{v$!PL+xG*dgMOW_N923jJhIx zvJa4@fzS+`APGIO?x&c=>57)ptQ2@pdczA(~aRKojHsq4_j2#IpP#-0XklXxIpke9K8~S4SPSEE zFcLbEF6R+MR`OdnjVgh3BILpHSWt`@$*= zf_wcv85(B0rnE9Q2>E)W=ixXOT$Ft*qC%+7;wO|u7|JxQZEbCGM%U}JQ)+aDj*?hK z!9+y^X@Xt($n=z)w2L@Fs2sh1dHD4C(UUKS2XDW>`uyYB3lFET?BcYKGdN3F{zp8) zO{KAHgmd-owA9W}Bs=n9CUq#=jh>71EHnMSpJ^@nBS~2QpY(eKrxQmEU+5|=?`Gq^ zOm=@0y^098aQ?#96rj+2{(OM>* zkw{aSqRL}Z1Xl$rm+h$V^yGM#aDlxS`L)Wn^?1!I??KH2xNq1ZtngXj8_okhtMLEe w8;oWz=9}+8A2DB9`hb(u5YLi10>0Bn9+w!HV~I7s9iEUHF7wM{0xQYu7f=_q8UO$Q literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$45.class b/_tests/out_app/com/lanremote/watch/MainActivity$45.class new file mode 100644 index 0000000000000000000000000000000000000000..a4418d5b1ae495139fab6774ee2b5d9725b5687f GIT binary patch literal 749 zcma)4+iDY06kR(RGn2{KT)fqLOw%@#f~n9xMFc4dN~&Nb_$HIdAvs}kMrO`be9N=H zAo%8^4}xOw!4L2|s^CwE`?Nxf7V5y9%VzDh_Bwli`}O53fDQOX-y!5%e&4|Yp_r**{5%R$?V^IJjhcruI7?VOPVQkED^89F6GFA+ z_x2SsEh8@cMc2W3Lizifw?AjIz4`0C`RvF0cPE2`oOn-#QJiwU+d_}yp@&t|H^=mdnNouH zKq--IaeGpcqRs>4fN&L5shA<+xytch!gY?;`PAUMiMZ{xPoVZ^*dO>txWQ|IcUU7{ z8}R<%*I=0_%I%M!+UYsUwR3Y^I81U4oh7kgO_0YDLvv_inRko(x`Gy;T&6Ih{QU-b C>bnjA literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$46.class b/_tests/out_app/com/lanremote/watch/MainActivity$46.class new file mode 100644 index 0000000000000000000000000000000000000000..a8d363824e023ff18e7c85982d90cc6b1eb527bb GIT binary patch literal 745 zcma)4+iDY06kR(RGt&o_3Q+ zrDCd$=)R3iJnpVVQay@|+>+*9Yvn$nWX3XUEfbpk)9^hX9%fwl0m=vn)k(A!S%uB+ zi{V7XhS?rSCCx)Zu^kRP%o4m@jr2y8BtELBxu^#?hx3HFlhmGNTCuMlP6)Mj*gp`+ zjZ8T1H$4v*3BlgSPy5^3dmnc8-|zUC!(|s&0$jy4LgOUP;~5jmQ5=gbYu&xK%sIbq zpPuw#5C>VVn^daJ-d|z;3kU};ZV>86^?8{q6%7+XSojaga6oWY^@!n>zEt9QJ{^km z)geJK&ACSYy3W&BJdu{Oc09*BR+Swet2oga$GaxXSdRkSwmtJ~f0!xbN~`;9bT|wl?_H literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$47.class b/_tests/out_app/com/lanremote/watch/MainActivity$47.class new file mode 100644 index 0000000000000000000000000000000000000000..67dbd9839cf516870165dac64f91ebb9a1bd8793 GIT binary patch literal 752 zcma)4U279T6g`uy+0ABcKK!cRF-fi=aQi-(eO1gm|YFTC`9Xc0MlWo^$Tp`}NnSF8~%07Lh~Vg%jWa3Jf!` znsky#rhK9d?>vr7JnAe(LSB!JSQF++bKwd@!Hk4%&NDQ6`{BDjJQQ8{0ZIrMD&uG^ zvI?u6<-wT8hS;tODaAmD`Yb7aJ4aN-B zR@mE8$c#wH_`|M;qYSmp=WjP(z4^Jm{^RA-?=PNx`~2F+G>*GC5#S_FG1T{B-d#9D zDT-sRb@S5Yc`E&WYyaA}t!x#$Vp1VjyMLMc7ZCPcoFT(I&vZAFG8!bDVfH^H!#;zv zsD=bD_k`qkvdMs__qGZ0X+|&Quc$1I`AuOttGjEwXjLikhKv)X$?p<3BQ*?g!M4t` zZ6YSk5ZscIr;ACXHP@)q40&KU4OXexIik_Z(O<$@iq`4Wpu3Iu?YR$N?T>KZ(T(98 ztp(cQJfgLM;17Ndj*X(+eh*eVxPfx*$Oew>B>9%k(U@`!@|YoL4o%F`?oeOPqeUm5 JD6A-bzX3V>y($0z literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$48.class b/_tests/out_app/com/lanremote/watch/MainActivity$48.class new file mode 100644 index 0000000000000000000000000000000000000000..de2438bc398dde98e440aa867a0141be0b723224 GIT binary patch literal 647 zcma)3-D(;^6#kA{cU?D$+NA$UtXfb5QHU1-OQD1m0;Yi^c)w1DICh+BM;W~h={n^5U3!goEm$T{$QSGO02<1hrgnS@`Op@A8 zr_FsH)E76}yX)-4#7duc??)Pa2hRwlJLvI5>tGN{!kY(hH2VCxz37bLD?O#<$H{mg zNvzh|52J}-QfLJ8r=%1lCfSBvCq;% z`v?U^@kbw^FXCH>vnZtKkGQZiJ7>?#8D{?7T>S;mL}dmkq#a~@WRW9O!g$n(0+onS zY((Q*V8UUe7f7`g8hIkkX|?&0kTXN6s~d#X?lgYOgNqplo{v0yLg6Sl39Q0lV|Q>Q zLc`TQNhQr^LVCT{ck!H%)sYa#E(-j4{qy(rk6#{2m~-&L$2=AY*{86 zgB$IvPw%ulX>H#mQXRG)BelMRMM7yp-5V||X#MXsa?en%;hw4*?4 zp;6`)yCA#-6$*CEy!jO0JYF%n#IIG3E#lSRpM&ZbaQ<*ac+ED)9+^|NZ{Xkat4LcE le*FwodRCgfMDbz9cjmlhP73d^%s#^#EVB};aIRJ3a|?D(n-Ty3 literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$5.class b/_tests/out_app/com/lanremote/watch/MainActivity$5.class new file mode 100644 index 0000000000000000000000000000000000000000..79223ba3d724750a8adbe596ab6696af86463e58 GIT binary patch literal 649 zcmaix-%1-n6vn^Vq}gQMnm@KytJN4*NFumG^-2*WC=_B9T5>;`9n9!v26iVAA4^ay zUibigDDezlRO&?*_MAB%zy0RyIe(uYp8)KlRe^_sk79@qC^58z8OJHtnH(D{<7;lk zC_d#%9|^0b%HBkK3?(~Kd9*`xe-^$Upp1%-AjBL(hT0{ca(BT+d^Wt4!jjv8(#jq( z6xy9ZfO%AX)I!wJU}(i@;V++h|Y8` zRpP3zax1mW7>YfUNQP=(Y58+99?I-DAEu=E<`rdFZ1>+8?RN&$*Do{4ggjA>ufHAP zwwnRD9&3@BTlHq^- zqe;6hgJA)zR&)EMm3#Egp+V|rI<=^FO3>Z92kSn-zom-)ieiZ}yd{cX;G*Lr%8oC0 s@4)`x<3BoZy0-$~TSWoO#CZ6M70N|g=_=Of)F91$?Vbg!W201g0agf?j{pDw literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$50.class b/_tests/out_app/com/lanremote/watch/MainActivity$50.class new file mode 100644 index 0000000000000000000000000000000000000000..ae4d07b9ac30f6363334b8e3e7b08fb20134f046 GIT binary patch literal 651 zcma)3-AWrl6#h;Uv+HJUVr;FyHEINtf)T1$iXfsOL`8M`USB0-O+-j? zRi1T!dGN6H=jl#NEY;b@+f1e5V1iJ5h8`zM1%gTkjD(pm>2Rsm_9kqPS+vU1;k=#iW{C%ZFyweG^ z78)g1*#+SerdW~(hAJ$Y;FcBK1`V-%JD5Tb~X5S@sTa0mrL^21 z4!SZu{8J#C4mBZYC&M(B@0F`L^Y8TEI8{!3r{jKNxWPSXd&yCVS8lexn-ECHo-EfuhJQns=Y!Tf|dFpYdynV}}H_)hkf#8s1lq2+!H(*(3Ln?F)o| q`4waxim-MGDm^Ssf5Xh(j8Dv2U`_@vvB*Bh8!WRDt8lJU?RfZ&P8`9ctqI_rIOJRgI2BGn3zFc zhi##NB136XeukXOxd_9`Ub8_RZB-|?RJ+kJ$58xjv?RtVC-ST_H@@=Wac|7Wh z;QHI41+iiZS-n3IZ*t=zbjs9a(2#4@M7A?-LY77d=1^ z75z&=(TxN1AHV6%%q@d|YTbM$IVUznK$8%L6Mt&rmTQ}kZr{hX>%p*CL z(OqS)$&iT#GORQh%I!(`0}}?aI!p^WSPb^i9lJ?|zH`wX3La6mL#bqR#GqAcHzsC~ z*I`>IpvX{~l%FBzaxTKK(%f%QM_bj&E!A#x%rO*yTe*yta=V^jNVohRv3y%9aUPGl zBDnr`XhEzP%qu?*xHy#ww(xf`J4rSQJW<^9L#g^55e@vFg|%dCBN>r0g$&l2QX*)1 zZWxLXCEC9MhFLJ%PHsSFNzu=tNY;6h%A_Y2v%dWdR)2y1NE*We(F}29tKwZbn`v{sTc| z3V!i7_-UY6g!%*gA8!5%@x%!$V=x1`=iGD8dCqfQe*FIS9Y6z(S)`DbA!(RFhGE|J zy_#!@fO~$#YcH+H9@f?^N8Gg|XVZyZm2Wi|GSScp%XNlQ>nQ)G3I($=R1H~Z47riD zX(bs3wMV@Xw697Fawx1u=U-5?eUbOuRS9#?RZAwM9k z+jD*UMVCl;J~^BwunjA)yii2}XJwqza2^*J3Ww2r5c-00`MnXL8I{&wW^v@WRPYAz zF5prUewm?cJllJn;@vzLpx_FF{&Rcl*N4f@c)as^Yj^T~_tQre^C-($&~O#k7>b8c zneH%EZP_*t!}3a_PCZ^Tj&AY+?o(vVC~(A}S!v6t5WW5GKaPd4dM;;J_>TmYHuZkh z@00sn%Mtux?Dcr?WDg)s(_v6eKMriZ<|LT;>57(;tQ2@p*sdQEopl}!{l12kWFwSh z`h*lRX!nKS!K!P8ArDcc)l|S>faP+@deX+G=+B}`)Sw~tOrUhq`Z2R3>2qdhM$em_jDEuG$oeU>ql|IJ9OI&1 q9HX=kt3x8#w#(`%cW+>E?T{0Dv$ zRP>Yh8wACo=nwFR)PEtKIALWBW+3;RbMHCNdCtqv-(Pjhr1P z%P?r%?~S;d5ZVn-c*#wMyjkliI7*5e^c9pCich$cq!HhWQlUU+kc1O(1;-iGr=IU` z4akfYoFtTOCvt*V#XL^SIHTb#&N0j%#P4n#3Q7|8Mhs=M*7-{*O+23}-6q2GxR8Zk zWH8LfyRTD(+xr6)Tw>6EeS1B5|6wv7PhPxKu>eEHqK3=3!caMg#B@`sP{(z792={x zCbf0LJiM>_SWnTklE@Q-cC9O;#-Q&t{6Q*&)AKpQ;(sKlb*bI!VV~URI-cP7(xAtq zhr0lI8VJq63e(8t8(xN4o~~#)%SwT_h3khg(b?q5Fzjns&6YsP22MyZ_3e%jJX-gi zIOZ`bw2cZFOt4ZZ+eli{9Q{Sq>2`^SRE3JuKj-RcVW%8UChmHXRbwbN_w#S)&@ib&H!uZ* zA=~5YJjt+Hz1!{yHzu@ep7i4D4Czw2rQskcZoi`;%P{p=@OTi4N8vzfFc}od`$EHE zGKC_F12S>n*Km|z)_BPKk&Zl$t2klcBu+8p_ab;Z3M6F-+C7F`soea_X%KrpmAXcZ z^Ei`)pJlL054Wvjj2pWHG@N5Fe?5CY`tWM>Vsq>H=GMmR(aSG7W?-q9HE#a&lKk+oQ_QFoV1`?q%&_c5||9C~uKQEsUy6TO|j-y2BD+rD6!{f`9Y7Il3o z=#cw#)05)Ppx+kZ{cV6W&4od?gF)zuWiP?ZjaM|EWTn8H()ELg=&Xpi8*~gTCcB^| zb0?&T!MG)*2$y^wMIu6hmQn*l2`rmU7L#^0MgJ5k^g2gck?zThUYYw0R{09`Bi$G- z(wQL%WrNO3F#h>JAQXDVLgf=-X1+sn(&ho%QOs%EnJ{yy3zk&D(LiufCX;6~A@iopdsA_z zJ8|XKorwMbL2D572lzi!{1f6GyJ#qdIxzRXkNeI&_uTva&zElinrO~o3Mn0$g=wT2 zX1y?|k6aP)AXL2m#8uv)zUKPkmZ$tJUp*~fyUvhS17DUK45ju#@huYuW^|YqGO!qO zLwCzfGHlfE^@iM2gm%LhzPibfs#H4$4%5O5`UY|gnaA8!am3f7SQxMwG~ou^z)^;5 z#HEUSPpwNuG194C6U_W%MGHw*dU#uSqfio^HLeC>-@;Nd2}aU&LXxE0 z9U*wMJaVPv5=9zG0}K_gTrL?)n$#)!GpNz&JgrK!PfpC*{3o#5XXqbj$8ec!nmn{O zWUs&?o5VjP6gtIX?IU5PzryII>_bjhv$IZj+Ri)Ow0*?s>h>|GYm9Ni8RM*79HX=g nYeOU0wq+d8Xw#cqm~MNv16YhH2R?2)^VGm zI*v|pYhONhgctCT!5Ytny2UQHDY*^lafYd;FZjzrzr({VrxTDxmtsTg4yXZEtWjE{ zmKe-v$wBDyXMPMYJ)Eu8xEAE*sc-`sQRJIkb){#b9(P?b98lrR4Iy~g2%IS55rLgX zM5RekpHfeQ<#O>n(1;}H%VLGB7HI`K#}=bf{RUR~4*h^m3}xC=B%yt#y@Kk$_YJZp z>29%d2zH1|`O6bOk={<`ueP?eYU>Es@;8sLcnXq-Mj&4>qkY9Z$p!6z0PYY(0(Y@W aQlr_ZVU4sox|t*yub5Q4N)*Jsl<^1Q@BW$q literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$58.class b/_tests/out_app/com/lanremote/watch/MainActivity$58.class new file mode 100644 index 0000000000000000000000000000000000000000..1b167bdc20cb493b8fa3f3e94e209b47b67c9b46 GIT binary patch literal 936 zcmb7COKTHR6#i~9W~P(Tq=~6oUwuq94>k3LLPU_FD5Mr_3Amh0F3ptW4$Mqi+_|aL z;?{)=r7o2qh>A6a{s4bRr&;zNi04uv?xqgRJ@=m1cfP~->vwMlzztj;K@4#fih(0Y zFihKSyWFyb$J=he%WGC(H_P*uBktLOv+4xT%$v6v5<%1P%~^)2YE*tjhlUXqx`8AN zhV+WHYDt9U@*3}*4QWaXU#y3p zerU)rc(Nk2~!;_m&PC#J!GS&==i~XY&V+>^b_c zey&JVD!ec3mg^J0c^)*~hJn0PhbEOkoqPu4kr3RQYgxX}eHA5!(tnVo5r&L0K_b_{ za1Jb;mO>}($LLQ|gkh3yQ}mV|y;%ANR{Re2GrdUQbSB6``AFw9jKBHUph_>sieJGp zM>DC+=uc#yQekczCx^AV?5cE;Q@$V$lPY4E!3DAkiRmH=bQ`CL#Fk(7z@SLcO9}lC De1rjB literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$59.class b/_tests/out_app/com/lanremote/watch/MainActivity$59.class new file mode 100644 index 0000000000000000000000000000000000000000..2d2af5510553ec91137fd29a27088ad5a31d0491 GIT binary patch literal 867 zcma)4-D(q25dKcG&2BcUP1e8qAJeTSsWxei7ZMSqSWr?0R|AU|XSd?*Z@X2`0r z8*U7OSQ$7=AX_}*!`Q?e&g-~f;UX?E%pFDVaU4qO5qA0vg>t3!m(fTC1G?xI@twn! zr2Hy_Q+~PscZzTGaDjnq4Ax}t?d1K($-57~K7BSZ4@bv>h3mM%P&|snw5D`V?)xH+ zos~wNR9!0{FY6)JQ#4%_1#+`lY3ryk*avz)8%fDK1HrKH9}OyPQhPP*Qu=HwkmAW` z*b&k5eSkF0gTZveQRIuYAi*q5-)Jf6N`()lKL}%@vo2IG>{?h!cECvHO-M26_DD(* ztqyn`ix@>(Mgt6GuzWsQNZQd9y*X4Vx=3D$&Pl|qE`9^6?m+)SCx)B!&5(sgVcdfC zFaHIhP!!A6uY{TT0mDn%CtOdnXI*c`F1TLCKIMA4ea7{SG0wSTT(*m2ln!8RXau_h hNBfR4*}AriG?oZ7g&OK)HJbM_Zj)zHvxFW!e*hIP)YJd~ literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$6.class b/_tests/out_app/com/lanremote/watch/MainActivity$6.class new file mode 100644 index 0000000000000000000000000000000000000000..922f3a3029600010a0c3998a2a717abf7b7c626e GIT binary patch literal 649 zcmaixT}$IY6o%hPYtzQKw)JaQ_oJ2wZ3W|nc%ukQQCO(D;L`i)WU%9=GmuOx{wzUJ zyzmG3qr@{P?4lP9=jr+35x@?b6?iE4D2A9piJ>XXC{DS~{YbOP_jdnN83dArr~=5%Bc7VLd+s$s9x|1cNd(;r-KVAEV=C~t?U6q zq1EmO_=I^M)etq*85-0483HbZ%=2hxn;P0^P4B4P_p!*Z&UKO*mBbSzFXKLi=u~%8 zCI0qQZl#tPL$PZT$uQqjTAqwY1DXBdgOn8CyrK-tt=_4aIy2);$Rp+W+W#Zm zax);;LoHI1D}8<}?a(A4zPSn224j^bU86Nk=Qr0fWe9&!m332|=Q8)vAnL=VWcaRs zG-$VFFf4#ot8Txva*y6w)Ja{UQKekAzcMtMk(V?NJLN`!?!B8IYEuLlA zXg%nUgqIN7O<(%SErz_^=xI1giWdwtlo?9T1W(dPJdIMR!DLV*4}^x}qz!zJw38IS z$s-=bI;uFW;*5c_ILA=kkJ-IAlms94M+_Ca(fvmzP5d#{xJgv2xR8ZkWU%ZfJFinz zSM~;IxWrKW^>X|7>$gAOywWiTOU1l_%ecZ&+mFF?FR4E6c_NOj{S&OMZ; zI66t>%Z-&rPep^l-0kzjR7&0-3x@eaBxv-gx2xfR+-JMK6!+7hFQP{~0C}1NgYJZB zmkKw3ub3z&p|#hcVGv7s)Uj7+B6`uVr&4q?p0DE2W55$2^Wjj2bPW1_m3f zT+SAeb~8tR2~DytkXEOAX3?7qAHbU1P~Xvw;VPX4l2E?Tc@4&Y|Hp(vRxCB&6K3HP zG&gS^aa_fmb=(=V;LYxGubQn z0KS0_ASf1L{wXq_Lmxvtal*0r!#Noe;15y<-tdAr`%aGD%H9BL>r6kl^srZImNr$U3tpa?JI8qPAPlSoP) z?`k+t5Zhktg^7*|E~>a>;4-c-RE`t(IEe%?M1wIy*{=8g>PclVp=WNB+6t~^>5B}O z{qo>;Ms4?Kf`;ov|Lg7E&-d?iEWuK-Y~TiNGE|SFpRFam&+~nrB-UD|Mb+G}PcG*X zy)yzG83$skTkor=Gnj{UewGU14JMpn`9BEieX8<$G^Fr_ULg3BG#v2w`2j$l`oN$& zQ5ySvBginzvoBiBSSj(L@F!71ayGdfMMDE?S?{&1&xDjP7>|VD@%qF|5}u$+L#Tnl z1}l}aL8RHt(O*P^PFKjQ(LOuT8!Ml{8lRzlpdG_4S_@>Me53U?jDPVj2!&43ZhR!n z!X7j?Z=P~o#awXQIkW7z1@nyKs^&Sz)uy=MOmWq$PEk9AHK7pfcUa0kY_cuo2l7}Y W&>Wg*kyWVQZQLPGC$dZ)eSZKm@6bO0 literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$62.class b/_tests/out_app/com/lanremote/watch/MainActivity$62.class new file mode 100644 index 0000000000000000000000000000000000000000..d1a5f9719a6f669a160b458315ff4dee09c1dd69 GIT binary patch literal 864 zcma)4U2D@|6n@?{Ytl5jHh$Ib+GUz{x^}gAQxRl1P&x&ph2X_V(|2o1@}}ft;-$C# z1+TpKMo=t*{s2Kl|AYE3#1kj1jKK`#J?A~|InQ~{$LHT4J^|>UQ@|W@G9(T2$TKXu zVbJs)5%C~Qc=M@~xTEHV|Slo*Oz+)2`iZ$_z5pfgCq3Alpe3$Tfv1a z{33&4KG}Vp;oIFGpx_d*`T64IuUD^sOrNV*gdt-|!)07ys2;>%wxLv{_mJPvjo~Vtd6JO6(0L8oKmW&s zLRPFc-V$d1BNRKQAF*snU$E?Xy=>We{g`FT`U%TcrZ{CyabB-ZQQL#nArb6X7}7VG dBwNyVL^{1t-!4)I(S6!)PYa?Z)geO_|T{qp0}X8_Nz<)MPA3n#!0)Ce0%K8Z7-3pvS+ zj8BD0#_@qr`gLN|OqsLj`5vKW#;S~V3G4lN=l89^LI4jw!JCOJQaY6%2-Nct;HHaP z0U8Ji;fa_Dt38SjhbJ;Itn*T7WnK}gt@gmj5^lS=6JQxl!sG)o%N2L2rInNNtTyNj}D|6=V^d- zJFf*h8a1MC?OdUL&Mm?Njy2A3zTzR*6@>h@f=3)JxWyey7j!Nddja<&7XKoB j`_1`=y7QeS9{<8WVQbvvg|A_QtEE2-T(a2+n>Ftz%m<;* literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$64$1.class b/_tests/out_app/com/lanremote/watch/MainActivity$64$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f2b0302ed8a64affa9987d15b79d8104370bd996 GIT binary patch literal 1638 zcma)6>rN9v6#k}VSy~3D74J7L1=@0HfvRXlL_jRIs8m7mmSx$%YS}frQ`Em2U%^CQ zz~3e!MHAz16W>B#!Wi{TDYg<4y2HIDGIk_*S)C z$P~tk%MeIE)K;}vUYNO9+H^(I4~_;EjT}t~(0Xy1@GQlyE<7}JL6y&$mMP9Nc*Bud zAA;DcqM2hK_A|6sfn^JOoS|)3?1bka4yicIaRf&hT6QbIP_OB_;kuzje|&&pJiL32 z?Hok5J5(HJ*jr|5)N!Pp|wq3)+5;V;Cg*!JPz{a&3$1yMm4~ z8LnWD(k3^j#o}4vnAXw`p3>Ubihl zzZBj7eI>M&+(;HfxXh7~o4wlNqQr8ABaKW2mcck->8J)vO2%L1xQ6TH_`x9=-&sX` zDl)4gyCr`S=}g|Tw1u3(FtmFD>KG-;%fESKmhQ)xy+|3F(xzoh=T{aC=f-AEU)Ef* zG?8~`)$8O*+J>yq^hcy-X@@^+=N;X+WJ(BoD%(?^yi=5P!qRiLOKN8fv1~7L+>-5t zr!32G#&VkL8ZKI>DRD5&z!M0_-UN`PHb|Y(LvIsqkiAKxF0x+fiFU7nMSIquM%PjQ zj$910^sOZer5$rL_8>qrsz+ZL{Eb3u$i9fa2YZh_WYhu<%$25}aP0OvP8850J?aM9 z8PeSwh%mgyFb!f1Uoe>I37!m|F5t{`DXxH#-VKa-@CMEQxh6fBd;8~0$@gz*s(@(; z*i!`DN#}*qi6*5Btx6c@l?W!4DCU)JJW_gLDSddZ#BiG;IK01PABc|pEb=g4%yI{J W$<|Npdr!3M=@L)MSb^oQ0yE3z&M9OAc3TuWY5f*b7sD8W@rBV`~C|+7q0u@f?GnF z3=hf~nssYdNo%IfXDx>-4>U)gR>m~LyrDbByx}|w_jH954CT(WkqLK_!{{+QRDt4^ z;e(&SGq0t?oS|-XMw{0Z!%{}Zhac*E&M_=g^+QI5gi0Az2rvY8-VmXbGCnoKb%&t) z4AXE17~GNQqz^&VNT`)jhm#CV#~`yuKF-islDsP66hmmA#e`!UX6k0vNGG}NM+g;O z)HBo&Tv++Mz42bWIw#{iE)cXfH^O?2 zEaBF(r<=JK`Gv27V?xGdL2wVfGai@F%@ExGId`+BsZFIR{r=LdsFT$rTQEAwP&Q;G zDNNOxxM2a2bcPU;R$ANom_(L4@dkhCCS2T6)05}@@T DbbmAf literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$64.class b/_tests/out_app/com/lanremote/watch/MainActivity$64.class new file mode 100644 index 0000000000000000000000000000000000000000..2d3da204a0493f17a6f7d461e08c494013f9440d GIT binary patch literal 1539 zcma)6T~pIQ6g^uSQbItesE9a1DcTk^e92b;MdZ^WGt|*RADob`5DW>EY(XCUC%)?| zGYX83{s4cJ(JE z`WCkZMVoLuM@%u)q|(ndG~$wqCLPU)Gjvpo&romKHV?z(;8-6anoCuOls?yGwMco! zb+{+Y7+MIAy`7KYDue!pTcQx~*RB%^4XwDYqD{vQv@^7xhj1zMJv#5NZ!siOudARL#Gk^S;E1}NM-PIB5=Hozu;%7Ce-Cd^y;{adkk8sAtN%_=!N=WdHKM1@`fK8 z3$%85V5*?g-RBjzLXOFP4F(3Jz6LLpk0flC)vAbJ3hzFKRgCBu#TY~UUr1Ey9X}+& zUMm%-sN&Uv=UMA6H`6awm<*STy>@(Kab@#+mX?ffADHap^qKo$>RW;ZoM|_|wAnIuD*nrX=j3K=N+L3Cn&<>MdEd zoL>lRKIcf6=JGDxlPDBC%?gk zA@f^7*4pHdF+pi`dhrph*+2G)wM@?urlkEqro%WU>4_8pBnUi| z4n&ns+)@&_t#n~r8N;N~k11sUtI9a$>5PiVdllm?glvJf5iDYf<|tjpCwNM$Hu@r2 M%3+*Lq_5)m4dy+SfdBvi literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$65.class b/_tests/out_app/com/lanremote/watch/MainActivity$65.class new file mode 100644 index 0000000000000000000000000000000000000000..079b59e347881fc6a809e4f0b8e5381a0da7ae5e GIT binary patch literal 698 zcmah{U279T6g`u#Z8oFXR;}L}+Xa&-ZlTeah#*Bp*eWy4&{ocklhKKA z$t>CzO218s#s}Ti&i`}R8+*9JuyN(=pwL=OGRaWeGbuqkR$6{4<`ZeZToTQZnrh(+OKjB^ zn!z8L!Y1;)Ds}7sUhRvrG8K8Jlg#8wPxqypnUv!RwivjTI+gZ=HN|nxu-lD=POVXC zbfVI!bWzz`*jSvJ!VM2E%`Y!-yWg^dIjt-56gW)zRK~PQzAf$Id zPoqL#8=Hi8DSAp+Ei?UR=V1Nk=kWSJ(E3g(hI_O(2vPrv`xI9Y(CNW)FU4KT5DVTv oBkdWy3#?x$ePU7nhF1NMT0C6pAK@`!jb_}zHbp+^OGC8&0`bnGegFUf literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$66.class b/_tests/out_app/com/lanremote/watch/MainActivity$66.class new file mode 100644 index 0000000000000000000000000000000000000000..3ab20877d8e8e20517b7477437b936f7c100afd9 GIT binary patch literal 683 zcmah{+iDvz5Iyp3>$O^MlGeSX7dKg`o60q${h5ivx^q7;>!S@LyytR%5o``T##fuTOwnuJ)zT7df;571-iFB8Mi z5mKr=k9Xc}ll=FC<@#??xity!h+*|c-M7LRG0hZ1Hsd~=3i z_#2&H6k>Qnwnd2M53G}4Lqw;iSGFP#C_-8A;VE%X5&Xf*4Kt)HnmIa6Pft9%;y=d= R!Um1Ak4^GI;#Y!bT>|U`oo@gD literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$67.class b/_tests/out_app/com/lanremote/watch/MainActivity$67.class new file mode 100644 index 0000000000000000000000000000000000000000..4325c83e85aaf8d0d8a2a90177ccf62d4a05801f GIT binary patch literal 1473 zcma)6TT|0O6#f<(A|(n{K*b9PQQKlI3IbXc5vf)S-mvhxBr7b_CQPy|Vs(T9c_#94Bzn#3>7>(a+G&JvZ>Bo8_LYa3y^&TjJ%an2uikfDT*{YU@q7(H28@ zGFAN3P0qv_hR&urU-r3*V*o=IY@DUQpKHtZ5kw^)$9W`8q%5Q{%rLN58W}pc+7e@vcO=K;M;1WaPF9gLwK^OT8zp5VbfLB6>^Az)6 zz`KE8UAK1wsnnwwGjYYjxGvMsKE7cvHl(XoHLpnvS8Y8L{WxHc!D}2wU4|P=t-5x-Hh)F z;!%{In6FlrMXj!yL*9f|4t!YiWa)H3{x<=y7X88NYV_5BwhPR(mjtP4JDdWE%ZNz zX_B`|n+rBaW^7%4+WAj8V&a`M_M24=+N~u Qig`SubWPC=d)(Ik6NJ8d+W-In literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$68$1.class b/_tests/out_app/com/lanremote/watch/MainActivity$68$1.class new file mode 100644 index 0000000000000000000000000000000000000000..c3aa3e144c4d15c865a9f969552f7e13e9424703 GIT binary patch literal 974 zcma)5Yikoh6g`vInsjW^_+1h#;*(AXTs>{k+)@$&}5k?9N8~NrDPO zi@^{60DqKtry?o&k}T|;JNI(WJu`du_n)7?0PJBqj}+1tG8|dt7;1hvasy9AViaoO ze)P0IbPqkLUin&%rT%0;Z`s=nIX#rI32NO1I@)H+HI6(A427{5*n=ocKEw>A?wL3C z+(gU3?aElU3*fkJVVR?d64fuuBxvBi>z@f<)94pcN&S)`U3YqUlySqtO^#c*%}`xH z%zyDshPAokNzYx}vv8l|0Uk0`<_%z2@_b*!vAws`++jGV&z~`S2hME5hCRoK)1-InQJU!cF^^en71l&9a~eWH}t4+KMNJ^@*#J$oXj$B@|% zPl=(}l}fx#Mtu<-|KrRb$$|285>YiBC5k+A6ef``-bgcY<*FaIj3^>`t^6R2r5YRx zJq%AdHjI6EM=25Q2VNYD7!`6M2VELcrIIltKuEr)Um-up8%K=U5@ICb)Al-J0wKk0y9BWn4A` kvtLlmenmC=jdq)t+|RH@m?59LXi`)r_A;S)jA(lP0vLYrH~;_u literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$68$2.class b/_tests/out_app/com/lanremote/watch/MainActivity$68$2.class new file mode 100644 index 0000000000000000000000000000000000000000..af6a7bc1cbaa985503529705fd6e3940216a02c2 GIT binary patch literal 1121 zcma)5TTc^F5dKa}*|siF3Ro2{2u0d**@6n_0$vCvBp^l%iI2*Uber~ymNSIIS8R`K_YBWm(q;`yTr)ju&GH_^hezW>4E5fU<;DleVdg(PbcqsF z5kiMAFHbf|^%`Gl-(dF-619tXATK?+5Cl0#e}34Yf>pk~{;|FO>v^&A=$WK5 zq~g5fvIjJnPAj-b=KKHQc3uc$F-Mt>*Cs$ss~_5J$pwbGNjpPfnr1A)Z{}APxpSu) zI5cl%h2iBLdi6VbL44-zykqhkmc(uTcPs`ZGYT>#%$)5~hs<(s$L% oKYF7C4;0W9C_)RA=%nx9jA5K)9gW@uu8?ldOWCFDQ0-#GLJ^%m! literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$68.class b/_tests/out_app/com/lanremote/watch/MainActivity$68.class new file mode 100644 index 0000000000000000000000000000000000000000..442a1cdd6e1fe3aef28ae314b822208ec65c73da GIT binary patch literal 2106 zcma)7ZBrXn6n<{VWkXmBO=$~N2TIeLgqQGEN=b_%g%%7!NhOA=b+g&R!m^9I8`}N= zKXs;lbH;w~t##0EGNTY=bo{J;L;r*y#B(=6Qc5T6B)fOdJ@?$_dG0x9|M>Tp-vA6^ zy$(LqNbt+xsAagITB~tGF>P(ta<%w<#Z{N$Gm37Gsjj}RyAQ)d!wj|VlJ10i89I{H z{1ZV0P$wZMqaHFt)3UOzh#eN=v$c637PLw@ zC*u{o%FuEY!fD4cX}y(OW(Y^_BoC8LL`$ZEs~aTmT7uJQ(3NTrq8;ZYbjY}X@Jskt zB4zNaieWIEj~og)eRz)mE-?hkR2(66L`D>`0|^Ivg@gl#BUQjpyS8pFJ_kQZnj|E2 zF`V*fdYr~=TX`sEg6KqDJ>uw<&?loG0}Lk){DcdE(p}9~T+3!S6RCtfRkkPUaT!Ar zuE-e1Rff<(gnbtVX-RQX+5?J5iL@YABxGE}b&|;R%+33;E7FgUzroOO5RXnHfH4NX zXj=suj#GmE{pr?UyPu1LpO7($o3w-D64;y7m3pam9)_};d*uL4!AtOVd?@-ke}>>G0h z-N;XtnkU7gPC8|pnmukPj-xr$>U{KdV9>#un#2c)TA+{q^;jXRL8A_O7nWeG^JlQw zHl$5@V_2noEj_`X(A|Vw@@HKXMWVT9v7f+-XyCshkgW-wN@x9{)9E74HsiG|v?V)3 z7mIj(W*42=ZFHx)cF@Bx;&1iuV36Sp^oh|3!|xa!;jKLMX6UUVZj97+x7P09mJd%L zd&8s;nT@?a#co|i%w|g4rgxFa#=5tW-NFZ%4YVZxx9795&TZTi_Dz8wkMI~d;wTu6 zqLCPV2|xb|ZTxFo;@_Z$e~To4iVS~-9RCh0d;=!`9{2eVc*Ki%%zwmZd=pRk4lIfh z1K-0CxCEbsQ3-MHcbPu+|G>A0HZYnIw_G!7utqC<_yjgR{Z#1=3N$)LGeUK7Wl9f9 HUhn!3dz>-D literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$69.class b/_tests/out_app/com/lanremote/watch/MainActivity$69.class new file mode 100644 index 0000000000000000000000000000000000000000..64413c6c9a76a963f7eeef521a94eceb6ad6ad52 GIT binary patch literal 654 zcmah`T}vB56g`u#HJfR(MosN^OadlROddi*Q3^#W6k-ca@qMxxl9A1>NmPZO{2N{kmatt*;oVEj@BRLI?Y@Z9` zPuj;q>Ce7VGi5I7A3ieV%tXcY4nwuS?EStSu)>jt%aEUmpgxYm#jtGiCXp|Xl;y4d>+qiKOijLMKL}&;Dn;F=hMEbJ? zMe(9Ppg&4HLj{XoWMR*l^YZLFXV3ZjaQ_Fu7Mc}!DEKIbc!Lr{QM=FmtiSEzBy8+6m_y|JGA!Mjt@F{l}oX2Ow3n?tQ?J2G7 zK0~3^9t3!Yc^}mfHPjgzv-}wXE`-eUXnT_y`qG-+QG4KHkzs@DBr__Br%GPN0}9cZ z?xjln>Z{yJEi;B<&m@vzzOS@Aos5Sv`^kqXDZcrKGAy_HuZ+6w0rmC6Ofn≪dmv zkMNtD0l6M(k(ylT^Al-DCJFJ;O{g}Us5I#rt!X;nxt1wIcuZB+OL?Bl+((0`SC^9E zi~iA|-Il?y09LKK{nE-kdgo9lb%{<*s+|&azTSX!ZsA{1MSn%HL>b;L#rIfw;v>qA uFL$oN?(p`R4xH|F;d^^1V3imTYgngTq?LZaCpy(hb6>k>0iUr^syqU9u$S`y literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$70.class b/_tests/out_app/com/lanremote/watch/MainActivity$70.class new file mode 100644 index 0000000000000000000000000000000000000000..dd0731f7c794b2043063ec1a9fb9f956318b0328 GIT binary patch literal 996 zcma)*-A)rh6vzM5uib7}C{+o{6L=*HajAv~Fjgr)hnK?6a=6C+*%*>Zxd;0(uv6My(aRUh(Nu(I2 zT-|m&u6)tfp>Uq_(A{!Yxm0)DQ0~a^MSiKwkP5eCkSAlZHpstX!9?1CWg`QdA-m0Y zcobpNS!-?!Hze9EsbqMYAzmo1n;0U)ZMRHh8H~23E$y4gF~qd8a0;gljM_MZF@}*N z*j=qX!4)0Z;a*3qZ7_@$9v5r>c#xoTIB(#Bjf=R%Fm_x94+2f7xNdGU57Z%G@ z+U3IF+IDpvis+MB4}GaNE5&sK1qO$!mak>YakUDC3Y~kBdwO$)CjJI@MSe|HJ?TEJ z$$++n&oKQT(TnR0iK=c1hT)o2;$f%V6#gUL^k~JFl>6VR!=tT`tQXA55uXdjbUBil^9I74<0udOv!7x5R0I~n7 z04C^Pm|&O%%Vwj$LEj}tErTMhmdKi&S-GAVGD-3xZl=<|0UenHn*aa+ literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$71.class b/_tests/out_app/com/lanremote/watch/MainActivity$71.class new file mode 100644 index 0000000000000000000000000000000000000000..4307f4a89d4ba6277e52a368e5c66414f1cdb8ca GIT binary patch literal 916 zcma)4U279T6g`u#-E6itjbF9(BgU;JsdlRr`VbK$T8O0fArdJ*$Ye83CT@1a?xe*> ze~a%0K`|8CAK?Fx`XJ~p5bw4XLn)*WGjs2qx#!$_=6?ILcK~1ob{a9nH6%UuYxN;RN_AyuEi)AAlipVh=tyfYOk`j(WP5y@ zM+_Z%qtz3RBDBZSlj;dWyjW`LxIl)}Z|lf1Ooc+d-Qlh~-~$mD$l;=fOC~Pk3d8JK z+%H1kBLKhEW3Y;E>Zj={rQ^_0NtYTMRCLTTm_K$84)=GzfBbN`H!?7Xc@5W1+`vtS z{8=>Pk}zbr6(ZwrR$y7a`$VZSAUSG?s?MDvd!kDw;d zS85TI(eQ_XBi3Y;J~J-OQY1f-Jog;e52>$pp}KzCMEPhIsHrU(^k4t`VETxfM_p81 z9)=>+@POgggc1n-lm^JtOzWUjuxvJ(YZ~rN9v6#k~SEz1h+s)(Y3uu3mT5mD3{6GJ4a0U=pJ((uD8eI#3M3(@=O1ClyzLi zsD?2E*D%g7d{U}UL*Jv2{MsgimD}h+IZB}11&*X>Q60C+X;=)#{`0OhsEm&5@-Vb!=Vqt}i@DRAa1__yAbP^IWgxspIlr!9iXnFz zxwX*r{ZN%}@;_)dD*1JW#DZVv41-I; z&?VjWqrl~hLOEu8^Pg6oBDg1>+wwySewoXrUpFwXMku>QD0X)+*3?{3xhtN>gN2q8 zhHCD#ZVniu(KNtNL@bk06AF-|cR)`gMr#l^NlueCNiwc1h2kz)VQLpz;S2gdkcpv0 zdx|8IKQKdj3>o^ng<0CwevE7)LC8Nbnmoh=$zt*sg>w53&m8WMOwa(`#XZtY;!#ZME0XnoO8*V`&--@( literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$73.class b/_tests/out_app/com/lanremote/watch/MainActivity$73.class new file mode 100644 index 0000000000000000000000000000000000000000..690bb1a51d2744a1b6b1d3d9cecdc37ece61bdc7 GIT binary patch literal 952 zcma)5T~8B16g|_H-DSHirHbNrEd~1_v;yiwjfo);Fhw2~n^Ygnb~~Y4x3kUe6vG>@ zJ{sRl{1GO85F`Eo{|EXnjCTu(l{CSJow;-O+zJ7c3ZU5Kdo1^#pI~XJBiRuukYJ@%?ZONhlN=P#it^x!gjrY8otS8+iMwE3a2O0 z^F8YQ7Ipcl?@|vogy8;)YXt!h2FJe_Lxx6M1H&z_R4N>An)nEPaTLf~Br8kj(4!Yi zpTLS=pnjkeLy1;}b|_)|ZOotGw<$}AFO@zc@eXsvk6`K{v_>?2&TPceQ)XiSuq6iM+(OAK?GcpJAM}Bs9_lFS(uB*_nA}XP*7>`}21I3wYRz7~(1tI(ncmOgere z@7i9#8-B#|Z|uma=eKO(tvZp|7tvc|ae+aJ>LN4>3=^B@`IjU>Qb#W|hUC8O8g{c8 zG7RnPZ0_0nwglVFTTvjq-I4|!{VFc#7(j|4b?Wf6y2qV}ke7ugq7{a?ncYqzO^VZ~ zB{9U%^SULRS4mtZ8)0Y|!4(x(b&TQ~!$`M6ABVn2-hOqD!7w`uYU7o%?HXH=aH$K; zl8WmL!>47n>t1UKx5fhvW9Uy}oT~iw{=?6&@1$W;hk=`9qLR2*W0*6~-uncmqZKD9 zsUu^U)?p$`-HZG-9(B(=8$!M_m{l>SV;*^iOt%|%j*_9zb{rmtMscA)!(2DdpXNXP z=yH{96}K47^T3UA-SH_&ys)b-S$Zw8>)BB& zAYJjjXT%KhHaBFDX8Ena;p;*=4t92AUQU+MJ@Opa4~damJgWOO9m|rAdXus|mn2(l zHfg)zc|0h)b{KLZw0d$OWQg!O7z&7`Qj+%oNqSxM;9~R-ph)sIY11U*(vq7w0L#rD zK+PSY?<1KQy-iREqh%a-NRJ^!ySrGVRR+JLQ<<)u`vj(bgILi0dw*ex!cN0nmFAxBvhE literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$75.class b/_tests/out_app/com/lanremote/watch/MainActivity$75.class new file mode 100644 index 0000000000000000000000000000000000000000..ca894672d9dc3ee28d52b4dba0fcd5a346c1bd1c GIT binary patch literal 1113 zcma)5TTc^F5dKbEx@B3UR1_3ZgjKfX(po{la)~sOU_edQkTg7y?e<6)w|ko1Eyg!r zefF1_$R*x>fd4~(hH(x{LL*IZliit}GiSb;Z)Se}`SJt6ELOV_LtH^ZLl=?^&aCwAx@IN>{eevTm-)}25vFpO^c`=nq(Vclf-4&OkY-4qJG`jwb2}vPCC78Z6^6Kx-A*Ax ziruKCFhKD|lY6@nKnmB%H_}xM;f8{n8isL;VW?Bm&jR65C{f*K(2e%YBH&UsO12d` zE-}(9DY(rrc%ENWz*@_Z<*67!ZwhxQh2I}O{`&S_8pbu~xJM?dNqN>7rj3gPoWZnl zau$-P8Nq}G16hVtC?Y(f(YSbpd?zubU|Pcr@(iP$DsFEpac9{!4+6b7TcF0S8<%(X zA3i#ivaR3&gK-(SUakufaGzoEKVUmeO?I0hQ5H4M(6{M${CTTU<^C(H>XN0~boM+e zZ26=oh4<32-;lSlAup+>X!$l@ccf!~J0ml)vlQ;BXS*Vx(cI!;UDPxz$+=XU6lMK% zk{PrO&*OgCwSs`tTq|egV3bB*1499^bXslzK$7;1Rxd_xABrR&k~TpyE-ksqL$KV` zA(Y%PdOnef(UyX)F#0TDj`SGP^!Et!^p%%)=~RX*=RSie-=S6FnSQg9$XqomU72fU zB}oU$a4}IdPcZluBb8&^$&4OhEV9Roq#oh^33BIvstlPdVJ*2#nJt{cF5)rC1dUb+ R%cNzIK-QI{`WG~M7c2k( literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$76$1$1.class b/_tests/out_app/com/lanremote/watch/MainActivity$76$1$1.class new file mode 100644 index 0000000000000000000000000000000000000000..ba5646aba7805a98f405fa3a301ff96c400539fc GIT binary patch literal 1201 zcma)*%TE(Q9LK-Ymfb!UC{Km@z_OLLAO%Da7eQ<^Y0|0@gNk}smI)nbcggM+qyL8| zPkQl8Qloef-oqL2R2aJXENd zDJo!2#k__E++>*O1Yk&*mc>0!UtF0ZL@C>uaVA==uo(YKa$72HF=RXO^iv zE&fnQ<=4;Wmv5%}}1wxPm)v`ws}y3v8!8 zVknhwf;G{5f+2=ah#a>CV}al^MqB!^)Cn$y@Cy@P&@-5>w4{0y*|z^b{mggFN`5Hd zkIVBa&oQjLz=*PqjPeSG@)|FdH!#R5hR86|8!BBhjMc#HF4ky{P$R5kgH~x;=V+Es QUuz1kE0>E@lJ}MPU+L%}&;S4c literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$76$1.class b/_tests/out_app/com/lanremote/watch/MainActivity$76$1.class new file mode 100644 index 0000000000000000000000000000000000000000..aa71a31192ad1e96a85df748b02c3c463f9d339b GIT binary patch literal 1351 zcma)6TTc@~6#j_t)A7NLn#+S|)30kvoc|rXnMXZValHKBrsr!M@&Lj6twcy2+K6#2!w>`7Is^ zUicWib4ogBC>hOU@F!-JIVF;}^mHVlo0e@TNvPn49&R|RPnkYc!Y`sqLIBlt$UZ|L zrz2yNGn#4{oP(mH*8TS8s1%s%Y!ZJEB>s?39Glyk4ZshN0z#(u!$nriej?kYi9wuR_IA($GjHTnUDgaQXebk^z!b zsJ5i$LH(qRz5sei_LA04(oM2PZd(D9+gBjU9V;l8KV$zA{inR8Ss)4F3Qmz;hH6?7 zXqvePwYZBec^Tpt)G$1UpLDj2LxILsG%al}Lfm2v@^y0FzKRIl4$n>a%jF0gu<;j=Fwr+( zeDO_RNfd}iefK|%{DE)AeM${bF=dj@xy7Wdu~zKw@Y! zoLt<}ZP&~>z8Qb2`^H*)R_FGZ;qxcle;yvZ!65l-+zaYYKv>m7%DpgUZmj zu0PR5h1K|cX5BP=$~MAn?vFB5N21FLPM|?XqlzYk7+NajXQ03`1?+b&SUr_k0CsaZbj06&G-k;p|cHrai}|KRcOq zhH&Ijs+_SF-P=p1BqUEx011RYe=Z{~>=6CPTo`EsNnwq%7rhd5s`C z7;0=iXL>^7h>9p;`{E4@3Gw>N(;UE__FZnT9>Sg?K}e}Cf|2LhV%{DVaZo0u)RaMy zcIa3=(e143@NC@i;*&JDOjna}jiLQ0jms<W)VyZZ1hzboNrgw)KoZZVuJT7Wz8srlqH!_52Kv4gnH zpzglh{_*Pd?zcBT-@g!j8B=i=iT%D@?-K&1DibQPDV8s_YLCz1s#@d(E2unv+#AFRqHZJU2EL=;YDqCaI=u+jJ9_?s=w1=cJ166^46Yjg8{! zqVrQlzdDT5?gY(RX)Sh?Sm#Hu*f!)%T9G;EEzt-mLGLN3rTDkB8=!BCu@7K7sIU2g z;7WDqWO^kKI-TA@^C?`~!sS$FsC@@lXFEfkG|cShX%d&EDRfBF=$2-1S2B>4bc{QxO#fp+Gm3BBH286N8dWhdk7fEIyd7yNnB6OWL~;e}j)c z8sn?4CK8E8efNimzruJ5MiwENP1moL07)C4I^6jKRR!0sRgVuI^L%LCe zO9ocfpyPy!lREm4XUK23Z8s_2uvTgt+@l<2K?FkHV@R9D)hr6+c+Gkirx|ivQRqG2 z6uzIu0L8aNUBe*GsW`9W0)`m+5An)@+L z!{BlKJ&MDCDu%TU2E%;TfpWmx{sY{S!YA>z>?{lheed(DA8+3N{Pue9-AfGQN}_mKTyt zfwUe7*AE+sX3?7KabqP|^o6%s5iu<%Do*@I^>T5QA+s3PIYVDX1pG;>S>w@Dx8_qM z=ZHq&%2q_a8Xn*?jGL7%TV%?VqP$CpF`)!(VpbaJ9p@L}NjVN6XfbGaVYbGH_r<`g};fzyNXhGe@S!Wj)3uC(&Kg87%B1#)YWt%Xr@1xJ* Z2H6bV*PFOaUV(BFy2&$zJ6KS1zX8769WVd@ literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$78$1.class b/_tests/out_app/com/lanremote/watch/MainActivity$78$1.class new file mode 100644 index 0000000000000000000000000000000000000000..d16a69151cb15fa2e682515895d90ace583461b6 GIT binary patch literal 1623 zcma)6>rN9v6#fQqm)2DZUhpnrk+xbFuc+${3Mg7cDPsJ&Y{zzVnbqAX>Q58n3z(RA z|K$UiAQ&({fX`uK{N)=M&sYjXB(TZOnai1TzVDke^X>QSR{+OxD~3AMn`p4G4hBPq z7fjf`D?>gJC~iM=l~=ZhTp@crB_@S>oa{c8Ji=h8vWRr2Bfo|nj?U6(A%-|Zm-blL zi#E#V-oMXfks+H}PB^`6YCgErh;}0R>&q)0D`}wv2S_~?R3R{IPA%U{`lXOIk+E

=b`Eot{;?=3vy-A zr4N?sW>+d-^Y#L%xKwsd+eeC`#gWA^i^}r^5stVT)rvAWOXbUz-LSwPRJioGlU@k6 zLTb__i*5_2bjUb`93skYi8ta5o!XE0AAUZ0{(bhD_Bw0f9H_jS$?JL$395VETTv>I z4E~A;768=PRH+XVrSOjH@#L_~`NF%G7ZH)=;Tj=dw9tcIhK8sdJY?8OM_!ZdAEs2P zeRQK1D|MtIr8};5JG1(s(zSN}cdnE<7ZfQ*Q(j1Ztuisr!_jKgSV5Get12O_)`t~R zCte6Dp~nY=PTIWm)i|tSQILM=`6Q_<4RKWtiWUa-CAS78DU$QuDB_Wc>vZ8(Ajx3P z*OG|>gI#l5qv$4XE~(NLHWAE!&I)bxd|6<~p)QfouNXj<9!z>e>*#MnKiL85b&{>u zGns>*z%qwE!OYBH{YRQ&xJ0c%7RC!)rhXj~G$IM8)tjHvR$9eqW(sTy&2wnIJ%jDl z(T-{CZrMi-4NWrB*#8-wbI9JF_nv{h;CZy_bh70%n}#!u3%3>#?14!LULs?>!Uf|s z28=hz8*edeyhFiwPZ+NJ#dZ~WvJLdQ4dEK~+W+>cL!TzCzbuAvg9I7DD8`J~ALISE AX#fBK literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$78.class b/_tests/out_app/com/lanremote/watch/MainActivity$78.class new file mode 100644 index 0000000000000000000000000000000000000000..15267daef30431be97a3d44f28ae372d09b2e70b GIT binary patch literal 1846 zcma)6Yf}?v6n@?$?1r#N3|15`gBmT_hzp8>1htfMH9$)g0ef3Eudur8(%lWVKcG(g zq0_M!wcmQNM zLI}%CiYvZIqh^5;x1*~+j#Tgg5n z0z?&5BgRm(s9Q;we^%h0&rp}WtS{NaiDKg|$sPEEwH6OA%< zDcFrY3{90vq5O5j;GUN}cCwXADreKJ1rqKtU1* zUy;xHn+y>{w=9Nz&6|)MPHj4f;%$bIb0vlpR2gXnhta~Yqg=_uo@0~i8OI^l2RFMe z?ZtFzItq>2`Sj6O|J?j}_1c%KfBg0I(bpnYn}VY_MsRz+%P>&cS*iQAQr34risKAb z+;tr{iVgRXH9lQ>IMCG@0+BSH^n^`p{1cP?{7qXu%On)UbwW zfX{frw)Gi{XHwHL1{vyu4KN*TXsqvZgD?1|V+(wS6`V!(O9tn4jV9IROXJNzR`r`|_m ziT-8yfW8t*NZ(+b^bi{8S1$MpKaa^vgyfWZ7iBOP%3Yt&t{t59k zo!2Cetf2J{YSM}J#0gSIi+4I7qI*hhxsTKL&~xDq;#qM{Z(Vu?LrWq!25DjkD7Z*R z6=h1-k&wPaqx3!YN~|sZFVZs3vjG_w{uims h5}-?{Eo!h4F0*QcmqAJM(7dz4^ZHy?MX?e)~) zaR35CuVyZ$i>hJqMbqKw`>LZA(o?E#OlXe2q&p9lkx^w(8DtQgf^I8A6q0W$CMzL` zkO)ae7&1e2L0wWksQL7**#)jSbmf?C=*~EUKardXA%YeWQ5mghW9VrLWS184>uH8o zHiUL`h&U|c2#zvzH-WN?kzt58#2|nOj?0MQ1Vd;^Eh-Lw;MgQTU)5i7^kO=%+fFu& zlQ<=!OU7x$86x|SDJS!sQq+-{Ox7anGM5#h>`UmhW9i1cgfr+Bk&ux@ilM8KHiodO zY23Dz;h_wv8%Z>lSI4CWnoZ6G(a#WbH#gi@Pu=AY?(*BMl_%Tluice5+vW1s+82-5 zfQ+=qO4@-O%w&R~vc=rh=kAM_e=3i**4F<=xX&KDs~cY2IhkHzSjx)66b%Wn5EzWZ5jyhYU9l)Ji?ppuZIG;NkFjo;9{ z!`Awi8SqL;S6nx=qG?lMrnplu=VV;<`oM3M3$&*6XH8sF^tkE&D(#PzHgaDUwWt;n`%5Xq#C9rC`s5?5L6S2;YI~K zA`VFK;vi{RN)+W(=+fl05-};BGpeSV=NRn%z-T$DP%Yw+gc{T`?BDByK~#-_M9Q4E zq{m%&8g(KLOE`jO7>+(cKL6$4&d^XY|86Jh8IC;sG_!O4ldXmCcb1p8Z*T5we!ji5 zxc$|_*3FN$ZY{ZS6pbR9Bs_~_48Br9Fu3JNL@}rb?G#0qzjPS6Qd?CEo4Tq^bq7X8 z1Q-q$>eH+1@;q;Z8-93r9a|){qK&~}s2?a+!3OztyMzurNB^f3s(zJ!Fi>PZ*OYD% z$M^Iq=hcam49xAs^F(}ZbmFvxZk(aE=t?RsN61URzsOo&OxDB7Y+BJGO85WW7rW1A z$4#G;@B)ush%4HZ857aVaHxQuoaFhm8jmWv8$IxFrG5zmxIjQP(vyZ&DTZqQ;GPtB zee~d>gh9MSKIBwN(V`5k#nI;lACE8ZmC!LnW&G{hx7`1TgiCmZ!D%LQiVT(h$8|~R zGK0x{=0O~ z5TjEd3SkK<@irW!e-t#GWPx?j+cLWUHMk5hi%Nzs;31wZ<0-Fi4GnkK;U8N?aL9hP zE+^B>@HK97zAlT94foOMJ>l(I!Ksnf6`b`{e}lv8=pm)^t#(iK3i?*?qW5JwRxmum zjg)6$8EMLk@vB{1T=>1k1d9hjtU6TuLCyUo?xO&~j?))=D>Q=a8Bseif zxxcxFcX;|XEB%vHLI@d1!U}4HRn!Vu)C>2}F05lf*uaSJBVxiPz7*~wL-*^#&-g`n zfElt-1EKaWxI|R3KhZCuv#pnoKTr=l;+BU5G@=gr#3hj;uEFAop@%n%KNC5ESsFz{ GaQ_S3XF5dy literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$79.class b/_tests/out_app/com/lanremote/watch/MainActivity$79.class new file mode 100644 index 0000000000000000000000000000000000000000..f6ce80736af4d791500e8d7c4979e6ac54ef884a GIT binary patch literal 1515 zcma)6+fEZv6kP|(Oc_SNdcQ@*ify@61O*(tViB<1tihlUW|*G9!RbshGxhQVCcfww znD}Pmg9_WAJh^*aDvn5ab+s#Sz^ z)Iec4WVyMdZ8{#$xdBh!HUn!mIbsUuoE3;$BDfpv?qyJdS>Z>IGBl+t`5PL-s8ylq zsDsYXIA`86WrmsL*z_E?0*clr91)ymsE)-aHPoX)MWc?*h%g+e6rZ8av@GuX(azqZ zglHgE8B%;hm&--U{kGsvV1%)i@L0KQ7~2_i%NF??#5r)iyBc<4mx|pw_Fyl=&W#Wb z`>sR(cc+CP36rSHPj7y+P`WzfP*TUbR0tTANX7t_gluE-``KRHNyn|p?eV+@BkDsq`Dqa7ML&?R+toMEtXK9aJr zu4Y9l6Ea*HoNh*izJhaFau0 zsXG?W2f}s2IK$Aea{uY~#l>%r-mg5kxAJg7_U4?9^XOme&G8Od!*pd%B|=36rFN}S z`ZKW+pHz_|HfzHCjhBl3A8F!~#JbAb$4j(P#rnz@T5+>by1ycW}Oki3!N!%r? zmT?Q7#Rr6R*}T4a?GgnAN;#J8`XsRt9?ZH~9b@vwXvhoeCXHo&aCQD@9ETi-d;PZQ z``o8_siG@};R0A=qrAmvj;iQahXJx)q+Ju8rA14$yaY?Uf;vwp(g?j3TA@6p_Ym}w z|6{U-=-WhM5o{ToYThC|RUO%qnF>X=WtOpHEA}m6f4U`dco|1VS|Tm9jIKJjy+OxR zqP6W6I+t+b>J!wb<%h^=@;N&%lTl|==p#TfeKTq){WFA==h&~jK(jKBHe~_lmCr~i uA2FbO!npDU!{kd>^$(;}^l7NZB{EbYjS*Tyq?l2R(=JkCN?V$R;`0lw literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$8.class b/_tests/out_app/com/lanremote/watch/MainActivity$8.class new file mode 100644 index 0000000000000000000000000000000000000000..557b8b9ee409cec46676323e094d7fae477199ec GIT binary patch literal 556 zcmah`TT22#6#iz{TwS-kbiX2Epa!iE5kV1z6a;Ez;rr}5=*T(?dolW1K~eP359mil zXDP5Z2WGx=&V1+o_5JY);0SwJXwVI$EG!_+P;vcEQ9&~IFN5dwz2vaouZS0a{l5diY&JXTXd&&R+ literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$80$1$1.class b/_tests/out_app/com/lanremote/watch/MainActivity$80$1$1.class new file mode 100644 index 0000000000000000000000000000000000000000..8af88e073f9561e7b2f88ef99b5259861efd554c GIT binary patch literal 1020 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 Wqcj3f@Ql0+VQMw%C=ptVCw~LtG&s}% literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$84.class b/_tests/out_app/com/lanremote/watch/MainActivity$84.class new file mode 100644 index 0000000000000000000000000000000000000000..222ca3a92822ef9e0ec386c5920e1ec4fab2427f GIT binary patch literal 1139 zcmbtUe^1j;6g_VnD=P)Y6a@S=p=#R!0|Z4eCWb)7fJTQX^4DAU0)?(!+BXbe#cyH4 zl$huT@Ix8zD~n8B!XGy2yZ7C9-nqBu-Pa#KzkUa>fJZr`kk*hf(1R?)q#M@DJ`W;M z52Yx7;L_bMZ*nhq>Pqj(lgH-L0z+2rd$BpoFtKqFepw~xHIReO(0jyvGvIZ>P}n%& zM_i@aD_3OX1$zn7Fwn1%nnE6mW3_wGKwiaiD(3U5@O2b$NyB9W!x&-6pHsc89tc-b zg^#_!lTR4Zmc6ZG6k{634P3>wKj3GXDV-Ou)*JFT!N1pW12;7k4cx*6!)Ui}d>)4Z zp~LC{gK6z{e9c)2%l28QDLtPAY%J?Aaa+S319xFD6uXgj3eC{RU01}hIkz}VQopk< z*1DsLwx)j-@h`yM*5EKqUsR5{9yFTr84qf{h!}SNqnge$?^X~)W+kjqj|^^jfq2oZ zS4FhNt3E|?6>l%#vKf)Dg+Wpi!?4wzroSS&dr0E9ck7j~8M$K3Q&dBpV$Y}!qJ*n~ z>xVHlpOJfLvRiyP`DtciB+LObK{)3vu5jP)Q8(TdOGSj5TnTrm`>kqcn3 zk;&)PZ2-tpuP2uJJF#>J=~|}f9Y%@l6nXPxd&rJEr52bo)q>_sx6tQ|Wm*_;zF_DR ztq9 z1E-i&w5f!40BNG#f~LKJrM<-*t)#&$8s-zwJ^GaZ8EWxGERk2BjVhOVY>Gb2>c0Sf Cfg4Hy literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$85.class b/_tests/out_app/com/lanremote/watch/MainActivity$85.class new file mode 100644 index 0000000000000000000000000000000000000000..60d828bff1dc675460ea682cb37944f74c44b303 GIT binary patch literal 1027 zcmbtTU2hUW6g>mT7FY!qKk8?(r3#dGTVoRwjEO;;V5oh-5MPI73WLjRvpZn?Stbx0 zAN&FSDB~S!QbL>X;3m6gX7l};LWaM!{; z8|%2wuzsDt4^g0q9dw5b`EupL$yiIDPI^{P;~^edcx>YdHW-T6DJ*7$A;UdSL{aJB zaG!GWxx6|lR}a5r;wquivGA0^<*FA3vgdk%(n4wXo#cMdZ_*?@<(?>=sD>}SFD)6- zZxJ#y|HIE>c`6--L?h@?@v<$c#K-ZdE5c8_>(ffAE&Gb=aY$n;xUj&mU2d(gTW=cK zbUPS_o;Z?5D!-WAJyUK9_+EK_5K)&L3q1&WHfq?V<(`brOp6|gf3cnNQX-AK-Bgr` zhR>r&L>8z<8!K#)^im#Cq(07q`T_A=&a^W?NX$mO|A1y#ZXb@C4OXyg#bm@`k2WDk<5zuNByMF0Q* literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$86$1.class b/_tests/out_app/com/lanremote/watch/MainActivity$86$1.class new file mode 100644 index 0000000000000000000000000000000000000000..421d3d7c1789ba3db0b83b4e36eb43ca6a6a3d25 GIT binary patch literal 1897 zcma)7-BTM?6#rd7ZjvsN#42j5MH*-lN&}UC*fc7nRMAjsgH-VIvbjwbmb-NKhU$yj zu~x_N%_n{F!Et#KS$GKD41>0}nsJ5l<*KJ;=7!LAB{L%&HDPOK-O(Q;&Yn(;F?8#S6BuEz zun&u@i4w99MuZ`>F5HA7?+o$6vRD@;UO7|LzN5<72rTq)JZzyCQHJQY!tBzrv^9l3 z?R*cnwz=x`K*#!<3+{S-pAYEWEz6dB#RZIj+)3*#6Y6RFx7- zCY|T@ZYr8f+5hS*0+jbkDJ!9?KAm>@RZ3bY8L2B?$--M^YFX2Y5|?*H5XgXozWlyc3q6oR z2HtErjxs~0rMA!7a5y`fxs4IQe4wQ0r+I9FVICdPs2R%ut@H<=pF#)Sy?BGx1(J@@ z+G*aThwp-=kKYAPZ{Wa>^on7Tp53&9e~33p?m(1wlmdDh<6p>>PVsU24%i*U?xSyE z15Y$|PuB2M{26-CmT%%HNj0Q4F=F;Lj75{*QB;!SXKHxvYh>;tx6m++ZQzB5L{26f z`WNHVtcF)>n7#S~Vog1Bw27iY+fhe5L}bBlVuXK!DSiu!{8I>i8)g0(migzn&cDD% y{7bw|795>_VQRRCNW4>b@Gjn?wTtGxz!FIVb(sXZOxDbmgAGYRuAzeE?(jd_wEfNi literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$86.class b/_tests/out_app/com/lanremote/watch/MainActivity$86.class new file mode 100644 index 0000000000000000000000000000000000000000..33ad520a53ab5ce7d63e191bd8052da89ed5212a GIT binary patch literal 2075 zcmbtVZBrXn6n<_JxFOk=bg89Oi?mH`-r4}Rl#+_JNGKQzB^4S_>t?fsh0Si<-C*n6 z=tpN9Uq1TL867_3l!7|?1Ngt=i`ye_x!qDli=}vTz;dHK@ zeMTe*O6Wp}A-Jg+QBx^v403K=*;GWT)pXvqb#v9Tlq4L&VTO>ftSGipb{M*AwpCX* z2usB?j7T^lLUsv5Ln&%T2t7E;@tlNX=w*l;#Gfm!YpP4Iuj;1mjx+dU@x>teNKwnB zAf9Ik-_sPgYHN4xsu{#dhJb(>!iyN-I3?jU&M+Krwb>cRGAWQ%TxW>JRvNZdOPh&5 zgFc9}1f{mOFwP;y5tooalHrhtd4Hc2wNfS6qp{|o%}?rSyn@yntHN)VuHblo>kuZ)|$+>7*w>eCx?~Uxf`1t$n zCl7xRy_=PA6LWMJ>Rq`knnG-7*GHn9VwP-6FQqLfeS>sEvojpGs2J^h>3m0rLYPNh zoTJ+eW9{>iPo~9=7eiRY62~101uWB%Zw5sruUHOoytk3#3suupiiVbnFLS)b(BmBo z-AYf-P2N|vimO|usLwkR?&948)?OMC1d2Vr!IY(o_x0p(#A8xocKQf`tnCQI2eFFfxoZwx~|w8vZuh zk)};kvnLG2aWn@5^gZYSgMvULB0dWMNgDc|q?ztX`WVs3@X>t?D#;RQ!z9HlIgv>2 zfF)8p;ED4)2q*diJLpdALf)pg3>vMSB*AUmBi)By`nT$>BF>)_Ma21x|B9Z1Up}5M z1mqL>LWlf9zR;O?2%g_Ve=aFUNe};om;6{FjqM?oJc{8*xHy}V$NYP^I)3t798Srv z$=CPr`WC_|`G!10>R6y=pZf*#1%kJWg-3XEX$z5@ctLk}au08B3y`S5!3u#Cu!kWL z>`nCZ`$+N!7~>z{I{y$^{t<5RkFml(L4|(}hkpr|e}zx^H&`RTegvM90nX8nO>yXd kp%08xR9aRf__0A&J{TyI4A9vz@g8Y1JrhM1*L+R<4f2&NXaE2J literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$87.class b/_tests/out_app/com/lanremote/watch/MainActivity$87.class new file mode 100644 index 0000000000000000000000000000000000000000..b7ebe03b658e7d4fc2967a7a311b42335ece224c GIT binary patch literal 1395 zcmb7ETT|0O6#kZ$hPF`(auK{C1WCgscm*w@h&Xhn$O8=TAzj+VG+~l0=(~SNhr;NC zKfoX5cs2~B1H(kyY0qBH`ObH4`}@z&UjUxrT^3zPX-MnnMuuU+4H~xR_#tlulG{g) zbnEtpBm5OtibEm47>f%G8Ce&RG0!kwNzyMV2R%Bn$T8#(9nYvce%0e4!)&6lv3(S* zpQ*<HBI0h~S97?9 z0S$vXhA_-f*mn*c6>`nq+}-CcL1vbOFXS>q$}H~WFoIDHcXZsvJ%-_HyfJ9xT=^wR zX0c65(n(Co+4Xoy`F@~d3=bK4WUwVe;nx@j$l!v;*(vExz|b(Ma!RQ&M8~43lOX?V3nSWd)nt3YwwIKL`cY*Eue8s;uO2&3C;ZqGE4wSr4ij zUNVd&l}bkmOT_IU3>pWLW`SYvpUQN#aQ~HC6_Q@|sc@^F6Gc3t2rnj4!&`<22^~No zU+MvB`Y!5z8hfM*1@#^PBx#;wNmCk2dWGm=>Z0EeY?AY|dP1_B0<&gX(5%@O z^43VYgM;QuGB3>zELZkw3xh6Wl++IBj~{ zn;)1;;R3NAX+msaP$ONE6WS@EJdg2TV1Z;Bi+F|Cv>K%w#a(?&I$h4>DBd?%$z=Zm D(J^}s literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$88.class b/_tests/out_app/com/lanremote/watch/MainActivity$88.class new file mode 100644 index 0000000000000000000000000000000000000000..f82ce84b096772e3460ab2180c8a9319aaacbe0a GIT binary patch literal 559 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 S>ehu{4Ba?hT|S=2D&5 zfgH);zI?F5kPQ0LFE5U*4_ z2BwkKkTa1-fuT4lKSP?^w($M(-hP8R+N?}&soK#n%TO4%avdtgEk`gUnr@dM+mcFL zghNYsx4#c@FH{W1jT?HlIFk`K|9>#sQ8o%ZRkq{$QuW#*=(}ALtI@YJRw$iri>oWH zgu`H-D`*tCz&LK y{y}m9<{!UINM7i*N3a)U#%v?XqklrvzYxbFabj4)GGT&7zk)T=42q4a(fI*kJ$wxS literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$94.class b/_tests/out_app/com/lanremote/watch/MainActivity$94.class new file mode 100644 index 0000000000000000000000000000000000000000..f9415efb0100c20c86f1a0bcaa81464e264dd8c4 GIT binary patch literal 647 zcmah`T}vB56g@XdvzyIYV{B_}YmMm&NrbKs_Cb__gcb_13QFE5vx6DCnT6d+#GfU! zwDh4rp#P%K{*B@tT2S;M19LwPXU@HI@6W&Ae*oA)yM_|V9x5Roph|cpvq_u^ldDN) zReT|=9LI-3n*(X}Oxw$7cZX25V_ihsg!W(_e=mTKnuj1n9U-A{E@r}2IE#-)=So^u z+t)_hw}f)1I}Gp;iyj&wme3@$=IImaLP}K>(VN|E?r5_!zoqWb!z03mFiD>2B%Wz? z5f9l!N2Z@@`DvgFtBlGCm422e!s0+1^>I2Gsr*!oQbxS&AC>T=Gq@+T*BugqlWdwx z^c0*v*cSfdJq0QN$vg0fXvF1j!Fq-N#VbNn@R7wax81AK?ilR`3hZc+7 zE68GZdPj>l>w~ZiYBbz-dEq6#bu<}$%u$DR;c8CGCMR=H?y!iN%3b1 ziqePvfc~iB9TXJ%kb$`$hcoBix%c+&`Ub!*IzCD$d#HqXfGXjo%w};aOs-~`Rq>Uu zavGlsZH}eY3vItd2YZC7o$4YQ5IUn}{KEh>_#T1~b%ccGrC118;UYepTq(f(k-9lh!cx-@Q|=0Op<3hi5FU3#bY+n znHi>9eje$KFntmm46bGlo2ocO(kr0NB4vddt*Xyp3QTq-f72Q z`*(u52$!BK~EhXnoC-$DH!@V;`!KVn;D55La#5gz~HN9-NH t*8c|jiIuc9pim$oX(16L;d0qd=t9{gyHk+2FkTuj zjL~>afNtnM-C2%bqcXwP%Tg==ej1dXcld=paKRUCmzip#iD_pN2+g48bj9 z&yX25lgk@h+!PdT(y}cv%}^VQule9dKtWJLGeQg*tE1^^EHp z2hzodHhGF04B-p672#U;=4`>rXSwS`JJbf;W(a(L@%qQn+i&js`iy!VDK5H$vrPRJV<1C6syjLD-OM;Aj!~OEg2CnI^@Fuh9r}Q z8OExoBOm>8?xsS-3?5_TP{t=LezXt< znK43Wp^l+ZorGTb*D}Cv(-0lu8vp6%0#XhWU zf3zm1Nz*?yrjMivP5Ps;sS64|YHMxi!@hp^ms4Eb4uT?0cRGp9#yc4K}*Fjg%jA@)2ZM-hLzcO!fzgIQMCef`B3-W2P>CuA)rqBJGAyr}?}7?c zf*M(!^$djzMWvdQpjJa20t`!Igs&}Tnp8R?W-^q_`po2;)ddwakp6Blb~?@o6(nn* z;vqu4*A`Z7YnUpk;$eooPTlND6RV+aV_m%u^=Q(t37e_Cws3mH;kdA!-4+3{9O`-H z0+{C&DkwW!kD!Jvc!YXLjxso88)I>zfxD_bZS6154e01}@Pwq^g zx;d4&ed&WT*|aXngKmb>s*d@s%65ADpJ%?c-ft(H$Qi5LTazM&q#8 z2%EYSw7~?g8#(#;a#{l<=|6!8n?t_> z#7U0QS0zao$-J8NXW^>Za2C8~0!z-&7Q+#Gdr5+Sju+@V2Yy#cTBC Mm*+^zXDBWH0}r)RF8}}l literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$98.class b/_tests/out_app/com/lanremote/watch/MainActivity$98.class new file mode 100644 index 0000000000000000000000000000000000000000..ad4e948de41513abde0c92a22e6e9709c40889da GIT binary patch literal 1033 zcma)5ZBG+H5Pr7Q9z9N5u!#6Zg#v9suJ}Sl42h|jG$~>N;rnv8mc{E{bGI$}vrGVu zAN&FSDC2BvfnXZEUNEMl2*9+(3$9&I?;^z*Qt#p%(5j z*WRJK&82$dY1x(fOJV&bLrNdYxKLr3ZCvNSVE{%Qq+v6pyF4gJ)$VA9=>}JR6iVMc zmVQ%ccgvT0Pkh!JHXPivaLYjkS%&Np?{dSb>FyjH36Ek^uceZDlVPM-+P5)*+ZJ*T zCUJ*hYDiiJi%<*zVHZp1=$b4&Y<>`k9`;=a)40bls>59!N!4V?QNRU_zLk6*;Gu;_ z4rYw|C7y$@B!#zZJjSerIR^#IGvu$U7{eI%JQ2r*YNbLot`@H^^1tLt`xX`%+(9+G zP-&sG`&RNGY}RQLedL}f?5J8Gy-y7p)3JycHvb21ko9WoO8X4STIdUgOhYR1zSBAo z(Vi(Sb$?ej71y1JbSv!RGRzmxTQP*=M%|>fcf(HPiFeYZ8oxY}E2c99xTU-xjHzGS zLLY{{gQsSE#@kWYYU>YNnpXC?Idw&Mtpz-eMQq^(!_44DLpV_SE0sc?2HOF{0utG* znQwq3y&`&83HmcAk}Q$7NOHtj%1ftU<>gaY1KN+yOfttpbQ*RVu-0$JKE;|Z-M zc=d1aWch?*Phg#4{0viPxc?pbixf7w!CptsennU-y+kf5B$G6Mt9VA*1o;?d=3Ai0 Izm`h>0neie3jhEB literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$99.class b/_tests/out_app/com/lanremote/watch/MainActivity$99.class new file mode 100644 index 0000000000000000000000000000000000000000..3fc2a2aa26f920fc2e96a487fe033dff72970edb GIT binary patch literal 5444 zcmbVQc~n%_8UNk)2Hu;w&!}TYGpQ1y!~#Ka3r2{EOVp48TD2yU#AF;^WCUjD%%Cwg zhPYHT;+_R1?uya43k>4cHq|U$lK#=2o}SY`dYFOqAJ1t{d)g!?_Pg&5!@x`eEr-Xw z@4oMT+wWWM<&$r(Tn8`(f3QM=tiYln1*r^U+`g*ZN|)EKSNVc^?rK-iU7lO)@_1*u zgPv8M;F^qS(-=~N<(@#s1cuQ?{m~Z)0jdToYz%`|xhgZN{rbzgzsTifV5Q=#reP57 zVNk`_a$g|GU@uzfTICXotjJvy^n1K33_e3N423;PS?%)^B`Xvx?$zLkv2gp!bg?)> z!+m1WD)YVpS2V75W+*Mj=hX0~*rtAj6Oz!Sk1|)ZHW^^)Zjv6MURO z&dge3!x&^Jcu2!o{E#8NKl>TD%k9YTGW&N~R-*MbWFcF@!y0lhu9udk zd&nM7U`|zaaE+m6se)XF5k0n;RI_S4m1Vl$hVe*KF^TwuFVuz)9_+lft8@S5t{Vr^ z#iuD69zh=2?W(TUy=4sJG7}X_)G^AuK*gg3OTOTgFE|x2jLaEz6E_zK9A;~H5_1@AQ4dcN4xTyy2PZMd0Ct{+r%>1f+2m=0j?kH|YabY4ItIFim$9NJ^rnhHd2~R5 z;_{aHeV(#hUm*7>npcwR6?n*N$^6=<^kz)7p&S*WR*|1G`*g)y-7Y0yADy$9=x9)Odgs(^squ6ZH@N;bLsSQ&n541Lz7WZ&V5{p8cEgH7s zO$M!7n*~OLqoz}+qMqTw&b`fD8+V0wZ;Nbsv+MB5aO27F&TSo`T2Z~*8;zLV!H{Og zY`AW7r2YuSa-RSfl6Gm>EqYywyV4iXRqUl*;ns`hmX6SsK3fcTzD+b{k1+F+(&CHS z+VK7ZrsEBocS-q35vt;fTS=fm&SlE=h`CJiU? zK9!jjI(2Ureln#3Edc^t2kp+in^|I?NmO(b>|6?aQ$K8s^T2OSZZy1 z={H?`jKeH)wwd_E3X6&h44%k_OI>H*H<_F6CeL;rKHGKnSV!ns*Y!4v@Xmc3Bk!Iw zvF`|-N`J;P*CQ;tbTYDWN4V~^NP@bZ>5t4y|Ki9ll0x+19VaMIh&a5nK78gKL$ynk z!)Cs89XTC&b9ZO^dkUHvhV`5p=Dgz8tAie&S9IG}4I#9}!S#rM>xBWp6_@gh%l*F9 zMoEcVjMj=Id7+?vfQ50A4OehY6vpceuKtx0g|ReIhk-3+Em3fj;;6?{-IbET*T3v! zf(sLM8OTc35~|#@>A*{17J0mSNln#q-M?6Pm=3;+JS)7eV2z*VvcHBJ^q@sSm%Dx41V z?ZFu7!eESaMKDIX6wy6Nq9+}{pz)V9dy+<##+>Yjo58Y2HbcoC*9@NRuryJ_d$`HV6o(-MA!0DX`(dXbMfAe@k?7V!9KAClj)t)V4rHv2e)9F{V|%i z;PDVeu)G)RUvkHA5mrPC|^oGSlNQAXT+8e<~oJ$F}e0Y3xfHIEaa3&aF5d_x8a0@o5&&x`zb-jV-z0<3f_z2Y|IqF z-hQ6qzgwA$rZU5fG-5_95zZ||4ohC@!}&^1zB(@7>PTsTCXzt0Q0~cjQFYCH94bC& z6c62B4I4tBfWNXd+mT98a;Mc{b1JR4DuVw4CHpA3T&}=nN_{E@Y!Zs77(51vPlts+ zj#T~xtb8U$@!1&5=U^N!#B=;2pN-#TJ4;Im3>#eE@xj<3`$~PFvX3((+9~*u6 k6MRaeg^szu!S84`n&zVGi=W@qmFe?TD_y+JpDX6@Uz(0PMgRZ+ literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$Act.class b/_tests/out_app/com/lanremote/watch/MainActivity$Act.class new file mode 100644 index 0000000000000000000000000000000000000000..8045547e5bde62776782e89701c6a9c31a52fe40 GIT binary patch literal 458 zcmah_O-sW-6r4@crj4;pYyIlULl12gBj~LnNI?*)f|cGkajB{429j;XpXH$l9{d5G z{rETHTM^C8!|uF&J8yV1FP~4(01nV}V8FCtxhSB>;7$0P`!Sbe|00-(P%#t_BN?e9 z2D9B6l~F?3hT~!hE<-C!rkb6KX`+OG$5nXapYcc@hbo#!>b^wCHBaPL7^J(bU0Lb+7=uFzeF1(>g}%r}(HcT~&|8fnmvfmN&#IwV!X IIyTY#0@6TfqyPW_ literal 0 HcmV?d00001 diff --git a/_tests/out_app/com/lanremote/watch/MainActivity$TabDef.class b/_tests/out_app/com/lanremote/watch/MainActivity$TabDef.class new file mode 100644 index 0000000000000000000000000000000000000000..07fe68f63efc3119527e1bd5b0680bdf314fb996 GIT binary patch literal 634 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 O#V>q9=puWxX8sRXDXi=O literal 0 HcmV?d00001 diff --git a/_tests/test_apk_contents.py b/_tests/test_apk_contents.py index 40415a8..757fc60 100644 --- a/_tests/test_apk_contents.py +++ b/_tests/test_apk_contents.py @@ -23,7 +23,7 @@ def _latest_apk() -> Path: (ROOT / "dist").glob("*watch*.apk"), key=lambda p: p.stat().st_mtime, reverse=True) return candidates[0] if candidates else \ - ROOT / "dist" / "ykxmz-watch-1.9.0.apk" + ROOT / "dist" / "ykxmz-watch-2.0.0.apk" APK = _latest_apk() diff --git a/_tests/test_image_modes.py b/_tests/test_image_modes.py index 91f9525..012ebb1 100644 --- a/_tests/test_image_modes.py +++ b/_tests/test_image_modes.py @@ -104,6 +104,35 @@ def wait_geometry(win, agent, timeout: float = 15.0): return None +def show_and_wait(actions, agent, image_path, retries: int = 3): + """显示图片并等窗口几何,失败就重来。 + + ⚠ 为什么要重试:这个测试开的是**真实的 Tk 窗口**, + 在全量套件里跑的时候偶尔会起不来(前一个阶段留下的窗口 + 或进程抢焦点),表现成「全屏窗口已创建」这一条红。 + 单独跑两次都是 19/19 —— 典型的偶发。 + + 与其让它偶发地红(那样"全量通过"就不可信了), + 不如在这里有界重试;三次都起不来才算真失败。 + """ + for attempt in range(1, retries + 1): + actions.show_image(str(image_path)) + pump(agent.root, 0.5) + rect = wait_geometry(actions._image_window, agent, + timeout=8.0 if attempt > 1 else 15.0) + if rect: + if attempt > 1: + print(f" (第 {attempt} 次才起来)") + return rect + # 没起来:关掉重来 + try: + actions.close_image() + except Exception: # noqa: BLE001 + pass + pump(agent.root, 0.6) + return None + + def _read_geometry(win): try: if not win.winfo_exists(): @@ -141,9 +170,7 @@ def main() -> int: print("一、屏幕中间(默认)") store.set("image_display", "window") store.set("image_timeout", 0) - actions.show_image(str(image_path)) - pump(agent.root, 0.3) - rect = wait_geometry(actions._image_window, agent) + rect = show_and_wait(actions, agent, image_path) check("窗口已创建", rect is not None) if rect: left, top, width, height = rect @@ -170,9 +197,7 @@ def main() -> int: # ---------------- 2. 全屏 ---------------- print("\n二、全屏") store.set("image_display", "fullscreen") - actions.show_image(str(image_path)) - pump(agent.root, 0.5) - rect = wait_geometry(actions._image_window, agent) + rect = show_and_wait(actions, agent, image_path) check("全屏窗口已创建", rect is not None) if rect: left, top, width, height = rect @@ -187,9 +212,7 @@ def main() -> int: store.set("image_display", "custom") store.set("image_custom_width", 640) store.set("image_custom_height", 400) - actions.show_image(str(image_path)) - pump(agent.root, 0.3) - rect = wait_geometry(actions._image_window, agent) + rect = show_and_wait(actions, agent, image_path) check("自定义窗口已创建", rect is not None) if rect: left, top, width, height = rect @@ -212,9 +235,7 @@ def main() -> int: print("\n四、只填宽度(高度自动)") store.set("image_custom_width", 500) store.set("image_custom_height", 0) - actions.show_image(str(image_path)) - pump(agent.root, 0.3) - rect = wait_geometry(actions._image_window, agent) + rect = show_and_wait(actions, agent, image_path) check("只填宽度也能显示", rect is not None) if rect: print(f" 客户区: {rect[2]}x{rect[3]}") diff --git a/_tests/test_lan_optimize.py b/_tests/test_lan_optimize.py index 112aa49..53f1e67 100644 --- a/_tests/test_lan_optimize.py +++ b/_tests/test_lan_optimize.py @@ -148,9 +148,19 @@ def main() -> int: check("MainActivity 的默认中转是空字符串", 'DEFAULT_RELAY_URL = "";' in main_src) check("不再硬编码旧设备地址", "192.168.2.156" not in main_src) - # 旧公网域名只允许出现在注释/文档里,**不允许**作为默认值的字面量 + # 旧公网域名只允许出现在注释/文档里,**不允许**作为默认值的字面量。 + # + # ⚠ 必须先把注释剥掉再查 —— 这条断言原来直接查原文,于是 + # migrateLegacyRelay() 的注释里引用那行老代码 + # (写的是"老版本是这样写的:private static final String + # DEFAULT_RELAY_URL = https://...")就把它判红了。 + # 断言要测的是"有没有把它当默认值",不是"源码里能不能出现这串字"。 + import re as _re + code_only = _re.sub(r"/\*.*?\*/", "", main_src, flags=_re.S) # 块注释 + code_only = _re.sub(r"//[^\n]*", "", code_only) # 行注释 check("没有把旧公网域名当默认值", - 'DEFAULT_RELAY_URL = "https://' not in main_src) + not _re.search(r'DEFAULT_RELAY_URL\s*=\s*"https?://', code_only), + "赋值语句里出现了公网地址") # 单实例锁端口可以被覆盖(测试才能和用户自己的实例并存) check("instance 有 control_port()", hasattr(instance, "control_port")) diff --git a/_tests/test_package_remote.py b/_tests/test_package_remote.py index f1eb582..fd24ed0 100644 --- a/_tests/test_package_remote.py +++ b/_tests/test_package_remote.py @@ -26,9 +26,9 @@ ROOT = Path(__file__).resolve().parent.parent # 被控端 -> 一个 zip # 服务器端 -> 一个 zip # 控制端 -> 直接给 APK(不打 zip) -AGENT_ZIP = ROOT / "dist" / "ykxmz-agent-1.9.0.zip" -SERVER_ZIP = ROOT / "dist" / "ykxmz-server-1.9.0.zip" -WATCH_APK = ROOT / "dist" / "ykxmz-watch-1.9.0.apk" +AGENT_ZIP = ROOT / "dist" / "ykxmz-agent-2.0.0.zip" +SERVER_ZIP = ROOT / "dist" / "ykxmz-server-2.0.0.zip" +WATCH_APK = ROOT / "dist" / "ykxmz-watch-2.0.0.apk" TOOLCHAIN = Path(r"C:\Users\shu\Desktop\deepseekagent\starklink\toolchain") JAVAC = TOOLCHAIN / "jdk17" / "bin" / "javac.exe" JAVA = TOOLCHAIN / "jdk17" / "bin" / "java.exe" @@ -89,7 +89,7 @@ def main() -> int: for label, path in (("被控端", agent_dir / "README-agent.txt"), ("服务器端", relay_dir / "README-server.txt"), ("控制端(旁边那份)", - ROOT / "dist" / "ykxmz-watch-1.9.0-说明.txt")): + ROOT / "dist" / "ykxmz-watch-2.0.0-说明.txt")): raw = path.read_bytes() if path.is_file() else b"" check(f"{label}说明有 UTF-8 BOM", raw[:3] == b"\xef\xbb\xbf", raw[:3]) diff --git a/_tests/test_relay_default_blank.py b/_tests/test_relay_default_blank.py new file mode 100644 index 0000000..2d76b34 --- /dev/null +++ b/_tests/test_relay_default_blank.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- +"""钉住两件事:中转地址默认必须是空的,以及老版本硬塞的地址要被清掉。 + +== 为什么需要 == + +用户报过:「安卓端为什么还是默认填的我的中转站,以后改成手动填」。 + +根因是**老版本 1.5.0 把作者的域名硬编码成默认值**: + + private static final String DEFAULT_RELAY_URL = "https://relay.xxmxxs.top"; + +第一次运行就存进了 SharedPreferences。装新 APK 不会清偏好, +所以看起来像"默认还是我的中转站"。 + +这条规矩(**对外发布的软件里不能内置作者自己的中转站地址**) +踩过一次就会再踩 —— 用户明确说过"这个中转站我就自己用,不对外开放"。 +所以用断言钉死。 + +覆盖: + 一、默认值必须是空串 + 二、源码里不能有任何"写死的中转域名默认值" + 三、必须有迁移逻辑,且迁移清单里包含那个历史域名 + 四、设置页存在(用户要求各种设置收在一起) + 五、其它客户端(Windows / 服务端)的默认也得是空 +""" +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" + / "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(" 中转地址默认必须为空(对外软件不能内置作者的服务器)") + print("=" * 60) + + check("MainActivity.java 存在", WATCH.is_file(), WATCH) + if not WATCH.is_file(): + return 1 + src = WATCH.read_text(encoding="utf-8") + + # ---------------------------------------------------------- 一 + print(" ---- 一、默认值是空 ----") + m = re.search(r'DEFAULT_RELAY_URL\s*=\s*"([^"]*)"', src) + check("能找到 DEFAULT_RELAY_URL", bool(m), "找不到定义") + if m: + value = m.group(1) + check("默认值是空串", value == "", + "实际是 %r —— 对外软件不能内置中转地址" % value) + + # ---------------------------------------------------------- 二 + print(" ---- 二、没有写死的中转域名默认值 ----") + # 找所有 "xxx = "https://某个域名"" 形式的赋值(非注释) + hard = [] + for i, line in enumerate(src.splitlines(), 1): + s = line.strip() + if s.startswith("//") or s.startswith("*") or s.startswith("/*"): + continue + for m2 in re.finditer(r'"https?://[a-z0-9.\-]+\.[a-z]{2,}[^"]*"', s): + # 允许出现在迁移清单里(那是用来"清掉"的,不是默认值) + if "LEGACY_BAKED_IN_RELAYS" in src[ + max(0, src.find(s) - 400):src.find(s) + 400]: + continue + hard.append((i, m2.group(0))) + # 更准的做法:把迁移清单那一段排除掉再看 + cleaned = re.sub( + r"private static final String\[\] LEGACY_BAKED_IN_RELAYS.*?\};", + "", src, flags=re.S) + cleaned = re.sub(r"//.*", "", cleaned) # 去行注释 + cleaned = re.sub(r"/\*.*?\*/", "", cleaned, flags=re.S) # 去块注释 + leftovers = [] + for i, line in enumerate(cleaned.splitlines(), 1): + for m3 in re.finditer(r'"https?://[a-z0-9.\-]+\.[a-z]{2,}[^"]*"', line): + leftovers.append((i, m3.group(0))) + check("除了迁移清单,没有别处写死中转域名", not leftovers, + "还在这些地方:%s" % leftovers[:4]) + + # ---------------------------------------------------------- 三 + print(" ---- 三、有迁移逻辑,能清掉老版本硬塞的值 ----") + check("有 migrateLegacyRelay()", + "migrateLegacyRelay" in src, "找不到迁移函数") + check("启动时会调用它", + re.search(r"^\s*migrateLegacyRelay\(\);\s*$", src, re.M) is not None, + "定义了但没调用 = 迁移不生效") + check("迁移清单里有那个历史域名", + "relay.xxmxxs.top" in src, "清单里没包含历史域名") + check("迁移是 remove 而不是覆盖成别的固定值", + re.search(r'\.remove\("relay_url"\)', src) is not None, + "应该是 remove,不能换成另一个硬编码值") + check("只清完全相等的老值(用户手填的不能动)", + "equalsIgnoreCase" in src, "没看到相等判断") + + # ---------------------------------------------------------- 四 + print(" ---- 四、设置页存在 ----") + for needle, note in (("buildSettingsPanel", "设置页构建"), + ("showSettingsPanel", "打开展示"), + ("settingsPanel", "面板字段"), + ("showOnly(settingsPanel)", + "面板纳入 showOnly(防漏藏)")): + check(note, needle in src, "找不到 %s" % needle) + + # ---------------------------------------------------------- 五 + print(" ---- 五、其它客户端的默认也得是空 ----") + win = (ROOT / "windows" / "lanremote" / "server.py").read_text( + encoding="utf-8") + m4 = re.search(r'DEFAULT_RELAY_URL\s*=\s*"([^"]*)"', win) + check("Windows 被控端默认是空", bool(m4) and m4.group(1) == "", + m4.group(1) if m4 else "找不到") + + run = (ROOT / "windows" / "run_agent.py").read_text(encoding="utf-8") + # run_agent 里不该有写死的公网域名(除了注释) + run_clean = re.sub(r"#.*", "", run) + run_clean = re.sub(r'""".*?"""', "", run_clean, flags=re.S) + hits = re.findall(r'"https?://[a-z0-9.\-]+\.(?:top|com|cn|net)[^"]*"', + run_clean) + check("Windows 端源码里没有写死的中转域名", not hits, + "还有:%s" % hits[:3]) + + print() + print("=" * 60) + print(" 通过 %d 项,失败 %d 项" % (passed, failed)) + return 0 if failed == 0 else 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/_tests/verify_all.ps1 b/_tests/verify_all.ps1 index a6662b8..bdcae9c 100644 --- a/_tests/verify_all.ps1 +++ b/_tests/verify_all.ps1 @@ -396,6 +396,12 @@ $stageOut = & python (Join-Path $root "_tests\test_watch_lan_switch.py") 2>&1 Show-Fails $stageOut Record "手表局域网切换" ($LASTEXITCODE -eq 0) +# ---------------------------------------------------------------- 3a3b +Banner "3a3b/7 中转默认必须为空(防内置作者服务器)" +$stageOut = & python (Join-Path $root "_tests\test_relay_default_blank.py") 2>&1 + Show-Fails $stageOut +Record "中转默认空白" ($LASTEXITCODE -eq 0) + # ---------------------------------------------------------------- 3a4 Banner "3a4/7 编码与换行(.java/.py 必须 UTF-8 无 BOM + LF)" # 踩过的坑:edit 工具会把行尾写成 CRLF,而仓库约定是 LF。 diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index d729125..95f8659 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="2.0.0"> diff --git a/android/build_apk.ps1 b/android/build_apk.ps1 index 287a185..aa5e2d8 100644 --- a/android/build_apk.ps1 +++ b/android/build_apk.ps1 @@ -27,7 +27,7 @@ $d8 = Join-Path $bt "d8.bat" $work = Join-Path $android "build" $outDir = Join-Path $root "dist" -$apkName = "ykxmz-watch-1.9.0.apk" +$apkName = "ykxmz-watch-2.0.0.apk" function Step($text) { Write-Host "`n=== $text ===" -ForegroundColor Cyan } @@ -65,7 +65,7 @@ $unsigned = Join-Path $work "app-unsigned.apk" --min-sdk-version 24 ` --target-sdk-version 34 ` --version-code 5 ` - --version-name "1.9.0" ` + --version-name "2.0.0" ` --auto-add-overlay if ($LASTEXITCODE -ne 0) { throw "aapt2 link 失败" } diff --git a/android/src/com/lanremote/watch/DeviceStore.java b/android/src/com/lanremote/watch/DeviceStore.java index a181158..ce88838 100644 --- a/android/src/com/lanremote/watch/DeviceStore.java +++ b/android/src/com/lanremote/watch/DeviceStore.java @@ -136,6 +136,11 @@ public class DeviceStore { writeDevices(updated); } + /** 清空所有已配对设备(设置页的清空用)。 */ + public void clearDevices() { + prefs.edit().remove(KEY_DEVICES).apply(); + } + public static String deviceKey(String host, int port, String deviceId) { return host + ":" + port + ":" + deviceId; } diff --git a/android/src/com/lanremote/watch/MainActivity.java b/android/src/com/lanremote/watch/MainActivity.java index 6ca26a2..703eb5b 100644 --- a/android/src/com/lanremote/watch/MainActivity.java +++ b/android/src/com/lanremote/watch/MainActivity.java @@ -90,6 +90,44 @@ public class MainActivity extends Activity implements RemoteClient.Listener { */ private static final String DEFAULT_RELAY_URL = ""; + /** + * 老版本硬塞进来的中转地址,要清掉。 + * + *

1.5.0 那版把作者的域名写死成默认值: + *

+     *     DEFAULT_RELAY_URL 这个常量写的是 https://relay.xxmxxs.top
+     * 
+ * 而且第一次运行就存进了 SharedPreferences。装新 APK 不会清偏好, + * 所以用户会看到「默认还是那个中转站」—— 其实他从来没选过。 + * + *

现在默认值是空串(跨网络要自己填)。这里做一次性迁移: + * 存的值如果正好是当时内置的那个域名,就当成没设过,清掉。 + * + *

⚠ 只在**完全等于**内置值时清 —— 用户自己手填的地址不能动。 + */ + private static final String[] LEGACY_BAKED_IN_RELAYS = { + "https://relay.xxmxxs.top", + "http://relay.xxmxxs.top", + }; + + private void migrateLegacyRelay() { + String saved = getSharedPreferences("lanremote", MODE_PRIVATE) + .getString("relay_url", ""); + if (saved == null) { + return; + } + String trimmed = saved.trim(); + for (String legacy : LEGACY_BAKED_IN_RELAYS) { + if (legacy.equalsIgnoreCase(trimmed)) { + // 这是老版本硬塞的,不是用户选的 —— 清掉,让他自己填 + getSharedPreferences("lanremote", MODE_PRIVATE).edit() + .remove("relay_url").apply(); + appendLog("已清掉旧版本内置的中转地址(不是你自己填的)"); + return; + } + } + } + private String relayUrl() { String saved = getSharedPreferences("lanremote", MODE_PRIVATE) .getString("relay_url", DEFAULT_RELAY_URL); @@ -199,6 +237,11 @@ public class MainActivity extends Activity implements RemoteClient.Listener { private final StringBuilder logBuffer = new StringBuilder(); // ---- 局域网连接页面 ---- private FrameLayout lanPanel; + // ---- 设置页(用户要求:各种设置收在一个页面里调)---- + private FrameLayout settingsPanel; + private TextView settingsRelayValue; + private TextView settingsCodeValue; + private TextView settingsDevicesValue; private LinearLayout lanResultBox; private EditText lanIpInput; private EditText lanPortInput; @@ -215,6 +258,8 @@ public class MainActivity extends Activity implements RemoteClient.Listener { super.onCreate(savedInstanceState); store = new DeviceStore(this); + // 老版本硬塞的中转地址要清掉(见 migrateLegacyRelay) + migrateLegacyRelay(); ui = new Handler(Looper.getMainLooper()); client = new RemoteClient(); client.setDevice(store.deviceId(), store.deviceName()); @@ -234,6 +279,7 @@ public class MainActivity extends Activity implements RemoteClient.Listener { initTabs(); buildMirrorPanel(); buildLanPanel(); + buildSettingsPanel(); root.addView(controlPanel, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, @@ -482,7 +528,7 @@ public class MainActivity extends Activity implements RemoteClient.Listener { // 用户原话:"我就是连不上才开设备诊断,连的上要设备诊断干嘛", // 所以它属于首页,不属于功能标签页。 // 中转地址:跨网络用。放首页是因为这是"连不上"的常见原因之一。 - Button relayButton = bigButton("中转设置(跨网络用)", C_ACCENT, 14); + Button relayButton = bigButton("设置", C_ACCENT, 14); LinearLayout.LayoutParams relayParams = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, dp(52)); relayParams.setMargins(0, 0, 0, dp(8)); @@ -490,7 +536,7 @@ public class MainActivity extends Activity implements RemoteClient.Listener { relayButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - promptRelayUrl(); + showSettingsPanel(); } }); box.addView(relayButton); @@ -1970,6 +2016,208 @@ public class MainActivity extends Activity implements RemoteClient.Listener { // 局域网连接(不经过中转) // ================================================================== + /** + * 「设置」页。用户要求:"安卓端加一个设置,各种设置就在这里面调"。 + * + *

以前设置散在首页(一个「中转设置」按钮)和别处, + * 现在统一收到这里。 + */ + private void buildSettingsPanel() { + settingsPanel = new FrameLayout(this); + settingsPanel.setBackgroundColor(C_BG); + + ScrollView scroll = new ScrollView(this); + scroll.setBackgroundColor(C_BG); + LinearLayout box = new LinearLayout(this); + box.setOrientation(LinearLayout.VERTICAL); + box.setPadding(dp(10), dp(12), dp(10), dp(12)); + scroll.addView(box, new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); + settingsPanel.addView(scroll, new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + + LinearLayout top = new LinearLayout(this); + top.setOrientation(LinearLayout.HORIZONTAL); + top.setGravity(Gravity.CENTER_VERTICAL); + box.addView(top, new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); + + TextView title = new TextView(this); + title.setText("设置"); + title.setTextColor(C_FG); + title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); + title.setTypeface(null, android.graphics.Typeface.BOLD); + top.addView(title, new LinearLayout.LayoutParams( + 0, ViewGroup.LayoutParams.WRAP_CONTENT, 1f)); + top.addView(smallButton("返回", C_CARD, new Runnable() { + @Override + public void run() { + hideSettingsPanel(); + } + })); + + // ================= 中转服务器 ================= + settingsRelayValue = new TextView(this); + settingsRelayValue.setTextColor(C_DIM); + settingsRelayValue.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); + settingsRelayValue.setPadding(0, dp(6), 0, dp(4)); + + box.addView(sectionTitle("中转服务器")); + box.addView(hintText("手表和电脑不在同一个网络时(比如在办公室管教室)" + + "才需要填。填你自己那台的地址,比如 relay.你的域名。\n" + + "只在一个 WiFi 里用就留空 —— 那样直接连,最快也不耗流量。")); + box.addView(settingsRelayValue); + + Button editRelay = bigButton("填写中转服务器", C_ACCENT, 14); + editRelay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + promptRelayUrl(); + } + }); + box.addView(editRelay); + + Button clearRelay = bigButton("清空中转服务器(只走局域网)", C_CARD, 13); + clearRelay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + setRelayUrl(""); + refreshSettingsPanel(); + toast("已清空 —— 以后只走局域网"); + } + }); + box.addView(clearRelay); + + // ================= 配对码 ================= + settingsCodeValue = new TextView(this); + settingsCodeValue.setTextColor(C_DIM); + settingsCodeValue.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); + settingsCodeValue.setPadding(0, dp(6), 0, dp(4)); + + box.addView(sectionTitle("记住的配对码")); + box.addView(hintText("手表会记住最近一次用的配对码," + + "下次连接自动带上,不用重复输。")); + box.addView(settingsCodeValue); + + Button clearCode = bigButton("清除记住的配对码", C_CARD, 13); + clearCode.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + getSharedPreferences("lanremote", MODE_PRIVATE).edit() + .remove("paired_code").apply(); + refreshSettingsPanel(); + toast("已清除"); + } + }); + box.addView(clearCode); + + // ================= 已配对设备 ================= + settingsDevicesValue = new TextView(this); + settingsDevicesValue.setTextColor(C_DIM); + settingsDevicesValue.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); + settingsDevicesValue.setPadding(0, dp(6), 0, dp(4)); + + box.addView(sectionTitle("已配对的电脑")); + box.addView(hintText("配对过的电脑会出现在首页列表里,点一下就能连。" + + "换电脑或者想重新配对时可以清空。")); + box.addView(settingsDevicesValue); + + Button clearDevices = bigButton("清空已配对的电脑", C_DANGER, 13); + clearDevices.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new android.app.AlertDialog.Builder(MainActivity.this) + .setTitle("清空已配对的电脑?") + .setMessage("清掉之后首页列表就空了," + + "需要重新输配对码连接。") + .setPositiveButton("清空", new android.content.DialogInterface.OnClickListener() { + @Override + public void onClick(android.content.DialogInterface d, int w) { + store.clearDevices(); + refreshDeviceList(); + refreshSettingsPanel(); + toast("已清空"); + } + }) + .setNegativeButton("取消", null) + .show(); + } + }); + box.addView(clearDevices); + + // ================= 关于 ================= + box.addView(sectionTitle("关于")); + box.addView(hintText("ykxmz 手表端 版本 " + appVersion() + + "\n\n" + + "连接顺序:先试局域网直连(同一个 WiFi,几毫秒);" + + "连不上再走中转(跨网络,受线路影响)。")); + } + + /** 一行小节标题 */ + private TextView sectionTitle(String text) { + TextView v = new TextView(this); + v.setText(text); + v.setTextColor(C_FG); + v.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); + v.setTypeface(null, android.graphics.Typeface.BOLD); + v.setPadding(0, dp(14), 0, 0); + return v; + } + + /** 一行灰色说明 */ + private TextView hintText(String text) { + TextView v = new TextView(this); + v.setText(text); + v.setTextColor(C_DIM); + v.setTextSize(TypedValue.COMPLEX_UNIT_SP, 11); + v.setLineSpacing(0, 1.25f); + v.setPadding(0, dp(4), 0, 0); + return v; + } + + /** 版本号。从 PackageManager 读,和构建脚本里的版本天然一致, + * 不用在代码里再写一份(写两份必然有一份会忘改)。 */ + private String appVersion() { + try { + return getPackageManager() + .getPackageInfo(getPackageName(), 0).versionName; + } catch (Exception e) { + return "?"; + } + } + + /** 把设置页上的文字刷新成当前值 */ + private void refreshSettingsPanel() { + if (settingsRelayValue == null) { + return; + } + String relay = relayUrl(); + settingsRelayValue.setText(relay.isEmpty() + ? "现在是:空(只走局域网)" + : "现在是:" + relay); + settingsRelayValue.setTextColor(relay.isEmpty() ? C_DIM : C_OK); + + String code = savedPairingCode(); + settingsCodeValue.setText((code == null || code.isEmpty()) + ? "现在没有记住的配对码" + : "记住的是:" + code); + + int n = store.devices() == null ? 0 : store.devices().size(); + settingsDevicesValue.setText("已配对 " + n + " 台电脑"); + } + + private void showSettingsPanel() { + refreshSettingsPanel(); + showOnly(settingsPanel); + } + + private void hideSettingsPanel() { + showConnectPanel(); + } + private void buildLanPanel() { lanPanel = new FrameLayout(this); lanPanel.setBackgroundColor(C_BG); @@ -2311,7 +2559,8 @@ public class MainActivity extends Activity implements RemoteClient.Listener { *

以后加面板只需要往这个方法里加一行,所有切换点自动都对。 */ private void showOnly(View keep) { - View[] all = {connectPanel, controlPanel, mirrorPanel, lanPanel}; + View[] all = {connectPanel, controlPanel, mirrorPanel, lanPanel, + settingsPanel}; for (View v : all) { if (v != null) { v.setVisibility(v == keep ? View.VISIBLE : View.GONE); diff --git a/docs/AFTER-INSTALL.txt b/docs/AFTER-INSTALL.txt index abe0cba..f50db49 100644 --- a/docs/AFTER-INSTALL.txt +++ b/docs/AFTER-INSTALL.txt @@ -3,7 +3,7 @@ ======================================================== 软件名称:ykxmz -版本:1.9.0 +版本:2.0.0 作者:小麦子 装好之后看这一页:怎么确认它在跑、怎么改设置、 @@ -197,7 +197,7 @@ 八、版本记录 -------------------------------------------------------- - 1.9.0 + 2.0.0 * 下载改走 Cloudflare 边缘缓存 —— 安装包和 APK 快了几十倍 * 跨网络更稳:隧道**两种协议同时跑**(QUIC + HTTP/2, 合计 10 条连接),一种协议犯病另一种还在服务 @@ -218,6 +218,6 @@ -------------------------------------------------------- 作者:小麦子 - 软件:ykxmz 1.9.0 + 软件:ykxmz 2.0.0 许可条款见《许可协议》(LICENSE.txt) -------------------------------------------------------- diff --git a/docs/BEFORE-INSTALL.txt b/docs/BEFORE-INSTALL.txt index e13b806..1fb703e 100644 --- a/docs/BEFORE-INSTALL.txt +++ b/docs/BEFORE-INSTALL.txt @@ -3,7 +3,7 @@ ======================================================== 软件名称:ykxmz -版本:1.9.0 +版本:2.0.0 作者:小麦子 请你**在安装之前**花三分钟读完这一页。里面有几条很要紧的 @@ -164,6 +164,6 @@ ykxmz 是一套自己搭建的远程管理工具,由三部分组成: -------------------------------------------------------- 作者:小麦子 - 软件:ykxmz 1.9.0 + 软件:ykxmz 2.0.0 继续安装,即表示你已阅读并同意《许可协议》。 -------------------------------------------------------- diff --git a/installer/license-combined.txt b/installer/license-combined.txt index b2420a7..248a3ff 100644 --- a/installer/license-combined.txt +++ b/installer/license-combined.txt @@ -3,7 +3,7 @@ ======================================================== 软件名称:ykxmz(远程管理工具) -版本:1.9.0 +版本:2.0.0 作者:小麦子 生效日期:2026 年 10 月 5 日 @@ -150,7 +150,7 @@ -------------------------------------------------------- 作者:小麦子 - 软件:ykxmz 1.9.0 + 软件:ykxmz 2.0.0 如果你不同意本协议的任何一条,请不要安装或使用本软件。 -------------------------------------------------------- @@ -162,7 +162,7 @@ ======================================================== 软件名称:ykxmz -版本:1.9.0 +版本:2.0.0 作者:小麦子 请你**在安装之前**花三分钟读完这一页。里面有几条很要紧的 @@ -323,7 +323,7 @@ ykxmz 是一套自己搭建的远程管理工具,由三部分组成: -------------------------------------------------------- 作者:小麦子 - 软件:ykxmz 1.9.0 + 软件:ykxmz 2.0.0 继续安装,即表示你已阅读并同意《许可协议》。 -------------------------------------------------------- @@ -334,7 +334,7 @@ ykxmz 是一套自己搭建的远程管理工具,由三部分组成: ======================================================== 软件名称:ykxmz -版本:1.9.0 +版本:2.0.0 作者:小麦子 装好之后看这一页:怎么确认它在跑、怎么改设置、 @@ -528,7 +528,7 @@ ykxmz 是一套自己搭建的远程管理工具,由三部分组成: 八、版本记录 -------------------------------------------------------- - 1.9.0 + 2.0.0 * 下载改走 Cloudflare 边缘缓存 —— 安装包和 APK 快了几十倍 * 跨网络更稳:隧道**两种协议同时跑**(QUIC + HTTP/2, 合计 10 条连接),一种协议犯病另一种还在服务 @@ -549,6 +549,6 @@ ykxmz 是一套自己搭建的远程管理工具,由三部分组成: -------------------------------------------------------- 作者:小麦子 - 软件:ykxmz 1.9.0 + 软件:ykxmz 2.0.0 许可条款见《许可协议》(LICENSE.txt) -------------------------------------------------------- diff --git a/installer/ykxmz.iss b/installer/ykxmz.iss index ad3909e..136b40b 100644 --- a/installer/ykxmz.iss +++ b/installer/ykxmz.iss @@ -27,7 +27,7 @@ ; ============================================================================ #define MyAppName "ykxmz" -#define MyAppVersion "1.9.0" +#define MyAppVersion "2.0.0" #define MyAppPublisher "小麦子" #define MyAppExeName "ykxmz.exe" @@ -137,6 +137,20 @@ Type: filesandordirs; Name: "{app}\data" Filename: "{app}\{#MyAppExeName}"; Parameters: "--code {code:GetPairingCode}"; \ Flags: runhidden; Check: HasPairingCode +; 1b. 写中转服务器(向导里留空就跳过)。 +; 用户要求"安装时就能设中转服务器" —— 装的时候是第一次设置, +; 最该一次填好,不然装完还得去双击 exe 找设置窗口。 +; +; 用了 --relay-url 而不是 --relay: +; --relay 会连接一次然后退出(人工排查用), +; 放在这条命令链里会让后面的 --silent 跑不到 +; --relay-url 只写配置,不连不问,适合安装流程 +; +; 地址两侧的引号是必须的:URL 里有 "//" 和可能的 ":", +; 不加引号 Inno 会按空格切参数。 +Filename: "{app}\{#MyAppExeName}"; Parameters: "--relay-url ""{code:GetRelayUrl}"""; \ + Flags: runhidden; Check: HasRelay + ; 2. 开机自启 Filename: "{app}\{#MyAppExeName}"; Parameters: "--autostart on"; \ Flags: runhidden; Tasks: autostart @@ -149,7 +163,7 @@ Filename: "{app}\{#MyAppExeName}"; Parameters: "--autostart on"; \ ; 代价是安装器和它是父子关系:用"等整个进程树"的方式调安装器会卡住 ; (PowerShell 的 Start-Process -Wait 就是)。 ; 学校批量部署请用 cmd: -; cmd /c ykxmz-setup-1.9.0.exe /VERYSILENT /CODE=123456 +; cmd /c ykxmz-setup-2.0.0.exe /VERYSILENT /CODE=123456 ; cmd 只等安装器本身,不等孙子进程,不会卡。 Filename: "{app}\{#MyAppExeName}"; Parameters: "--silent"; \ Description: "立即启动(后台运行,不显示窗口)"; \ @@ -182,6 +196,7 @@ Type: dirifempty; Name: "{app}" var CodePage: TInputQueryWizardPage; ForcedCode: String; + ForcedRelay: String; { 把字符串里的非数字滤掉。 } function OnlyDigits(const raw: String): String; @@ -198,22 +213,59 @@ begin end; end; -{ 配对码那一页。Inno 没有现成的输入页,用官方的 CreateInputQueryPage。 } +{ 配对码 + 中转服务器那一页。 + Inno 没有现成的输入页,用官方的 CreateInputQueryPage(不算自己造轮子)。 + + 为什么要在这里也能填中转服务器(用户要求): + 装的时候是"第一次设置",那时候最该一次把地址填好 —— + 不然装完还得让人去双击 exe 找设置窗口,很容易漏。 + 装完之后照样能改:双击 exe 打开设置窗口就有这一栏。 } procedure InitializeWizard(); begin - { 静默部署可以带 /CODE=123456 直接把码传进来(电教批量装用这个)。 + { 静默部署可以带 /CODE=123456 /RELAY=https://... 直接把值传进来。 注意:Inno 的 [Code] 段连**注释里的花括号**都会当常量去解析, 所以这里不能直接写 param 那种写法,否则编译器报语法错误。 } ForcedCode := OnlyDigits(ExpandConstant('{param:CODE|}')); + ForcedRelay := Trim(ExpandConstant('{param:RELAY|}')); CodePage := CreateInputQueryPage(wpSelectTasks, - '配对码', + '配对码和中转服务器', '给这台电脑定一个 6 位配对码', '手表上要输这一串数字才能连上这台电脑。自己定个好记的,' + - '比如 789113。装完之后也可以在被控端窗口里改。'); + '比如 789113。' + #13#10 + #13#10 + + '中转服务器是**跨网络**才需要的(比如在办公室管教室)。' + + '只在一个 WiFi 里用就留空,那样手表和电脑直接连,最快。'); CodePage.Add('6 位配对码:', False); + CodePage.Add('中转服务器(可以不填):', False); if ForcedCode <> '' then CodePage.Values[0] := ForcedCode; + if ForcedRelay <> '' then + CodePage.Values[1] := ForcedRelay; +end; + +{ 规范化中转地址。规则必须和 run_agent.py 的 normalize_relay_url() 一致: + 去首尾空白 -> 没协议头就补 https:// -> 去末尾斜杠 + 两边不一致会出现"向导里显示一个样、文件里存另一个样"的怪事。 + + ⚠ 不用 LowerCase:Inno Pascal 各版本支持不一致, + 直接四种写法都比一遍最保险。 } +function NormalizeRelay(raw: String): String; +var + s: String; +begin + s := Trim(raw); + if s = '' then + begin + Result := ''; + Exit; + end; + { 先削末尾斜杠再补协议头 —— 顺序反了会把 https:// 的斜杠也削掉 } + while (Length(s) > 0) and (s[Length(s)] = '/') do + Delete(s, Length(s), 1); + if (Pos('http://', s) <> 1) and (Pos('HTTP://', s) <> 1) + and (Pos('https://', s) <> 1) and (Pos('HTTPS://', s) <> 1) then + s := 'https://' + s; + Result := s; end; { 校验:必须是 6 位数字。 @@ -244,6 +296,37 @@ begin end; { 规范化,后面 [Run] 阶段用得到 } CodePage.Values[0] := digits; + + { ---- 中转地址的检查 ---- + 只做最基本的:不许有空格、不许有明显不对的字符。 + 不做"能不能连上"的检查 —— 装的时候那台服务器可能还没起, + 卡在这里会让用户装不下去。地址写错了装完还能改。 } + raw := Trim(CodePage.Values[1]); + if raw <> '' then + begin + if Pos(' ', raw) > 0 then + begin + MsgBox('中转服务器地址里不能有空格。' + #13#10 + #13#10 + + '你填的是:' + raw + #13#10 + #13#10 + + '只填域名就行,比如 relay.你的域名.com' + #13#10 + + '(协议头 https:// 不写也会自动加上)', + mbError, MB_OK); + Result := False; + Exit; + end; + if Pos('.', raw) = 0 then + begin + MsgBox('中转服务器地址看着不像个域名。' + #13#10 + #13#10 + + '你填的是:' + raw + #13#10 + #13#10 + + '应该形如 relay.你的域名.com。' + #13#10 + + '只在一个 WiFi 里用的话,这一栏留空即可。', + mbError, MB_OK); + Result := False; + Exit; + end; + end; + { 规范化后再写回,让用户看到最终会用哪个地址 } + CodePage.Values[1] := NormalizeRelay(raw); end; { 最终用的配对码:命令行 /CODE 优先,其次是向导里填的。 @@ -280,6 +363,28 @@ begin Result := EffectiveCode() <> ''; end; +{ 最终用的中转地址:命令行 /RELAY 优先,其次是向导里填的。 + 空的就返回空串 —— 那条命令会被 HasRelay 跳过。 } +function EffectiveRelay(): String; +begin + Result := NormalizeRelay(ForcedRelay); + if Result = '' then + Result := NormalizeRelay(CodePage.Values[1]); +end; + +{ 中转服务器。配 HasRelay 一起用 —— 留空时那条命令会被跳过, + 这样"只在一个 WiFi 里用"的人不会多写一个空地址进配置。 } +function GetRelayUrl(Param: String): String; +begin + Result := EffectiveRelay(); +end; + +{ 填了中转地址才跑那条 --relay-url 命令 } +function HasRelay(): Boolean; +begin + Result := EffectiveRelay() <> ''; +end; + { 卸载前先停掉正在跑的进程,不然文件删不干净。 必须在这里做,**不能**改到 UninstallRun 区段去: diff --git a/relay/relay.py b/relay/relay.py index 1721558..de64ab4 100644 --- a/relay/relay.py +++ b/relay/relay.py @@ -59,7 +59,7 @@ from collections import deque from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path -VERSION = "1.9.0" +VERSION = "2.0.0" # ---------------- 参数(都能用环境变量覆盖)---------------- diff --git a/windows/lanremote/__init__.py b/windows/lanremote/__init__.py index 6948f31..b85b526 100644 --- a/windows/lanremote/__init__.py +++ b/windows/lanremote/__init__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- """局域网遥控 · Windows 被控端。""" -__version__ = "1.9.0" +__version__ = "2.0.0" APP_NAME = "ykxmz" diff --git a/windows/run_agent.py b/windows/run_agent.py index bb39c19..8d5f368 100644 --- a/windows/run_agent.py +++ b/windows/run_agent.py @@ -70,6 +70,8 @@ def parse_args(argv=None): help="网络自检(自开控制台,不需要装 Python)") parser.add_argument("--fix-firewall", action="store_true", help="提权修复防火墙") + parser.add_argument("--relay-url", default=None, metavar="地址", + help="只把中转地址写进配置,不连接、不退出(安装包用)") parser.add_argument("--relay", default=None, metavar="地址", help="设置中转服务器地址(跨网络用)。" "可用分号分隔多个,按顺序尝试,例如:" @@ -274,19 +276,39 @@ def cli_fix_firewall() -> int: return 0 if ok else 1 +def normalize_relay_url(raw: str) -> str: + """把用户填的中转地址规范化。 + + 规则(和安装向导、设置窗口保持**完全一致**): + * 去掉首尾空白 + * 没有 http:// / https:// 就补 https:// + (用户基本只会填个域名,逼他打协议头没意义) + * 去掉末尾斜杠(拼接 "/v1/health" 时不会变成双斜杠) + * 空字符串 = 关掉中转,只走局域网 + + ⚠ 为什么抽成函数:原来这段逻辑散在 cli_relay 里,安装向导 + 再写一份就容易两边不一致。现在统一走这里。 + """ + url = (raw or "").strip() + if not url: + return "" + # 先去掉末尾斜杠,再补协议头(顺序反了会把 "https://" 的斜杠也削掉) + url = url.rstrip("/") + if not url.startswith(("http://", "https://")): + url = "https://" + url + return url + + def cli_relay(url: str) -> int: """设置中转地址。传空字符串就关掉。""" store = Store(data_dir()) - url = (url or "").strip().rstrip("/") + url = normalize_relay_url(url) store.set("relay_url", url) attach_console() if not url: print("已关闭中转(以后只在局域网内可用)") wait_key() return 0 - if not url.startswith(("http://", "https://")): - url = "https://" + url - store.set("relay_url", url) print(f"中转地址已设为:{url}") print() print("正在测试能不能连上…") @@ -782,14 +804,30 @@ def main(argv=None) -> int: args = parse_args(argv) - # --code / --name 要**最先**处理 —— 它们会改配置, + # --code / --name / --relay-url 要**最先**处理 —— 它们会改配置, # 而 --status / --autostart 这些是"看一眼就退出"的命令。 # 安装包的调用链是: - # ykxmz.exe --code 789113 --name 三年二班 --autostart on --silent + # ykxmz.exe --code 789113 --name 三年二班 --relay-url https://... --autostart on --silent # 如果先把 --autostart 处理掉就 return 了,配对码根本写不进去。 - if args.code is not None or args.name: + if (args.code is not None or args.name + or args.relay_url is not None): store = Store(data_dir()) wrote = False + + # ---- 中转服务器(安装向导那一页填的)---- + # ⚠ 和 --relay 的区别很重要: + # --relay 连接一次、打印状态、然后 return + # (人工排查用,**不能**和 --code 连用, + # 因为它会提前退出,后面的 --silent 就不跑了) + # --relay-url 只写进配置,不连接、不退出 + # (安装包用:要和 --code/--autostart/--silent + # 串在一条命令里跑完) + if args.relay_url is not None: + url = normalize_relay_url(str(args.relay_url)) + store.set("relay_url", url) + print(f"中转服务器已设为 {url or '(空 —— 只走局域网,不跨网络)'}") + wrote = True + if args.code is not None: digits = "".join(ch for ch in str(args.code) if ch.isdigit()) if len(digits) != 6: diff --git a/windows/version_info.txt b/windows/version_info.txt index 150f0ed..0542dc7 100644 --- a/windows/version_info.txt +++ b/windows/version_info.txt @@ -27,12 +27,12 @@ VSVersionInfo( [ StringStruct("CompanyName", "ykxmz"), StringStruct("FileDescription", "ykxmz"), - StringStruct("FileVersion", "1.9.0.0"), + StringStruct("FileVersion", "2.0.0.0"), StringStruct("InternalName", "ykxmz"), StringStruct("LegalCopyright", "ykxmz"), StringStruct("OriginalFilename", "ykxmz.exe"), StringStruct("ProductName", "ykxmz"), - StringStruct("ProductVersion", "1.9.0.0"), + StringStruct("ProductVersion", "2.0.0.0"), ], ) ]