Commit Graph

33 Commits

Author SHA1 Message Date
2509ab8a85 feat(update): 设置页新增检测更新/下载APK/自动安装;接入Gitea update.json清单 2026-10-08 21:42:45 +08:00
ffc06a38ca feat(account): 多账号体系、Sub2API token 自动刷新与面板按账号隔离
- Trae/WorkBuddy/Sub2API 支持多账号:每账号一张首页卡片、可设默认账号
  (小组件/每日自动签到仅作用于默认账号),新增账号管理页
- 每日自动签到按账号执行,签到结果弹窗汇报(含积分变动)
- 移除独立的 UsageStat 页,用量并入服务详情
- Sub2API 面板 token 过期自动用邮箱+密码重登并回写该账号,
  自动重登失败才引导手动网页登录;并发 401 按账号互斥去重
- Sub2API 面板管理(Key/分组/兑换码)按当前账号隔离
- 首页恢复每账号一张普通卡片(回退叠放卡组样式)并保留历史排序兼容
- WebView 登录自动识别成功、去掉手动确认弹窗;登录后立即刷新余额
- 修复积分占位符泄漏(%1$s /%2$s 积分)
2026-09-15 23:32:51 +08:00
1791fa6436 fix: 登录后余额不刷新 + 明细中英文本地化
- WebViewLogin 登录成功后 popBackStack 到 SERVICE_DETAIL,让详情页
  ON_RESUME 自动刷新余额;back stack 无 SERVICE_DETAIL 时 fallback
  到 guardedPop() 避免卡住
- GenericExtrasCard 重写:11 个已知技术 key 映射为三语本地化标签,
  布尔值格式化为是/否,consumption_ratio 格式化为百分比
- 三语 strings.xml 新增 13 个 extra_label_* / extra_value_* 字符串
- 移除 WebViewLoginViewModel/Screen 中的调试 Log
2026-09-13 16:37:22 +08:00
0bed6d626a feat(login): Trae+WorkBuddy 软件内登录
- WebViewLoginViewModel: 新增 Trae OAuth 回调解析(onTraeCallback)
  和 WorkBuddy 设备授权流(bindWorkBuddy+pollWorkBuddyToken)
