# -*- coding: utf-8 -*- r'''手表端:常驻顶部快捷栏。 == 用户的要求(原话)== "手表端不管干什么,上面都有一栏,栏里的按钮可以在设置页自定义, 最多可以加 4 个,其中有一个按钮不能改,功能就是一键返回桌面" ("返回桌面"经确认 = **让被控电脑显示桌面**,即 Win+D。) == 做什么 == 1. **一条常驻的快捷栏**:贴在屏幕顶部,任何页面都在 (控制页 / 镜像页 / 设置页 / 局域网页面板切换时不动) 2. **最多 4 个按钮**: * **1 个固定**:显示桌面(Win+D)—— 不给改,这是用户明确要求的 * **最多 3 个自定义**:从 7 个动作里挑 3. **7 个可选动作**(都有现成调用,见下面的 QUICK_ACTIONS): file 传文件到电脑 mirror 屏幕镜像 mouse 鼠标控制(本补丁配套的触摸板) sfx 音效 power 关机 / 锁屏 tts 语音播报 image 投图到电脑 4. **设置页里能改**:勾选哪 3 个动作。 == 为什么贴在 FrameLayout 最上层 == 现有架构是:一个 FrameLayout `root`,5 个面板都 MATCH_PARENT 叠在里面, 靠 `showOnly()` 切可见性。 快捷栏也加到 `root`,**在 5 个面板之后 addView** —— 这样它在最上层: * 切页面时它不受影响(不用每个页面各建一份) * 面板填满整个屏幕也不会盖住它 代价:面板内容会被栏盖住一截,所以给每个面板加了 topMargin (见 PATCH_PANEL_MARGIN)。 == 为什么栏在没连上时也显示 == 用户说"不管干什么上面都有一栏",那就**一直在**。 没连上的时候按钮置灰(不是隐藏)—— "一直在但暂时不能用" 比"时有时无"更好理解,也不会让用户以为功能没了。 == 存储 == 用 SharedPreferences(和 App 其他设置一致),键 `quick_slots`, 存逗号分隔的动作 id。默认给 file,mirror,sfx。 读取时会**过滤掉不认识的 id**(比如以后删了某个动作), 不够 3 个就按默认顺序补齐 —— 这样老配置永远不会让栏变空。 ''' from __future__ import annotations import sys from pathlib import Path ROOT = Path(__file__).resolve().parent.parent MAIN = ROOT / "android" / "src" / "com" / "lanremote" / "watch" / "MainActivity.java" # ---------------------------------------------------------------- 字段 FIELDS_ANCHOR = " private Button updateButton;" FIELDS = ''' private Button updateButton; // ---------------- 顶部快捷栏 ---------------- // // 用户要求:"不管干什么,上面都有一栏,栏里的按钮可以在设置页 // 自定义,最多可以加 4 个,其中有一个按钮不能改, // 功能就是一键返回桌面"。 // // 所以这里是 1 个固定(显示桌面)+ 最多 3 个自定义。 private LinearLayout quickBar; private final java.util.List