Skip to content

feat(mobile): 复用电脑订阅授权并新增额度小组件(iOS优先) - #5252

Draft
FicoHub wants to merge 16 commits into
makecindy:mainfrom
FicoHub:cindy/sweet-bohr
Draft

FicoHub wants to merge 16 commits into
makecindy:mainfrom
FicoHub:cindy/sweet-bohr

Conversation

@FicoHub

@FicoHub FicoHub commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

手机选择已连接的电脑后,复用 Cindy 已有 Claude / Codex / Grok 授权,将脱敏订阅额度快照交给桌面小组件。Widget 不另配供应商授权,不保存 token、邮箱、providerId 或账号指纹。

保持 draft。iOS 已有完整构建、Air/18 Pro WidgetKit 和 18 Pro Claude/Codex 真实链路证据;Android 本轮完成完整 debug App 构建及原生 AppWidget 演示状态验证。Android 真实账号联调、不同真实账号、物理断网恢复及维护者冷更/设计把关仍未完成。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • docs / test 验收与契约验证

范围

  • 关联需求:用户原创双端订阅额度桌面小组件。
  • 设置入口、既有 device-link 只读同步、v2 脱敏快照、逐窗口源观测时间,以及账号/设备切换的迟到响应隔离。
  • iOS AppGroup / WidgetKit / config plugin:三张独立 small 卡和最多两家 medium 组合卡。
  • Android RemoteViews:共享圆环/真实品牌图标/计划/额度/Extra resets,宽布局两列,窄布局纵向排列;空间不足提示放大,支持系统字体缩放。
  • Claude 主动读取与 SDK 增量保持逐窗口 observedAt;Codex 正式 control 响应观测时间与旧缓存源时间分开。模型专属桶不冒充总额度。
  • 前台事件触发、60秒兜底;后台及 Widget 不主动请求供应商。系统 timeline / Android 30分钟调度只是缓存重绘,不保证源数据或系统准时刷新。
  • 停止共享/退出清理缓存并刷新全部 widget kinds;无新 OAuth、服务器、后台保活或付费模型探测。
  • 不包含历史宿主模拟器补丁、海量旧设计、生产签名或发布。Grok 无真实账号实测。
  • Breaking change:旧 v2 快照保持可读;原生模块新增需要冷更,不向旧原生包推不兼容 OTA。

UI 变化

  • 引用的设计规范:docs/design-rules/DESIGN.md §2 Color Palette & Roles、§3 Typography Rules、§4 Cards & Containers / Usage data graphics;apps/mobile/docs/mobile-design-guide.md §3。生成资源复用 feature-local quotaWidgetTokens 与既有翻译源,不增加平行主题系统;Light/Dark 均实现并有原生截图。
  • 用户确认 Extra resets 版为基线。共享环42pt/dp、线宽4.5;品牌/计划12;medium 周百分比32,次级及倒计时14,三行共用左边缘/基线。Codex Weekly 复用 Claude 5h 的 quotaSession 色,第三行 Extra resets,不再重复 Reset。时长 d/h/m、5h 小写。
  • Android 原生文本层补齐共享外观与响应式布局;本轮 iOS SwiftUI/确认视觉文件无改动。字体放大时按实际空间调整显示数量并提示 Enlarge for all,不缩字或省略号伪装通过。
  • 计划只展示可靠返回;仅返回 Pro 不推断 Pro $100/$200/$500,unknown 隐藏。
  • 正式 account/rateLimits/read 的 rateLimitResetCredits.availableCount 映射为剩余次数。未知/非法/过期显示—,确证0显示0;不从credits余额、明细数组或reset倒计时推断,不调用消耗reset接口。

Android紧凑横卡白天,模拟器合成数据
Android紧凑横卡深夜,模拟器合成数据

以上为真实 AOSP Launcher AppWidget 完整桌面截图,数据为隔离fixture,非浏览器渲染、非物理真机或真实账号。正式Cindy包另从系统选择器添加并验证空态同尺寸。旧近景不再代表本轮布局。

