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
|
acddaae068
|
chore: 精简 AGENTS.md,仅保留提交推送许可规则
|
2026-08-04 06:27:08 +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
|
6498e4cf71
|
Merge pull request #4 from CATMIAOZHI/i18n-localization
i18n: 多语言支持(全量资源化 + 英文翻译)
|
2026-08-02 11:32:12 +08:00 |
|
WaterRain
|
041df0c240
|
docs: README 措辞正式化 + 新增英文版 README.en.md
|
2026-08-02 03:11:48 +00:00 |
|
WaterRain
|
7795b553d0
|
docs: README 补充多语言功能说明
|
2026-08-02 03:05:30 +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
|
79edb053cc
|
Merge pull request #1 from CATMIAOZHI/feat/unit-tests
test: 新增 52 个单元测试 + 删除模板残留 + 整理构建修复
|
2026-07-20 17:27:01 +08:00 |
|
WaterRain
|
433770d285
|
docs: AGENTS.md + README.md 同步测试体系、CI workflow、PR 审计红线
AGENTS.md:
- 新增测试体系段落(5 文件 78 用例)
- 新增 CI workflow 段落(3 job 串行、签名 fallback、artifact 上传)
- 新增重大修改 PR 审计红线(构建/签名/CI/架构变更必须 PR 提交)
- 关键命令段补 testDebugUnitTest
README.md:
- 顶部加 CI badge
- 构建说明补 testDebugUnitTest 命令
|
2026-07-20 09:24:23 +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
|
246f5dece3
|
ci: 增强 CI workflow——测试报告上传 + lint + Release APK 完整性验证
- test job: testDebugUnitTest + lintDebug,上传 XML 测试报告和 lint 报告
- build-debug job: assembleDebug,上传 Debug APK artifact
- build-release job: assembleRelease + APK 完整性验证(manifest/arsc/res/),上传 Release APK artifact
- test 通过后才构建,三个 job 串行依赖
- 所有 artifact 保留 14 天
|
2026-07-20 09:10:35 +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
|
ea1cae597d
|
ci: release workflow 注入签名密码 Secret
|
2026-07-17 22:29:45 +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
|
1a3fdff0c1
|
docs: 截图按高度分组——竖屏四张一排,横图两张一排对齐
Release / build (push) Has been cancelled
|
2026-07-08 05:19:10 +00:00 |
|
WaterRain
|
24d8db179e
|
docs: 修正 Ollama 截图尺寸——横图加宽到 300px 保持视觉高度对齐
|
2026-07-08 05:18:13 +00:00 |
|
WaterRain
|
a980841a3b
|
docs: README 新增 Ollama Pro 截图(首页卡片 + 模型调用次数详情)
|
2026-07-08 05:16:18 +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
|
5e630c8895
|
fix: CI跳过国内Maven镜像,修复GitHub Actions构建失败
|
2026-07-07 02:10:21 +00:00 |
|