bc862df226
fix(sub2api): 余额标签与数字同行;请求次数改为「消耗 N 次」
2026-09-13 00:02:16 +08:00
62ddf50638
fix(sub2api): 面板管理按钮贴右边缘;补齐审查发现的登录安全与死代码问题
...
面板管理按钮(用户反馈「没有放到最右边」):
- 根因:底部 Row 里同时给左侧文案 weight(1f, fill=false) 和中间 Spacer weight(1f),
两个 weight 平分剩余空间,按钮只被推到一半。改为只让文案 weight(1f) 吃掉全部剩余宽度。
- 同时清零 TextButton 的 contentPadding,并去掉无效的 defaultMinSize(0)
(Material3 的最小尺寸挂在按钮内层节点,外层 modifier 压不下去,实测为 no-op)。
- 去掉箭头 Icon 的 offset 微调:offset 只改放置不改测量,右移的像素会落在按钮命中区之外造成误触。
独立复审发现并修复:
- 【安全】线上真正使用的面板登录弹窗 PanelLoginDialog 轮询 localStorage.auth_token 时
完全没有来源校验——登录容器会跳转到第三方页(OAuth/CDN),它们可伪造 token 覆盖用户凭据。
现要求 token 必须来自配置的面板域名(比较 hostname),并回传 host 一并校验。
- 【阻塞】saveFromCookieManager 仍在主线程 runBlocking 做 Keystore 加解密 + DataStore 写盘,
改 suspend 并在 viewModelScope 中调用。
- 【死代码】移除已无调用点的 balanceTrailing 插槽(余额行入口已改到底部)。
说明:WebViewLoginScreen 那套 JS 桥(LoginProbeBridge/nonce/trustedHosts)经查其路由
Routes.WEBVIEW_LOGIN 没有任何 UI 入口(onStartWebViewLogin 只声明未调用),实际不可达,
故本次把安全校验补到了真正在跑的 PanelLoginDialog 上,避免两套并行实现语义分叉。
验证:compileDebugKotlin 与 lintDebug 通过;真机实测按钮与「刚刚更新」同行(y1492-1555)
且可点击区域右边缘到达卡片内容区右缘,点按正常打开弹窗。
2026-09-12 11:31:15 +08:00
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
edc2a40dc1
fix(sub2api): 面板管理入口与余额齐平;用量磁贴压缩为两行
...
- 「面板管理」从卡片底部移到余额同一行右侧:给 BalanceMainArea 增加 balanceTrailing 槽,
Sub2ApiBalanceWithUsage 用 Row(verticalAlignment=CenterVertically) 让入口与余额数字齐平,
不再单独占一行并额外撑高卡片。
- 今日/近7天 磁贴由三行(周期名/Token/次数)改为两行:第一行「周期名 … 请求次数」左右分布,
第二行 Token 数。磁贴高度 56dp → 44dp,卡片整体更紧凑。
真机验证(V2172A / Android 15):余额 359.01 位于 y958-1105,面板管理 y956-1037 与之同高;
磁贴两行 y1185-1243 / y1255-1339;点「面板管理」正常打开弹窗(弹窗内标题仍只有一个)。
compileDebugKotlin 与 lintDebug 均通过。
2026-09-12 10:18:19 +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
ce8a656448
fix(sub2api): 刷新按钮与「面板管理」标题同排
...
- 弹窗标题槽改为 Row:左侧标题 + 右侧刷新图标按钮,刷新与标题处于同一水平线,
且随标题固定不随内容滚动(内容区仍可滚动)。
- showHeader=false 时组件不再渲染内部标题/刷新行,避免多出一条空行把刷新挤到标题下面。
真机验证(V2172A / Android 15):标题 y284..413 与刷新 y300..396 同行居中;
点刷新弹窗保持打开且列表重载;滚动后标题+刷新固定于顶部。
compileDebugKotlin 与 lintDebug 均通过。
2026-09-12 09:47:42 +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
80552af204
feat: 新凭据类型补全 RefreshWriteSession lastVerifiedAt 分支
2026-09-11 23:38:03 +08:00
fd3d74cfef
feat: API 管理 / 用量统计 / 充值 WebView / 首页仅显示已配置;Sub2API 用量明细卡(模型筛选+时间窗口+柱状图)
2026-09-11 23:38:03 +08:00
e4cd9a36f6
feat: 新增 Trae / WorkBuddy / Sub2API 三家供应商接入与凭据管理
2026-09-11 23:38:03 +08:00
WaterRain
3bef8cc3f1
feat: 时间选择器优化 —— 范围单弹窗选择(DateRangePicker)+ 打开回显 + 天/月选择器精简
2026-09-11 07:51:49 +00:00
WaterRain
777860024d
release: bump to v1.6.4
Release / build (push) Has been cancelled
2026-09-11 06:55:38 +00:00
WaterRain
1439e8ca43
refactor(ccgo): CommandCode Go 统一更名为 CommandCode
2026-09-11 06:52:37 +00:00
WaterRain
a079a0bfcb
feat(chart): 用量详情页显示服务标识;图例只显示当前时间范围内模型(含 tooltip 残留修复)
2026-09-11 06:52:36 +00:00
WaterRain
95508bab9f
release: bump to v1.6.3
Release / build (push) Has been cancelled
2026-08-30 06:57:05 +00:00
WaterRain
75c6ce9568
feat(ocgo): 用量窗口新增模型级用量列表(_server 接口 + 窗口配额)
2026-08-30 06:56:49 +00:00
WaterRain
24eb3e190c
fix(ccgo): GOAT 计划月度额度映射 + 详情页月度重置倒计时修复
...
- PLANS 新增 individual-goat→$70(官网 GOAT 计划,5h $14 / weekly $35 / monthly $70),
修正 individual-pro 30→80,planDisplayName 映射 GOAT
- 抽 internal planMonthlyQuota/planDisplayName(大小写不敏感、未知计划安全降级)
- 详情页月度重置倒计时改用仓库已算好的 monthly.resetInSec(原按 ISO 解析
epoch 毫秒的 billingPeriodEnd 恒失败,倒计时永不显示)
- 新增 7 个计划映射测试
2026-08-30 05:49:52 +00:00
WaterRain
6cd54a3a8f
feat(ccgo): 适配用量接口新格式 + 修复 nextCursor null 同步死循环
...
- 解析迁移到 companion(纯函数可单测),cost 改读 meta.totalCost(美元数值),
旧格式 creditsTotal 兼容回退
- nextCursor 由服务端直接提供,缺失/null 时回退按末条自编码
- 修复 JSON null 被解析成字符串 "null" 导致 fullSync 死循环(JsonNull 拦截)
- fullSync/incrementalSync 增加游标未前进 + 页数上限双防御
- 新增 8 个解析测试(含 null 游标回归用例)
2026-08-30 05:49:45 +00:00
WaterRain
f1ed643b80
release: bump to v1.6.2
Release / build (push) Has been cancelled
2026-08-27 02:24:17 +00:00
WaterRain
1a1066076a
feat(opencode): 适配用量页新格式(usagePercent 小数 + usage/limit 字段)
...
- parseWindows 的 usagePercent 改为 Float 解析,避免小数被 toIntOrNull 丢弃\n- 新增 usage/limit 字段解析(exactKey 匹配避免前缀误命中)\n- 首页卡片与桌面小组件读取端改为 toFloatOrNull()?.roundToInt()\n- 新增新格式/旧格式兼容测试
2026-08-27 02:23:54 +00:00
WaterRain
bb309c92f0
release: bump to v1.6.1
Release / build (push) Has been cancelled
2026-08-24 08:49:58 +00:00
WaterRain
dcc93714be
chore: 统一品牌命名(Ollama 去 Pro 后缀、Codex 去 Plus 后缀)
2026-08-24 08:49:54 +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
7e44e545bf
feat(codex): 用量窗口支持 Spark 独立限额分组解析
...
- UsageWindow 增加 WindowGroup(CODEX/SPARK)分组字段\n- additional_rate_limits 按 limit_name 是否含 spark 归类\n- selectPrimaryWindow 优先普通 Codex 组,避免 Spark 5h 抢占主余额
2026-08-24 08:49:35 +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
266d33d131
release: bump to v1.6.0
Release / build (push) Has been cancelled
2026-08-07 03:36:46 +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
83fc18317f
feat(heatmap): 滑动查看手势扩展到每周与累计视图
...
- 手势仲裁(长按/慢速拖动=查看锁定、快速=滚动)从每日扩展到三种视图
- 长按(按住不动≥系统长按时长)进入查看:所见即所得格子高亮+读数条
- 每周视图读数条显示周范围(formatWeekRangeText 与浮层同口径)
- 累计视图读数条显示累计 token;tap 点击清除残留预览
- 对抗审查修复:up 消费防误弹浮层、判决事件即时消费、溢出省略、防御性校验
2026-08-07 01:30:21 +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
6e4a5ff9cb
feat(heatmap): add HeatmapCanvas composable with three view layouts
...
- Daily: 53×7 GitHub-style grid with week grouping and left-padding
- Weekly: 52×1 single-row grid
- Cumulative: 53×7 grid using cumulative token data
- 6-level pink color gradient (light/dark mode)
- Canvas drawRoundRect with 11dp blocks, 3dp gap, 3dp radius
- Bottom month labels (Chinese), color legend, horizontal scroll
- Tap interaction with coordinate-to-cell mapping
2026-08-06 07:21:07 +00:00
WaterRain
b8479eebf3
feat(heatmap): add HeatmapViewModel with quantile-based color levels and three view modes
...
- Daily/Weekly/Cumulative data aggregation from OCGO records
- Quantile (P25/P50/P75/P95) color level mapping with nearest-rank
- Token = inputTokens + cacheReadTokens + reasoningTokens + outputTokens
- 365-day rolling window, 52-week weekly view, cumulative running sum
- Hilt injected, Dispatchers.Default for heavy ops, try-catch for safety
2026-08-06 07:06:34 +00:00
WaterRain
7f2ca18d9d
feat: 图表新增近30天时间尺度 (LAST_30D_DAILY)
2026-08-06 05:47:16 +00:00
WaterRain
f203149f4f
security: 修复 CI/Release workflow 签名凭据风险
...
- 所有 action 引用改为 commit SHA pin(checkout/setup-java/setup-android/action-gh-release/upload-artifact)
- build.gradle.kts 移除硬编码签名密码 fallback,改用 takeIf 防御 null 和空字符串
- release.yml 构建完成后清理 release.jks(if: always())
- ci.yml 补充最小权限声明 permissions: contents: read
2026-08-04 22:58:00 +00:00
WaterRain
172d6b61aa
release: bump to v1.5.4
Release / build (push) Has been cancelled
2026-08-04 06:52:11 +00:00
WaterRain
488f08d083
fix: 主页底部版本号改为实时读取 BuildConfig.VERSION_NAME
2026-08-04 06:48:52 +00:00
WaterRain
8340ded070
fix: 详情页新鲜缓存不再标记为缓存,用量卡片显示刷新时间
2026-08-04 06:43:01 +00:00
WaterRain
e4ea61c0f2
release: bump to v1.5.3
Release / build (push) Has been cancelled
2026-08-02 03:33:34 +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
2e4e5ce449
fix: 与系统应用语言页同步(framework 唯一权威源)+ widget 文本跟随最新偏好(Codex review + 审计)
2026-08-02 00:12:35 +00:00
WaterRain
f463751fb1
fix: 日期格式与应用内语言同步 + DeepSeek 标签动态化(Codex review)
2026-08-01 20:32:27 +00:00
WaterRain
5e7942c5cc
chore: 移除已迁移的 values-zh(简体资源已迁至 values-b+zh+Hans)
2026-08-01 13:43:37 +00:00
WaterRain
b51644048d
fix: widget 用量条左对齐(label 统一 44dp)+ 署名动态化跟随应用内语言
...
- 三套布局三行 label 统一 44dp:此前 row2/3 为 60dp、row1 44dp,
进度条起点差 16dp 导致不对齐;英文标签简化为 Week/Month 后 44dp 足够
- 署名 TextView 补 @+id/widget_brand,Provider 动态 setTextViewText:
与行标签同源(跟随应用内语言),避免宿主进程按系统语言渲染混搭
2026-08-01 13:43:05 +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
3a724d46fd
fix: 日期格式化跟随系统语言,修复英文界面中文日期符号(Codex review P2)
...
UsageOverviewScreen.DailyDetailRow 原强制 Locale.CHINA,英文环境下 datePattern
为 MMM d, EEEE 但月份/星期仍渲染中文(如 8月1日, 星期五)。改为
Locale.getDefault() 并加入 remember key,与资源语言保持一致。
2026-08-01 12:22:07 +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
f70b77f5cc
release: v1.5.2
Release / build (push) Has been cancelled
2026-07-28 01:29:38 +00:00
WaterRain
728b3ad89e
fix: OCGO 激活用量端点从 zen/v1 改为 zen/go/v1
...
- CHAT_API: opencode.ai/zen/v1/chat/completions → opencode.ai/zen/go/v1/chat/completions
- fetchModels provider key: "opencode" → "opencode-go"
(opencode = Zen 模型列表, opencode-go = Go 模型列表)
2026-07-28 01:22:28 +00:00
WaterRain
6a73155ed0
release: v1.5.1
Release / build (push) Has been cancelled
2026-07-27 05:24:15 +00:00
WaterRain
2732b138ae
fix: 凭据变更后刷新状态并防止旧请求回写 ( #2 )
...
## 修复内容
### Issue #2 : 凭据保存/删除后返回设置页配置状态不刷新
**核心修复:**
- Dashboard 并发竞态:reloadLocalState() 改为只更新 credentialState,不再通过 loadFromCache() 重建卡片,避免覆盖 refresh() 写入的最新余额/错误状态
- ServiceDetail 凭据刷新:reloadCredentialState() 增加凭据指纹检测(credentialFingerprint),区分凭据替换/新增/删除三种场景,正确清除旧缓存
- refresh() 加 generation 标记,防止旧请求响应覆盖新数据
- 宽屏布局刷新:Expanded 模式下 ServiceDetail 面板切换时正确触发凭据状态刷新
**安全修复:**
- 移除公开提交的 debug.keystore,恢复 AGP 默认签名行为
- 凭据指纹架构:SHA-256 不可逆指纹 + cacheIdentityFingerprint + sameRefreshLineage,支持 Codex token 轮换不误清缓存
- RefreshWriteSession + CredentialSnapshot 原子提交架构
**测试:**
- 新增 16+ 个单元测试覆盖凭据指纹、分类逻辑、四个场景
- 总计 78+ 个用例全部通过
Refs #2
2026-07-27 11:40:47 +08:00
WaterRain
74a4e3d494
fix: 签名 fallback 限制到 CI 环境,本地构建缺 release.jks 时报错
...
修复 chatgpt-codex-connector review 指出的问题:
原逻辑在任何机器缺 release.jks 时都静默 fallback 到 debug keystore,
可能生成不安全的 debug 签名 Release APK 而无任何错误提示。
改为仅 CI=true 时才 fallback,本地构建直接 GradleException 报错。
2026-07-20 13:03:22 +00:00
WaterRain
29877c00ce
feat: OCGO & Ollama 一键激活用量 + 设置页 API Key 输入
...
- OpenCodeGoRepository: 新增 fetchModels() + triggerUsage(),调 opencode.ai/zen/v1/chat/completions
- OllamaRepository: 新增 fetchModels() + triggerUsage(),调 ollama.com/v1/chat/completions
- SessionCredential: 新增 apiKey 字段,用于一键激活用量
- RefreshBalanceUseCase: 新增 fetchOpenCodeGoModels/triggerOpenCodeGoUsage/fetchOllamaModels/triggerOllamaUsage
- ServiceDetailViewModel: 通用化 triggerUsage(),支持 Codex/OCGO/Ollama 三服务,各服务独立 SharedPreferences 持久化
- ServiceDetailScreen: 三服务均显示模型选择器 + 激活按钮 + 响应弹窗
- CredentialEditScreen/ViewModel: OCGO & Ollama 凭据表单新增 API Key 输入区域
- AGENTS.md & README.md: 同步新功能描述
2026-07-20 09:46:39 +00:00
WaterRain
360dde342f
fix: CI Release 构建签名 fallback + debug keystore 保障
...
- build.gradle.kts: release.jks 不存在时自动 fallback 到 ~/.android/debug.keystore
- ci.yml: build-release job 增加 Ensure debug keystore 步骤
- ci.yml: Release APK 完整性验证(manifest/arsc/res/)
上一轮 CI 失败原因: validateSigningRelease 找不到 release.jks
2026-07-20 09:21:05 +00:00
WaterRain
b7639a733e
test: 新增 52 个单元测试,删除模板残留,整理构建修复
...
## 变更内容
### 新增测试(3 文件,52 用例)
- FormatUtilsTest (18): formatAmount/formatResetInSec/formatResetForWidget/normalizeWindowLabel
- FormatCodexPrimaryLabelTest (9): Codex 窗口标签翻译,含 null fallback/大小写/未知值
- CodexRepositoryTest (25): durationLabel 阈值/parseUsageWindows JsonNull 安全/parseSseResponse SSE 解析
### 删除模板残留
- ExampleUnitTest.kt (包名 com.java.myapplication)
- ExampleInstrumentedTest.kt (包名 com.java.myapplication)
### 生产代码可见性调整 (CodexRepository.kt)
- UsageWindow/parseUsageWindows/durationLabel: private to internal, 移入 companion object
- parseSseResponse: private to internal 顶层函数
### 构建修复 (上一轮会话成果)
- build.gradle.kts: 删除旧 fixReleaseManifest workaround,替换为 guardReleaseResources 任务
- AGENTS.md: 新增 ARM64 Proot Release 构建红线段落
- README.md: 补充 Release 构建额外配置说明
## 测试结果
78 tests, 0 failures, 0 errors
2026-07-20 09:07:54 +00:00
WaterRain
5ead63a8a3
fix: AGP 9.0 ARM64 Proot release APK 缺 AndroidManifest.xml
...
packageRelease 任务在 ARM64 Proot 环境下丢失 manifest,
新增 fixReleaseManifest 后处理任务:从 .ap_ 提取 binary
AndroidManifest.xml 注入 APK 并用 apksigner 重新签名。
仅 aarch64 环境触发,CI x86_64 不受影响。
2026-07-17 23:18:39 +00:00
WaterRain
81cdd00cac
revert: 恢复签名密码默认值,无需额外配置 Secret
2026-07-17 22:27:24 +00:00
WaterRain
5178af91f6
fix: 安全与发布成熟度改进
...
1. 移除通用 WebView 登录入口(半成品功能,凭据无法正确映射到 Repository)
2. allowBackup=false,移除空模板备份规则引用
3. 版本号修正:versionCode=5, versionName=1.5
4. 签名密码默认值改为空字符串(CI 注入 Secret)
5. release workflow 注入签名密码环境变量
6. 新增 ci.yml:push/PR 触发单测+Debug 编译
7. 新增 LICENSE 文件(MIT)
8. CommandCodeGoRepository 注释修正(顺序执行非并行)
9. README 安全声明更新}
2026-07-17 22:26:16 +00:00
WaterRain
0b140fe73e
fix: UTC+0/UTC+8 切换偏好持久化——OCGO 路径首次加载不读取持久化值导致偏好丢失
...
将 UTC 偏好同步读取逻辑从 setWorkspace() 下沉到 load() 开头,
确保 OCGO(load())和 CCGO(setWorkspace()→load())两条路径
首次加载时都从 DataStore 读取持久化的 useUtc8 偏好。
useUtc8Initialized 标志位保证只读取一次,后续 toggleUtc8() 不被覆盖。
2026-07-17 21:34:51 +00:00
WaterRain
b4c3402d22
feat: Codex 一键激活用量功能 — 模型列表从 models.dev 动态获取,SSE 响应解析弹窗展示
Release / build (push) Has been cancelled
2026-07-17 01:50:50 +00:00
WaterRain
f17d37ae39
fix: Codex JsonNull 崩溃 + 5h 窗口优雅降级
...
- CodexRepository: 所有 ?.jsonObject/?.jsonPrimitive → as? JsonObject/as? JsonPrimitive
防止 API 返回 JSON null 时 IllegalArgumentException 闪退
- CodexRepository: parseUsageWindows() 外包 try/catch → ParseError 兜底
- CodexRepository: extras 新增 primary.label 供 UI 动态显示主窗口标签
- ServiceBalanceCards: CodexMainBalance 标签动态化 + CodexUsageWindows 保留 5h 空槽位
- ServiceDetailScreen: mainCardLabel 改为 "用量" + CodexUsageCard 保留 5h 空槽位
- Widget: Codex 窗口动态解析 + 5h 始终占第一行
- AGENTS.md: 新增 JsonNull 安全红线 + Codex 5h 降级说明
2026-07-13 02:13:44 +00:00
WaterRain
9d06644225
feat: Codex OAuth 无头登录、调试日志面板、用量详情进度条与文档同步
...
- 实现 Codex OAuth PKCE 无头模式:生成授权链接、外部浏览器登录、粘贴回调 URL 交换 token
- 新增 DebugLog 内存 ring buffer 与设置页调试日志入口,Repository 关键路径埋点
- 修复 Codex refresh_token 刷新请求体为 form-urlencoded,RefreshResult 密封类保留错误详情
- ServiceDetailScreen 为 Codex 增加用量窗口进度条,Ollama 百分比精确到两位小数
- 同步 AGENTS.md、README.md
2026-07-11 03:07:16 +00:00
WaterRain
fbae6701b8
fix: DashboardViewModel 竞态条件导致 Codex 用量闪回旧值
...
- init 从两个独立协程改为单协程串行 loadFromCache→refresh
- refresh() 加 Mutex.tryLock() 防并发调用交错覆盖 UI
- AGENTS.md 补充刷新竞态红线说明
2026-07-10 22:54:13 +00:00
WaterRain
45e10ad063
fix: Ollama小组件logo独立命名,不影响首页图标
...
Ollama logo拆分为两个资源:
- ic_ollama_logo: 首页ServiceIcon用,无night变体,深色模式靠浅灰背景保证可见
- ic_ollama_logo_widget: 小组件用,有night变体(浅色版)
避免drawable-night-nodpi覆盖影响首页Ollama图标。
2026-07-07 22:07:09 +00:00
WaterRain
06f28c9e57
fix: 深色模式小组件logo不可见
...
新增 drawable-night-nodpi/ 目录,放入深色模式专用 PNG logo:
- ic_opencode_go_logo_widget.png (OCGO/CCGO)
- ic_codex_logo_widget.png (Codex)
- ic_ollama_logo.png (Ollama)
黑色像素替换为 #E8D8D5 暖灰色,透明通道保留。
Android 资源系统在深色模式自动选择 night-nodpi 同名资源。
DeepSeek 蓝色 logo 在深色背景上可见度足够,不需要变体。
2026-07-07 22:03:51 +00:00
WaterRain
9077605da6
feat: Ollama详情页新增模型调用次数显示
...
在 OllamaUsageCard 的 5h 和每周用量窗口进度条下方,
新增模型级调用次数列表(按次数降序,品牌粉标色)。
数据来自已有的 extras[session.models]/[weekly.models],
新增 parseModelRequests() 解析 + ModelRequestList Composable。
仅改详情页,首页 Dashboard 未动。
2026-07-07 21:46:59 +00:00
WaterRain
75a5c8f81e
fix: 对抗审查修复5项问题
...
1. BalanceCache.put() 并发写丢失 — read-modify-write 搬进 dataStore.edit{} 互斥锁
2. Widget VectorDrawable → PNG — 生成 ic_opencode_go_logo_widget.png 和 ic_codex_logo_widget.png
3. SimpleDateFormat 线程安全 — 共享实例改为每次调用创建局部实例
4. 增量同步按 workspace 过滤 — 新增 getIdsByWorkspace() 避免跨 workspace ID 碰撞
5. Codex amount 语义统一为 usedPct — balance_cache 版本 v2→v3 旧缓存失效
Doc: AGENTS.md/README.md 同步更新(›→>、RemoteViews PNG文件名、增量同步描述)
2026-07-07 05:40:16 +00:00
WaterRain
c5505c896a
fix: ic_deepseek_logo.png从ICO转为真PNG,修复CI AAPT编译失败
Release / build (push) Has been cancelled
2026-07-07 02:16:11 +00:00
WaterRain
814ae61f01
feat: 使用小技巧系统 + 小组件点击提示 + 图表默认tooltip + 添加小组件权限检测
...
- 新增 AppTips.kt:13条操作技巧,Dashboard随机展示一条hint,设置页TipsScreen查看全部
- 小组件左上角加 › 箭头提示可点击进APP,其他区域点切换服务
- 图表默认选中最后一根柱子,tooltip首次可见
- 添加小组件二次确认弹窗 + Manifest权限 + MIUI AppOps检测
- Dashboard首次进入显示长按拖拽排序提示横幅
- NavHost新增Tips路由
- 同步AGENTS.md和README.md
2026-07-07 01:57:52 +00:00
WaterRain
2c21add8c3
refactor: template CredentialEditViewModel testAndSave methods + cleanup
...
Step 6: CredentialEditViewModel template
- New: testAndRollback() template method — handles save/test/rollback/message
- testAndSaveApiKey: use testAndRollback(rollbackOnFailure=false)
- testAndSaveCommandCodeGo: use testAndRollback(rollbackOnFailure=false)
- testAndSaveOpenCodeGo: use testAndRollback(rollbackOnFailure=true)
- testAndSaveOllama: use testAndRollback(rollbackOnFailure=true)
- Unified error message formatting in one place
- ~50 lines of duplicate when(err) blocks removed
All 8 PLAN.md items complete — deleting plan file
2026-07-07 00:16:22 +00:00
WaterRain
6e629d8eb2
refactor: remove Jsoup dependency + replace runBlocking with Flow
...
Step 7: Remove Jsoup
- Delete implementation(libs.jsoup) from build.gradle.kts
- Delete jsoup version + library from libs.versions.toml
- 0 imports of Jsoup in codebase, pure dead dependency
Step 8: ChartSettingsStore Flow
- Replace runBlocking getUseUtc8() with StateFlow useUtc8State
- UsageChartViewModel: setWorkspace() reads useUtc8Flow.first() async
- ChartUiState: add useUtc8Initialized flag to prevent double-load
- Remove runBlocking import from ChartSettingsStore
2026-07-07 00:05:33 +00:00
WaterRain
220a74492a
feat: add retry with exponential backoff to all repositories
...
- New: RetryHelper.kt — retryOnTransientError(maxRetries=2, baseDelay=1s)
- Wraps in RefreshBalanceUseCase — single dispatch point for all 5 services
- Retries on Network and 5xx ServerError
- 401/403 (InvalidCredential), 429 (RateLimited), ParseError — no retry
2026-07-06 23:57:58 +00:00
WaterRain
f2e5eedaa4
refactor: extract duplicate format functions to FormatUtils
...
- New: ui/components/FormatUtils.kt — formatAmount/formatResetInSec/formatResetForWidget/normalizeWindowLabel
- ServiceBalanceCards.kt: remove internal definitions, import from FormatUtils
- ServiceDetailScreen.kt: remove private formatResetInSec/formatAmount, import from FormatUtils
- OpenCodeGoWidgetProvider.kt: remove private normalizeWindowLabel, import from FormatUtils
(formatReset kept — widget uses short d/h/m format, not Chinese)
2026-07-06 23:47:20 +00:00
WaterRain
ec5f2dcb5c
refactor: split DashboardScreen into ServiceBalanceCards
...
- New: ServiceBalanceCards.kt (511 lines) — all service balance Composables +
CompactUsageRow/CompactUsageRowEmpty + utility functions
(formatAmount/formatResetInSec/normalizeWindowLabel/statusBadgeStyle/
secondaryLine/footerText)
- DashboardScreen.kt: 1121 → 637 lines (-43%)
Retained: DashboardScreen main + DraggableDashboardCards + DashboardCard +
DashboardFooter
- All functions changed from private to internal for cross-file visibility
- No behavior change
2026-07-06 23:39:48 +00:00
WaterRain
c53266a16b
test: add parsing unit tests for Ollama and OpenCodeGo
...
- OllamaRepositoryTest: 17 tests covering plan/percentage/timestamp/model parsing
- OpenCodeGoRepositoryTest: 10 tests covering window parsing/nested objects/edge cases
- Move parseUsage/parseWindows to companion object as internal static methods
- Move ParsedUsage/ScrapedWindow to companion object as internal data classes
- All 27 tests pass via ./gradlew test
2026-07-06 23:29:13 +00:00
WaterRain
14083f4be1
refactor: migrate UsageCache from DataStore JSON to Room
...
- New: UsageRecordEntity (Room Entity, indexed on workspaceId+timeCreated)
- New: UsageDao (CRUD + time-range queries)
- New: UsageDatabase (Room Database, version 1)
- New: migrateDataStoreToRoom() — one-time migration from old DataStore JSON
- Rewrite: UsageCache internal impl from JSON serialize/deserialize to Room DAO
- UsageCache public API unchanged (getAll/insertAll/getRecords/count/etc.)
- Old DataStore key cleared after successful migration
- SharedPreferences flag prevents re-migration
- Room 2.7.1 + KSP compatible
- libs.versions.toml + build.gradle.kts updated
2026-07-06 23:21:43 +00:00
WaterRain
e3d21e0a8f
fix: crop Ollama logo padding, enlarge to 14dp on widget}
2026-07-06 22:48:40 +00:00
WaterRain
262918d9be
fix: only resize logo for Ollama, restore XML defaults for other services on switch}
2026-07-06 22:45:45 +00:00
WaterRain
7cdb3d9b3c
fix: unify widget logo height to 12dp for all services, prevent layout shift on switch
2026-07-06 22:41:57 +00:00
WaterRain
7ad1934474
fix: Ollama widget layout - hide empty 3rd row, put Plan in title}
2026-07-06 22:37:41 +00:00
WaterRain
d880b808d4
fix: replace DeepSeek emoji logo with official favicon, resize widget logo to 16dp}
2026-07-06 22:33:55 +00:00
WaterRain
e0301aad1d
fix: resize Ollama logo to 20x20dp on widget for square aspect ratio
2026-07-06 22:31:47 +00:00
WaterRain
f7662d065a
fix: use hello.png as Ollama logo, fillMaxSize for crisp display}
2026-07-06 22:29:43 +00:00
WaterRain
65e4dc5a2f
fix: Ollama pct parsing use Float then Int for decimal percentages
...
toIntOrNull() returns null for 35.1, causing 0% display.
toFloatOrNull()?.toInt() handles decimal percentages correctly.
2026-07-06 22:25:36 +00:00
WaterRain
2926e8ebb2
fix: Ollama detail page usage card, 5h label, real logo, widget data
...
- Add OllamaUsageCard to ServiceDetailScreen (5h + weekly windows)
- Unify Session → 5h across dashboard/detail/widget
- Download Ollama llama logo (icon-32x32.png) to drawable-nodpi
- ServiceIcon: use real PNG instead of emoji
- Widget: use ic_ollama_logo, fix row label to 5h
2026-07-06 22:20:29 +00:00
WaterRain
e1c2774c86
fix: show Ollama cookie as plaintext, no password masking
2026-07-06 22:03:31 +00:00
WaterRain
fb2e60d4a0
feat: add Ollama Pro Cloud usage service
...
- New ServiceType.OLLAMA enum + ServiceConfig
- OllamaRepository: OkHttp + Cookie auth, scrape ollama.com/settings HTML
parse plan/session/weekly usage via regex (aria-label + data-time + data-model)
- SessionCredential: add ollamaCookie field
- NetworkModule: @Provides OllamaRepository
- RefreshBalanceUseCase: dispatch OLLAMA
- CredentialEditViewModel: load/save/test Ollama cookie
- CredentialEditScreen: OllamaCookieForm composable
- DashboardScreen: OllamaMainBalance + OllamaUsageWindows cards
- ServiceIcon: Ollama emoji placeholder
- Widget: shortName/logo/populateServiceRows + DISPLAY_SERVICES}
2026-07-06 21:59:18 +00:00
WaterRain
47d361b527
fix: LineChart tooltip UTC+8 date label mismatch
...
LineChart 点击 tooltip 的日期格式化未传入 useUtc8 参数,
导致 UTC+8 模式下首尾数据点标签差 8 小时(日粒度差一天)。
同步补上 UsageChartScreen 中 6 处图表调用的 useUtc8 传递。
2026-07-03 06:34:31 +00:00
WaterRain
9cfb962bc8
Add predictive back navigation polish
2026-07-02 22:29:09 +00:00
WaterRain
45c8f71b8a
fix: 修复自定义日期时区并统一用量入口
2026-07-01 21:06:47 +00:00
WaterRain
23ae718327
fix: Codex配置页看不到已保存的凭证
...
CredentialEditViewModel.load() 缺少 CodexCredential 分支,
导致已保存的凭据不回显到表单。
2026-07-01 20:46:46 +00:00
WaterRain
a5ba79ea4b
feat: 首页拖拽排序 + Widget三服务切换 + 刷新优化
...
- DashboardScreen.kt: 长按自由拖动排序(原生Compose,原位节点+offset让位+中心命中模型+自动滚动补偿)
- OpenCodeGoWidgetProvider.kt: 新增三服务切换按钮(OCGO/CCGO/Codex循环)、showRefreshing()、isRefreshing互斥锁
- WidgetRefreshReceiver.kt: 只刷当前服务+DeepSeek、25s超时保护
- CodexRepository.kt: weekly→每周文案统一
- ServiceIcon.kt: CCGO复用OCGO图标
- widget_opencode_go.xml: 新增切换按钮布局
2026-07-01 15:29:34 +00:00