既有 iOS 合成数据证据(确认布局未改):Air Light / Air Dark。18 Pro 真实账号图片仅在任务本地交付,未公开上传。

怎么验证的

Android真实账号续验:2026-10-02 23:18 +0800

当前代码head仍为 1af3a1a4a,未修改布局或供应商认证。已在完整Android Cindy自主完成企业发现/区域确认/正式SSO跳转,当前停在飞书官方本人扫码认证,尚无Android真实账号源→缓存→Widget数据证据。iOS已登录不等于Android自动继承身份;没有复制凭据。本人确认后再完成来源、前后台、清空恢复联调。

本轮一次检查发现Linux第二片的 WallpaperVideo.test.tsx 失败,Windows两片等通过;该文件不在PR改动中,本地定向16项通过但不能视作远端通过。未循环poll或修改无关墙纸,仍保持draft。

本轮尺寸修复:1af3a1a4a6173dc576221d950447ae797dce411e

  • 旧 minResizeHeight=184dp 令实际实例占三行,加上根布局 match_parent/center_vertical,卡片背景被拉到439dp。现在背景随内容,默认5×2;没有缩字体、裁截图或调整设备density。
  • 实测分配382.095×288.762dp(5×2),可见卡片382×163dp。透明宿主空间仍占桌面格子,不声称已释放。4×2仅303dp宽,不足以保持32/14sp双列;最小3×2显示一家并提示放大。
  • 长套餐与普通套餐共用46dp品牌区最小高度,三行基线一致。iOS确认UI未改。
  • 完整 :app:assembleDebug :cindy-quota-widget:testDebugUnitTest 成功(734 tasks;9 JVM tests),正式APK已安装且实际默认添加;隔离包38条设备内检查通过;Mobile native plugin 10项及Mobile typecheck通过;生成资源和diff检查通过。未重跑上轮63项或更早全量,下面均标为历史结果。
  • 额外dev-docs为9/10通过,唯一失败为未跟踪历史 docs/assets/quota-widget-art-study/references/widgets.md 引用缺失文件,未纳入PR、未删除旧稿或弱化检查。
  • 原生逐图目检默认日夜100%最长、0、unknown、长套餐、最小拖拽尺寸;字体尺寸未变。源文件哈希、截图哈希及布局量化见本轮记录。HTML仅作本地一页证据容器,不算原生运行证明。

上轮 Android 功能验证:25d443de351819700357a3b9522b29da8fcefcc9(历史结果)

./gradlew :app:assembleDebug :cindy-quota-widget:testDebugUnitTest \
  -PreactNativeArchitectures=arm64-v8a --no-daemon --max-workers=2
结果:BUILD SUCCESSFUL;734 tasks;7 JVM tests / 0 failures。

pnpm --filter mobile exec vitest run src/__tests__/quotaWidgetSnapshot.test.ts \
 src/__tests__/quotaWidgetController.test.ts src/__tests__/quotaWidgetNativePlugin.test.ts \
 src/__tests__/quotaWidgetBridge.test.ts
结果:63 passed。

pnpm --filter mobile run typecheck
node scripts/generate-quota-widget-resources.mjs --check
git diff --check
结果:通过。设计台账与术语检查通过。
  • 专用 AVD cindy-quota-api36 / emulator-5580,Pixel9 profile,API36 / Android16 ARM64,1080×2424px、420dpi,未 root。
  • 完整 com.xd.cindy debug APK 已安装启动真实登录页;系统 Widget picker 添加空态,点击返回真实 App 登录页。使用本 worktree 的 localhost:8088 Metro(专用 AVD reverse 8081→8088)。未登录,不称为真实数据链路验收。
  • 独立 org.cindy.quota.validation:38 条设备内契约检查通过,含三品牌 VectorDrawable 真加载、次数未知/0/整数、源时间、存储清空。日夜、100%最长、部分额度、0/unknown/stale/offline/unauthorized、缺计划/窗口、长套餐、横向缩放、字体1.3/2.0截图目检。实际代码与测试包复制文件逐字节一致。
  • 本轮发现并修复旧 Kotlin sanitizer 右括号缺失的真实编译错误;Android 对 SVG 相邻 arc flags 解析失败导致 Grok 空卡的问题以生成转换解决并设备回归;未授权隐藏旧窗口并显示 Reconnect。
  • 可复现测试包源码:tools/quota-widget-android-fixture/,仅 demo,不在生产 App 注入测试入口。完整构建、哈希与边界记录。