- WebViewLoginScreen: 添加 shouldOverrideUrlLoading 拦截 Trae 回调
  (http://127.0.0.1:18080/authorize), loginUrl 为空时显示加载指示器
- CredentialEditScreen: TraeCredentialForm 和 WorkBuddyCredentialForm
  顶部添加'软件内登录'按钮(OutlinedButton)
- strings.xml(三语): 新增 action_login_in_app 和 error_login_timeout
- 修复: WorkBuddy 网络请求包裹 withContext(Dispatchers.IO) 防止
  NetworkOnMainThreadException
2026-09-13 14:57:33 +08:00
085a4d722f feat(checkin): 签到语义化结果 + 多语言 + 轮换/并发安全
- Repository 改为返回语义化 CheckinOutcome(不再直出硬编码中文),
  UI 经 UiText 按 Locale 解析;补齐三语言文案(含连签/需配置凭据/已签禁用态)
- WorkBuddy authedPost 改 sealed 结果:失败也回传轮换出的新 token,
  多候选路径共享轮换状态,避免旧 refreshToken 单次消费后卡死(永久 401)
- 签到的凭据写入改走 RefreshBalanceUseCase.withCredentialSession,
  按快照校验提交,避免并发改凭据被旧快照覆盖(lost update)
- Trae 仅在实际被服务端接受时才标记 lastVerifiedAt(400 业务失败不标记)
- DEVICE_BLOCKED 改用 Notice 态:不置灰按钮,与「今日已签到」语义区分
- 新增 TraeRepositoryTest(10) / WorkBuddyRepositoryTest(5),纯 JVM 解析用例
2026-09-13 14:01:27 +08:00
dc3027417e feat(sub2api): 详情页新增「按 Key」tab;面板管理按钮间距收紧
详情页「按模型」分区改为 tab 切换:按模型 / 按 Key。
按 Key tab 调 GET /api/v1/usage/stats?api_key_id=N 逐个查询,并行拉取;
未使用的 Key(404)显示为 0 而非报错。

面板管理「复制/分组/删除」三个操作从 TextButton 改为可点击 Text,
去掉 58dp 最小宽度带来的过大间隔(用户反馈「间隔有点宽」)。

补齐三语言缺失字符串(sub2_home_spend / sub2_panel_delete_confirm_*
/ sub2_trend_account_scope / sub2_tab_by_* / sub2_no_key_data /
sub2_key_unused)。
2026-09-13 11:44:00 +08:00
bc862df226 fix(sub2api): 余额标签与数字同行;请求次数改为「消耗 N 次」 2026-09-13 00:02:16 +08:00
56f85d296c feat(sub2api): 重做首页卡片布局——余额主视觉 + 今日/近7天等宽磁贴
原布局把余额与周期数据塞在同一行,窄屏(360dp)会换行、数字长短不一还容易错位,
整体观感松散。改为上下分区:

- 余额区:「余额」小标签 + 大号数字 + 单位,单行左对齐,作为卡片主视觉。
- 用量区:「今日 / 近7天」两块等宽磁贴(14dp 圆角 + 半透明底色),
  每块固定三行(周期名 / Token 数 / 请求次数),内容垂直居中,
  两块结构与内边距一致,数值长短不同也不会错位。
- 卡片正面只保留 余额、Token 用量、请求次数三项;不再显示花费与「本月已用」
  (花费与更长周期明细仍可在详情页时间窗口查看)。

副标题改为登录方式:
- Sub2API 卡片副标题由「自托管面板 · 用户级 sk- Key 余额」改为「邮箱登录 / API 登录」,
  依据 Repository 新写入的 extras["auth_mode"](panel / apikey)判定,无数据时回退原描述。

真机验证(V2172A / Android 15,360dp 宽):
余额 y887-1105 与两块磁贴 y1185-1405 分区清晰、不换行;磁贴在 x176 与 x788 等宽对齐;
副标题显示「邮箱登录」。compileDebugKotlin 与 lintDebug 均通过。
2026-09-12 10:14:15 +08:00
eebe9f6987 fix(sub2api): 面板管理只保留首页入口,弹窗支持滚动、操作前置
按使用反馈调整(真机验证):
- 详情页不再重复展示面板管理卡:Key 列表/新建/分组/兑换统一收到首页 Sub2API 卡片的
  「面板管理」入口,详情页只保留用量明细(周期切换 + 柱状图 + 按模型)。
  随之移除详情页已不再使用的 panelKeysState / panelGroups / panelActionMessage 状态收集。
- 修复「面板管理弹窗打开后不能滚动」:AlertDialog 的 text 槽是固定高度且不自带滚动容器,
  内容超过上限会被直接裁剪。改为给 text 槽加 verticalScroll + 高度上限(屏幕高度 72%),
  现在可以正常上下滚动浏览全部 Key。
- 主要操作前置:新建 Key / 兑换卡密 从列表底部移到顶部(原位置在 20+ 条 Key 之后,
  需要滚到底才能看到);并新增「API Key 列表」小标题区分列表区。
- 弹窗内不再重复标题:组件新增 showHeader 参数,首页弹窗由 AlertDialog title 槽显示标题,
  组件内部标题隐藏(刷新按钮保留)。

验证:compileDebugKotlin、lintDebug 通过;真机(V2172A / Android 15)实测
首页仍只显示今日与近7天、弹窗可滚动、新建/兑换在首屏、详情页无面板管理卡。
注:gradle.properties 的本地路径开关仍未纳入提交。
2026-09-12 09:40:59 +08:00
58d8b0e077 fix(sub2api): 按真实面板实测校准兑换/金额/模型窗口口径
实测环境:xxcsn.site(无忧ai)v0.2.1,浏览器登录态直连接口逐条比对响应结构。

修复(均为实测发现,非推测):
- 兑换失败文案被吞:失败走 HTTP 404/409 + {code,message,reason},原先先判状态再解析,
  会把「兑换码不存在 / 已被使用」降级成无文案的通用错误。改为先解析 body,
  并把 REDEEM_CODE_NOT_FOUND/USED/EXPIRED/DISABLED 映射为中文,未知 reason 透传面板原文。
- 兑换成功不显示金额:成功响应 data.value 是数字(实测 value:50),原用 scalar("value") 取不到,
  「兑换成功」后面没有金额。改用 numberOr + trimNum,并附带类型后缀(余额/订阅)。
- 金额少一位(严重):trimNum 原实现 v.toString().trimEnd('0','.'),Kotlin 的 trimEnd 会连续
  剥离集合内任意字符——"50.0"→"5"、"100.0"→"1"、"10.0"→"1"(已在 JDK 上复现)。
  即兑换 $50 会显示成 +$5。改为 BigDecimal.valueOf(v).stripTrailingZeros().toPlainString()。
  同一份错误实现还拷贝在 TraeRepository / WorkBuddyRepository,一并修复。
- 按模型无法按周期筛选(Key 模式根因):实测下游 /v1/usage 的 model_stats 恒为历史累计口径,
  days/start_date/end_date 只影响 daily_usage。新增 fetchKeyScopedWindowModelStats():
  有面板登录态时先用 /api/v1/keys 反查当前 sk-key 的 id,再走支持日期窗口与 api_key_id 的
  /api/v1/usage/dashboard/models(实测同一 key:today=0 / 近7天=8 / 近90天=8 条)。
- 累计口径如实标注:新增 WindowModelStats(stats, allTime);纯 Key 无面板态时回退历史累计,
  UI 在「按模型统计」标题追加「(累计口径,未按所选周期过滤)」,避免冒充周期数据(三语)。
- API Key 掩码对齐面板网页观感(sk-06b...2dc0);列表接口虽返回完整 key,页面仍只显示掩码,
  复制按钮复制的始终是完整值。

实测核对结果:首页 今日 $1.58/936req 与 近7天 $132.49/9893req 周期区分有效;
90 天趋势网关只返回 89 天,补零后 90 天(验证 slice() 补零逻辑必要且正确);
按模型 today=1 / 近7天=11 / 近90天=34 条,周期筛选生效;
兑换成功路径真实执行一次(id=57,$50,余额 309.29→359.29),失败路径 404/409 文案正确。

验证:compileDebugKotlin、lintDebug 均通过;独立审计两轮均无阻断与必修体验问题。
注:测试用临时 key 已删除;gradle.properties 的本地路径开关未纳入提交。
2026-09-12 03:41:02 +08:00
2aaa225139 feat(sub2api): 面板管理接入首页卡片;用量明细周期化与按模型筛选修复
首页与用量明细(用户反馈 1-3):
- 首页 Sub2API 卡片汇总只保留「今日 / 近7天」两个周期,去掉近30天/本月
- Sub2API 用量明细卡默认窗口改为「今天」,进入即看当天数据
- 每日用量柱状图:柱间距按天数自适应(>44 天 1dp),避免近90天时 3dp×N 间距溢出屏幕导致柱子挤没;柱高封顶 0.95、零消耗日 0.02 占位
- 「按模型」真正按时间周期筛选:新增 Sub2ApiRepository.fetchWindowModelStats(),按窗口 start_date/end_date 拉取 model_stats(面板模式走 dashboard/models,Key 模式走 /v1/usage),并新增加载中/错误/空态;切换窗口后自动取消悬空模型选中

面板管理(用户反馈 4):
- 面板管理 UI 从 ServiceDetailScreen 抽为公共组件 ui/servicedetail/Sub2ApiPanelManagement.kt
- 首页 Sub2API 卡片新增「面板管理」入口,弹窗内嵌同一组件(DashboardViewModel 新增面板状态与动作)
- API Key 不再展示过长明文:列表只显示掩码(前8+后4),新建成功弹窗一次性展示完整 Key 并可复制
- 复制按钮补 Toast 反馈;新建 Key 响应解析兼容 data 对象/字符串/顶层字段,并透传面板 error/message
- 兑换结果不再静默:Toast + 行内快照双反馈;消息消费后置空,连续相同结果也能再次提示
- 面板接口统一校验 HTTP 状态(401/403 明确提示面板登录已失效),不再把登录失效显示成余额 $0.00/空列表
- 面板模式分模型统计窗口与每日明细对齐到近 90 天

其它:SiteIcon 站点图标网络与 SVG 解码移到 Dispatchers.IO;新增 sub2_panel_* 三语文案,修正 sub2_home_no_usage 默认英文资源误写中文。
2026-09-12 03:11:31 +08:00
fd3d74cfef feat: API 管理 / 用量统计 / 充值 WebView / 首页仅显示已配置;Sub2API 用量明细卡(模型筛选+时间窗口+柱状图) 2026-09-11 23:38:03 +08:00
WaterRain
3bef8cc3f1
feat: 时间选择器优化 —— 范围单弹窗选择(DateRangePicker)+ 打开回显 + 天/月选择器精简 2026-09-11 07:51:49 +00:00
WaterRain
1439e8ca43
refactor(ccgo): CommandCode Go 统一更名为 CommandCode 2026-09-11 06:52:37 +00:00
WaterRain
75c6ce9568
feat(ocgo): 用量窗口新增模型级用量列表(_server 接口 + 窗口配额) 2026-08-30 06:56:49 +00:00
WaterRain
43d8df90f6
feat(ui): Codex 主模型余额为主视觉,Spark 弱化为次要摘要
- 首页卡片:主模型窗口独占进度行,Spark 收为单行小字摘要\n- 详情页:Spark 收进分隔线 + 小标题次要小节,细条低饱和进度\n- 桌面小组件:跳过 SPARK 窗口,仅保留主模型三行布局\n- 新增 window_spark 多语言文案
2026-08-24 08:49:46 +00:00
WaterRain
4ed6aaa3cc
feat(heatmap): 年份选择器新增最近365天窗口(默认)
- RECENT_YEAR(-1) sentinel:最近365天(今天往前364天~今天),默认加载窗口
- computeAllViews 支持窗口模式:每日/每周/累计/统计/分位按窗口计算
- 下拉置顶最近365天+ 分隔线 + 选中标记,与具体年份区分
- 浮层日期跨年自动带年份前缀(formatWeekRangeText 兼容 RECENT)
- setYear 竞态 guard 改 latestRequestedYear(最后点击胜出);RECENT 缓存跨天自动失效重算
- HeatmapAllViewsTest 4 用例,全量 130 用例通过
2026-08-08 00:27:55 +00:00
WaterRain
99050554e2
feat(heatmap): 个人资料与活动洞察 + 当前连续天数逻辑修正
- 个人资料卡片(页面顶部):自定义头像(相册选图→私有目录持久化→降采样解码)+ 昵称/邮箱自由文本编辑,SharedPreferences 持久化
- 活动洞察卡片:总请求次数 + 最多请求时段 Top3(按小时,UTC+8/UTC 口径,全量历史)
- 当前连续天数:结尾 0 token 天跳过,从最后一个非零天往前数(最后一天 0 也计入连续)
- 三语言资源(en/Hans/Hant),HeatmapInsightsTest 7 用例,全量 126 用例通过
2026-08-07 23:01:37 +00:00
WaterRain
025f971f7a
feat(heatmap): 首页OCGO快捷入口 + 多语言兼容修复
- 首页:OCGO用量卡与服务卡「查看用量详情」右侧新增 Token 活动快捷入口
- 首页入口描述改为「OCGO Token 活动」;统计卡片改 2×2 布局
- 多语言:热力图月份/日期/数字单位 locale-aware(英文 K/M/B + MMM d)
- 浮层/读数条句子走 stringResource;月份名资源数组(三语言)
- 遗留修复:Codex 窗口标签中性化(weekly/usage)、Ollama plan 空串兜底、
  isFiveHourLabel 语言无关判断、字段标签资源化、Widget usageLabel
- 单测同步:Codex/Ollama/FormatUtils/FormatCodexPrimaryLabel 全绿(119 用例)
2026-08-07 03:28:23 +00:00
WaterRain
03424e6184
feat(heatmap): 年度统计卡片(累计/峰值/当前连续/最长连续)
- computeStats 单次循环计算四项指标,存于 HeatmapUiState.stats
- 视图切换器下方一行 4 卡片,按所选年份跟随变化
- i18n 三语言(含 plurals 单复数);loading 占位显示 -
- 对抗审查修复:surfaceVariant 品牌色、en plurals、loading 占位
- 新增 HeatmapStatsTest 单测(4 用例全绿)
2026-08-07 01:53:24 +00:00
WaterRain
962d8f1215
feat(heatmap): 年份选择器 + 每周视图柱状图 + 对抗审查修复
- 修复 4 个 heatmap 提交的编译错误与对抗审查问题:浮层锚定与跨年日期、
  Crossfade 快照、时区口径统一(useUtc8)、万级格式化溢出、周视图周日对齐
- 新增年份选择器:自然年语义、默认今年、三种视图跟随、下拉菜单、
  图例固定不随热力图滚动、打开默认滚到最右、0 token 天可点击查看
- 每周视图改为离散柱状图:列=自然周,高度按 token 排名比例映射 2~7 格
  (不同量级周高度可区分),0 用量周显示 Level 0 空白格(整列 7 格全绘制)
- 选中周整列主题色描边强调,浮层日期跨年带年份前缀
- 文档 docs/heatmap-plan.md 补充年份选择器/图例与滚动/柱状图章节
2026-08-06 22:33:25 +00:00
WaterRain
77cb664590
feat(heatmap): add popup tooltip, crossfade animation, accessibility, i18n
- Click cell shows popup with date and token count in Chinese format
- Weekly popup shows date range (start-end)
- Crossfade 150ms between view mode switches
- Canvas i18n: noDataText/lessText/moreText parameters
- Accessibility: semantics contentDescription on Canvas
- formatTokenChinese: 亿/万 Chinese units with decimal precision
- Popup: focusable, auto-dismiss, toggle on re-click
- heatmap_accessibility_desc string in EN/zh-Hans/zh-Hant
2026-08-06 07:45:15 +00:00
WaterRain
dd91e94805
feat(heatmap): add HeatmapScreen, navigation route, dashboard entry, i18n strings
- HeatmapScreen with TopAppBar, view switcher (Daily/Weekly/Cumulative), Canvas
- DashboardScreen: new HeatmapEntryCard with CalendarMonth icon
- RainyTokenNavHost: HEATMAP route for both Compact and Expanded layouts
- 9 new string resources across EN/zh-Hans/zh-Hant
- ArrowBack -> AutoMirrored.Filled.ArrowBack (deprecation fix)
2026-08-06 07:30:28 +00:00
WaterRain
488f08d083
fix: 主页底部版本号改为实时读取 BuildConfig.VERSION_NAME 2026-08-04 06:48:52 +00:00
WaterRain
f788d57798
fix: 同步/触发错误全链路本地化(count_times 单位 + Unknown/PartialSync/TriggerError 结构化映射) 2026-08-02 03:02:58 +00:00
WaterRain
039f27da18
fix: ParseError 原因结构化本地化,消除英文/繁体界面的中文错误透传(Codex review + 双审计) 2026-08-02 01:16:52 +00:00
WaterRain
4107954080
feat: 应用内语言切换(跟随系统/简/繁/英)+ 繁体中文支持 + 应用名/署名分语言
- 新增 LocaleManager:语言偏好存 SharedPreferences,createConfigurationContext
  + LocaleList 包装 Application/MainActivity 的 attachBaseContext(零新依赖)
- 设置页新增语言卡片与选择对话框:跟随系统 / 简体中文 / 繁體中文 / English
- 新增繁体中文 values-b+zh+Hant(434 条,OpenCC s2twp 台湾标准转换+人工修正)
- 简体目录改为 values-b+zh+Hans(BCP-47,与繁体对称;AGP9 不接受 values-zh-Hans)
- widget_brand 可翻译:英=Rainy / 简繁=雨晴喵;app_name 可翻译:英=RainyToken / 简繁=雨晴Token
- 资源三语言 434/434/434 对齐,占位符零差异
2026-08-01 13:43:05 +00:00
WaterRain
13acca37ed
fix: 默认资源改为英文,非中/英系统语言回退英文(原回退中文)
原结构:values/(默认)=中文,values-en=英文。系统语言既非中文也非英文时
(如日语/法语)会回退到默认资源显示中文,不符合国际用户预期。

新结构:
- values/(默认)=英文(国际回退语言),unqualifiedResLocale=zh-CN → en
- 中文移入 values-zh/(中文系统精确匹配)
- 品牌资源(app_name/widget_brand/brand_token/dashboard_footer_version,
  translatable=false)保留在默认资源,所有语言共用中文品牌名
- 删除 values-en/(不再需要,默认即英文)

验证:中英 426/426 key 对齐、lint 0 Error(MissingTranslation/ExtraTranslation 0)、
113 测试全绿、assembleDebug 成功
2026-08-01 12:28:00 +00:00
WaterRain
6ac4d06e9f
i18n 修复:消除英文环境下 5 处中文泄漏(最终审查 P1)
最终独立审查发现英文环境用户可见中文,全部修复:

- 激活成功弹窗:三个 parse 函数(OCGO/Codex/Ollama)改为返回结构化 TriggerSummary,
  中文摘要拼接移出 Repository;UI 层 buildTriggerSummaryText() 用资源组装本地化文本
- Codex 窗口标签:formatCodexPrimaryLabel / normalizeWindowLabel 增加「每周/每月」字面量分支,
  Dashboard 与 Widget 英文环境下正确显示 Weekly/Monthly
- Dashboard footer:DashboardCardUi.lastFetchError 改 UiText?,errorToUiText() 按类型映射资源
- 凭据编辑页:ParseError→error_parse_failed(RepositoryError.ParseError 新增公开 detail),
  「未知」「JSON格式错误」中文 fallback 改资源
- 服务详情页:triggerUsage else 分支复用 errorMessage() 全类型映射;
  TriggerError「token刷新失败」前缀资源化;「无响应体」不再展示
- 新增 TriggerSummary 数据类与 12 组中英资源(trigger_*/error_token_refresh_failed/等)
- 测试:CodexRepositoryTest 6 用例改为结构化断言,FormatUtilsTest 更新 monthly 映射;
  113 个用例全绿,lint 0 Error,资源 426/426 对齐
2026-08-01 08:19:51 +00:00
WaterRain
52b86e95e5
i18n 阶段二:新增英文翻译 values-en + widget 布局英文适配
- 新增 values-en/strings.xml:414 条英文资源与中文完全对齐(占位符/转义/格式逐一校验,无缺失无多余,无中文残留)
- widget 三套布局(亮色/预览/暗色 night)完成资源化 + 英文布局适配:
  - row2/row3 行标签宽度 44dp→60dp,避免 "This week"/"This month" 被截断
  - widget_updated 增加 maxLines=1 + ellipsize=end,防最小宽度下挤占刷新按钮
- widget_name/widget_description 由 translatable=false 改为正式可翻译资源,补充英文(AI Usage Panel)
- 统一英文术语:raw_record_title 改为 Raw data 与 title_raw_data 一致
- 验证:testDebugUnitTest 78 用例通过、lintDebug 0 Error 且 MissingTranslation/ExtraTranslation/Untranslatable 全为 0、assembleDebug 成功
2026-08-01 07:53:59 +00:00
WaterRain
a26629027e
i18n 阶段一:全量字符串资源化(行为不变,仍为中文)
- strings.xml 扩充至 ~470 条(原 3 条),全部 UI 硬编码中文迁移为资源引用
- 新增 UiText 抽象(Resource/Dynamic + asString()/resolve()),6 个 ViewModel 错误消息 UiText 化
- AppTips 13 条改为 @StringRes 资源 ID;TimeFilter/ChartGranularity/StatusStyle/DashboardViewModel 徽章改资源 ID
- FormatUtils 保持纯函数,DurationText/标签参数注入(78 个纯 JVM 测试不受影响)
- Widget XML(2) + WidgetProvider 文字资源化;品牌名 translatable=false
- 开启 generateLocaleConfig + resources.properties(unqualifiedResLocale=zh-CN)
- 修复审查发现的每周/每月行为回归(dashboard/widget 保持'每周/每月')
- 删除死资源/死代码;ChartGranularity 粒度标签补 time_last_12h
- 验证:compileDebugKotlin / testDebugUnitTest(78) / lintDebug / assembleDebug 全绿
2026-08-01 07:32:23 +00:00
WaterRain
5a18ffc02f
feat: MIUI Widget 完整适配 + 深色模式全局修复
MIUI Widget 接入(负一屏 + 曝光刷新)
- AndroidManifest 新增 miuiWidget 全套标识
- intent-filter 新增 miui.appwidget.action.APPWIDGET_UPDATE
- 根布局改为 FrameLayout + @android:id/background
- minWidth 250→300dp(4x2 标准)
- onReceive() 处理 MIUI 曝光刷新
- 5min 冷却自动刷新

深色模式全面适配
- drawable-night/widget_bg.xml
- drawable-night/ic_opencode_go_logo.xml
- drawable-night/ic_deepseek_logo.png + wordmark
- layout-night/widget_opencode_go.xml
- DarkInkWarm/DarkInkMuted + inkWarm()/inkMuted()
- 全页面 51 处 InkMuted → inkMuted()
- ServiceIcon 白底 → 主题自适应

用户体验
- 顶部栏 + 按钮:一键添桌面小组件
- 负一屏底部遮挡修复(间距压缩 28dp)
2026-06-19 07:38:02 +00:00
WaterRain
3aca009290
🎉 RainyToken — AI 余额查询 APP
- Jetpack Compose + Material 3 仪表盘
- DeepSeek REST API 余额查询
- OpenCode Go WebView 抓取用量
- 3 张 Canvas 图表(消耗/请求/Token)
- 原始记录分页浏览
- DataStore + 内存缓存
- 桌面小组件
2026-06-16 01:46:03 +00:00