Commit Graph

101 Commits

Author SHA1 Message Date
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 响应解析弹窗展示
Some checks failed
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编译失败
Some checks failed
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
WaterRain
4cbf593983
feat: add Codex/ChatGPT Plus service with auth.json import and auto token refresh
- New ServiceType.CODEX with CodexCredential (access_token + refresh_token + expiresAt)
- CodexRepository: query chatgpt.com/backend-api/wham/usage, auto refresh token 60min before expiry
- Import full auth.json in settings, supports automatic OAuth token refresh
- ChatGPT favicon SVG icon (ic_codex_logo.xml)
- Dashboard card shows 5h/Weekly usage windows with reset times
- Update AGENTS.md and README.md with Codex service info
2026-07-01 04:59:52 +00:00
WaterRain
1d11aa8ed2
fix: 连点左上角返回导致空页面/旧页面残影卡在上层的导航过渡 bug
Some checks failed
Release / build (push) Has been cancelled
根因三重:
① mutableStateOf 写入触发 NavHost 重组,干扰 AnimatedContent 过渡状态机
② popExitTransition=None 字面零帧,连续 pop 时退出 composable 未从 layout 树清除
③ popExitTransition=None + 默认 popEnter(700ms) 不匹配,第二次 pop 中断进入动画

修复:
- PopGuard 普通对象替代 mutableStateOf,不触发 NavHost 重组
- popExitTransition=fadeOut(tween(1)),极短非零帧确保 composable 正确移除
- popEnterTransition=EnterTransition.None,返回导航瞬时完成
- previousBackStackEntry 空值检查 + popBackStack() 返回值检查
2026-06-29 05:09:57 +00:00
WaterRain
2ab5f2f342
docs+nav: sync AGENTS.md 导航过时内容 + guardedPop 围栏方案
- AGENTS.md: AnimatedContent → when(pane) 原子切换
- AGENTS.md: 新增 Compact guardedPop 机制说明 + 已知连点空页面 Bug
- RainyTokenNavHost.kt: Compact 用 guardedPop(150ms) + popExitTransition=None
- Expanded 局部 NavHost 同步加 popExitTransition=None(预防性)
2026-06-29 04:20:52 +00:00
WaterRain
ea9f6f7e72
feat: 平板自适应全面适配 — BoxWithConstraints 双窗格 + 文档同步
P0 — 容器宽度自适应布局:
- 新增 WindowSizeUtils.kt (rememberWindowSizeClass 封装)
- 添加 material3-window-size-class 依赖
- DashboardScreen: BoxWithConstraints >600dp 卡片双列
- UsageDetailScreen/UsageChartScreen: >700dp 图表并排
- UsageDataScreen/UsageOverviewScreen: 移除全局 WindowSizeClass

P1 — 双窗格导航:
- RainyTokenNavHost 拆分 CompactNavHost/ExpandedLayout
- Expanded 模式: 左侧 35% Dashboard + 右侧 65% AnimatedContent
- 右侧内置子路由(图表⇄总览⇄数据) + Settings 局部 NavHost
- Compact 模式: 原 NavHost 一字未改,零回归