既有 iOS / 共享层证据(精确版本,不冒充本轮重跑)

  • 代码head 779bf7134:完整 Global iOS App+WidgetKit 强制重建退出0,当时指纹 5f8904917a99d0b4daf9a4c301dc18f35982e309;两台任务模拟器覆盖安装。18 Pro保留登录,通过深链/立即同步再次验证真实Claude/Codex源→手机→AppGroup→WidgetKit,small/medium日夜目检。Air没有账号,完整App登录/Widget空态/深链验证。
  • Xcode27.0/27A266a、iOS27.0,Air420×912pt、18 Pro402×874pt;均模拟器。停止共享/退出清理、源设备切换、SSO恢复有既有证据;本轮没有重复登出。
  • 合主干 a9eb56b95 后190项定向与Mobile/Desktop类型检查属于 779bf7134;179项复测与Swift契约属于文档head 03fa6b1d5。历史7745项属于eba687,不称为当前全量。
  • 本轮Android原生资源改变fingerprint输入,不能把此前iOS指纹数值当成本head的发布证明。

未执行的验证

  • Android真实账号登录、源同步、真实退出/账号切换未跑;fixture清空不是实际用户登出,Offline fixture不是物理断网。
  • 不同真实账号、设备范围真实断网恢复、实体手机/OEM Launcher/省电策略、长期系统刷新预算未完成。本轮已确认纵向三行缩至两行、两行下限及横向5列至3列再恢复;横屏和其他Launcher未验证。
  • Duo需27.1beta但本机没有对应runtime;Grok无真实账号。未购买账号或转移凭据。
  • 最新CI以本head检查为准;不循环poll,不把历史head全绿当成当前结论。

风险

风险分类

  • 协议兼容:既有只读投影;v2新增可选字段,旧快照可读,无新wire RPC。
  • 权限 / 用户数据:仅脱敏快照,源账号/设备响应隔离,撤权清理。
  • 原生层 / fingerprint / OTA:AppGroup、WidgetKit、原生模块/Android资源必须冷更;旧包不获得新原生能力。
  • 跨平台差异:Android按Launcher尺寸和系统字体响应;不声称全部厂商布局/后台行为等同iOS。

影响与回滚

回滚通过后续冷更移除入口/模块,不回退供应商认证或其他用户数据。已有用户需安装含原生扩展的新包;不单独推送不兼容OTA。本轮无生产签名、buildNumber变更、TestFlight上传或商店发布。

Ready门槛:用户视觉确认不替代仓库指定维护者设计/冷更批准。CODEOWNERS为@makecindy/maintainers,具体放行人由维护者指派;目前没有该批准,保持draft,不合并。发布负责人还需补齐选定通道的Widget扩展签名archive/export:当前quota plugin缺EAS appExtensions签名元数据,本地ExportOptions只列主App profile。eas.json存在testflight-global不等于已经能分发。实现者负责剩余账号/设备回归,维护者决定未验收范围是否阻断首版。

提交前检查

  • 已 review 完整本轮 diff,仅明确文件清单stage;历史宿主补丁和旧稿保留未提交。
  • 每个提交带匹配 author 的 DCO 签名。
  • UI规范与两主题证据已说明。
  • 未提交凭证、token、真实账号截图、SDK、APK或大批历史设计。
  • 已同步Android旧“未编译/文本兼容”结论,测试与未验收边界如实记录。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant