-
Notifications
You must be signed in to change notification settings - Fork 2
UI Audits
AceGuru-mjh edited this page Oct 1, 2026
·
4 revisions
📑 本页目录
7 个 Compose 屏 + 14 个共享组件 + 主题/资源 + 悬浮窗 UI,逐行约 12,000 行, 共 45 项问题(高 9 / 中 22 / 低 14)。来源
docs/ui-quality-audit-2026-08-27.md(基线main@e34c176)。 这是"想改 UI 的人"最有价值的一页。
| 现象 | 数字 |
|---|---|
imePadding |
0 处 |
真实 rememberSaveable
|
0 处(对比 76 处 remember { mutableStateOf }) |
stringResource |
0 处(1085 行硬编码中文 / 34 文件) |
BackHandler / Navigation |
0 处 |
widthIn / maxWidth / WindowWidthSizeClass
|
0 处 |
再加上触摸目标系统性低于 48dp、悬浮窗窗口参数错误 —— 构成体验天花板。
| ID | 问题 | 位置 | 建议 |
|---|---|---|---|
| UI-001 |
键盘遮挡:enableEdgeToEdge() 使 adjustResize 失效,而全应用 0 处 imePadding
|
MainActivity.kt:19、AdaptiveInputField.kt:219-232
|
统一加 Modifier.imePadding().navigationBarsPadding()
|
| UI-002 | 全屏编辑器三重缺陷:combinedClickable 劫持选词;× 直接丢弃修改而返回键保存(语义相反);>50 字符 隐藏门槛不可发现 |
AdaptiveInputField.kt:115-125, 215-259 |
分离手势、统一保存语义、去掉隐藏门槛 |
| UI-003 | 终端屏 BasicText 平铺 fillMaxSize,无 verticalScroll、无虚拟化、无跟随底部(设置允许 10000 行缓冲但首屏外看不到) |
TerminalRenderer.kt:67-76 |
virtualization + 跟随底部 |
| UI-004 | 终端屏无任何命令输入通道(grep terminal/ 无 sendInput/writeToTerminal) |
TerminalScreen.kt:302/322 |
接 terminal.write(现已由 T82 的 styled grid + IME 桥补齐) |
| UI-005 |
必死按钮:依赖安装命令是 winget install … / scoop install …,Android PTY 中不存在 |
TerminalViewModel.kt:134-162 |
接 platform/terminal/pkg/PackageManager + 能力检测(T82 已改为 Ubuntu 路由 + 诚实降级) |
| UI-006 | API Key 输入框无 PasswordVisualTransformation、明文写普通 SP、每次按键吞掉换行 → 无法录入第二个 Key
|
SettingsScreen.kt:658-663、SettingsRepository.kt:32-33,173
|
密码掩码 + 多 Key 编辑器 |
| UI-007 | 悬浮窗全屏 MATCH_PARENT 仅配 FLAG_NOT_TOUCH_MODAL、缺 FLAG_NOT_FOCUSABLE;OverlayLifecycleOwner 从未 setViewTreeLifecycleOwner
|
BrowserOverlay.kt:205-218 |
补 flag + lifecycle owner |
| UI-008 |
CyberNeonBallManager.dismiss() 只 EasyFloat.dismiss(tag) 不清 ballView,doShow() 首行 if (ballView != null) return → 球一旦关闭永久失踪
|
CyberNeonBallManager.kt:63-68 |
dismiss 时置空 |
| UI-009 | Shizuku 兜底 startActivity(ACTION_VIEW) 无 ActivityNotFoundException 防护 |
PermissionsScreen.kt:296-301 |
补防护 |
| 类别 | 问题 |
|---|---|
| i18n(UI-010) |
strings.xml 仅 2 条;单文件最多 199 行中文(AgentChatViewModel);中英混用;supportsRtl 名存实亡 |
| 无障碍(UI-012/013) | 触摸目标普遍 32–40dp(错误复制钮 28dp、ContextMeterBar 实际 ~8dp);AttachmentPreviewBar 注释宣称"48dp 触控区"实为假修复(外层 Box 无 clickable,真实可点 20/24dp);icon-only 无标签 3 处;抽屉导航项 enabled = !selected 让当前项被读成"已禁用" |
| 状态与导航(UI-014/015) | 旋转后导航目的地重置回 Agent 页;日志筛选词/菜单开关/滑块值/终端输入全丢;7 屏用 when(currentDestination)(无入栈),返回键直接退出 |
| 主题外硬编码颜色(UI-016) |
21 处:日志等级 0xFFE57373/0xFFFFB74D/0xFF81C784、终端 0xFF1E1E1E/0xFFD4D4D4、ContextMeterBar 0xFFFF4D8D/0xFFFFB020、Slash 按钮青粉渐变(青在浅底对比度 ≈1.4:1) |
| 性能(UI-017/018/019) |
LogViewerScreen remember(records) 每条新日志触发全量 joinToString;NeonRingView 用 Handler.postDelayed(16ms) 自绘循环(非 Choreographer)、每帧新建 3 个 SweepGradient+RectF;ContextMeterBar 的 rememberInfiniteTransition 只要组合就跑 |
| LazyColumn key(UI-023) | 消息列表 key = { index, _ -> index };日志列表无 key(行内 remember{expanded} 串到错误记录) |
| 死路(UI-025) |
UserInputDialog 对 InputType.CHOICE 把提交按钮设为 enabled = !isChoice → 恒禁用,用户只能取消,Agent 等待至超时 |
| 文件路径(UI-027) |
res/xml/file_paths.xml 兜底 <external-path name="external" path="." /> 暴露整个外部存储根 |
| 指标 | 数字 |
|---|---|
Color(0x…) 硬编码 |
81 处 / 8 文件(Theme.kt 60 处合理,主题外 21 处) |
contentDescription = null |
32 处(疑似问题 3 处) |
| UI 层中文字面量 | 1085 行 |
硬编码 fontSize(业务代码) |
8 处(BrowserOverlay 6、TerminalRenderer 2) |
| LazyColumn/LazyRow | 10 处,仅 4 处有稳定 key |
Toast.makeText |
7 处,全中文硬编码 |
| 主线程纪律 |
良好:BrowserEngine 11 处 withContext(Main),ui 目录零 runBlocking / Thread.sleep
|
-
Theme.kt明暗两套 scheme(mint 主色 / amber 强调 / magenta 危险态)+ 120–400ms tween 动效; -
自审文化:
docs/agent-ui-audit.md与代码注释保留"缺陷 N 修复"追溯; -
GithubTokenDialog是全仓库唯一做对的密钥输入:suspend 校验 + 验证期禁用 + inline 错误不关窗 +ghp_/github_pat_预检 +PasswordVisualTransformation; - Skill / Memory 屏的"空态 +
items(key=)+ 删除二次确认 + Snackbar"四件套范式; -
FileOpener用 FileProvider +ActivityNotFoundException替代 Android 11+ 失效的resolveActivity(); - 8 个 drawable 全部 vector/shape,
NeonRingView纯代码 SweepGradient(零 Lottie)。
| 阶段 | 内容 |
|---|---|
| P0 止血 | UI-001(键盘)、UI-002(编辑器)、UI-006(Key)、UI-007+008(悬浮窗/球)、UI-009(Shizuku)、UI-025(CHOICE 死路) |
| P1 可用性 | UI-003+004+005(终端屏三连)、UI-012+013(无障碍)、UI-014+015(状态与导航)、UI-020~022 |
| P2 一致性 | UI-010+045(i18n/构建)、UI-011+016+028+031(颜色)、UI-017~019+023+043(性能与 key)、UI-024 |
| P3 打磨 | UI-032~041 |
- 无真机/模拟器动态测试与截图(云端沙箱无模拟器);
- 未跑
./gradlew lint(沙箱无 Android SDK,CI 也未含 lint 任务 —— 建议后续加入lintDebug门禁); - TalkBack / 字体缩放仅代码推断,未实测。
-
MCP 生态总览
新 - (沙箱 MCP · 官方 Hub · 逆向 Host · 门控语义)
- 终端运行时
- 终端 API 契约
- SDK 边界
- Termux 能力矩阵
- Ubuntu rootfs 供给
- Ubuntu 生命周期
- PRoot 二进制溯源
- VT100/ANSI 模拟器
- 终端性能
- 终端迁移
- 原生层 C++/JNI