Rainytoken/app
Liuxinyu176 8592f15663 feat(sub2api): 未配置服务不再占位;面板管理入口改到卡片右下角;网页登录自动抓取凭据
1) 未配置的用量卡不再显示
   OpenCode/CommandCode 用量卡与 Token 热力图卡此前是无条件加入首页列表的,
   即使对应服务未配置凭据也会占位显示。现改为按 cards 里是否包含该服务来判断,
   热力图卡跟随 OCGO。

2) 面板管理入口位置:卡片底部右下角,与「刚刚更新」同一行右对齐
   (此前放在余额右侧,用户反馈位置不对)
   底部 Row:左 footerText(weight(1f, fill=false)) + 中间弹性 Spacer + 右按钮。

3) 网页登录后自动获取凭据
   - WebViewLoginScreen 注入 JS 桥(@JavascriptInterface LoginProbeBridge),
     页面加载完成后读取 localStorage.auth_token / auth_user / favicon / origin 回传。
   - WebViewSessionSaver.saveSub2ApiPanelSession 落库面板凭据,保留已有 email/password/apiKey。
   - 安全:每次会话随机 nonce(回传必须匹配)+ origin host 白名单(trustedHosts
     来自用户配置的面板基址),防止登录过程中跳转的第三方页面伪造 payload 投毒凭据。
   - 自托管实例的 baseUrl 由 ViewModel 自行从凭据仓库读取,避免每个导航调用点漏传。

4) 修复(独立审查发现)
   - saveSub2ApiPanelSession 去 runBlocking 改 suspend,在 viewModelScope 中调用,
     避免 JS 桥线程同步等待 Keystore 加解密 + DataStore 写盘。
   - 删除「用 origin 查 Cookie」的旁路:origin 无 path,CookieManager 查不到会误报
     「登录完成了吗」,Cookie 抓取统一交回 onPageFinished 的真实 URL。
   - normalizeBaseUrl 改用 okhttp3 HttpUrl 解析,垃圾串不再通过校验后落库。
   - 撤销给 DeepSeek 加 loginUrl 的改动:其凭据类型是 ApiKeyCredential,
     走 Cookie 路径会写成 SessionCredential 并导致 API Key 静默丢失。

真机验证(V2172A / Android 15):
首页只剩 Sub2API 一张卡;面板管理与「刚刚更新」同一行(均 y1492-1555,按钮右对齐 x783-980);
点按钮正常打开弹窗;网页登录容器正常加载面板首页(证明 baseUrl 兜底生效)。
compileDebugKotlin 与 lintDebug 均通过。
2026-09-12 10:57:58 +08:00
..
src feat(sub2api): 未配置服务不再占位;面板管理入口改到卡片右下角;网页登录自动抓取凭据 2026-09-12 10:57:58 +08:00
build.gradle.kts feat(sub2api): 面板管理接入首页卡片;用量明细周期化与按模型筛选修复 2026-09-12 03:11:31 +08:00
proguard-rules.pro 🎉 RainyToken — AI 余额查询 APP 2026-06-16 01:46:03 +00:00