文档同步:
- AGENTS.md: 新增自适应断点说明 + 双窗格导航图
- README.md: 新增平板适配特性条目
- 项目记忆: 更新概述 + 删除旧 WIP 记录
2026-06-29 02:06:04 +00:00
WaterRain
26693c92d4
feat: 12小时10分钟粒度 + UTC时区切换持久化 + 自动降级 + 刻度优化
Some checks failed
Release / build (push) Has been cancelled
- 新增 LAST_12H_10MIN 枚举及 aggregate10Min 聚合器(10分钟桶)
- ChartSettingsStore 持久化 UTC 偏好,跨会话保留
- 自动降级链:5h无数据→12h→7天→当月(用户手动选择后关闭降级)
- niceCeil 加细阈值,图表刻度不再太空
- setWorkspace 保留 useUtc8,CCGO 切换不丢失
- UTC 按钮追加 Snackbar 反馈 + "点击切换"提示
- 文档同步:AGENTS.md / README.md
2026-06-27 03:49:44 +00:00
WaterRain
ef30cad3a4
fix: CCGO 凭证引导优化 —— Cookie 说明改为全选复制 + 帮助弹窗
- 帮助弹窗 Cookie 步骤改为"全选复制全部 Cookie",无需逐个挑选
- 输入框 placeholder 改为 F12 全选复制粘贴操作提示
- 新增"如何获取 API Key 和 Cookie?"帮助按钮
- README 警告文字更新(含 CommandCode Go)
2026-06-26 20:48:07 +00:00
WaterRain
cc7aecc331
feat: CCGO 用量功能 + 首页布局修复 + 文档同步
- 新增 CommandCode Go (CCGO) 用量抓取与展示
- CCGO 输入 token 语义修正(inputTokens = tokensIn - cacheRead)
- 清除数据按钮迁移至 CCGO 详情页顶栏(带倒计时二次确认)
- 移除三个 ViewModel 的 init 自动加载,改为 LaunchedEffect 显式触发
- 修复 hiltViewModel key 碰撞导致 CCGO 详情页无限加载
- 首页 LazyColumn 改为 Column + verticalScroll + PullToRefreshBox
- OCGO/CCGO 页面 autoLoad 参数隔离重复 load
- AGENTS.md / README.md 文档同步更新
2026-06-26 20:37:07 +00:00
WaterRain
bb51efde09
feat: add CommandCode Go usage history API (cursor-based pagination)
- CommandCodeUsageRepository: GET /internal/usage?limit=100&cursor=<base64>
  parses JSON response, converts creditsTotal → cost (COST_DENOM)
- SyncCommandCodeUsageUseCase: fullSync + incrementalSync
  reuses existing UsageCache with workspaceId="commandcode"
- NetworkModule: DI for CommandCodeUsageRepository
- PAGE_SIZE=100 for fewer page requests
2026-06-26 08:18:10 +00:00
WaterRain
0f26269b7e
feat: add CommandCode Go support (JSON API via API Key)
- New CommandCodeGoRepository: calls api.commandcode.ai/alpha/billing/credits + /alpha/billing/subscriptions
- ServiceType: COMMANDCODE_GO added (reordered: OCGO → CCGO → DEEPSEEK)
- ServiceConfigProvider: REST_API config with $ unit
- NetworkModule: DI for CommandCodeGoRepository
- RefreshBalanceUseCase: COMMANDCODE_GO branch
- CredentialEditViewModel: inject CommandCodeGoRepository, allow testAndSave
- ServiceIcon: ⚡ emoji for CommandCode Go
- DashboardScreen: CCGO card with 3 windows (5h/weekly/monthly) like OCGO
- ServiceDetailScreen: CommandCodeGoUsageCard with 5h→weekly→monthly order
- Fixed resetAt: epoch millis → remaining seconds conversion
2026-06-26 08:04:16 +00:00
WaterRain
6795dbd351
fix: 图表模型颜色从8色扩展为12色 Material Design 500调色板
Some checks failed
Release / build (push) Has been cancelled
modelColors 从8色扩展到12色 MD500 色阶,解决11个模型颜色不够区分、
后3个模型与前面颜色循环重复的问题。

UsageChartScreen.kt — modelColors: 8色 → 12色 (Red/Pink/Purple/Deep Purple/
Indigo/Blue/Cyan/Teal/Green/Orange/Brown/Blue Grey)
2026-06-22 21:45:53 +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
05008ca20f
feat: 小组件自动刷新——缓存为空/超5分钟冷却时触发后台刷新 2026-06-19 06:36:24 +00:00
WaterRain
3ba4954dbe
修复.gitignore:排除app/build/产物 2026-06-16 02:47:25 +00:00
WaterRain
5190194230
调整主页布局:压缩用量间距 + DeepSeek挪至最下 2026-06-16 02:46:27 +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