Compare commits

...

267 Commits
v1.0.0 ... dev

Author SHA1 Message Date
1ad89763ad fix(proxy): 测试按区域选凭据不再误用默认账号;签到成功/已签即时落本地记录 2026-10-10 11:39:28 +08:00
cfbbc371c3 chore(update): 1.7.24 改用 release download 直链 2026-10-10 11:23:58 +08:00
2f9ce6ec82 chore(update): 1.7.24(44)指向最新修复包
Some checks are pending
Release / build (push) Waiting to run
2026-10-10 11:06:27 +08:00
b0a85265c2 chore(release): 1.7.24(44)修复版 2026-10-10 11:04:24 +08:00
f85b319083 chore(update): 1.7.23 指向 https 域名最新包 2026-10-10 10:39:33 +08:00
df357c1eeb fix(update): 更新清单改用 https 域名,避开 Clash 代理不可达的裸 IP 端口 2026-10-10 10:36:00 +08:00
38298ab944 chore(update): 1.7.23 指向测试区域修复包 2026-10-10 10:28:28 +08:00
5b7a4df868 fix(settings): 测试按钮跟随当前选中代理区域,不再固定国内 2026-10-10 10:26:13 +08:00
029114b72d Merge branch 'dev-proxy' into dev: 国际版反代/模型修复 2026-10-10 10:14:20 +08:00
f27eb7a8db chore(update): 1.7.23(43)反代修复版 2026-10-10 10:14:20 +08:00
75ccd2fe8e chore(release): 1.7.23(43)反代修复版 2026-10-10 10:12:09 +08:00
a31dad6e9f chore(update): 1.7.22 安装包换为反代修复版本 2026-10-10 08:35:59 +08:00
027eb6185d fix(wb): 国际版反代走 console 路由并补齐请求头;模型目录改 /v3/config 与 CLI 名单过滤 2026-10-10 08:29:50 +08:00
618eecf676 Merge pull request '_tmp_update' (#11) from _tmp_update into dev 2026-10-10 02:39:06 +08:00
8207285b23 update 1.7.22 final2
Some checks are pending
CI / Unit Tests & Lint (pull_request) Waiting to run
CI / Debug APK (pull_request) Blocked by required conditions
CI / Release APK (debug-signed) (pull_request) Blocked by required conditions
2026-10-10 02:39:01 +08:00
f917e5bfd6 fix(wb): 国际版无独立签到活动,不再调 daily-checkin,详情页展示说明卡 2026-10-10 02:34:27 +08:00
82bd04597d Merge pull request '_tmp_update' (#3) from _tmp_update into dev 2026-10-10 02:00:16 +08:00
5850fc452c update 1.7.22 final
Some checks are pending
CI / Unit Tests & Lint (pull_request) Waiting to run
CI / Debug APK (pull_request) Blocked by required conditions
CI / Release APK (debug-signed) (pull_request) Blocked by required conditions
2026-10-10 02:00:15 +08:00
809b8db2d3 fix(wb): 余额与 token 刷新按区域分流(INTL 走 workbuddy.ai,CN 保持 workbuddy.cn/copilot.tencent.com) 2026-10-10 01:59:06 +08:00
c6a75f8fce Merge pull request '_tmp_update' (#2) from _tmp_update into dev 2026-10-10 01:47:32 +08:00
a384309689 update 1.7.22
Some checks are pending
CI / Unit Tests & Lint (pull_request) Waiting to run
CI / Debug APK (pull_request) Blocked by required conditions
CI / Release APK (debug-signed) (pull_request) Blocked by required conditions
2026-10-10 01:47:31 +08:00
1dd72986f5 fix(wb): CN 恢复软件内登录;INTL 从绑定后直接打开系统浏览器并按官方接口轮询回填 2026-10-10 01:45:05 +08:00
525b91f370 feat(login): Trae/WorkBuddy INTL 提供手机浏览器登录并自动回填;Trae CN 保留软件内登录 2026-10-10 01:17:56 +08:00
8692014340 Merge pull request 'chore(update): publish 1.7.21 manifest' (#1) from _tmp_update into dev
Some checks are pending
Release / build (push) Waiting to run
2026-10-10 00:25:54 +08:00
15c6bc24c4 chore(update): 发布 1.7.21 更新清单
Some checks are pending
CI / Unit Tests & Lint (pull_request) Waiting to run
CI / Debug APK (pull_request) Blocked by required conditions
CI / Release APK (debug-signed) (pull_request) Blocked by required conditions
2026-10-10 00:25:12 +08:00
dab9b7b272 feat(trae): 详情页直接展示 INTL 用量事件,INTL 充值改外部浏览器 2026-10-10 00:17:03 +08:00
460bed7279 chore(update): 发布 1.7.20 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 23:16:10 +08:00
2a7e06acf3 chore(update): 发布 1.7.20 更新清单 2026-10-09 23:16:06 +08:00
5a12f10d4e feat(trae): INTL 显示美元用量额度 $0.00 / $1.00
- 详情页主余额与首页卡片新增「美元用量额度」行(basic_usage_limit/used)
- 账户信息卡同步展示已用/总额美元额度
- 设备已实测:Free plan / $0.00 / $1.00 + 月请求配额
2026-10-09 23:14:52 +08:00
ecbc86fdf2 chore(update): 发布 1.7.19 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 22:43:53 +08:00
94bb4de0b4 chore(update): 发布 1.7.19 更新清单 2026-10-09 22:43:50 +08:00
6dfb9ecb71 fix(trae): 详情页主余额改为 Free plan 月配额展示
- 详情页顶部「当前余额」在 INTL 美元计费时显示套餐名 + 月配额明细,不再显示 0 Credits
- 设备已实测:Free plan / 10次/月 / 50次/月 / 1000次/月 / 5000次/月
2026-10-09 22:42:46 +08:00
05b5107f46 chore(update): 发布 1.7.18 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 22:32:24 +08:00
8e22d1ab9f chore(update): 发布 1.7.18 更新清单 2026-10-09 22:32:21 +08:00
8062a54252 fix(trae): 国际版移除签到卡,详情页按美元/月配额展示
- INTL 详细页不再显示每日签到卡(国际版无签到体系),改为说明卡
- Trae 账户信息卡在美元计费时显示套餐名 + Premium 快速/慢速、高级、自动补全月配额
- INTL 不再生成 0 积分权益包计数,避免残留“积分”字样
2026-10-09 22:31:20 +08:00
bccd7bad83 chore(update): 发布 1.7.17 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 22:14:31 +08:00
0ca6ccd384 chore(update): 发布 1.7.17 更新清单 2026-10-09 22:14:25 +08:00
cf6f426a36 feat(trae): INTL 美元计费展示 + apiHost + 充值入口 + INTL 网关修正
- Trae 凭据新增 apiHost(回调 host 自动保存,如 api-us-east.trae.ai)
- INTL 余额改走官方 v1 计费接口(grow-normal/api-us-east),解析 Free plan 请求额度(Premium fast/slow、高级、自动补全)
- 首页 INTL 不再显示空 0 Credits,改为按月配额展示
- Trae 凭据页新增「充值 / 升级」入口(CN→trae.cn/subscription,INTL→trae.ai/pricing)
- INTL 模型/对话网关修正为 core-normal.trae.ai(实测接口有效)
2026-10-09 22:11:48 +08:00
c5120c5952 chore(update): 发布 1.7.16 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 18:39:17 +08:00
4ae2aa01b6 chore(update): 发布 1.7.16 更新清单 2026-10-09 18:39:12 +08:00
deea17bf6e feat(trae): 粘贴回调导入 JWT + 浏览器回调服务器自动回传
- Trae 表单新增「登录回调链接」粘贴框,支持整条 http://127.0.0.1:18080/authorize?... 解析并填入 JWT
- 「在浏览器中打开登录入口」改为启动本地 18081 回调服务器 + 浏览器登录,登录完自动保存(Sub2API 同款)
2026-10-09 18:38:01 +08:00
2c5a3b2055 chore(update): 发布 1.7.15 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 18:02:12 +08:00
df84aa94ab chore(update): 发布 1.7.15 更新清单 2026-10-09 18:02:09 +08:00
68cdbcf0b0 fix(trae): 回调兼容 localhost/fragment,pageStarted 兜底拦截
- 识别任意 127.0.0.1/localhost:18080/authorize 回调(http/https、query/fragment)
- shouldOverrideUrlLoading 未触发时在 onPageStarted 拦截并停止加载,避免卡 Authenticating
2026-10-09 18:01:06 +08:00
c76193e892 chore(update): 发布 1.7.14 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 17:22:54 +08:00
101e2bc240 chore(update): 发布 1.7.14 更新清单 2026-10-09 17:22:50 +08:00
9db3e01d49 fix(trae): 支持回调仅带 refreshToken 时自动兑换 JWT
- 登录回调不再只认 userJwt;老流程只回传 refreshToken 时调用 ExchangeToken 兑换 Cloud-IDE-JWT
- 兑换失败给出明确提示,不再永远停在 Authenticating
2026-10-09 17:21:48 +08:00
6edd68f80e chore(update): 发布 1.7.13 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 17:12:43 +08:00
57bd49f470 chore(update): 发布 1.7.13 更新清单 2026-10-09 17:12:39 +08:00
56969cb879 fix(webview): 子资源连接关闭不再误报整页失败
- ERR_CONNECTION_CLOSED 若来自图片/脚本/统计等子资源,忽略并继续等待主页面
- 页面进度继续推进时自动清除瞬时错误提示
2026-10-09 17:11:35 +08:00
750b9d9f90 chore(update): 发布 1.7.12 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 16:42:53 +08:00
b62dc90c40 chore(update): 发布 1.7.12 更新清单 2026-10-09 16:42:45 +08:00
d5a152ef1e fix(wb): 按官方客户端补齐登录请求头并延长 INTL 授权超时
- WorkBuddy auth/state 改用 VSCode(国内)/workbuddy-ai(INTL) platform,与官方客户端一致
- 补齐 Origin/Referer/X-Client-ID/X-Client-Version/X-Product/X-No-Authorization
- INTL 浏览器登录等待时间从 120s 延长到 15 分钟,普通用户邮箱/验证码流程不会再中途超时
2026-10-09 16:41:35 +08:00
0f4d68033e chore(update): 发布 1.7.11 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 16:33:50 +08:00
62304ecc9b chore(update): 发布 1.7.11 更新清单 2026-10-09 16:33:46 +08:00
7574c3c7fb fix(login): 页面加载反馈 + WB 凭证解析容错 + 系统浏览器登录入口
- 登录页新增加载进度条、加载失败提示和重试
- 顶部新增「在浏览器打开」:Trae 谷歌登录被 WebView 拦时可走系统浏览器(沿用本机 Chrome 的 Google 登录态)
- WorkBuddy 轮询兼容 accessToken/access_token/token/authToken 等返回结构,失败时打印调试日志
2026-10-09 16:32:36 +08:00
7c7a23f097 chore(update): 发布 1.7.10 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 15:36:25 +08:00
b94e2f6994 chore(update): 发布 1.7.10 更新清单 2026-10-09 15:36:21 +08:00
46b4d457b8 fix(login): 每次登录自动清除 WebView 登录态
登录前自动清 Cookie/WebStorage,避免上一个号码的登录态串到新账号。账号凭据本身已按账号 ID 独立保存。
2026-10-09 15:35:19 +08:00
7c3809e879 chore(update): 发布 1.7.9 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 15:29:08 +08:00
3c2b2ec16e chore(update): 发布 1.7.9 更新清单 2026-10-09 15:29:04 +08:00
d6e4d34a42 fix(login): INT L 登录走对应域名 + 可清除 WebView 登录态
- Trae INTL 登录改打开 trae.ai 授权页,不再误开 trae.cn
- WorkBuddy auth state/token 按区域切换 copilot.tencent.com / workbuddy.ai
- 登录页新增「清除登录」按钮:清 Cookie/WebStorage 后重开,避免沿用上一个号码的登录态
- 新建账号表单保持留空(确认逻辑已存在),登录结果回填新账号
- 版本升至 1.7.9
2026-10-09 15:28:00 +08:00
7ad49e994d chore(update): 发布 1.7.8 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 12:27:18 +08:00
e914633797 chore(update): 发布 1.7.8 更新清单 2026-10-09 12:27:15 +08:00
eb4451c4de feat(proxy): CN/INTL 配置与模型列表完全分离
- 模型 Provider 改为按区域独立列表:Trae CN/INTL、WorkBuddy CN/INTL 各自拉取,不再互相覆盖
- 拉模型按区域取账号:未配置该区域账号时返回失败并保留内置兜底
- WorkBuddy 凭据表单补充区域(CN/INTL)选择,解决国际版无处配置的问题
- 账号管理列表显示 CN/INTL 区域徽标,一眼区分
- 版本升至 1.7.8
2026-10-09 12:26:12 +08:00
8f40360b9f chore(update): 发布 1.7.7 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 11:51:52 +08:00
1a96bcb105 feat(proxy): WorkBuddyModelProvider 增加 supports 判断
供聚合路由按模型匹配 WorkBuddy 供应商。
2026-10-09 11:51:24 +08:00
fee433d2fc chore(update): 发布 1.7.7 更新清单 2026-10-09 11:50:44 +08:00
597632dad3 feat(proxy): 聚合网关——按模型自动选供应商并失败切换
Some checks are pending
Release / build (push) Waiting to run
- ProviderRouter 重构为聚合路由:请求只写 model,网关自动匹配供应商
- 候选按历史速度排序,上游不可用/HTTP>=400/抛错自动切换下一个
- Sub2API 作为通用兜底;显式前缀 traecn-/wbintl- 仍可强制指定
- 显式前缀转发前自动剥离,避免上游收到 traecn-glm-5.2 这类模型名
- 内存速度/冷却统计:失败供应商冷却 30s 起步、指数退避
- 版本升至 1.7.7
2026-10-09 11:49:38 +08:00
08a3b42a82 chore(update): 发布 1.7.6 更新清单 2026-10-09 11:23:01 +08:00
73ff6b2ee7 chore(update): 发布 1.7.6 更新清单 2026-10-09 11:22:57 +08:00
f13b38c02b feat(proxy): 按代理/区域区分模型列表与选择
Some checks are pending
Release / build (push) Waiting to run
- 新增“代理”下拉:Trae CN/INTL、WorkBuddy CN/INTL
- WorkBuddyModelProvider 在线拉取 /v2/enterprises/personal/models
- Trae/WorkBuddy 各区域独立记住所选测试模型
- 真实代理转发仍按前缀自动路由,不受测试选择影响
- 版本升至 1.7.6
2026-10-09 11:21:53 +08:00
aab50bbe78 chore(update): 发布 1.7.5 更新清单 2026-10-09 11:04:35 +08:00
0283ce6bdc chore(update): 发布 1.7.5 更新清单 2026-10-09 11:04:31 +08:00
0241840f9c feat(proxy): Trae 模型切换 + 在线拉取模型列表
Some checks are pending
Release / build (push) Waiting to run
- 设置页新增模型下拉选择,内置参考映射兜底
- TraeModelProvider 在线拉取账号可用模型(/api/remote/v1/models)
- 选中模型持久化,作为反代缺省模型
- 常用 OpenAI/Claude 模型名自动映射到 Trae 内部模型
- 修复探针测试请求体混入反斜杠导致 JSON 无效的问题
- 版本升至 1.7.5
2026-10-09 11:03:27 +08:00
faf7f40524 chore(update): 发布 1.7.4 更新清单 2026-10-09 10:47:27 +08:00
8a9d9432fe chore(update): 发布 1.7.4 更新清单 2026-10-09 10:47:24 +08:00
fbbca4a03b feat(proxy): 探针结果结构化摘要,不再刷屏原始参数
Some checks are pending
Release / build (push) Waiting to run
- 显示:请求行/模型/messages数/stream、HTTP、事件帧数、模型、文本摘要、用量、错误
- 原始请求+响应仍完整保留,点“复制原始”一键复制
- 版本升至 1.7.4
2026-10-09 10:46:30 +08:00
342788056b chore(update): 发布 1.7.3 更新清单 2026-10-09 10:29:48 +08:00
7de7111b18 chore(update): 发布 1.7.3 更新清单 2026-10-09 10:29:43 +08:00
dcd5cab2b2 feat(proxy): 探针输出美化 + 一键复制原始输出
Some checks are pending
Release / build (push) Waiting to run
- 调试输出改为滚动等宽代码块,状态一眼可读
- 新增“复制全部”按钮,一键把原始输出写入剪贴板
- 版本升至 1.7.3
2026-10-09 10:28:19 +08:00
b479cb2a7a chore(update): 发布 1.7.2 更新清单 2026-10-09 10:22:57 +08:00
a804d46acd chore(update): 发布 1.7.2 更新清单 2026-10-09 10:22:52 +08:00
ada750df7e fix(proxy): Trae messages.content 转原生块数组,修复 4001
Some checks are pending
Release / build (push) Waiting to run
- 上游 LLMRawMessage.messages.content 要求 []*LLMRawMessageContent
- 字符串转 [{"type":"text","text":...}],列表块按 text/input_text 归一
- 版本升至 1.7.2
2026-10-09 10:21:48 +08:00
6e0d67afb7 chore(update): 发布 1.7.1 更新清单 2026-10-09 10:13:03 +08:00
b5ef9249d8 chore(update): 发布 1.7.1 更新清单
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 10:12:59 +08:00
481c57c535 feat(update): 已下载 APK 直接复用 + 安装失败可重试不重下
Some checks are pending
Release / build (push) Waiting to run
- downloadApk 检测同版本已完成文件,存在则跳过下载
- 下载先写 .part 再改名,避免半截文件被误用
- install 失败保留 Ready(file, error),UI 显示重试安装
- NeedInstallPermission 携带文件,开启权限后可继续安装
2026-10-09 10:11:26 +08:00
8d68c3b280 chore(update): 发布 1.7.0 更新清单 2026-10-09 10:03:32 +08:00
571b270cb6 chore(update): 发布 1.7.0 更新清单 2026-10-09 10:03:27 +08:00
fa796d57b5 fix(proxy): 修复 Trae Authorization 头发成字面量 jwt + 补全 SOLO 头
Some checks are pending
Release / build (push) Waiting to run
- 上一版把 \ 写成了字符串 jwt,Trae 收到 Cloud-IDE-JWT jwt 必然被网关拒绝
- 完整 SOLO 头集合对齐 trae2api-cn:x-app-version/x-lscbd-*/x-ttnet-* 等
- 版本升至 1.7.0
2026-10-09 10:02:07 +08:00
71f3f8d554 chore(update): 发布 1.6.9 更新清单 2026-10-09 09:47:13 +08:00
8e692a0c6e chore(update): 发布 1.6.9 更新清单 2026-10-09 09:47:09 +08:00
4597fb0f8e fix(update): canRequestPackageInstalls 包 try/catch,旧包也不闪退
Some checks are pending
Release / build (push) Waiting to run
- 旧版本未声明 REQUEST_INSTALL_PACKAGES 时调该 API 本身会抛 SecurityException
- 现在降级为 capture 后按 false 处理,引导去系统设置开启未知来源
- 版本升至 1.6.9
2026-10-09 09:46:06 +08:00
dfd91a5355 chore(update): 发布 1.6.8 更新清单 2026-10-09 09:40:01 +08:00
40af5db889 chore(update): 发布 1.6.8 更新清单 2026-10-09 09:39:57 +08:00
5adf053b6f fix(update): 声明 REQUEST_INSTALL_PACKAGES 权限并加固安装流程
Some checks are pending
Release / build (push) Waiting to run
- 缺少该权限时部分 ROM 启动系统安装器会被拒绝/闪退
- install() 整体容错:FileProvider URI 失败、ACTION_VIEW 失败均捕获并回退 ACTION_INSTALL_PACKAGE
- 版本升至 1.6.8
2026-10-09 09:38:52 +08:00
149fc5f125 chore(update): 发布 1.6.7 更新清单 2026-10-09 09:31:01 +08:00
e2bf924246 chore(update): 发布 1.6.7 更新清单 2026-10-09 09:30:50 +08:00
d0b79cf1bd fix(proxy): Trae CN 上游换用 trae-api-cn.mchost.guru,修正 404
Some checks are pending
Release / build (push) Waiting to run
- trae-api-cn.mchost.guru/api/agent/v3/llm_utils_chat 才是模型网关
- api.trae.cn 只是账号/OAuth 主机,不暴露 IDE 模型路由
- 请求头对齐参考实现:真实 x-app-id / x-ide-version / 设备指纹
- llm_utils_chat body 收敛为 SOLO 结构(config_name/model/function/stream)
2026-10-09 09:29:40 +08:00
95cde916ca chore(update): 发布 1.6.6 更新清单 2026-10-09 09:18:15 +08:00
15408a6640 chore(update): 发布 1.6.6 更新清单 2026-10-09 09:18:12 +08:00
8da1f2b377 chore: 版本号升至 1.6.6 (versionCode 16)
Some checks are pending
Release / build (push) Waiting to run
2026-10-09 09:13:39 +08:00
a4d854271f feat(proxy): 设置页新增 Trae/WorkBuddy 流式探针
- 用默认账号直接请求 llm_utils_chat/v2 chat,抓取上游原始 SSE 帧
- 调试输出显示 HTTP 状态、Content-Type 与最多 80 行原始帧
- 为 StreamNormalizer 提供真实协议样本
2026-10-09 08:08:47 +08:00
67e1f060c5 feat(proxy): 网关随机 API Key + 启动失败提示
- SettingsViewModel 每次进程生成随机本机 Key,start 失败时暴露错误信息
- Settings 页显示 API Key 与错误提示
2026-10-09 00:04:55 +08:00
f5162bbf74 docs: 更新流式转发与 Qoder 攻坚状态 2026-10-08 23:53:30 +08:00
de95013164 feat(proxy): stream=true 实时透传上游 SSE 字节流
- Ktor respondOutputStream 逐块转发上游 body,不再整包缓冲
- 流式/非流式按客户端 body 的 stream 字段分流
- openStreamingChat 入口正式接线
2026-10-08 23:52:12 +08:00
072f7efa55 docs: 更新反代网关开发进度 2026-10-08 23:46:18 +08:00
1609e210bd fix(proxy): 修复 WorkBuddy/Trae 鉴权头、401、模型前缀 + 流式入口骨架
- WorkBuddyChatProxy/TraeChatProxy:Authorization 插值去掉误转义
- KtorLocalProxyServer:authorized() 失败返回 401
- 路由剥离 wbcn-/traecn- 等前缀后再转发,Trae config_name/model_name 不再带前缀
- Sub2ApiChatProxy 去掉 IOException 吞掉逻辑
- 新增 ProxyUpstreamStream 与三个代理的 openStreamingChat 入口(暂未接入实时转发)
2026-10-08 23:44:44 +08:00
a1605e6993 feat(proxy): M2 账号池轮询 + 会话粘性 + 双区域路由
- ProviderRouter:前缀路由到 WorkBuddy CN/INTL、Trae CN/INTL、OpenAI 兼容
- AccountPool:从 CredentialRepository 实时取号,round-robin + 会话粘性(X-Conversation-Id / user)
- 账号按 credential.region 与路由区域匹配,找不到时回退全部账号
- WorkBuddy/Trae 代理支持 forcedRegion 覆盖
- Ktor 路由接入账号池
2026-10-08 23:34:35 +08:00
5aa2d8f116 chore: 忽略 build_compile.log 2026-10-08 23:24:06 +08:00
11b9065f82 feat(proxy): M1b WorkBuddy CN/Trae CN 适配 + 设置页网关开关
- KtorLocalProxyServer:修复审计阻断项(start/stop 加锁、apiKey Bearer 鉴权、IOException 502、请求体上限、错误 JSON 规范化)
- WorkBuddyChatProxy:转发到 copilot.tencent.com/v2/chat/completions,Bearer accessToken + IDE 请求头
- TraeChatProxy:转发到 api.trae.cn/api/agent/v3/llm_utils_chat,Cloud-IDE-JWT 身份/设备头,最小 body 转换
- Credential.WorkBuddyCredential 增加 region 字段(默认 CN,兼容旧数据)
- Settings 页新增代理网关开关(默认 127.0.0.1:8787,本机 Key: rainytoken)
2026-10-08 23:23:16 +08:00
85c6cf4283 feat(proxy): M1a 本地 HTTP 服务 + Sub2API 透传
- 引入 Ktor 3.0.3(server-core / cio / content-negotiation / kotlinx-json)
- Sub2ApiChatProxy:把 /v1/chat/completions 与 /v1/models 透传到用户配置的 Sub2API 实例
- KtorLocalProxyServer:绑定 127.0.0.1:8787,提供 /health、/v1/models、/v1/chat/completions
- NetworkModule 提供 Hilt 注入
2026-10-08 22:58:33 +08:00
9d3c004617 feat(proxy): 新增反代网关骨架与开发路线图
- docs/PROXY-ROADMAP.md:M0-M4 里程碑、Provider 矩阵、风险与参考仓库
- data/proxy/:ProviderKind/ProviderRegion/ProxyModels/ProviderAdapter/AccountPool/RegionRouter/LocalProxyServer 接口骨架
- .gitignore:忽略 _tmp_* 调试文件,防止真实接口响应/账号数据入库
2026-10-08 22:22:45 +08:00
79f99f5dee fix(credential): 多账号会话凭据按请求账号精确匹配;UI微调
- CredentialRepository 快照新增 requestedAccountId,暂存凭据严格按请求账号匹配,
  避免 A 账号刷新期间把暂存凭据误交给默认账号/其他账号
- Dashboard 首页提示与自动签到开关改为卡片样式,开关配色对齐雨晴粉主题
- 默认账号徽标加 maxLines/softWrap 防窄屏换行
2026-10-08 22:16:06 +08:00
2509ab8a85 feat(update): 设置页新增检测更新/下载APK/自动安装;接入Gitea update.json清单 2026-10-08 21:42:45 +08:00
ceb5e6a268 feat(checkin): 签到记录含日期/状态/id/数量,失败可当天重试;同步本地主题与组件改动 2026-10-08 21:08:22 +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
3b4cd103d0 fix(sub2api): tab改纯文字样式;去掉多余「按模型」标题;今天明细按小时
1. 「按模型 / 按 Key」tab 从 FilterChip 按钮改为纯 Text + clickable,
   去掉按钮背景和圆角,更像文字标签而非按钮。
2. MODEL tab 下方原来有一行「按模型」小标题(sub2_models_header),
   和 tab 本身重复,去掉。
3. 「今天」窗口的每日用量明细从隐藏改为按小时倒序列出,
   每行显示 HH:00 + 请求/tokens/费用。
2026-09-13 13:14:49 +08:00
78f93588f8 fix(sub2api): 修复柱状图不显示——接入按小时趋势
详情页「今天」窗口柱状图只有一根按天柱子看不出分布,
原因是 hourlyTrend / onLoadHourlyTrend 参数从未从 Screen 传入 Card。

修复:
- VM 新增 hourlyTrend StateFlow + loadHourlyTrend(date) loader
- Screen 传入 hourlyTrend + onLoadHourlyTrend 回调
- Card 的 onLoadHourlyTrend 改为 (LocalDate) -> Unit,今天窗口时拉取小时趋势
- detailTab 状态去掉 remember(detail) 依赖,避免后台刷新余额时重置 tab 选中
2026-09-13 12:18:11 +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
100b698f38 feat(sub2api): 面板管理支持删除 Key;用量明细修柱状图与按小时趋势 2026-09-13 00:46:04 +08:00
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
2da780bf09 docs: 上游同步指南与二开计划/凭据文档;scripts: sync-upstream 一键合并 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
Some checks failed
Release / build (push) Has been cancelled
2026-09-11 06:55:38 +00:00
WaterRain
2c38c4caf1
docs: taste.md 补充审计不选模型、版本号控制权偏好 2026-09-11 06:52:37 +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
eecf54986f
docs: README 补充 Token活动热力图说明与截图;归档历史计划文档至 docs/archive
Some checks are pending
CI / Unit Tests & Lint (push) Waiting to run
CI / Debug APK (push) Blocked by required conditions
CI / Release APK (debug-signed) (push) Blocked by required conditions
2026-09-10 07:58:14 +00:00
WaterRain
95508bab9f
release: bump to v1.6.3
Some checks failed
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
2b2ef941a9
docs: 新增 taste.md 协作偏好,AGENTS.md 要求任务前先读取 2026-08-30 05:50:04 +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
Some checks failed
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
Some checks failed
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
a0cf7fd31c
docs: AGENTS.md 补充子代理任务完整路径规则 2026-08-08 00:27:54 +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
Some checks failed
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
bb1dd97874
docs: 安全修复计划(security-fix-plan) 2026-08-07 01:32:43 +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
Some checks failed
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
Some checks failed
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
Some checks failed
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
Some checks failed
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 响应解析弹窗展示
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
1a3fdff0c1
docs: 截图按高度分组——竖屏四张一排,横图两张一排对齐
Some checks failed
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编译失败
Some checks failed
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
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
86aaef9a60
docs: sync AGENTS.md and README.md for Room migration + refactors
AGENTS.md:
- Tech stack: DataStore → Room + DataStore
- UsageCache: DataStore JSON → Room DAO, auto-migration from old DataStore
- ChartSettingsStore: add StateFlow, remove runBlocking
- Data flow: insertAll persist/invalidateCache → Room DAO insert (IGNORE)
- RefreshBalanceUseCase: add retryOnTransientError note

README.md:
- Architecture diagram: UsageCache DataStore → Room
- Feature table: 内存缓存 → Room 数据库
- Dependency table: remove Jsoup, add Room
- Project structure: local/ updated with Room files
2026-07-07 00:27:31 +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
8469f01354
docs: sync AGENTS.md and README.md for Ollama Pro integration
- AGENTS.md: add Ollama to project overview, service list, data flow,
  widget service count (3→4), credential echo coverage, dashboard item count (7→8),
  fix widget refresh flow (DEEPSEEK+OPENCODE_GO → selectedService+DEEPSEEK)
- README.md: add Ollama to title, features, download requirements,
  architecture diagram, project structure; mark Jsoup as unused}
2026-07-06 22:57:38 +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
4e5dda5521
docs: 同步自定义日期和用量入口说明 2026-07-01 23:18:31 +00:00
WaterRain
45c8f71b8a
fix: 修复自定义日期时区并统一用量入口 2026-07-01 21:06:47 +00:00
WaterRain
1d98d4dee1
docs: 同步Codex凭据回显修复记录
AGENTS.md 新增「凭据回显红线」警示段落,防止后续新增凭据类型时遗漏 load() 回显分支。
2026-07-01 20:50:22 +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
9a7c0284a1
docs: 同步拖拽排序和Widget切换文档
- AGENTS.md: 首页布局新增拖拽排序详细设计(中心命中、offset让位、坐标补偿)
- AGENTS.md: 服务新增文案统一标注
- AGENTS.md: Widget段更新三服务切换和刷新优化
- README.md: 特性表更新拖拽排序和Widget服务切换
2026-07-01 15:23:30 +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
4a63db2840
style: README 运营风格统一——雨晴系列一致性修复
- 添加双语标语(中英文)
- 关于部分雨晴系列描述统一 — “第 4 个成员”
- “守护主人的每一分算力预算”尾部句
2026-06-26 21:10:16 +00:00
WaterRain
0c5f0850c0
docs: README 添加 4 张截图展示
- 戴表盘(亮x色)
- 戴表盘(深色)
- 用量图表详情
- 桌面小组件
2026-06-26 21:03:41 +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
d37589b89a
chore: 删除误提交的临时文件 2026-06-22 21:46:01 +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
9d2a7c7a0c
docs: 同步 MIUI Widget + 深色模式 + 一键添小组件到文档 2026-06-19 15:22:28 +00:00
WaterRain
02f0af92c8
chore: 删除误提交的临时文件 2026-06-19 07:38:16 +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
281c39e660
docs: 雨晴系列标准 README 格式 2026-06-16 01:56:50 +00:00
3215 changed files with 35749 additions and 31741 deletions

129
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,129 @@
name: CI
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
jobs:
test:
name: Unit Tests & Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
- uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4
with:
java-version: '17'
distribution: 'temurin'
- uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3
with:
packages: 'platforms;android-35 build-tools;35.0.0'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Run unit tests
run: ./gradlew testDebugUnitTest
- name: Upload test results
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: unit-test-results
path: app/build/test-results/testDebugUnitTest/*.xml
retention-days: 14
- name: Run lint
run: ./gradlew lintDebug
- name: Upload lint results
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: lint-results
path: app/build/reports/lint-results-debug.*
retention-days: 14
build-debug:
name: Debug APK
runs-on: ubuntu-latest
needs: test
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
- uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4
with:
java-version: '17'
distribution: 'temurin'
- uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3
with:
packages: 'platforms;android-35 build-tools;35.0.0'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Assemble Debug
run: ./gradlew assembleDebug
- name: Upload Debug APK
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: debug-apk
path: app/build/outputs/apk/debug/app-debug.apk
retention-days: 14
build-release:
name: Release APK (debug-signed)
runs-on: ubuntu-latest
needs: test
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
- uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4
with:
java-version: '17'
distribution: 'temurin'
- uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3
with:
packages: 'platforms;android-35 build-tools;35.0.0'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# 确保存在 debug keystore(某些 runner 镜像可能没有)
- name: Ensure debug keystore
run: |
KS="$HOME/.android/debug.keystore"
mkdir -p "$HOME/.android"
if [ ! -f "$KS" ]; then
keytool -genkeypair -v -keystore "$KS" -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 -dname "CN=Android Debug,O=Android,C=US"
echo "Generated debug keystore"
else
echo "Debug keystore exists"
fi
# CI 无 release.jks;build.gradle.kts 自动 fallback 到 debug keystore
# 只验证编译 + 资源完整性,签名由 Release workflow 用 secrets 完成
- name: Assemble Release
run: ./gradlew assembleRelease
- name: Verify Release APK
run: |
APK=app/build/outputs/apk/release/app-release.apk
if [ ! -f "$APK" ]; then
echo "❌ Release APK not found"
exit 1
fi
echo "✅ Release APK size: $(du -h "$APK" | cut -f1)"
unzip -l "$APK" | grep -q "AndroidManifest.xml" || { echo "❌ AndroidManifest.xml missing"; exit 1; }
unzip -l "$APK" | grep -q "resources.arsc" || { echo "❌ resources.arsc missing"; exit 1; }
unzip -l "$APK" | grep -q "res/" || { echo "❌ res/ directory missing"; exit 1; }
echo "✅ APK integrity verified: manifest + arsc + res/ all present"
- name: Upload Release APK
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: release-apk
path: app/build/outputs/apk/release/app-release.apk
retention-days: 14

View File

@ -10,24 +10,31 @@ jobs:
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
- uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4
with:
java-version: '17'
distribution: 'temurin'
- uses: android-actions/setup-android@v3
- uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3
with:
packages: 'platforms;android-35 build-tools;35.0.0'
- name: Decode Keystore
run: echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > release.jks
- name: Build Release APK
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEYSTORE_ALIAS: ${{ secrets.KEYSTORE_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
run: |
chmod +x gradlew
./gradlew assembleRelease
- name: Cleanup keystore (always run for security)
run: rm -f release.jks
if: always()
- name: Rename & Release
run: |
cp app/build/outputs/apk/release/app-release.apk "RainyToken-${GITHUB_REF#refs/tags/}.apk"
- uses: softprops/action-gh-release@v2
- uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2
with:
name: "🎉 RainyToken ${{ github.ref_name }}"
files: RainyToken-${{ github.ref_name }}.apk

9
.gitignore vendored
View File

@ -7,8 +7,10 @@
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
/.idea/
.DS_Store
/build
app/build/
/captures
.externalNativeBuild
.cxx
@ -18,3 +20,10 @@ release.jks
.operit/
.kotlin/
*.jks
tmp_cc/
goal.md
/reference/
# 调试临时文件(可能包含真实接口响应/账号数据,禁止提交)
_tmp_*
build_compile.log

View File

@ -1,98 +1,5 @@
# 雨晴Token — AI 余额查询 APP
任务开始前必须先读取 taste.md(协作偏好),任务全程遵守其中约定,包括:修改后派发独立 subagent 审计(无阻断问题 + 无影响用户体验问题),修复后用同一个 subagent 复审。
## 项目概述
未经用户允许禁止提交推送
Android(Jetpack Compose + Kotlin)APP,统一查询 DeepSeek、OpenCode Go 两项服务的余额/配额。
DeepSeek 走 REST API,OpenCode Go 通过 OkHttp 抓取 dashboard HTML 解析 SSR hydration 数据。
APP 名为「雨晴Token」(粉色调品牌),配套桌面小组件。
## 技术栈
- Kotlin 100% · Jetpack Compose + Material 3
- MVVM + Repository + `RefreshBalanceUseCase`(单一 UseCase,按 ServiceType 分发)
- Hilt + KSP(DI)
- Retrofit 2 + OkHttp 4 + Kotlinx Serialization
- DataStore(本地缓存)+ Android Keystore(凭据加密,AES-256 GCM)
- `minSdk=31`(Android 12+)
- WorkManager(计划中)
## 当前实现状态
**服务**:
- ✅ DeepSeek — REST API `GET /user/balance`,API Key 认证
- ✅ OpenCode Go — OkHttp 抓 dashboard HTML,解析 `rollingUsage`/`weeklyUsage`/`monthlyUsage`
- ❌ OpenCode Zen / 小米 MiMo — 未实现
**用量统计系统**:
- ✅ `UsageCache`(DataStore,~3700 条记录)— 全量 JSON 序列化 + 内存缓存(`@Volatile cachedAll`),仅在写入后失效
- ✅ `SyncUsageUseCase` — 首次全量同步(cursor 翻页)、增量同步(逐页比对本地 ID 集合)
- ✅ `UsageViewModel` — `loadStatsInternal()` 单次 `getRecords()`→ 内存聚合 Overview/ModelStats/DailyStats,所有重操作包在 `withContext(Dispatchers.Default)` 避免主线程卡顿
- ✅ `UsageChartViewModel` — 图表粒度(5h/24h/今天/昨天/7天/当月/自定义日/月/范围),模型多选,3 张 Canvas 图表
- ✅ `UsageDataViewModel` — 原始记录分页浏览(20条/页),支持时间+模型筛选,页码输入跳转
- ✅ 全局刷新绑定 — Dashboard 下拉刷新 → `DashboardViewModel.refresh()` → `UsageViewModel.sync()`(增量)
**页面导航**:
```
Dashboard → UsageDetail(图表) → UsageOverview(总统计)
↘ UsageData(原始数据)
```
**桌面小组件(Widget)**:
- 显示 OpenCode Go 三个用量窗口(5h/本周/本月)+ 进度条 + 重置时间 + DeepSeek 余额
- 右上角刷新按钮(后台广播 → `WidgetRefreshReceiver` → EntryPoints 获取 `RefreshBalanceUseCase`)
- 进度条颜色按百分比动态变化(<50% 草莓粉 / 50-80% 暖橙 / >80% 玫红)
## RemoteViews 兼容性红线
以下元素在 Widget 布局中**不可用**,会导致「载入出现问题」:
| ❌ 不可用 | ✅ 替代方案 |
|-----------|------------|
| `<Space>` | 透明 ProgressBar(`0dp + weight=1`) |
| `<View>` | ProgressBar 或 TextView |
| `<ImageView>` + 矢量 drawable | PNG(`drawable-nodpi`) |
| `<TextView>` `0dp+weight=1` 空串 spacer | ProgressBar spacer |
| `<TextView>` 固定 dp 宽度 + `gravity` | 仅固定 dp,不加 gravity |
## 关键命令
```bash
cd /data/user/0/com.ai.assistance.operit/files/workspace/Rainytoken
export ANDROID_HOME=$HOME/Android
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-arm64
./gradlew assembleDebug
# APK: app/build/outputs/apk/debug/app-debug.apk
```
## 数据流
```
DashboardViewModel.refresh()
→ RefreshBalanceUseCase(service)
→ DeepSeekRepository.fetchBalance() / OpenCodeGoRepository.fetchBalance()
→ BalanceCache.put(service, result)
→ OpenCodeGoWidgetProvider.notifyDataChanged(context)
Dashboard 下拉刷新 → usageSyncTrigger++ → UsageViewModel.sync()
→ SyncUsageUseCase.fullSync() / incrementalSync()
→ OpenCodeUsageRepository.fetchPage(cursor) 逐页抓取
→ UsageCache.insertAll() → persist() → invalidateCache()
→ UsageViewModel.loadStats() → getRecords() → 内存聚合
Widget 刷新按钮:
↻ → PendingIntent.getBroadcast() → WidgetRefreshReceiver
→ EntryPoints → RefreshBalanceUseCase(DEEPSEEK + OPENCODE_GO)
→ notifyDataChanged()
```
## 品牌色
| 用途 | 色值 |
|------|------|
| 主品牌草莓粉 | `#FF85A2` |
| 樱粉背景/点缀 | `#FFD1DC` |
| 浅粉背景 | `#FFF0F5` |
| 深暖文字 | `#3D2C35` |
| 暖灰辅助 | `#8A7A82` |
| 玫红(>80% 警示) | `#E91E63` |
| 暖橙(50-80%) | `#FFA726` |
派发子代理任务(独立审计/探索/通用 subagent)时,prompt 中涉及工作区文件的所有路径必须使用完整绝对路径(以工作区根目录为前缀)。子代理没有工作区附着上下文,相对路径会导致其找不到文件或无法执行。

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 Rainy
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

238
README.en.md Normal file
View File

@ -0,0 +1,238 @@
# RainyToken (雨晴Token)
> *"AI Balance & Usage at a Glance"*
[![CI](https://github.com/CATMIAOZHI/Rainytoken/actions/workflows/ci.yml/badge.svg)](https://github.com/CATMIAOZHI/Rainytoken/actions/workflows/ci.yml)
[![Release](https://github.com/CATMIAOZHI/Rainytoken/actions/workflows/release.yml/badge.svg)](https://github.com/CATMIAOZHI/Rainytoken/actions)
[![Version](https://img.shields.io/github/v/release/CATMIAOZHI/Rainytoken?color=ff85a2)](https://github.com/CATMIAOZHI/Rainytoken/releases)
Android app for checking AI balance & usage — unified view of DeepSeek, OpenCode Go, CommandCode, Codex / ChatGPT, and Ollama balances and usage quotas. Pink-toned brand UI, with companion home screen widgets.
RainyToken (雨晴Token) — AI Balance & Usage Quota Query · the Rainy Family tools.
---
## 📸 Screenshots
<p align="center">
<img src="docs/screenshots/dashboard-light.jpg" width="200" alt="Dashboard (light)" />
<img src="docs/screenshots/dashboard-dark.jpg" width="200" alt="Dashboard (dark)" />
<img src="docs/screenshots/detail.jpg" width="200" alt="Usage charts" />
<img src="docs/screenshots/ollama-detail.jpg" width="200" alt="Ollama model call counts" />
</p>
<p align="center">
<em>Dashboard (light) · Dashboard (dark) · Usage charts · Ollama model call counts</em>
</p>
<p align="center">
<img src="docs/screenshots/widget.jpg" width="300" alt="Home screen widget" />
<img src="docs/screenshots/ollama-card.jpg" width="200" alt="Ollama card" />
</p>
<p align="center">
<em>Home screen widget · Ollama home card</em>
</p>
<p align="center">
<img src="docs/screenshots/heatmap.jpg" width="200" alt="Token Activity" />
</p>
<p align="center">
<em>Token Activity</em>
</p>
---
## ✨ Features
| Feature | Description |
|------|------|
| 📊 **Dashboard** | DeepSeek balance (¥) + usage/balance cards for each service; OCGO/CCGO cards link directly to usage details; long-press & drag to reorder (persisted); pull-to-refresh globally · tablet-adaptive two-pane layout |
| 📈 **Usage charts** | 3 Canvas-drawn charts — amount spent / API request count / token consumption (dual data sources: OCGO & CCGO); UTC+0/UTC+8 timezone switching and custom day/month/range; automatic fallback (no data in last 5h → 12h → 7 days → current month); side-by-side on tablets |
| 🗓️ **Token Activity** | OCGO daily token heatmap (GitHub contribution-graph style): daily / weekly / cumulative views + year switching (last 365 days by default, or a calendar year); personal profile + activity insights (total requests / top 3 request hours) + yearly stats (total / peak / streaks); 6-level pink quantile scale, tap / slide to inspect |
| 📱 **Tablet adaptation** | Global `BoxWithConstraints` adaptive container width; ≥600dp dual-column cards, ≥700dp side-by-side charts; two-pane 35/65 split (Expanded mode); supports Android 13+ predictive back gestures |
| 📋 **Detailed data** | Paginated browsing of raw records with time + model filtering; tap to view full fields |
| 🔍 **Multi-granularity filters** | 5 hours / 12 hours (10-minute buckets) / 24 hours / today / yesterday / last 7 days / last 30 days / current month / custom day · month · range |
| 🏷️ **Model filtering** | Multi-select / single-select / select all, with dynamic legends that wrap automatically |
| 📱 **Home screen widget** | Check usage without opening the app; switch between four services (OCGO/CCGO/Codex/Ollama) + DeepSeek balance; top-left corner → open app, tap elsewhere to switch, ↻ to refresh; can be added to the At a Glance screen; auto-refreshes when scrolled into view (MIUI exposure refresh) |
| 🔄 **Auto sync** | Pull-to-refresh on home auto-syncs usage; auto full sync on startup when no cache; CCGO detail page supports manual clear & re-sync |
| 🌙 **Dark mode** | Fully adaptive — in-app text/icons/background switch automatically; widget adapts independently with a dark layout |
| ➕ **One-tap add to home screen** | Tap + inside the app to add the widget directly, no need to browse the system list; double confirmation + permission check |
| 💡 **Usage tips** | Home page shows a random operation tip (refreshed on each launch); settings page lists all 13 hidden tips |
| ⚡ **Room database** | Usage records stored in Room (indexed on workspaceId+timeCreated); DAO queries replace full JSON serialization; auto-migration from the legacy DataStore on first launch |
| 🎀 **Rainy pink theme** | Material Design 3 · Refined Rose primary #C9436C · Blush white background #FDEFF4 |
| 🔐 **Codex OAuth sign-in** | Headless OAuth PKCE: the app generates an authorization link → sign in in an external browser → paste the callback URL to complete authorization; no manual auth.json export needed |
| ⚡ **Codex one-tap usage activation** | Codex detail page can send a short request to the ChatGPT API to trigger usage tracking; model list fetched dynamically from models.dev and persisted, with manual refresh; response dialog is copyable |
| ⚡ **OCGO / Ollama one-tap usage activation** | OCGO detail page can send a request to `opencode.ai/zen/v1`, Ollama detail page to `ollama.com/v1` to trigger usage tracking; API keys are entered manually in settings; model lists fetched dynamically from models.dev |
| 🐛 **Debug logs** | In-app "Debug Logs" page showing detailed logs of Repository network requests, token refreshes, parse errors, etc.; no computer needed |
| 🌐 **Multilingual** | Simplified Chinese / 繁體中文 / English interface; one-tap switching in settings (follow system / Simplified / Traditional / English); two-way sync with the system "App languages" page on Android 13+; non-CN/EN system languages fall back to English; home screen app name and widget follow the language |
---
## 📦 Download
Download the latest APK from [Releases](https://github.com/CATMIAOZHI/Rainytoken/releases).
> ⚠️ You need a DeepSeek API Key, OpenCode Go login credentials, CommandCode API Key, Codex (OAuth sign-in or pasted auth.json), or an Ollama Cookie to fetch data.
---
## 🏗️ Architecture
```
┌──────────────────────────────────────────────────────────────────┐
│ Android App │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Compose UI (3-layer screens) │ │
│ │ Dashboard · Usage Charts · Totals │ │
│ │ Detail · Token Activity · Settings │ │
│ └──────────────────────────────┬─────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────▼─────────────────────────────┐ │
│ │ ViewModel Layer (MVVM) │ │
│ │ DashboardVM · UsageVM · UsageChartVM │ │
│ │ · UsageDataVM (Hilt injected) │ │
│ └──────────────────────────────┬─────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────▼─────────────────────────────┐ │
│ │ UseCase Layer │ │
│ │ RefreshBalanceUseCase (balance) │ │
│ │ SyncUsageUseCase / SyncCommandCodeUsageUseCase │ │
│ └──────────────────────────────┬─────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────▼─────────────────────────────┐ │
│ │ Repository + Network │ │
│ │ DeepSeekApi (Retrofit) · OpenCodeGo web scraping │ │
│ │ · OpenCodeUsageRepository · CommandCodeUsageRepository │ │
│ │ · CodexRepository · OllamaRepository (OkHttp) │ │
│ └──────────────────────────────┬─────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────▼─────────────────────────────┐ │
│ │ Local Storage │ │
│ │ BalanceCache (DataStore) │ │
│ │ UsageCache (Room, indexed on workspaceId+timeCreated) │ │
│ │ CredentialRepository (Keystore AES-256 GCM) │ │
│ └────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
```
---
## 📁 Project Structure
```
Rainytoken/
├── app/src/main/java/com/rainy/token/
│ ├── data/
│ │ ├── cache/ # BalanceCache (DataStore)
│ │ ├── local/ # UsageCache (Room), UsageRecordEntity, UsageDao, UsageDatabase, ChartBucket
│ │ ├── remote/ # DeepSeekApi (Retrofit) + OpenCodeGo scraping + UsageRepository
│ │ └── repository/ # DeepSeek / OpenCodeGo / CommandCode / Codex / Ollama / Credential repositories
│ ├── domain/
│ │ ├── model/ # ServiceBalance, Credential, etc.
│ │ ├── service/ # ServiceType enum
│ │ └── usecase/ # RefreshBalanceUseCase / SyncUsageUseCase / SyncCommandCodeUsageUseCase
│ ├── ui/
│ │ ├── dashboard/ # DashboardScreen / UsageDetailScreen / UsageOverviewScreen / UsageDataScreen
│ │ ├── heatmap/ # Token Activity heatmap (HeatmapScreen / HeatmapCanvas / HeatmapViewModel)
│ │ ├── servicedetail/ # Service detail (ServiceDetailScreen)
│ │ ├── settings/ # Settings / credential editing (SettingsScreen / CredentialEditScreen)
│ │ ├── webview/ # Web login / Codex OAuth (WebViewLoginScreen / CodexOAuthScreen)
│ │ ├── widget/ # Home screen widget (OpenCodeGoWidgetProvider)
│ │ ├── components/ # ServiceIcon / StatusChip, etc.
│ │ ├── theme/ # Rainy pink theme (StrawberryPink / InkMuted)
│ │ └── RainyTokenNavHost.kt # Navigation routes
│ └── di/ # Hilt modules
├── gradle/libs.versions.toml # Version Catalog dependency management
├── build.gradle.kts # Project-level configuration
└── settings.gradle.kts # Project settings
```
---
## 🛠️ Build
### Option 1: Android Studio (recommended)
1. Clone the repository: `git clone https://github.com/CATMIAOZHI/Rainytoken.git`
2. Open the project in Android Studio
3. Sync Gradle, connect a device, and hit Run ▶️
### Option 2: Command line
```bash
# Run unit tests
./gradlew testDebugUnitTest
# Build a Debug APK
./gradlew assembleDebug
# APK output: app/build/outputs/apk/debug/app-debug.apk
# Build a Release APK
./gradlew assembleRelease
```
<details>
<summary>🔧 ARM64 environment notes (optional)</summary>
The project bundles an ARM64 AAPT2 binary, which is enabled automatically in ARM64 environments such as Proot/Termux:
```bash
chmod +x ./setup_android_env.sh
./setup_android_env.sh
```
The script configures `$ANDROID_HOME` and uses the project-bundled ARM64 build-tools.
**Extra Release build configuration**: Under ARM64 Proot, AGP 9.0 passes `--resource-path-shortening-map=<path>` (equals-sign syntax) to `optimizeReleaseResources`, which the ARM64 AAPT2 does not accept. Configure the AAPT2 wrapper in `~/.gradle/gradle.properties` (global, not committed to the repository):
```properties
android.aapt2FromMavenOverride=/path/to/android-aapt2-wrapper/aapt2
```
The wrapper script splits the equals-sign syntax into two separate space-delimited argv entries. The project's `build.gradle.kts` includes a built-in `guardReleaseResources` task as a build safeguard (falls back to the linked `.ap_` automatically when the optimized `.ap_` is missing).
> On x86_64 environments (GitHub Actions / regular Linux), the official AAPT2 is used automatically — no extra steps required.
</details>
---
## 📦 Dependency Management
The project manages all dependencies with a Gradle Version Catalog (`gradle/libs.versions.toml`).
| Dependency | Purpose |
|------|------|
| `androidx.compose:compose-bom` | Jetpack Compose BOM |
| `androidx.navigation:navigation-compose` | Page navigation |
| `com.squareup.retrofit2:retrofit` | DeepSeek REST API |
| `com.squareup.okhttp3:okhttp` | OpenCode Go web scraping |
| `org.jetbrains.kotlinx:kotlinx-serialization-json` | JSON serialization |
| `androidx.room:room-runtime` | Local usage database (Room) |
| `androidx.datastore:datastore-preferences` | Local caching |
| `com.google.dagger:hilt-android` | Dependency injection |
| `com.google.devtools.ksp:symbol-processing-api` | KSP annotation processing |
---
## 🔒 Security
- ✅ API keys / session credentials are stored in the **Android Keystore** (AES-256 GCM encrypted)
- ✅ Network requests are only sent to the official DeepSeek / OpenCode APIs
- ✅ `allowBackup=false`: encrypted credentials and usage data are excluded from system backups, preventing undecryptable ciphertext when restoring on a new device
- ✅ Fixed signing key — every Release can be installed over the previous version
- ✅ Signing keys and passwords are stored encrypted in GitHub Secrets and decrypted during CI
---
## 🐱 About
RainyToken (雨晴Token) is the 4th member of the "Rainy Family" tools, maintained by [雨晴喵 (Rainy)](https://github.com/CATMIAOZHI), released alongside the [Rainy Family](https://github.com/CATMIAOZHI?tab=repositories):
- [RainyLLM](https://github.com/CATMIAOZHI/RainyLLM) — fully offline Android local LLM inference server (Gemma + OpenAI-compatible API)
- [RainyScanner](https://github.com/CATMIAOZHI/RainyScanner) — Android QR scanner that neither intercepts nor redirects
- [Rainy2FA](https://github.com/CATMIAOZHI/Rainy2FA) — fully local · zero network · biometric-protected TOTP authenticator
- **RainyToken** — AI Balance & Usage Quota Query (this project)
---
## 📄 License
MIT License © 2026 Rainy
---
<p align="center">RainyToken · the Rainy Family tools</p>

259
README.md
View File

@ -1,52 +1,239 @@
# 🌧️ 雨晴Token (RainyToken)
> *"AI 用量,尽在掌握"* 🐱✨
> *"AI 用量,尽在掌握 — AI Balance & Usage at a Glance"*
[![CI](https://github.com/CATMIAOZHI/Rainytoken/actions/workflows/ci.yml/badge.svg)](https://github.com/CATMIAOZHI/Rainytoken/actions/workflows/ci.yml)
[![Release](https://github.com/CATMIAOZHI/Rainytoken/actions/workflows/release.yml/badge.svg)](https://github.com/CATMIAOZHI/Rainytoken/actions)
[![Version](https://img.shields.io/github/v/release/CATMIAOZHI/Rainytoken?color=ff85a2)](https://github.com/CATMIAOZHI/Rainytoken/releases)
Android AI 余额与用量查询 APP —— 统一查看 DeepSeek、OpenCode Go、CommandCode、Codex / ChatGPT、Ollama 的余额与用量配额。粉色调品牌 UI,配套桌面小组件。
RainyToken(雨晴Token)— AI Balance & Usage Quota Query · the Rainy Family tools.
Android AI 余额查询 APP —— 统一查看 DeepSeek 和 OpenCode Go 的余额/配额。
---
## 功能
## 📸 截图
- 📊 仪表盘:DeepSeek 余额(¥)+ OpenCode Go 用量(5h/本周/本月)+ 下拉全局刷新
- 📈 用量图表:消耗金额 / API 请求次数 / Token 消耗(3 张 Canvas 图表,支持多粒度筛选)
- 📋 详细数据:原始记录分页浏览,时间+模型筛选,原始数据弹窗
- 🧩 桌面小组件:不打开 APP 也能看用量
- 🔄 自动同步:首页下拉自动同步用量;无缓存时启动自动全量同步
- 🎀 雨晴粉色调 UI
<p align="center">
<img src="docs/screenshots/dashboard-light.jpg" width="200" alt="仪表盘(亮色)" />
<img src="docs/screenshots/dashboard-dark.jpg" width="200" alt="仪表盘(深色)" />
<img src="docs/screenshots/detail.jpg" width="200" alt="用量图表" />
<img src="docs/screenshots/ollama-detail.jpg" width="200" alt="Ollama 模型调用次数" />
</p>
## 构建
<p align="center">
<em>仪表盘(亮色) · 仪表盘(深色) · 用量图表 · Ollama 模型调用次数</em>
</p>
<p align="center">
<img src="docs/screenshots/widget.jpg" width="300" alt="桌面小组件" />
<img src="docs/screenshots/ollama-card.jpg" width="200" alt="Ollama 卡片" />
</p>
<p align="center">
<em>桌面小组件 · Ollama 首页卡片</em>
</p>
<p align="center">
<img src="docs/screenshots/heatmap.jpg" width="200" alt="Token 活动" />
</p>
<p align="center">
<em>Token 活动</em>
</p>
---
## ✨ 功能特性
| 特性 | 说明 |
|------|------|
| 📊 **仪表盘** | DeepSeek 余额(¥)+ 各服务用量/余额卡片;OCGO/CCGO 卡片可直达用量详情;长按拖动自由排序(持久化);下拉全局刷新 · 平板自适应双窗格布局 |
| 📈 **用量图表** | 3 张 Canvas 手绘图表 — 消耗金额 / API 请求次数 / Token 消耗(OCGO & CCGO 双数据源);支持 UTC+0/UTC+8 时区切换和自定义日/月/范围;自动降级(近5h无数据→12h→7天→当月);平板并排展示 |
| 🗓️ **Token活动** | OCGO每日 Token热力图(GitHub贡献图风格):每日 /每周 /累计三视图 +年份切换(默认最近 365 天,可切换自然年);个人资料 +活动洞察(总请求次数 /最多请求时段 Top 3)+年度统计(累计 /峰值 /连续天数);6 级粉色分位色阶,点击 /滑动查看 |
| 📱 **平板适配** | 全局 `BoxWithConstraints` 自适应容器宽度;≥600dp 卡片双列,≥700dp 图表并排;双窗格 35/65 左右分栏(Expanded 模式);支持 Android 13+ 预见性返回手势 |
| 📋 **详细数据** | 原始记录分页浏览,支持时间 + 模型筛选,点击查看完整字段 |
| 🔍 **多粒度筛选** | 5小时 / 12小时(10分钟桶) / 24小时 / 今天 / 昨天 / 最近7天 / 最近30天 / 当月 / 自定义日·月·范围 |
| 🏷️ **模型筛选** | 多选 / 单选 / 全选,动态图例自适应换行 |
| 📱 **桌面小组件** | 不打开 APP 也能看用量;支持四服务切换(OCGO/CCGO/Codex/Ollama)+ DeepSeek 余额;左上角 > 进 APP、其他区域点切换、↻ 刷新;可拖入负一屏;划到即自动刷新(MIUI 曝光刷新) |
| 🔄 **自动同步** | 首页下拉自动同步用量;无缓存时启动自动全量同步;CCGO 详情页支持手动清除并重新同步 |
| 🌙 **深色模式** | 全局自适应 — App 内文字/图标/背景自动切换,小组件独立适配暗色布局 |
| ➕ **一键添桌面** | APP 内点 + 直接添加小组件,不用去系统列表翻;二次确认 + 权限检测 |
| 💡 **使用小技巧** | 首页随机展示一条操作提示(每次启动刷新);设置页可查看全部 13 条隐藏操作技巧 |
| ⚡ **Room 数据库** | 用量记录存 Room(indexed on workspaceId+timeCreated),DAO 查询替代全量 JSON 序列化;首次启动自动从旧 DataStore 迁移 |
| 🎀 **雨晴粉主题** | Material Design 3 · 精致玫瑰粉 主色 #C9436C · 粉白背景 #FDEFF4 |
| 🔐 **Codex OAuth 登录** | 无头模式 OAuth PKCE:APP 生成授权链接 → 外部浏览器登录 → 粘贴回调 URL 完成授权,无需手动导出 auth.json |
| ⚡ **Codex 一键激活用量** | Codex 详情页可向 ChatGPT API 发送简短请求触发用量统计;模型列表从 models.dev 动态获取并持久化,支持手动刷新;响应弹窗可复制 |
| ⚡ **OCGO / Ollama 一键激活用量** | OCGO 详情页可向 `opencode.ai/zen/v1` 发送请求,Ollama 详情页可向 `ollama.com/v1` 发送请求触发用量统计;API Key 在设置页手动填写,模型列表从 models.dev 动态获取 |
| 🐛 **调试日志** | APP 内「调试日志」页面,查看 Repository 网络请求、Token 刷新、解析错误等详细日志,无需连接电脑 |
| 🌐 **多语言** | 简体中文 / 繁體中文 / English 三语言界面;设置页一键切换(跟随系统 / 简体 / 繁体 / English);Android 13+ 与系统「应用语言」页双向同步;非中英系统语言自动回退英文;桌面 APP 名称与小组件跟随语言 |
---
## 📦 下载
前往 [Releases](https://github.com/CATMIAOZHI/Rainytoken/releases) 下载最新 APK。
> ⚠️ 需要配置 DeepSeek API Key、OpenCode Go 登录凭据、CommandCode API Key、Codex(OAuth 登录或粘贴 auth.json)或 Ollama Cookie 才能拉取数据。
---
## 🏗️ 技术架构
```
┌──────────────────────────────────────────────────┐
│ Android App │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Compose UI(3 层页面) │ │
│ │ 仪表盘 · 用量图表 · 总统计 │ │
│ │ 详细数据 · Token活动 · 设置 │ │
│ └────────────────────┬────────────────────────┘ │
│ │ │
│ ┌────────────────────▼─────────────────────────┐ │
│ │ ViewModel 层(MVVM) │ │
│ │ DashboardVM · UsageVM · UsageChartVM │ │
│ │ · UsageDataVM(Hilt 注入) │ │
│ └────────────────────┬────────────────────────┘ │
│ │ │
│ ┌────────────────────▼─────────────────────────┐ │
│ │ UseCase 层 │ │
│ │ RefreshBalanceUseCase(余额) │ │
│ │ SyncUsageUseCase / SyncCommandCodeUsageUseCase│ │
│ └────────────────────┬────────────────────────┘ │
│ │ │
│ ┌────────────────────▼─────────────────────────┐ │
│ │ Repository + Network │ │
│ │ DeepSeekApi(Retrofit)· OpenCodeGo 网页抓取
│ │ · OpenCodeUsageRepository · CommandCodeUsageRepository · CodexRepository · OllamaRepository(OkHttp)│ │
│ └────────────────────┬────────────────────────┘ │
│ │ │
│ ┌────────────────────▼─────────────────────────┐ │
│ │ 本地存储 │ │
│ │ BalanceCache(DataStore) │ │
│ │ UsageCache(Room,indexed on workspaceId+timeCreated) │ │
│ │ CredentialRepository(Keystore AES-256 GCM) │ │
│ └──────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘
```
---
## 📁 项目结构
```
Rainytoken/
├── app/src/main/java/com/rainy/token/
│ ├── data/
│ │ ├── cache/ # BalanceCache(DataStore)
│ │ ├── local/ # UsageCache(Room)、UsageRecordEntity、UsageDao、UsageDatabase、ChartBucket
│ │ ├── remote/ # DeepSeekApi(Retrofit)+ OpenCodeGo 抓取 + UsageRepository
│ │ └── repository/ # DeepSeek / OpenCodeGo / CommandCode / Codex / Ollama / Credential Repository
│ ├── domain/
│ │ ├── model/ # ServiceBalance、Credential 等
│ │ ├── service/ # ServiceType 枚举
│ │ └── usecase/ # RefreshBalanceUseCase / SyncUsageUseCase / SyncCommandCodeUsageUseCase
│ ├── ui/
│ │ ├── dashboard/ # DashboardScreen / UsageDetailScreen / UsageOverviewScreen / UsageDataScreen
│ │ ├── heatmap/ # Token活动热力图(HeatmapScreen / HeatmapCanvas / HeatmapViewModel)
│ │ ├── servicedetail/ # 服务详情(ServiceDetailScreen)
│ │ ├── settings/ # 设置 /凭据编辑(SettingsScreen / CredentialEditScreen)
│ │ ├── webview/ # 网页登录 / Codex OAuth(WebViewLoginScreen / CodexOAuthScreen)
│ │ ├── widget/ # 桌面小组件(OpenCodeGoWidgetProvider)
│ │ ├── components/ # ServiceIcon / StatusChip 等
│ │ ├── theme/ # 雨晴粉主题(StrawberryPink / InkMuted)
│ │ └── RainyTokenNavHost.kt # Navigation 路由
│ └── di/ # Hilt 模块
├── gradle/libs.versions.toml # Version Catalog 依赖管理
├── build.gradle.kts # 项目级配置
└── settings.gradle.kts # 项目设置
```
---
## 🛠️ 构建
### 方式一:Android Studio(推荐)
1. Clone 仓库:`git clone https://github.com/CATMIAOZHI/Rainytoken.git`
2. 用 Android Studio 打开项目
3. 同步 Gradle,连接设备,Run ▶️
### 方式二:命令行
```bash
cd Rainytoken
export ANDROID_HOME=$HOME/Android
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-arm64
# 运行单元测试
./gradlew testDebugUnitTest
# 构建 Debug APK
./gradlew assembleDebug
# APK 输出:app/build/outputs/apk/debug/app-debug.apk
# 构建 Release APK
./gradlew assembleRelease
```
APK 输出:`app/build/outputs/apk/debug/app-debug.apk`
## 技术栈
Kotlin + Jetpack Compose + Material 3 · Hilt + KSP · Retrofit + OkHttp · DataStore · minSdk=31
## 项目结构
<details>
<summary>🔧 ARM64 环境说明(非必需)</summary>
项目内置了 ARM64 AAPT2 二进制,在 Proot/Termux 等 ARM64 环境中自动启用:
```bash
chmod +x ./setup_android_env.sh
./setup_android_env.sh
```
com.rainy.token/
├── data/
│ ├── cache/ # BalanceCache(DataStore)
│ ├── local/ # UsageCache(DataStore + 内存缓存)、UsageRecord、ChartBucket
│ ├── remote/ # DeepSeekApi(Retrofit)+ OpenCodeGo 抓取 + OpenCodeUsageRepository
│ └── repository/ # DeepSeekRepository / OpenCodeGoRepository / CredentialRepository
├── domain/
│ ├── model/ # ServiceBalance、Credential 等
│ ├── service/ # ServiceType 枚举
│ └── usecase/ # RefreshBalanceUseCase / SyncUsageUseCase
├── ui/
│ ├── dashboard/ # DashboardScreen、UsageDetailScreen(图表)、UsageOverviewScreen(总统计)、UsageDataScreen(原始数据)
│ ├── widget/ # 桌面小组件(OpenCodeGoWidgetProvider)
│ └── theme/ # 雨晴粉主题
└── di/ # Hilt 模块
```
该脚本会配置 `$ANDROID_HOME` 并使用项目内置的 ARM64 build-tools。
**Release 构建额外配置**:ARM64 Proot 下 AGP 9.0 的 `optimizeReleaseResources` 传入 `--resource-path-shortening-map=<path>` 等号参数,ARM64 AAPT2 不接受此语法,需在 `~/.gradle/gradle.properties`(全局,不提交项目仓库)中配置 AAPT2 wrapper:
```properties
android.aapt2FromMavenOverride=/path/to/android-aapt2-wrapper/aapt2
```
wrapper 脚本将等号形式拆分为空格分隔的两个独立 argv。项目 `build.gradle.kts` 中已内置 `guardReleaseResources` 任务作为构建防护(optimized `.ap_` 缺失时自动 fallback 到 linked `.ap_`)。
> 在 x86_64 环境(GitHub Actions / 普通 Linux)中会自动走官方 AAPT2,无需额外操作。
</details>
---
## 📦 依赖管理
项目使用 Gradle Version Catalog (`gradle/libs.versions.toml`) 统一管理依赖。
| 依赖 | 用途 |
|------|------|
| `androidx.compose:compose-bom` | Jetpack Compose BOM |
| `androidx.navigation:navigation-compose` | 页面导航 |
| `com.squareup.retrofit2:retrofit` | DeepSeek REST API |
| `com.squareup.okhttp3:okhttp` | OpenCode Go 网页抓取 |
| `org.jetbrains.kotlinx:kotlinx-serialization-json` | JSON 序列化 |
| `androidx.room:room-runtime` | 用量数据本地数据库(Room) |
| `androidx.datastore:datastore-preferences` | 本地缓存 |
| `com.google.dagger:hilt-android` | 依赖注入 |
| `com.google.devtools.ksp:symbol-processing-api` | KSP 注解处理 |
---
## 🔒 安全说明
- ✅ API Key / Session 凭据存入 **Android Keystore**(AES-256 GCM 加密)
- ✅ 网络请求仅向 DeepSeek / OpenCode 官方 API 发出
- ✅ `allowBackup=false`:凭据密文、用量数据均不参与系统备份,避免换机恢复后密文无法解密
- ✅ 签名密钥固定,每次 Release 可覆盖安装
- ✅ GitHub Secrets 加密存储签名密钥及密码,CI 中解码使用
---
## 🐱 关于
RainyToken(雨晴Token)是「雨晴系列」的第 4 个成员,由 [雨晴喵](https://github.com/CATMIAOZHI) 开发维护,随 [雨晴系列](https://github.com/CATMIAOZHI?tab=repositories) 发布:
- [RainyLLM](https://github.com/CATMIAOZHI/RainyLLM) — 纯离线 Android 本地 LLM 推理服务器(Gemma + OpenAI 兼容 API)
- [RainyScanner](https://github.com/CATMIAOZHI/RainyScanner) — 不拦截不跳转的 Android 扫码工具
- [Rainy2FA](https://github.com/CATMIAOZHI/Rainy2FA) — 纯本地 · 零联网 · 生物识别保护的 TOTP 验证器
- **RainyToken** — AI 余额与用量查询 APP | AI Balance & Usage Quota Query(本项目)
> 守护每一分 AI 算力预算 💖
---
## 📄 License
MIT License © 2026 Rainy
---
<p align="center">RainyToken · the Rainy Family tools</p>

View File

@ -1,3 +1,5 @@
import java.io.File
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.compose)
@ -14,8 +16,8 @@ android {
applicationId = "com.rainy.token"
minSdk = 31
targetSdk = 35
versionCode = 1
versionName = "1.0"
versionCode = 44
versionName = "1.7.24"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
@ -25,10 +27,40 @@ android {
signingConfigs {
create("release") {
storeFile = rootProject.file("release.jks")
storePassword = System.getenv("KEYSTORE_PASSWORD") ?: "RainyToken2026!"
keyAlias = System.getenv("KEYSTORE_ALIAS") ?: "rainy"
keyPassword = System.getenv("KEY_PASSWORD") ?: "RainyToken2026!"
// CI 环境没有 release.jks,自动 fallback 到 debug keystore
// Release workflow 通过 Secret 注入 release.jks
val keystoreFile = rootProject.file("release.jks")
if (keystoreFile.exists()) {
storeFile = keystoreFile
// 凭据必须通过环境变量注入;缺失或为空时直接报错,不提供任何隐式 fallback
// 注意:GitHub Actions 中未设置的 secret 会被替换为空字符串(非 null),
// 因此用 takeIf { isNotBlank() } 同时防御 null 和空字符串
storePassword = System.getenv("KEYSTORE_PASSWORD")
?.takeIf { it.isNotBlank() }
?: throw GradleException("KEYSTORE_PASSWORD env var not set or empty — cannot sign release")
keyAlias = System.getenv("KEYSTORE_ALIAS")
?.takeIf { it.isNotBlank() }
?: throw GradleException("KEYSTORE_ALIAS env var not set or empty — cannot sign release")
keyPassword = System.getenv("KEY_PASSWORD")
?.takeIf { it.isNotBlank() }
?: throw GradleException("KEY_PASSWORD env var not set or empty — cannot sign release")
} else {
// 仅在 CI 环境中 fallback 到 debug keystore(用于编译/资源完整性验证)
// 本地构建缺少 release.jks 时直接报错,避免静默生成 debug 签名的 Release APK
if (System.getenv("CI") != null) {
val debugKeystore = file("${System.getProperty("user.home")}/.android/debug.keystore")
storeFile = debugKeystore
storePassword = "android"
keyAlias = "androiddebugkey"
keyPassword = "android"
} else {
throw GradleException(
"release.jks 不存在,且当前不是 CI 环境。\n" +
"正式 Release 构建需要 release.jks 密钥库文件。\n" +
"如需本地验证编译,请设置环境变量 CI=true 或使用 assembleDebug。"
)
}
}
}
}
@ -45,12 +77,18 @@ android {
)
}
}
// noCompress workaround removed — no longer needed
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
buildFeatures {
compose = true
buildConfig = true
}
androidResources {
// Android 13+ 应用级语言设置:根据 values-* 目录自动生成 locales_config
generateLocaleConfig = true
}
packaging {
resources {
@ -59,6 +97,84 @@ android {
}
}
// ═══════════════════════════════════════════════════════
// AGP 9.0 ARM64 Proot: Release resource guard + fallback
//
// 根因:AGP 9.0 的 optimizeReleaseResources 传入 --resource-path-shortening-map=<path>
// 等号形式,ARM64 AAPT2 不接受此语法(只接受空格分隔),exit code=1 但 AGP 不检查,
// 导致 optimized .ap_ 缺失,packageRelease 生成无资源残缺 APK。
//
// 修复链:
// 1. ~/.gradle/gradle.properties → android.aapt2FromMavenOverride 指向 wrapper
// wrapper 将 --resource-path-shortening-map=<path> 拆分为两个独立 argv
// 2. 本任务作为构建防护:optimizeReleaseResources 之后验证 optimized .ap_ 完整性,
// 若缺失则复制 linked .ap_ 作为 fallback(功能正确,仅跳过 path shortening)
// 3. packageRelease 依赖此任务,确保消费到完整资源
// ═══════════════════════════════════════════════════════
if (System.getProperty("os.arch") == "aarch64") {
tasks.register("guardReleaseResources") {
dependsOn("optimizeReleaseResources")
doLast {
val linkedAp = layout.buildDirectory
.file("intermediates/linked_resources_binary_format/release/processReleaseResources/linked-resources-binary-format-release.ap_")
.get().asFile
val optimizedDir = layout.buildDirectory
.dir("intermediates/optimized_processed_res/release/optimizeReleaseResources")
.get().asFile
val optimizedAp = File(optimizedDir, "resources-release-optimize.ap_")
if (optimizedAp.exists() && optimizedAp.length() > 0) {
// optimized .ap_ 存在,验证内容完整性
val zipList = providers.exec {
commandLine("unzip", "-l", optimizedAp.absolutePath)
isIgnoreExitValue = true
}.standardOutput.asText.get()
val hasManifest = zipList.contains("AndroidManifest.xml")
val hasArsc = zipList.contains("resources.arsc")
val hasRes = zipList.contains("res/")
if (hasManifest && hasArsc && hasRes) {
logger.lifecycle("GuardReleaseResources: optimized .ap_ OK (${optimizedAp.length()} bytes)")
return@doLast
}
logger.warn("GuardReleaseResources: optimized .ap_ incomplete (manifest=$hasManifest arsc=$hasArsc res=$hasRes)")
} else {
logger.warn("GuardReleaseResources: optimized .ap_ missing or empty")
}
// Fallback: copy linked .ap_ → optimized .ap_
if (!linkedAp.exists() || linkedAp.length() == 0L) {
throw GradleException("GuardReleaseResources: linked .ap_ also missing or empty — cannot recover")
}
optimizedDir.mkdirs()
linkedAp.copyTo(optimizedAp, overwrite = true)
// Verify the copy
val verifyList = providers.exec {
commandLine("unzip", "-l", optimizedAp.absolutePath)
isIgnoreExitValue = true
}.standardOutput.asText.get()
val vManifest = verifyList.contains("AndroidManifest.xml")
val vArsc = verifyList.contains("resources.arsc")
val vRes = verifyList.contains("res/")
if (!vManifest || !vArsc || !vRes) {
throw GradleException("GuardReleaseResources: fallback copy verification failed (manifest=$vManifest arsc=$vArsc res=$vRes)")
}
logger.lifecycle("GuardReleaseResources: fallback — copied linked .ap_ → optimized .ap_ (${optimizedAp.length()} bytes, path shortening skipped)")
}
}
// packageRelease 必须依赖此防护任务
project.tasks.matching { it.name == "packageRelease" }.configureEach {
dependsOn("guardReleaseResources")
}
}
// Force ARM64 AAPT2 in Proot environment (local only; GitHub Actions x86_64 uses default)
if (System.getProperty("os.arch") == "aarch64") {
configurations.all {
@ -74,6 +190,7 @@ dependencies {
// Core
implementation(libs.androidx.core.ktx)
implementation(libs.androidsvg)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.lifecycle.runtime.compose)
implementation(libs.androidx.lifecycle.viewmodel.compose)
@ -85,6 +202,7 @@ dependencies {
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3)
implementation(libs.androidx.material3.window.size)
// Navigation
implementation(libs.androidx.navigation.compose)
@ -95,7 +213,12 @@ dependencies {
implementation(libs.okhttp.logging.interceptor)
implementation(libs.kotlinx.serialization.json)
implementation(libs.retrofit.kotlinx.serialization.converter)
implementation(libs.jsoup)
// Ktor 本地反代 HTTP 服务
implementation(libs.ktor.server.core)
implementation(libs.ktor.server.cio)
implementation(libs.ktor.server.content.negotiation)
implementation(libs.ktor.serialization.kotlinx.json)
// DataStore
implementation(libs.androidx.datastore.preferences)
@ -108,6 +231,11 @@ dependencies {
ksp(libs.hilt.compiler)
implementation(libs.androidx.hilt.navigation.compose)
// Room
implementation(libs.room.runtime)
implementation(libs.room.ktx)
ksp(libs.room.compiler)
// Test
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)

View File

@ -1,809 +0,0 @@
package com.rainy.token;
import android.app.Activity;
import android.app.Service;
import android.view.View;
import androidx.datastore.core.DataStore;
import androidx.datastore.preferences.core.Preferences;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.SavedStateHandle;
import androidx.lifecycle.ViewModel;
import com.rainy.token.data.cache.BalanceCache;
import com.rainy.token.data.local.SecureStorage;
import com.rainy.token.data.local.UsageCache;
import com.rainy.token.data.remote.DeepSeekApi;
import com.rainy.token.data.repository.CredentialRepository;
import com.rainy.token.data.repository.DeepSeekRepository;
import com.rainy.token.data.repository.OpenCodeGoRepository;
import com.rainy.token.data.repository.OpenCodeUsageRepository;
import com.rainy.token.data.repository.WebViewSessionSaver;
import com.rainy.token.di.NetworkModule_ProvideBalanceCacheDataStoreFactory;
import com.rainy.token.di.NetworkModule_ProvideBalanceCacheFactory;
import com.rainy.token.di.NetworkModule_ProvideDeepSeekApiFactory;
import com.rainy.token.di.NetworkModule_ProvideDeepSeekRepositoryFactory;
import com.rainy.token.di.NetworkModule_ProvideJsonFactory;
import com.rainy.token.di.NetworkModule_ProvideOkHttpClientFactory;
import com.rainy.token.di.NetworkModule_ProvideOpenCodeGoRepositoryFactory;
import com.rainy.token.di.NetworkModule_ProvideOpenCodeUsageRepositoryFactory;
import com.rainy.token.di.NetworkModule_ProvideRetrofitFactory;
import com.rainy.token.di.NetworkModule_ProvideSecureStorageFactory;
import com.rainy.token.di.NetworkModule_ProvideUsageCacheFactory;
import com.rainy.token.di.StorageModule_ProvideSecureStorageDataStoreFactory;
import com.rainy.token.di.StorageModule_ProvideUsageCacheDataStoreFactory;
import com.rainy.token.domain.usecase.RefreshBalanceUseCase;
import com.rainy.token.domain.usecase.SyncUsageUseCase;
import com.rainy.token.ui.dashboard.DashboardViewModel;
import com.rainy.token.ui.dashboard.DashboardViewModel_HiltModules;
import com.rainy.token.ui.dashboard.DashboardViewModel_HiltModules_BindsModule_Binds_LazyMapKey;
import com.rainy.token.ui.dashboard.DashboardViewModel_HiltModules_KeyModule_Provide_LazyMapKey;
import com.rainy.token.ui.dashboard.UsageChartViewModel;
import com.rainy.token.ui.dashboard.UsageChartViewModel_HiltModules;
import com.rainy.token.ui.dashboard.UsageChartViewModel_HiltModules_BindsModule_Binds_LazyMapKey;
import com.rainy.token.ui.dashboard.UsageChartViewModel_HiltModules_KeyModule_Provide_LazyMapKey;
import com.rainy.token.ui.dashboard.UsageDataViewModel;
import com.rainy.token.ui.dashboard.UsageDataViewModel_HiltModules;
import com.rainy.token.ui.dashboard.UsageDataViewModel_HiltModules_BindsModule_Binds_LazyMapKey;
import com.rainy.token.ui.dashboard.UsageDataViewModel_HiltModules_KeyModule_Provide_LazyMapKey;
import com.rainy.token.ui.dashboard.UsageViewModel;
import com.rainy.token.ui.dashboard.UsageViewModel_HiltModules;
import com.rainy.token.ui.dashboard.UsageViewModel_HiltModules_BindsModule_Binds_LazyMapKey;
import com.rainy.token.ui.dashboard.UsageViewModel_HiltModules_KeyModule_Provide_LazyMapKey;
import com.rainy.token.ui.servicedetail.ServiceDetailViewModel;
import com.rainy.token.ui.servicedetail.ServiceDetailViewModel_HiltModules;
import com.rainy.token.ui.servicedetail.ServiceDetailViewModel_HiltModules_BindsModule_Binds_LazyMapKey;
import com.rainy.token.ui.servicedetail.ServiceDetailViewModel_HiltModules_KeyModule_Provide_LazyMapKey;
import com.rainy.token.ui.settings.CredentialEditViewModel;
import com.rainy.token.ui.settings.CredentialEditViewModel_HiltModules;
import com.rainy.token.ui.settings.CredentialEditViewModel_HiltModules_BindsModule_Binds_LazyMapKey;
import com.rainy.token.ui.settings.CredentialEditViewModel_HiltModules_KeyModule_Provide_LazyMapKey;
import com.rainy.token.ui.settings.SettingsViewModel;
import com.rainy.token.ui.settings.SettingsViewModel_HiltModules;
import com.rainy.token.ui.settings.SettingsViewModel_HiltModules_BindsModule_Binds_LazyMapKey;
import com.rainy.token.ui.settings.SettingsViewModel_HiltModules_KeyModule_Provide_LazyMapKey;
import com.rainy.token.ui.webview.WebViewLoginViewModel;
import com.rainy.token.ui.webview.WebViewLoginViewModel_HiltModules;
import com.rainy.token.ui.webview.WebViewLoginViewModel_HiltModules_BindsModule_Binds_LazyMapKey;
import com.rainy.token.ui.webview.WebViewLoginViewModel_HiltModules_KeyModule_Provide_LazyMapKey;
import dagger.hilt.android.ActivityRetainedLifecycle;
import dagger.hilt.android.ViewModelLifecycle;
import dagger.hilt.android.internal.builders.ActivityComponentBuilder;
import dagger.hilt.android.internal.builders.ActivityRetainedComponentBuilder;
import dagger.hilt.android.internal.builders.FragmentComponentBuilder;
import dagger.hilt.android.internal.builders.ServiceComponentBuilder;
import dagger.hilt.android.internal.builders.ViewComponentBuilder;
import dagger.hilt.android.internal.builders.ViewModelComponentBuilder;
import dagger.hilt.android.internal.builders.ViewWithFragmentComponentBuilder;
import dagger.hilt.android.internal.lifecycle.DefaultViewModelFactories;
import dagger.hilt.android.internal.lifecycle.DefaultViewModelFactories_InternalFactoryFactory_Factory;
import dagger.hilt.android.internal.managers.ActivityRetainedComponentManager_LifecycleModule_ProvideActivityRetainedLifecycleFactory;
import dagger.hilt.android.internal.managers.SavedStateHandleHolder;
import dagger.hilt.android.internal.modules.ApplicationContextModule;
import dagger.hilt.android.internal.modules.ApplicationContextModule_ProvideContextFactory;
import dagger.internal.DaggerGenerated;
import dagger.internal.DoubleCheck;
import dagger.internal.LazyClassKeyMap;
import dagger.internal.MapBuilder;
import dagger.internal.Preconditions;
import dagger.internal.Provider;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import javax.annotation.processing.Generated;
import kotlinx.serialization.json.Json;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class DaggerRainyTokenApplication_HiltComponents_SingletonC {
private DaggerRainyTokenApplication_HiltComponents_SingletonC() {
}
public static Builder builder() {
return new Builder();
}
public static final class Builder {
private ApplicationContextModule applicationContextModule;
private Builder() {
}
public Builder applicationContextModule(ApplicationContextModule applicationContextModule) {
this.applicationContextModule = Preconditions.checkNotNull(applicationContextModule);
return this;
}
public RainyTokenApplication_HiltComponents.SingletonC build() {
Preconditions.checkBuilderRequirement(applicationContextModule, ApplicationContextModule.class);
return new SingletonCImpl(applicationContextModule);
}
}
private static final class ActivityRetainedCBuilder implements RainyTokenApplication_HiltComponents.ActivityRetainedC.Builder {
private final SingletonCImpl singletonCImpl;
private SavedStateHandleHolder savedStateHandleHolder;
private ActivityRetainedCBuilder(SingletonCImpl singletonCImpl) {
this.singletonCImpl = singletonCImpl;
}
@Override
public ActivityRetainedCBuilder savedStateHandleHolder(
SavedStateHandleHolder savedStateHandleHolder) {
this.savedStateHandleHolder = Preconditions.checkNotNull(savedStateHandleHolder);
return this;
}
@Override
public RainyTokenApplication_HiltComponents.ActivityRetainedC build() {
Preconditions.checkBuilderRequirement(savedStateHandleHolder, SavedStateHandleHolder.class);
return new ActivityRetainedCImpl(singletonCImpl, savedStateHandleHolder);
}
}
private static final class ActivityCBuilder implements RainyTokenApplication_HiltComponents.ActivityC.Builder {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl;
private Activity activity;
private ActivityCBuilder(SingletonCImpl singletonCImpl,
ActivityRetainedCImpl activityRetainedCImpl) {
this.singletonCImpl = singletonCImpl;
this.activityRetainedCImpl = activityRetainedCImpl;
}
@Override
public ActivityCBuilder activity(Activity activity) {
this.activity = Preconditions.checkNotNull(activity);
return this;
}
@Override
public RainyTokenApplication_HiltComponents.ActivityC build() {
Preconditions.checkBuilderRequirement(activity, Activity.class);
return new ActivityCImpl(singletonCImpl, activityRetainedCImpl, activity);
}
}
private static final class FragmentCBuilder implements RainyTokenApplication_HiltComponents.FragmentC.Builder {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl;
private final ActivityCImpl activityCImpl;
private Fragment fragment;
private FragmentCBuilder(SingletonCImpl singletonCImpl,
ActivityRetainedCImpl activityRetainedCImpl, ActivityCImpl activityCImpl) {
this.singletonCImpl = singletonCImpl;
this.activityRetainedCImpl = activityRetainedCImpl;
this.activityCImpl = activityCImpl;
}
@Override
public FragmentCBuilder fragment(Fragment fragment) {
this.fragment = Preconditions.checkNotNull(fragment);
return this;
}
@Override
public RainyTokenApplication_HiltComponents.FragmentC build() {
Preconditions.checkBuilderRequirement(fragment, Fragment.class);
return new FragmentCImpl(singletonCImpl, activityRetainedCImpl, activityCImpl, fragment);
}
}
private static final class ViewWithFragmentCBuilder implements RainyTokenApplication_HiltComponents.ViewWithFragmentC.Builder {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl;
private final ActivityCImpl activityCImpl;
private final FragmentCImpl fragmentCImpl;
private View view;
private ViewWithFragmentCBuilder(SingletonCImpl singletonCImpl,
ActivityRetainedCImpl activityRetainedCImpl, ActivityCImpl activityCImpl,
FragmentCImpl fragmentCImpl) {
this.singletonCImpl = singletonCImpl;
this.activityRetainedCImpl = activityRetainedCImpl;
this.activityCImpl = activityCImpl;
this.fragmentCImpl = fragmentCImpl;
}
@Override
public ViewWithFragmentCBuilder view(View view) {
this.view = Preconditions.checkNotNull(view);
return this;
}
@Override
public RainyTokenApplication_HiltComponents.ViewWithFragmentC build() {
Preconditions.checkBuilderRequirement(view, View.class);
return new ViewWithFragmentCImpl(singletonCImpl, activityRetainedCImpl, activityCImpl, fragmentCImpl, view);
}
}
private static final class ViewCBuilder implements RainyTokenApplication_HiltComponents.ViewC.Builder {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl;
private final ActivityCImpl activityCImpl;
private View view;
private ViewCBuilder(SingletonCImpl singletonCImpl, ActivityRetainedCImpl activityRetainedCImpl,
ActivityCImpl activityCImpl) {
this.singletonCImpl = singletonCImpl;
this.activityRetainedCImpl = activityRetainedCImpl;
this.activityCImpl = activityCImpl;
}
@Override
public ViewCBuilder view(View view) {
this.view = Preconditions.checkNotNull(view);
return this;
}
@Override
public RainyTokenApplication_HiltComponents.ViewC build() {
Preconditions.checkBuilderRequirement(view, View.class);
return new ViewCImpl(singletonCImpl, activityRetainedCImpl, activityCImpl, view);
}
}
private static final class ViewModelCBuilder implements RainyTokenApplication_HiltComponents.ViewModelC.Builder {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl;
private SavedStateHandle savedStateHandle;
private ViewModelLifecycle viewModelLifecycle;
private ViewModelCBuilder(SingletonCImpl singletonCImpl,
ActivityRetainedCImpl activityRetainedCImpl) {
this.singletonCImpl = singletonCImpl;
this.activityRetainedCImpl = activityRetainedCImpl;
}
@Override
public ViewModelCBuilder savedStateHandle(SavedStateHandle handle) {
this.savedStateHandle = Preconditions.checkNotNull(handle);
return this;
}
@Override
public ViewModelCBuilder viewModelLifecycle(ViewModelLifecycle viewModelLifecycle) {
this.viewModelLifecycle = Preconditions.checkNotNull(viewModelLifecycle);
return this;
}
@Override
public RainyTokenApplication_HiltComponents.ViewModelC build() {
Preconditions.checkBuilderRequirement(savedStateHandle, SavedStateHandle.class);
Preconditions.checkBuilderRequirement(viewModelLifecycle, ViewModelLifecycle.class);
return new ViewModelCImpl(singletonCImpl, activityRetainedCImpl, savedStateHandle, viewModelLifecycle);
}
}
private static final class ServiceCBuilder implements RainyTokenApplication_HiltComponents.ServiceC.Builder {
private final SingletonCImpl singletonCImpl;
private Service service;
private ServiceCBuilder(SingletonCImpl singletonCImpl) {
this.singletonCImpl = singletonCImpl;
}
@Override
public ServiceCBuilder service(Service service) {
this.service = Preconditions.checkNotNull(service);
return this;
}
@Override
public RainyTokenApplication_HiltComponents.ServiceC build() {
Preconditions.checkBuilderRequirement(service, Service.class);
return new ServiceCImpl(singletonCImpl, service);
}
}
private static final class ViewWithFragmentCImpl extends RainyTokenApplication_HiltComponents.ViewWithFragmentC {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl;
private final ActivityCImpl activityCImpl;
private final FragmentCImpl fragmentCImpl;
private final ViewWithFragmentCImpl viewWithFragmentCImpl = this;
ViewWithFragmentCImpl(SingletonCImpl singletonCImpl,
ActivityRetainedCImpl activityRetainedCImpl, ActivityCImpl activityCImpl,
FragmentCImpl fragmentCImpl, View viewParam) {
this.singletonCImpl = singletonCImpl;
this.activityRetainedCImpl = activityRetainedCImpl;
this.activityCImpl = activityCImpl;
this.fragmentCImpl = fragmentCImpl;
}
}
private static final class FragmentCImpl extends RainyTokenApplication_HiltComponents.FragmentC {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl;
private final ActivityCImpl activityCImpl;
private final FragmentCImpl fragmentCImpl = this;
FragmentCImpl(SingletonCImpl singletonCImpl, ActivityRetainedCImpl activityRetainedCImpl,
ActivityCImpl activityCImpl, Fragment fragmentParam) {
this.singletonCImpl = singletonCImpl;
this.activityRetainedCImpl = activityRetainedCImpl;
this.activityCImpl = activityCImpl;
}
@Override
public DefaultViewModelFactories.InternalFactoryFactory getHiltInternalFactoryFactory() {
return activityCImpl.getHiltInternalFactoryFactory();
}
@Override
public ViewWithFragmentComponentBuilder viewWithFragmentComponentBuilder() {
return new ViewWithFragmentCBuilder(singletonCImpl, activityRetainedCImpl, activityCImpl, fragmentCImpl);
}
}
private static final class ViewCImpl extends RainyTokenApplication_HiltComponents.ViewC {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl;
private final ActivityCImpl activityCImpl;
private final ViewCImpl viewCImpl = this;
ViewCImpl(SingletonCImpl singletonCImpl, ActivityRetainedCImpl activityRetainedCImpl,
ActivityCImpl activityCImpl, View viewParam) {
this.singletonCImpl = singletonCImpl;
this.activityRetainedCImpl = activityRetainedCImpl;
this.activityCImpl = activityCImpl;
}
}
private static final class ActivityCImpl extends RainyTokenApplication_HiltComponents.ActivityC {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl;
private final ActivityCImpl activityCImpl = this;
ActivityCImpl(SingletonCImpl singletonCImpl, ActivityRetainedCImpl activityRetainedCImpl,
Activity activityParam) {
this.singletonCImpl = singletonCImpl;
this.activityRetainedCImpl = activityRetainedCImpl;
}
Map keySetMapOfClassOfAndBooleanBuilder() {
MapBuilder mapBuilder = MapBuilder.<String, Boolean>newMapBuilder(8);
mapBuilder.put(CredentialEditViewModel_HiltModules_KeyModule_Provide_LazyMapKey.lazyClassKeyName, CredentialEditViewModel_HiltModules.KeyModule.provide());
mapBuilder.put(DashboardViewModel_HiltModules_KeyModule_Provide_LazyMapKey.lazyClassKeyName, DashboardViewModel_HiltModules.KeyModule.provide());
mapBuilder.put(ServiceDetailViewModel_HiltModules_KeyModule_Provide_LazyMapKey.lazyClassKeyName, ServiceDetailViewModel_HiltModules.KeyModule.provide());
mapBuilder.put(SettingsViewModel_HiltModules_KeyModule_Provide_LazyMapKey.lazyClassKeyName, SettingsViewModel_HiltModules.KeyModule.provide());
mapBuilder.put(UsageChartViewModel_HiltModules_KeyModule_Provide_LazyMapKey.lazyClassKeyName, UsageChartViewModel_HiltModules.KeyModule.provide());
mapBuilder.put(UsageDataViewModel_HiltModules_KeyModule_Provide_LazyMapKey.lazyClassKeyName, UsageDataViewModel_HiltModules.KeyModule.provide());
mapBuilder.put(UsageViewModel_HiltModules_KeyModule_Provide_LazyMapKey.lazyClassKeyName, UsageViewModel_HiltModules.KeyModule.provide());
mapBuilder.put(WebViewLoginViewModel_HiltModules_KeyModule_Provide_LazyMapKey.lazyClassKeyName, WebViewLoginViewModel_HiltModules.KeyModule.provide());
return mapBuilder.build();
}
@Override
public void injectMainActivity(MainActivity arg0) {
}
@Override
public DefaultViewModelFactories.InternalFactoryFactory getHiltInternalFactoryFactory() {
return DefaultViewModelFactories_InternalFactoryFactory_Factory.newInstance(getViewModelKeys(), new ViewModelCBuilder(singletonCImpl, activityRetainedCImpl));
}
@Override
public Map<Class<?>, Boolean> getViewModelKeys() {
return LazyClassKeyMap.<Boolean>of(keySetMapOfClassOfAndBooleanBuilder());
}
@Override
public ViewModelComponentBuilder getViewModelComponentBuilder() {
return new ViewModelCBuilder(singletonCImpl, activityRetainedCImpl);
}
@Override
public FragmentComponentBuilder fragmentComponentBuilder() {
return new FragmentCBuilder(singletonCImpl, activityRetainedCImpl, activityCImpl);
}
@Override
public ViewComponentBuilder viewComponentBuilder() {
return new ViewCBuilder(singletonCImpl, activityRetainedCImpl, activityCImpl);
}
}
private static final class ViewModelCImpl extends RainyTokenApplication_HiltComponents.ViewModelC {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl;
private final ViewModelCImpl viewModelCImpl = this;
Provider<CredentialEditViewModel> credentialEditViewModelProvider;
Provider<DashboardViewModel> dashboardViewModelProvider;
Provider<ServiceDetailViewModel> serviceDetailViewModelProvider;
Provider<SettingsViewModel> settingsViewModelProvider;
Provider<UsageChartViewModel> usageChartViewModelProvider;
Provider<UsageDataViewModel> usageDataViewModelProvider;
Provider<SyncUsageUseCase> syncUsageUseCaseProvider;
Provider<UsageViewModel> usageViewModelProvider;
Provider<WebViewLoginViewModel> webViewLoginViewModelProvider;
ViewModelCImpl(SingletonCImpl singletonCImpl, ActivityRetainedCImpl activityRetainedCImpl,
SavedStateHandle savedStateHandleParam, ViewModelLifecycle viewModelLifecycleParam) {
this.singletonCImpl = singletonCImpl;
this.activityRetainedCImpl = activityRetainedCImpl;
initialize(savedStateHandleParam, viewModelLifecycleParam);
}
Map hiltViewModelMapMapOfClassOfAndProviderOfViewModelBuilder() {
MapBuilder mapBuilder = MapBuilder.<String, javax.inject.Provider<ViewModel>>newMapBuilder(8);
mapBuilder.put(CredentialEditViewModel_HiltModules_BindsModule_Binds_LazyMapKey.lazyClassKeyName, ((Provider) (credentialEditViewModelProvider)));
mapBuilder.put(DashboardViewModel_HiltModules_BindsModule_Binds_LazyMapKey.lazyClassKeyName, ((Provider) (dashboardViewModelProvider)));
mapBuilder.put(ServiceDetailViewModel_HiltModules_BindsModule_Binds_LazyMapKey.lazyClassKeyName, ((Provider) (serviceDetailViewModelProvider)));
mapBuilder.put(SettingsViewModel_HiltModules_BindsModule_Binds_LazyMapKey.lazyClassKeyName, ((Provider) (settingsViewModelProvider)));
mapBuilder.put(UsageChartViewModel_HiltModules_BindsModule_Binds_LazyMapKey.lazyClassKeyName, ((Provider) (usageChartViewModelProvider)));
mapBuilder.put(UsageDataViewModel_HiltModules_BindsModule_Binds_LazyMapKey.lazyClassKeyName, ((Provider) (usageDataViewModelProvider)));
mapBuilder.put(UsageViewModel_HiltModules_BindsModule_Binds_LazyMapKey.lazyClassKeyName, ((Provider) (usageViewModelProvider)));
mapBuilder.put(WebViewLoginViewModel_HiltModules_BindsModule_Binds_LazyMapKey.lazyClassKeyName, ((Provider) (webViewLoginViewModelProvider)));
return mapBuilder.build();
}
@SuppressWarnings("unchecked")
private void initialize(final SavedStateHandle savedStateHandleParam,
final ViewModelLifecycle viewModelLifecycleParam) {
this.credentialEditViewModelProvider = new SwitchingProvider<>(singletonCImpl, activityRetainedCImpl, viewModelCImpl, 0);
this.dashboardViewModelProvider = new SwitchingProvider<>(singletonCImpl, activityRetainedCImpl, viewModelCImpl, 1);
this.serviceDetailViewModelProvider = new SwitchingProvider<>(singletonCImpl, activityRetainedCImpl, viewModelCImpl, 2);
this.settingsViewModelProvider = new SwitchingProvider<>(singletonCImpl, activityRetainedCImpl, viewModelCImpl, 3);
this.usageChartViewModelProvider = new SwitchingProvider<>(singletonCImpl, activityRetainedCImpl, viewModelCImpl, 4);
this.usageDataViewModelProvider = new SwitchingProvider<>(singletonCImpl, activityRetainedCImpl, viewModelCImpl, 5);
this.syncUsageUseCaseProvider = new SwitchingProvider<>(singletonCImpl, activityRetainedCImpl, viewModelCImpl, 7);
this.usageViewModelProvider = new SwitchingProvider<>(singletonCImpl, activityRetainedCImpl, viewModelCImpl, 6);
this.webViewLoginViewModelProvider = new SwitchingProvider<>(singletonCImpl, activityRetainedCImpl, viewModelCImpl, 8);
}
@Override
public Map<Class<?>, javax.inject.Provider<ViewModel>> getHiltViewModelMap() {
return LazyClassKeyMap.<javax.inject.Provider<ViewModel>>of(hiltViewModelMapMapOfClassOfAndProviderOfViewModelBuilder());
}
@Override
public Map<Class<?>, Object> getHiltViewModelAssistedMap() {
return Collections.<Class<?>, Object>emptyMap();
}
private static final class SwitchingProvider<T> implements Provider<T> {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl;
private final ViewModelCImpl viewModelCImpl;
private final int id;
SwitchingProvider(SingletonCImpl singletonCImpl, ActivityRetainedCImpl activityRetainedCImpl,
ViewModelCImpl viewModelCImpl, int id) {
this.singletonCImpl = singletonCImpl;
this.activityRetainedCImpl = activityRetainedCImpl;
this.viewModelCImpl = viewModelCImpl;
this.id = id;
}
@Override
@SuppressWarnings("unchecked")
public T get() {
switch (id) {
case 0: // com.rainy.token.ui.settings.CredentialEditViewModel
return (T) new CredentialEditViewModel(singletonCImpl.credentialRepositoryProvider.get(), singletonCImpl.provideOpenCodeGoRepositoryProvider, singletonCImpl.refreshBalanceUseCaseProvider);
case 1: // com.rainy.token.ui.dashboard.DashboardViewModel
return (T) new DashboardViewModel(singletonCImpl.credentialRepositoryProvider.get(), singletonCImpl.provideBalanceCacheProvider.get(), singletonCImpl.refreshBalanceUseCaseProvider.get(), ApplicationContextModule_ProvideContextFactory.provideContext(singletonCImpl.applicationContextModule));
case 2: // com.rainy.token.ui.servicedetail.ServiceDetailViewModel
return (T) new ServiceDetailViewModel(singletonCImpl.credentialRepositoryProvider.get(), singletonCImpl.provideBalanceCacheProvider.get(), singletonCImpl.refreshBalanceUseCaseProvider.get());
case 3: // com.rainy.token.ui.settings.SettingsViewModel
return (T) new SettingsViewModel(singletonCImpl.credentialRepositoryProvider.get());
case 4: // com.rainy.token.ui.dashboard.UsageChartViewModel
return (T) new UsageChartViewModel(singletonCImpl.provideUsageCacheProvider, singletonCImpl.credentialRepositoryProvider.get());
case 5: // com.rainy.token.ui.dashboard.UsageDataViewModel
return (T) new UsageDataViewModel(singletonCImpl.provideUsageCacheProvider, singletonCImpl.credentialRepositoryProvider.get());
case 6: // com.rainy.token.ui.dashboard.UsageViewModel
return (T) new UsageViewModel(singletonCImpl.provideUsageCacheProvider, viewModelCImpl.syncUsageUseCaseProvider, singletonCImpl.credentialRepositoryProvider.get());
case 7: // com.rainy.token.domain.usecase.SyncUsageUseCase
return (T) new SyncUsageUseCase(singletonCImpl.provideOpenCodeUsageRepositoryProvider, singletonCImpl.provideUsageCacheProvider);
case 8: // com.rainy.token.ui.webview.WebViewLoginViewModel
return (T) new WebViewLoginViewModel(singletonCImpl.webViewSessionSaverProvider.get());
default: throw new AssertionError(id);
}
}
}
}
private static final class ActivityRetainedCImpl extends RainyTokenApplication_HiltComponents.ActivityRetainedC {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl = this;
Provider<ActivityRetainedLifecycle> provideActivityRetainedLifecycleProvider;
ActivityRetainedCImpl(SingletonCImpl singletonCImpl,
SavedStateHandleHolder savedStateHandleHolderParam) {
this.singletonCImpl = singletonCImpl;
initialize(savedStateHandleHolderParam);
}
@SuppressWarnings("unchecked")
private void initialize(final SavedStateHandleHolder savedStateHandleHolderParam) {
this.provideActivityRetainedLifecycleProvider = DoubleCheck.provider(new SwitchingProvider<ActivityRetainedLifecycle>(singletonCImpl, activityRetainedCImpl, 0));
}
@Override
public ActivityComponentBuilder activityComponentBuilder() {
return new ActivityCBuilder(singletonCImpl, activityRetainedCImpl);
}
@Override
public ActivityRetainedLifecycle getActivityRetainedLifecycle() {
return provideActivityRetainedLifecycleProvider.get();
}
private static final class SwitchingProvider<T> implements Provider<T> {
private final SingletonCImpl singletonCImpl;
private final ActivityRetainedCImpl activityRetainedCImpl;
private final int id;
SwitchingProvider(SingletonCImpl singletonCImpl, ActivityRetainedCImpl activityRetainedCImpl,
int id) {
this.singletonCImpl = singletonCImpl;
this.activityRetainedCImpl = activityRetainedCImpl;
this.id = id;
}
@Override
@SuppressWarnings("unchecked")
public T get() {
switch (id) {
case 0: // dagger.hilt.android.ActivityRetainedLifecycle
return (T) ActivityRetainedComponentManager_LifecycleModule_ProvideActivityRetainedLifecycleFactory.provideActivityRetainedLifecycle();
default: throw new AssertionError(id);
}
}
}
}
private static final class ServiceCImpl extends RainyTokenApplication_HiltComponents.ServiceC {
private final SingletonCImpl singletonCImpl;
private final ServiceCImpl serviceCImpl = this;
ServiceCImpl(SingletonCImpl singletonCImpl, Service serviceParam) {
this.singletonCImpl = singletonCImpl;
}
}
private static final class SingletonCImpl extends RainyTokenApplication_HiltComponents.SingletonC {
private final ApplicationContextModule applicationContextModule;
private final SingletonCImpl singletonCImpl = this;
Provider<OkHttpClient> provideOkHttpClientProvider;
Provider<Json> provideJsonProvider;
Provider<Retrofit> provideRetrofitProvider;
Provider<DeepSeekApi> provideDeepSeekApiProvider;
Provider<DataStore<Preferences>> provideSecureStorageDataStoreProvider;
Provider<SecureStorage> provideSecureStorageProvider;
Provider<CredentialRepository> credentialRepositoryProvider;
Provider<DataStore<Preferences>> provideBalanceCacheDataStoreProvider;
Provider<BalanceCache> provideBalanceCacheProvider;
Provider<DeepSeekRepository> provideDeepSeekRepositoryProvider;
Provider<OpenCodeGoRepository> provideOpenCodeGoRepositoryProvider;
Provider<RefreshBalanceUseCase> refreshBalanceUseCaseProvider;
Provider<DataStore<Preferences>> provideUsageCacheDataStoreProvider;
Provider<UsageCache> provideUsageCacheProvider;
Provider<OpenCodeUsageRepository> provideOpenCodeUsageRepositoryProvider;
Provider<WebViewSessionSaver> webViewSessionSaverProvider;
SingletonCImpl(ApplicationContextModule applicationContextModuleParam) {
this.applicationContextModule = applicationContextModuleParam;
initialize(applicationContextModuleParam);
}
@SuppressWarnings("unchecked")
private void initialize(final ApplicationContextModule applicationContextModuleParam) {
this.provideOkHttpClientProvider = DoubleCheck.provider(new SwitchingProvider<OkHttpClient>(singletonCImpl, 4));
this.provideJsonProvider = DoubleCheck.provider(new SwitchingProvider<Json>(singletonCImpl, 5));
this.provideRetrofitProvider = DoubleCheck.provider(new SwitchingProvider<Retrofit>(singletonCImpl, 3));
this.provideDeepSeekApiProvider = DoubleCheck.provider(new SwitchingProvider<DeepSeekApi>(singletonCImpl, 2));
this.provideSecureStorageDataStoreProvider = DoubleCheck.provider(new SwitchingProvider<DataStore<Preferences>>(singletonCImpl, 8));
this.provideSecureStorageProvider = DoubleCheck.provider(new SwitchingProvider<SecureStorage>(singletonCImpl, 7));
this.credentialRepositoryProvider = DoubleCheck.provider(new SwitchingProvider<CredentialRepository>(singletonCImpl, 6));
this.provideBalanceCacheDataStoreProvider = DoubleCheck.provider(new SwitchingProvider<DataStore<Preferences>>(singletonCImpl, 10));
this.provideBalanceCacheProvider = DoubleCheck.provider(new SwitchingProvider<BalanceCache>(singletonCImpl, 9));
this.provideDeepSeekRepositoryProvider = DoubleCheck.provider(new SwitchingProvider<DeepSeekRepository>(singletonCImpl, 1));
this.provideOpenCodeGoRepositoryProvider = DoubleCheck.provider(new SwitchingProvider<OpenCodeGoRepository>(singletonCImpl, 11));
this.refreshBalanceUseCaseProvider = new SwitchingProvider<>(singletonCImpl, 0);
this.provideUsageCacheDataStoreProvider = DoubleCheck.provider(new SwitchingProvider<DataStore<Preferences>>(singletonCImpl, 13));
this.provideUsageCacheProvider = DoubleCheck.provider(new SwitchingProvider<UsageCache>(singletonCImpl, 12));
this.provideOpenCodeUsageRepositoryProvider = DoubleCheck.provider(new SwitchingProvider<OpenCodeUsageRepository>(singletonCImpl, 14));
this.webViewSessionSaverProvider = DoubleCheck.provider(new SwitchingProvider<WebViewSessionSaver>(singletonCImpl, 15));
}
@Override
public void injectRainyTokenApplication(RainyTokenApplication rainyTokenApplication) {
}
@Override
public RefreshBalanceUseCase refreshBalanceUseCase() {
return refreshBalanceUseCaseProvider.get();
}
@Override
public Set<Boolean> getDisableFragmentGetContextFix() {
return Collections.<Boolean>emptySet();
}
@Override
public ActivityRetainedComponentBuilder retainedComponentBuilder() {
return new ActivityRetainedCBuilder(singletonCImpl);
}
@Override
public ServiceComponentBuilder serviceComponentBuilder() {
return new ServiceCBuilder(singletonCImpl);
}
private static final class SwitchingProvider<T> implements Provider<T> {
private final SingletonCImpl singletonCImpl;
private final int id;
SwitchingProvider(SingletonCImpl singletonCImpl, int id) {
this.singletonCImpl = singletonCImpl;
this.id = id;
}
@Override
@SuppressWarnings("unchecked")
public T get() {
switch (id) {
case 0: // com.rainy.token.domain.usecase.RefreshBalanceUseCase
return (T) new RefreshBalanceUseCase(singletonCImpl.provideDeepSeekRepositoryProvider, singletonCImpl.provideOpenCodeGoRepositoryProvider);
case 1: // com.rainy.token.data.repository.DeepSeekRepository
return (T) NetworkModule_ProvideDeepSeekRepositoryFactory.provideDeepSeekRepository(singletonCImpl.provideDeepSeekApiProvider.get(), singletonCImpl.credentialRepositoryProvider.get(), singletonCImpl.provideBalanceCacheProvider.get());
case 2: // com.rainy.token.data.remote.DeepSeekApi
return (T) NetworkModule_ProvideDeepSeekApiFactory.provideDeepSeekApi(singletonCImpl.provideRetrofitProvider.get());
case 3: // retrofit2.Retrofit
return (T) NetworkModule_ProvideRetrofitFactory.provideRetrofit(singletonCImpl.provideOkHttpClientProvider.get(), singletonCImpl.provideJsonProvider.get());
case 4: // okhttp3.OkHttpClient
return (T) NetworkModule_ProvideOkHttpClientFactory.provideOkHttpClient();
case 5: // kotlinx.serialization.json.Json
return (T) NetworkModule_ProvideJsonFactory.provideJson();
case 6: // com.rainy.token.data.repository.CredentialRepository
return (T) new CredentialRepository(singletonCImpl.provideSecureStorageProvider.get());
case 7: // com.rainy.token.data.local.SecureStorage
return (T) NetworkModule_ProvideSecureStorageFactory.provideSecureStorage(singletonCImpl.provideSecureStorageDataStoreProvider.get(), singletonCImpl.provideJsonProvider.get());
case 8: // @javax.inject.Named("dataStore.secureStorage") androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences>
return (T) StorageModule_ProvideSecureStorageDataStoreFactory.provideSecureStorageDataStore(ApplicationContextModule_ProvideContextFactory.provideContext(singletonCImpl.applicationContextModule));
case 9: // com.rainy.token.data.cache.BalanceCache
return (T) NetworkModule_ProvideBalanceCacheFactory.provideBalanceCache(singletonCImpl.provideBalanceCacheDataStoreProvider.get(), singletonCImpl.provideJsonProvider.get());
case 10: // @javax.inject.Named("dataStore.balanceCache") androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences>
return (T) NetworkModule_ProvideBalanceCacheDataStoreFactory.provideBalanceCacheDataStore(ApplicationContextModule_ProvideContextFactory.provideContext(singletonCImpl.applicationContextModule));
case 11: // com.rainy.token.data.repository.OpenCodeGoRepository
return (T) NetworkModule_ProvideOpenCodeGoRepositoryFactory.provideOpenCodeGoRepository(singletonCImpl.provideOkHttpClientProvider.get(), singletonCImpl.credentialRepositoryProvider.get(), singletonCImpl.provideBalanceCacheProvider.get());
case 12: // com.rainy.token.data.local.UsageCache
return (T) NetworkModule_ProvideUsageCacheFactory.provideUsageCache(singletonCImpl.provideUsageCacheDataStoreProvider.get(), singletonCImpl.provideJsonProvider.get());
case 13: // @javax.inject.Named("dataStore.usageCache") androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences>
return (T) StorageModule_ProvideUsageCacheDataStoreFactory.provideUsageCacheDataStore(ApplicationContextModule_ProvideContextFactory.provideContext(singletonCImpl.applicationContextModule));
case 14: // com.rainy.token.data.repository.OpenCodeUsageRepository
return (T) NetworkModule_ProvideOpenCodeUsageRepositoryFactory.provideOpenCodeUsageRepository(singletonCImpl.provideOkHttpClientProvider.get(), singletonCImpl.credentialRepositoryProvider.get());
case 15: // com.rainy.token.data.repository.WebViewSessionSaver
return (T) new WebViewSessionSaver(singletonCImpl.credentialRepositoryProvider.get());
default: throw new AssertionError(id);
}
}
}
}
}

View File

@ -1,55 +0,0 @@
package com.rainy.token;
import android.app.Application;
import androidx.annotation.CallSuper;
import dagger.hilt.android.internal.managers.ApplicationComponentManager;
import dagger.hilt.android.internal.managers.ComponentSupplier;
import dagger.hilt.android.internal.modules.ApplicationContextModule;
import dagger.hilt.internal.GeneratedComponentManagerHolder;
import dagger.hilt.internal.UnsafeCasts;
import java.lang.Object;
import java.lang.Override;
import javax.annotation.processing.Generated;
/**
* A generated base class to be extended by the @dagger.hilt.android.HiltAndroidApp annotated class. If using the Gradle plugin, this is swapped as the base class via bytecode transformation.
*/
@Generated("dagger.hilt.android.processor.internal.androidentrypoint.ApplicationGenerator")
public abstract class Hilt_RainyTokenApplication extends Application implements GeneratedComponentManagerHolder {
private boolean injected = false;
private final ApplicationComponentManager componentManager = new ApplicationComponentManager(new ComponentSupplier() {
@Override
public Object get() {
return DaggerRainyTokenApplication_HiltComponents_SingletonC.builder()
.applicationContextModule(new ApplicationContextModule(Hilt_RainyTokenApplication.this))
.build();
}
});
@Override
public final ApplicationComponentManager componentManager() {
return componentManager;
}
@Override
public final Object generatedComponent() {
return this.componentManager().generatedComponent();
}
@CallSuper
@Override
public void onCreate() {
hiltInternalInject();
super.onCreate();
}
protected void hiltInternalInject() {
if (!injected) {
injected = true;
// This is a known unsafe cast, but is safe in the only correct use case:
// RainyTokenApplication extends Hilt_RainyTokenApplication
((RainyTokenApplication_GeneratedInjector) generatedComponent()).injectRainyTokenApplication(UnsafeCasts.<RainyTokenApplication>unsafeCast(this));
}
}
}

View File

@ -1,17 +0,0 @@
package com.rainy.token;
import dagger.hilt.InstallIn;
import dagger.hilt.codegen.OriginatingElement;
import dagger.hilt.components.SingletonComponent;
import dagger.hilt.internal.GeneratedEntryPoint;
import javax.annotation.processing.Generated;
@OriginatingElement(
topLevelClass = RainyTokenApplication.class
)
@GeneratedEntryPoint
@InstallIn(SingletonComponent.class)
@Generated("dagger.hilt.android.processor.internal.androidentrypoint.InjectorEntryPointGenerator")
public interface RainyTokenApplication_GeneratedInjector {
void injectRainyTokenApplication(RainyTokenApplication rainyTokenApplication);
}

View File

@ -1,265 +0,0 @@
package com.rainy.token;
import com.rainy.token.di.NetworkModule;
import com.rainy.token.di.StorageModule;
import com.rainy.token.ui.dashboard.DashboardViewModel_HiltModules;
import com.rainy.token.ui.dashboard.UsageChartViewModel_HiltModules;
import com.rainy.token.ui.dashboard.UsageDataViewModel_HiltModules;
import com.rainy.token.ui.dashboard.UsageViewModel_HiltModules;
import com.rainy.token.ui.servicedetail.ServiceDetailViewModel_HiltModules;
import com.rainy.token.ui.settings.CredentialEditViewModel_HiltModules;
import com.rainy.token.ui.settings.SettingsViewModel_HiltModules;
import com.rainy.token.ui.webview.WebViewLoginViewModel_HiltModules;
import com.rainy.token.ui.widget.WidgetRefreshEntryPoint;
import dagger.Binds;
import dagger.Component;
import dagger.Module;
import dagger.Subcomponent;
import dagger.hilt.android.components.ActivityComponent;
import dagger.hilt.android.components.ActivityRetainedComponent;
import dagger.hilt.android.components.FragmentComponent;
import dagger.hilt.android.components.ServiceComponent;
import dagger.hilt.android.components.ViewComponent;
import dagger.hilt.android.components.ViewModelComponent;
import dagger.hilt.android.components.ViewWithFragmentComponent;
import dagger.hilt.android.flags.FragmentGetContextFix;
import dagger.hilt.android.flags.HiltWrapper_FragmentGetContextFix_FragmentGetContextFixModule;
import dagger.hilt.android.internal.builders.ActivityComponentBuilder;
import dagger.hilt.android.internal.builders.ActivityRetainedComponentBuilder;
import dagger.hilt.android.internal.builders.FragmentComponentBuilder;
import dagger.hilt.android.internal.builders.ServiceComponentBuilder;
import dagger.hilt.android.internal.builders.ViewComponentBuilder;
import dagger.hilt.android.internal.builders.ViewModelComponentBuilder;
import dagger.hilt.android.internal.builders.ViewWithFragmentComponentBuilder;
import dagger.hilt.android.internal.lifecycle.DefaultViewModelFactories;
import dagger.hilt.android.internal.lifecycle.HiltViewModelFactory;
import dagger.hilt.android.internal.lifecycle.HiltWrapper_DefaultViewModelFactories_ActivityModule;
import dagger.hilt.android.internal.lifecycle.HiltWrapper_HiltViewModelFactory_ActivityCreatorEntryPoint;
import dagger.hilt.android.internal.lifecycle.HiltWrapper_HiltViewModelFactory_ViewModelModule;
import dagger.hilt.android.internal.managers.ActivityComponentManager;
import dagger.hilt.android.internal.managers.FragmentComponentManager;
import dagger.hilt.android.internal.managers.HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedComponentBuilderEntryPoint;
import dagger.hilt.android.internal.managers.HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedLifecycleEntryPoint;
import dagger.hilt.android.internal.managers.HiltWrapper_ActivityRetainedComponentManager_LifecycleModule;
import dagger.hilt.android.internal.managers.HiltWrapper_ActivitySavedStateHandleModule;
import dagger.hilt.android.internal.managers.ServiceComponentManager;
import dagger.hilt.android.internal.managers.ViewComponentManager;
import dagger.hilt.android.internal.modules.ApplicationContextModule;
import dagger.hilt.android.internal.modules.HiltWrapper_ActivityModule;
import dagger.hilt.android.scopes.ActivityRetainedScoped;
import dagger.hilt.android.scopes.ActivityScoped;
import dagger.hilt.android.scopes.FragmentScoped;
import dagger.hilt.android.scopes.ServiceScoped;
import dagger.hilt.android.scopes.ViewModelScoped;
import dagger.hilt.android.scopes.ViewScoped;
import dagger.hilt.components.SingletonComponent;
import dagger.hilt.internal.GeneratedComponent;
import dagger.hilt.migration.DisableInstallInCheck;
import javax.annotation.processing.Generated;
import javax.inject.Singleton;
@Generated("dagger.hilt.processor.internal.root.RootProcessor")
public final class RainyTokenApplication_HiltComponents {
private RainyTokenApplication_HiltComponents() {
}
@Module(
subcomponents = ServiceC.class
)
@DisableInstallInCheck
@Generated("dagger.hilt.processor.internal.root.RootProcessor")
abstract interface ServiceCBuilderModule {
@Binds
ServiceComponentBuilder bind(ServiceC.Builder builder);
}
@Module(
subcomponents = ActivityRetainedC.class
)
@DisableInstallInCheck
@Generated("dagger.hilt.processor.internal.root.RootProcessor")
abstract interface ActivityRetainedCBuilderModule {
@Binds
ActivityRetainedComponentBuilder bind(ActivityRetainedC.Builder builder);
}
@Module(
subcomponents = ActivityC.class
)
@DisableInstallInCheck
@Generated("dagger.hilt.processor.internal.root.RootProcessor")
abstract interface ActivityCBuilderModule {
@Binds
ActivityComponentBuilder bind(ActivityC.Builder builder);
}
@Module(
subcomponents = ViewModelC.class
)
@DisableInstallInCheck
@Generated("dagger.hilt.processor.internal.root.RootProcessor")
abstract interface ViewModelCBuilderModule {
@Binds
ViewModelComponentBuilder bind(ViewModelC.Builder builder);
}
@Module(
subcomponents = ViewC.class
)
@DisableInstallInCheck
@Generated("dagger.hilt.processor.internal.root.RootProcessor")
abstract interface ViewCBuilderModule {
@Binds
ViewComponentBuilder bind(ViewC.Builder builder);
}
@Module(
subcomponents = FragmentC.class
)
@DisableInstallInCheck
@Generated("dagger.hilt.processor.internal.root.RootProcessor")
abstract interface FragmentCBuilderModule {
@Binds
FragmentComponentBuilder bind(FragmentC.Builder builder);
}
@Module(
subcomponents = ViewWithFragmentC.class
)
@DisableInstallInCheck
@Generated("dagger.hilt.processor.internal.root.RootProcessor")
abstract interface ViewWithFragmentCBuilderModule {
@Binds
ViewWithFragmentComponentBuilder bind(ViewWithFragmentC.Builder builder);
}
@Component(
modules = {
ApplicationContextModule.class,
HiltWrapper_FragmentGetContextFix_FragmentGetContextFixModule.class,
NetworkModule.class,
ActivityRetainedCBuilderModule.class,
ServiceCBuilderModule.class,
StorageModule.class
}
)
@Singleton
@jakarta.inject.Singleton
public abstract static class SingletonC implements RainyTokenApplication_GeneratedInjector,
WidgetRefreshEntryPoint,
FragmentGetContextFix.FragmentGetContextFixEntryPoint,
HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedComponentBuilderEntryPoint,
ServiceComponentManager.ServiceComponentBuilderEntryPoint,
SingletonComponent,
GeneratedComponent {
}
@Subcomponent
@ServiceScoped
public abstract static class ServiceC implements ServiceComponent,
GeneratedComponent {
@Subcomponent.Builder
abstract interface Builder extends ServiceComponentBuilder {
}
}
@Subcomponent(
modules = {
CredentialEditViewModel_HiltModules.KeyModule.class,
DashboardViewModel_HiltModules.KeyModule.class,
HiltWrapper_ActivityRetainedComponentManager_LifecycleModule.class,
HiltWrapper_ActivitySavedStateHandleModule.class,
ActivityCBuilderModule.class,
ViewModelCBuilderModule.class,
ServiceDetailViewModel_HiltModules.KeyModule.class,
SettingsViewModel_HiltModules.KeyModule.class,
UsageChartViewModel_HiltModules.KeyModule.class,
UsageDataViewModel_HiltModules.KeyModule.class,
UsageViewModel_HiltModules.KeyModule.class,
WebViewLoginViewModel_HiltModules.KeyModule.class
}
)
@ActivityRetainedScoped
public abstract static class ActivityRetainedC implements ActivityRetainedComponent,
ActivityComponentManager.ActivityComponentBuilderEntryPoint,
HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedLifecycleEntryPoint,
GeneratedComponent {
@Subcomponent.Builder
abstract interface Builder extends ActivityRetainedComponentBuilder {
}
}
@Subcomponent(
modules = {
HiltWrapper_ActivityModule.class,
HiltWrapper_DefaultViewModelFactories_ActivityModule.class,
FragmentCBuilderModule.class,
ViewCBuilderModule.class
}
)
@ActivityScoped
public abstract static class ActivityC implements MainActivity_GeneratedInjector,
ActivityComponent,
DefaultViewModelFactories.ActivityEntryPoint,
HiltWrapper_HiltViewModelFactory_ActivityCreatorEntryPoint,
FragmentComponentManager.FragmentComponentBuilderEntryPoint,
ViewComponentManager.ViewComponentBuilderEntryPoint,
GeneratedComponent {
@Subcomponent.Builder
abstract interface Builder extends ActivityComponentBuilder {
}
}
@Subcomponent(
modules = {
CredentialEditViewModel_HiltModules.BindsModule.class,
DashboardViewModel_HiltModules.BindsModule.class,
HiltWrapper_HiltViewModelFactory_ViewModelModule.class,
ServiceDetailViewModel_HiltModules.BindsModule.class,
SettingsViewModel_HiltModules.BindsModule.class,
UsageChartViewModel_HiltModules.BindsModule.class,
UsageDataViewModel_HiltModules.BindsModule.class,
UsageViewModel_HiltModules.BindsModule.class,
WebViewLoginViewModel_HiltModules.BindsModule.class
}
)
@ViewModelScoped
public abstract static class ViewModelC implements ViewModelComponent,
HiltViewModelFactory.ViewModelFactoriesEntryPoint,
GeneratedComponent {
@Subcomponent.Builder
abstract interface Builder extends ViewModelComponentBuilder {
}
}
@Subcomponent
@ViewScoped
public abstract static class ViewC implements ViewComponent,
GeneratedComponent {
@Subcomponent.Builder
abstract interface Builder extends ViewComponentBuilder {
}
}
@Subcomponent(
modules = ViewWithFragmentCBuilderModule.class
)
@FragmentScoped
public abstract static class FragmentC implements FragmentComponent,
DefaultViewModelFactories.FragmentEntryPoint,
ViewComponentManager.ViewWithFragmentComponentBuilderEntryPoint,
GeneratedComponent {
@Subcomponent.Builder
abstract interface Builder extends FragmentComponentBuilder {
}
}
@Subcomponent
@ViewScoped
public abstract static class ViewWithFragmentC implements ViewWithFragmentComponent,
GeneratedComponent {
@Subcomponent.Builder
abstract interface Builder extends ViewWithFragmentComponentBuilder {
}
}
}

View File

@ -1,23 +0,0 @@
package dagger.hilt.internal.aggregatedroot.codegen;
import dagger.hilt.android.HiltAndroidApp;
import dagger.hilt.internal.aggregatedroot.AggregatedRoot;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedRoot(
root = "com.rainy.token.RainyTokenApplication",
rootPackage = "com.rainy.token",
originatingRoot = "com.rainy.token.RainyTokenApplication",
originatingRootPackage = "com.rainy.token",
rootAnnotation = HiltAndroidApp.class,
rootComponentPackage = "dagger.hilt.components",
rootSimpleNames = "RainyTokenApplication",
originatingRootSimpleNames = "RainyTokenApplication",
rootComponentSimpleNames = "SingletonComponent"
)
@Generated("dagger.hilt.processor.internal.root.AggregatedRootGenerator")
public class _com_rainy_token_RainyTokenApplication {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.components.SingletonComponent",
entryPoints = "com.rainy.token.RainyTokenApplication_GeneratedInjector"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_RainyTokenApplication_GeneratedInjector {
}

View File

@ -1,124 +0,0 @@
package com.rainy.token;
import dagger.hilt.internal.aggregatedroot.codegen._com_rainy_token_RainyTokenApplication;
import dagger.hilt.internal.componenttreedeps.ComponentTreeDeps;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_ActivityComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_ActivityRetainedComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_FragmentComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_ServiceComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_ViewComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_ViewModelComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_ViewWithFragmentComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_ActivityComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_ActivityRetainedComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_FragmentComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_ServiceComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_ViewComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_ViewModelComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_ViewWithFragmentComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_components_SingletonComponent;
import hilt_aggregated_deps._com_rainy_token_MainActivity_GeneratedInjector;
import hilt_aggregated_deps._com_rainy_token_RainyTokenApplication_GeneratedInjector;
import hilt_aggregated_deps._com_rainy_token_di_NetworkModule;
import hilt_aggregated_deps._com_rainy_token_di_StorageModule;
import hilt_aggregated_deps._com_rainy_token_ui_dashboard_DashboardViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_rainy_token_ui_dashboard_DashboardViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_rainy_token_ui_dashboard_UsageChartViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_rainy_token_ui_dashboard_UsageChartViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_rainy_token_ui_dashboard_UsageDataViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_rainy_token_ui_dashboard_UsageDataViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_rainy_token_ui_dashboard_UsageViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_rainy_token_ui_dashboard_UsageViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_rainy_token_ui_servicedetail_ServiceDetailViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_rainy_token_ui_servicedetail_ServiceDetailViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_rainy_token_ui_settings_CredentialEditViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_rainy_token_ui_settings_CredentialEditViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_rainy_token_ui_settings_SettingsViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_rainy_token_ui_settings_SettingsViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_rainy_token_ui_webview_WebViewLoginViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_rainy_token_ui_webview_WebViewLoginViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_rainy_token_ui_widget_WidgetRefreshEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_flags_FragmentGetContextFix_FragmentGetContextFixEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_flags_HiltWrapper_FragmentGetContextFix_FragmentGetContextFixModule;
import hilt_aggregated_deps._dagger_hilt_android_internal_lifecycle_DefaultViewModelFactories_ActivityEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_lifecycle_DefaultViewModelFactories_FragmentEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_lifecycle_HiltViewModelFactory_ViewModelFactoriesEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_lifecycle_HiltWrapper_DefaultViewModelFactories_ActivityModule;
import hilt_aggregated_deps._dagger_hilt_android_internal_lifecycle_HiltWrapper_HiltViewModelFactory_ActivityCreatorEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_lifecycle_HiltWrapper_HiltViewModelFactory_ViewModelModule;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_ActivityComponentManager_ActivityComponentBuilderEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_FragmentComponentManager_FragmentComponentBuilderEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedComponentBuilderEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedLifecycleEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_HiltWrapper_ActivityRetainedComponentManager_LifecycleModule;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_HiltWrapper_ActivitySavedStateHandleModule;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_ServiceComponentManager_ServiceComponentBuilderEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_ViewComponentManager_ViewComponentBuilderEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_ViewComponentManager_ViewWithFragmentComponentBuilderEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_modules_ApplicationContextModule;
import hilt_aggregated_deps._dagger_hilt_android_internal_modules_HiltWrapper_ActivityModule;
@ComponentTreeDeps(
rootDeps = _com_rainy_token_RainyTokenApplication.class,
defineComponentDeps = {
_dagger_hilt_android_components_ActivityComponent.class,
_dagger_hilt_android_components_ActivityRetainedComponent.class,
_dagger_hilt_android_components_FragmentComponent.class,
_dagger_hilt_android_components_ServiceComponent.class,
_dagger_hilt_android_components_ViewComponent.class,
_dagger_hilt_android_components_ViewModelComponent.class,
_dagger_hilt_android_components_ViewWithFragmentComponent.class,
_dagger_hilt_android_internal_builders_ActivityComponentBuilder.class,
_dagger_hilt_android_internal_builders_ActivityRetainedComponentBuilder.class,
_dagger_hilt_android_internal_builders_FragmentComponentBuilder.class,
_dagger_hilt_android_internal_builders_ServiceComponentBuilder.class,
_dagger_hilt_android_internal_builders_ViewComponentBuilder.class,
_dagger_hilt_android_internal_builders_ViewModelComponentBuilder.class,
_dagger_hilt_android_internal_builders_ViewWithFragmentComponentBuilder.class,
_dagger_hilt_components_SingletonComponent.class
},
aggregatedDeps = {
_com_rainy_token_MainActivity_GeneratedInjector.class,
_com_rainy_token_RainyTokenApplication_GeneratedInjector.class,
_com_rainy_token_di_NetworkModule.class,
_com_rainy_token_di_StorageModule.class,
_com_rainy_token_ui_dashboard_DashboardViewModel_HiltModules_BindsModule.class,
_com_rainy_token_ui_dashboard_DashboardViewModel_HiltModules_KeyModule.class,
_com_rainy_token_ui_dashboard_UsageChartViewModel_HiltModules_BindsModule.class,
_com_rainy_token_ui_dashboard_UsageChartViewModel_HiltModules_KeyModule.class,
_com_rainy_token_ui_dashboard_UsageDataViewModel_HiltModules_BindsModule.class,
_com_rainy_token_ui_dashboard_UsageDataViewModel_HiltModules_KeyModule.class,
_com_rainy_token_ui_dashboard_UsageViewModel_HiltModules_BindsModule.class,
_com_rainy_token_ui_dashboard_UsageViewModel_HiltModules_KeyModule.class,
_com_rainy_token_ui_servicedetail_ServiceDetailViewModel_HiltModules_BindsModule.class,
_com_rainy_token_ui_servicedetail_ServiceDetailViewModel_HiltModules_KeyModule.class,
_com_rainy_token_ui_settings_CredentialEditViewModel_HiltModules_BindsModule.class,
_com_rainy_token_ui_settings_CredentialEditViewModel_HiltModules_KeyModule.class,
_com_rainy_token_ui_settings_SettingsViewModel_HiltModules_BindsModule.class,
_com_rainy_token_ui_settings_SettingsViewModel_HiltModules_KeyModule.class,
_com_rainy_token_ui_webview_WebViewLoginViewModel_HiltModules_BindsModule.class,
_com_rainy_token_ui_webview_WebViewLoginViewModel_HiltModules_KeyModule.class,
_com_rainy_token_ui_widget_WidgetRefreshEntryPoint.class,
_dagger_hilt_android_flags_FragmentGetContextFix_FragmentGetContextFixEntryPoint.class,
_dagger_hilt_android_flags_HiltWrapper_FragmentGetContextFix_FragmentGetContextFixModule.class,
_dagger_hilt_android_internal_lifecycle_DefaultViewModelFactories_ActivityEntryPoint.class,
_dagger_hilt_android_internal_lifecycle_DefaultViewModelFactories_FragmentEntryPoint.class,
_dagger_hilt_android_internal_lifecycle_HiltViewModelFactory_ViewModelFactoriesEntryPoint.class,
_dagger_hilt_android_internal_lifecycle_HiltWrapper_DefaultViewModelFactories_ActivityModule.class,
_dagger_hilt_android_internal_lifecycle_HiltWrapper_HiltViewModelFactory_ActivityCreatorEntryPoint.class,
_dagger_hilt_android_internal_lifecycle_HiltWrapper_HiltViewModelFactory_ViewModelModule.class,
_dagger_hilt_android_internal_managers_ActivityComponentManager_ActivityComponentBuilderEntryPoint.class,
_dagger_hilt_android_internal_managers_FragmentComponentManager_FragmentComponentBuilderEntryPoint.class,
_dagger_hilt_android_internal_managers_HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedComponentBuilderEntryPoint.class,
_dagger_hilt_android_internal_managers_HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedLifecycleEntryPoint.class,
_dagger_hilt_android_internal_managers_HiltWrapper_ActivityRetainedComponentManager_LifecycleModule.class,
_dagger_hilt_android_internal_managers_HiltWrapper_ActivitySavedStateHandleModule.class,
_dagger_hilt_android_internal_managers_ServiceComponentManager_ServiceComponentBuilderEntryPoint.class,
_dagger_hilt_android_internal_managers_ViewComponentManager_ViewComponentBuilderEntryPoint.class,
_dagger_hilt_android_internal_managers_ViewComponentManager_ViewWithFragmentComponentBuilderEntryPoint.class,
_dagger_hilt_android_internal_modules_ApplicationContextModule.class,
_dagger_hilt_android_internal_modules_HiltWrapper_ActivityModule.class
}
)
public final class RainyTokenApplication_ComponentTreeDeps {
}

View File

@ -1,9 +0,0 @@
package dagger.hilt.internal.processedrootsentinel.codegen;
import dagger.hilt.internal.processedrootsentinel.ProcessedRootSentinel;
@ProcessedRootSentinel(
roots = "com.rainy.token.RainyTokenApplication"
)
public final class _com_rainy_token_RainyTokenApplication {
}

View File

@ -1,96 +0,0 @@
package com.rainy.token;
import android.content.Context;
import android.os.Bundle;
import androidx.activity.ComponentActivity;
import androidx.activity.contextaware.OnContextAvailableListener;
import androidx.annotation.CallSuper;
import androidx.lifecycle.ViewModelProvider;
import dagger.hilt.android.internal.lifecycle.DefaultViewModelFactories;
import dagger.hilt.android.internal.managers.ActivityComponentManager;
import dagger.hilt.internal.GeneratedComponentManagerHolder;
import dagger.hilt.internal.UnsafeCasts;
import java.lang.Object;
import java.lang.Override;
import javax.annotation.processing.Generated;
/**
* A generated base class to be extended by the @dagger.hilt.android.AndroidEntryPoint annotated class. If using the Gradle plugin, this is swapped as the base class via bytecode transformation.
*/
@Generated("dagger.hilt.android.processor.internal.androidentrypoint.ActivityGenerator")
public abstract class Hilt_MainActivity extends ComponentActivity implements GeneratedComponentManagerHolder {
private volatile ActivityComponentManager componentManager;
private final Object componentManagerLock = new Object();
private boolean injected = false;
Hilt_MainActivity() {
super();
_initHiltInternal();
}
Hilt_MainActivity(int contentLayoutId) {
super(contentLayoutId);
_initHiltInternal();
}
private void _initHiltInternal() {
addOnContextAvailableListener(new OnContextAvailableListener() {
@Override
public void onContextAvailable(Context context) {
inject();
}
});
}
private void initSavedStateHandleHolders() {
componentManager().initSavedStateHandleHolders();
}
@CallSuper
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initSavedStateHandleHolders();
}
@Override
protected void onDestroy() {
super.onDestroy();
componentManager().clearSavedStateHandleHolders();
}
@Override
public final Object generatedComponent() {
return this.componentManager().generatedComponent();
}
protected ActivityComponentManager createComponentManager() {
return new ActivityComponentManager(this);
}
@Override
public final ActivityComponentManager componentManager() {
if (componentManager == null) {
synchronized (componentManagerLock) {
if (componentManager == null) {
componentManager = createComponentManager();
}
}
}
return componentManager;
}
protected void inject() {
if (!injected) {
injected = true;
((MainActivity_GeneratedInjector) this.generatedComponent()).injectMainActivity(UnsafeCasts.<MainActivity>unsafeCast(this));
}
}
@Override
public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
return DefaultViewModelFactories.getActivityFactory(this, super.getDefaultViewModelProviderFactory());
}
}

View File

@ -1,17 +0,0 @@
package com.rainy.token;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.ActivityComponent;
import dagger.hilt.codegen.OriginatingElement;
import dagger.hilt.internal.GeneratedEntryPoint;
import javax.annotation.processing.Generated;
@OriginatingElement(
topLevelClass = MainActivity.class
)
@GeneratedEntryPoint
@InstallIn(ActivityComponent.class)
@Generated("dagger.hilt.android.processor.internal.androidentrypoint.InjectorEntryPointGenerator")
public interface MainActivity_GeneratedInjector {
void injectMainActivity(MainActivity mainActivity);
}

View File

@ -1,17 +0,0 @@
package com.rainy.token;
import dagger.hilt.InstallIn;
import dagger.hilt.codegen.OriginatingElement;
import dagger.hilt.components.SingletonComponent;
import dagger.hilt.internal.GeneratedEntryPoint;
import javax.annotation.processing.Generated;
@OriginatingElement(
topLevelClass = RainyTokenApplication.class
)
@GeneratedEntryPoint
@InstallIn(SingletonComponent.class)
@Generated("dagger.hilt.android.processor.internal.androidentrypoint.InjectorEntryPointGenerator")
public interface RainyTokenApplication_GeneratedInjector {
void injectRainyTokenApplication(RainyTokenApplication rainyTokenApplication);
}

View File

@ -1,46 +0,0 @@
package com.rainy.token.data.repository;
import com.rainy.token.data.local.SecureStorage;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class CredentialRepository_Factory implements Factory<CredentialRepository> {
private final Provider<SecureStorage> secureStorageProvider;
private CredentialRepository_Factory(Provider<SecureStorage> secureStorageProvider) {
this.secureStorageProvider = secureStorageProvider;
}
@Override
public CredentialRepository get() {
return newInstance(secureStorageProvider.get());
}
public static CredentialRepository_Factory create(Provider<SecureStorage> secureStorageProvider) {
return new CredentialRepository_Factory(secureStorageProvider);
}
public static CredentialRepository newInstance(SecureStorage secureStorage) {
return new CredentialRepository(secureStorage);
}
}

View File

@ -1,58 +0,0 @@
package com.rainy.token.data.repository;
import com.rainy.token.data.cache.BalanceCache;
import com.rainy.token.data.remote.DeepSeekApi;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class DeepSeekRepository_Factory implements Factory<DeepSeekRepository> {
private final Provider<DeepSeekApi> deepSeekApiProvider;
private final Provider<CredentialRepository> credentialRepositoryProvider;
private final Provider<BalanceCache> balanceCacheProvider;
private DeepSeekRepository_Factory(Provider<DeepSeekApi> deepSeekApiProvider,
Provider<CredentialRepository> credentialRepositoryProvider,
Provider<BalanceCache> balanceCacheProvider) {
this.deepSeekApiProvider = deepSeekApiProvider;
this.credentialRepositoryProvider = credentialRepositoryProvider;
this.balanceCacheProvider = balanceCacheProvider;
}
@Override
public DeepSeekRepository get() {
return newInstance(deepSeekApiProvider.get(), credentialRepositoryProvider.get(), balanceCacheProvider.get());
}
public static DeepSeekRepository_Factory create(Provider<DeepSeekApi> deepSeekApiProvider,
Provider<CredentialRepository> credentialRepositoryProvider,
Provider<BalanceCache> balanceCacheProvider) {
return new DeepSeekRepository_Factory(deepSeekApiProvider, credentialRepositoryProvider, balanceCacheProvider);
}
public static DeepSeekRepository newInstance(DeepSeekApi deepSeekApi,
CredentialRepository credentialRepository, BalanceCache balanceCache) {
return new DeepSeekRepository(deepSeekApi, credentialRepository, balanceCache);
}
}

View File

@ -1,46 +0,0 @@
package com.rainy.token.data.repository;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class WebViewSessionSaver_Factory implements Factory<WebViewSessionSaver> {
private final Provider<CredentialRepository> credentialRepositoryProvider;
private WebViewSessionSaver_Factory(Provider<CredentialRepository> credentialRepositoryProvider) {
this.credentialRepositoryProvider = credentialRepositoryProvider;
}
@Override
public WebViewSessionSaver get() {
return newInstance(credentialRepositoryProvider.get());
}
public static WebViewSessionSaver_Factory create(
Provider<CredentialRepository> credentialRepositoryProvider) {
return new WebViewSessionSaver_Factory(credentialRepositoryProvider);
}
public static WebViewSessionSaver newInstance(CredentialRepository credentialRepository) {
return new WebViewSessionSaver(credentialRepository);
}
}

View File

@ -1,53 +0,0 @@
package com.rainy.token.di;
import android.content.Context;
import androidx.datastore.core.DataStore;
import androidx.datastore.preferences.core.Preferences;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata({
"javax.inject.Named",
"dagger.hilt.android.qualifiers.ApplicationContext"
})
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class NetworkModule_ProvideBalanceCacheDataStoreFactory implements Factory<DataStore<Preferences>> {
private final Provider<Context> contextProvider;
private NetworkModule_ProvideBalanceCacheDataStoreFactory(Provider<Context> contextProvider) {
this.contextProvider = contextProvider;
}
@Override
public DataStore<Preferences> get() {
return provideBalanceCacheDataStore(contextProvider.get());
}
public static NetworkModule_ProvideBalanceCacheDataStoreFactory create(
Provider<Context> contextProvider) {
return new NetworkModule_ProvideBalanceCacheDataStoreFactory(contextProvider);
}
public static DataStore<Preferences> provideBalanceCacheDataStore(Context context) {
return Preconditions.checkNotNullFromProvides(NetworkModule.INSTANCE.provideBalanceCacheDataStore(context));
}
}

View File

@ -1,55 +0,0 @@
package com.rainy.token.di;
import androidx.datastore.core.DataStore;
import androidx.datastore.preferences.core.Preferences;
import com.rainy.token.data.cache.BalanceCache;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
import kotlinx.serialization.json.Json;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata("javax.inject.Named")
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class NetworkModule_ProvideBalanceCacheFactory implements Factory<BalanceCache> {
private final Provider<DataStore<Preferences>> dataStoreProvider;
private final Provider<Json> jsonProvider;
private NetworkModule_ProvideBalanceCacheFactory(
Provider<DataStore<Preferences>> dataStoreProvider, Provider<Json> jsonProvider) {
this.dataStoreProvider = dataStoreProvider;
this.jsonProvider = jsonProvider;
}
@Override
public BalanceCache get() {
return provideBalanceCache(dataStoreProvider.get(), jsonProvider.get());
}
public static NetworkModule_ProvideBalanceCacheFactory create(
Provider<DataStore<Preferences>> dataStoreProvider, Provider<Json> jsonProvider) {
return new NetworkModule_ProvideBalanceCacheFactory(dataStoreProvider, jsonProvider);
}
public static BalanceCache provideBalanceCache(DataStore<Preferences> dataStore, Json json) {
return Preconditions.checkNotNullFromProvides(NetworkModule.INSTANCE.provideBalanceCache(dataStore, json));
}
}

View File

@ -1,49 +0,0 @@
package com.rainy.token.di;
import com.rainy.token.data.remote.DeepSeekApi;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
import retrofit2.Retrofit;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class NetworkModule_ProvideDeepSeekApiFactory implements Factory<DeepSeekApi> {
private final Provider<Retrofit> retrofitProvider;
private NetworkModule_ProvideDeepSeekApiFactory(Provider<Retrofit> retrofitProvider) {
this.retrofitProvider = retrofitProvider;
}
@Override
public DeepSeekApi get() {
return provideDeepSeekApi(retrofitProvider.get());
}
public static NetworkModule_ProvideDeepSeekApiFactory create(
Provider<Retrofit> retrofitProvider) {
return new NetworkModule_ProvideDeepSeekApiFactory(retrofitProvider);
}
public static DeepSeekApi provideDeepSeekApi(Retrofit retrofit) {
return Preconditions.checkNotNullFromProvides(NetworkModule.INSTANCE.provideDeepSeekApi(retrofit));
}
}

View File

@ -1,62 +0,0 @@
package com.rainy.token.di;
import com.rainy.token.data.cache.BalanceCache;
import com.rainy.token.data.remote.DeepSeekApi;
import com.rainy.token.data.repository.CredentialRepository;
import com.rainy.token.data.repository.DeepSeekRepository;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class NetworkModule_ProvideDeepSeekRepositoryFactory implements Factory<DeepSeekRepository> {
private final Provider<DeepSeekApi> deepSeekApiProvider;
private final Provider<CredentialRepository> credentialRepositoryProvider;
private final Provider<BalanceCache> balanceCacheProvider;
private NetworkModule_ProvideDeepSeekRepositoryFactory(Provider<DeepSeekApi> deepSeekApiProvider,
Provider<CredentialRepository> credentialRepositoryProvider,
Provider<BalanceCache> balanceCacheProvider) {
this.deepSeekApiProvider = deepSeekApiProvider;
this.credentialRepositoryProvider = credentialRepositoryProvider;
this.balanceCacheProvider = balanceCacheProvider;
}
@Override
public DeepSeekRepository get() {
return provideDeepSeekRepository(deepSeekApiProvider.get(), credentialRepositoryProvider.get(), balanceCacheProvider.get());
}
public static NetworkModule_ProvideDeepSeekRepositoryFactory create(
Provider<DeepSeekApi> deepSeekApiProvider,
Provider<CredentialRepository> credentialRepositoryProvider,
Provider<BalanceCache> balanceCacheProvider) {
return new NetworkModule_ProvideDeepSeekRepositoryFactory(deepSeekApiProvider, credentialRepositoryProvider, balanceCacheProvider);
}
public static DeepSeekRepository provideDeepSeekRepository(DeepSeekApi deepSeekApi,
CredentialRepository credentialRepository, BalanceCache balanceCache) {
return Preconditions.checkNotNullFromProvides(NetworkModule.INSTANCE.provideDeepSeekRepository(deepSeekApi, credentialRepository, balanceCache));
}
}

View File

@ -1,44 +0,0 @@
package com.rainy.token.di;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
import kotlinx.serialization.json.Json;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class NetworkModule_ProvideJsonFactory implements Factory<Json> {
@Override
public Json get() {
return provideJson();
}
public static NetworkModule_ProvideJsonFactory create() {
return InstanceHolder.INSTANCE;
}
public static Json provideJson() {
return Preconditions.checkNotNullFromProvides(NetworkModule.INSTANCE.provideJson());
}
private static final class InstanceHolder {
static final NetworkModule_ProvideJsonFactory INSTANCE = new NetworkModule_ProvideJsonFactory();
}
}

View File

@ -1,44 +0,0 @@
package com.rainy.token.di;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
import okhttp3.OkHttpClient;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class NetworkModule_ProvideOkHttpClientFactory implements Factory<OkHttpClient> {
@Override
public OkHttpClient get() {
return provideOkHttpClient();
}
public static NetworkModule_ProvideOkHttpClientFactory create() {
return InstanceHolder.INSTANCE;
}
public static OkHttpClient provideOkHttpClient() {
return Preconditions.checkNotNullFromProvides(NetworkModule.INSTANCE.provideOkHttpClient());
}
private static final class InstanceHolder {
static final NetworkModule_ProvideOkHttpClientFactory INSTANCE = new NetworkModule_ProvideOkHttpClientFactory();
}
}

View File

@ -1,63 +0,0 @@
package com.rainy.token.di;
import com.rainy.token.data.cache.BalanceCache;
import com.rainy.token.data.repository.CredentialRepository;
import com.rainy.token.data.repository.OpenCodeGoRepository;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
import okhttp3.OkHttpClient;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class NetworkModule_ProvideOpenCodeGoRepositoryFactory implements Factory<OpenCodeGoRepository> {
private final Provider<OkHttpClient> okHttpClientProvider;
private final Provider<CredentialRepository> credentialRepositoryProvider;
private final Provider<BalanceCache> balanceCacheProvider;
private NetworkModule_ProvideOpenCodeGoRepositoryFactory(
Provider<OkHttpClient> okHttpClientProvider,
Provider<CredentialRepository> credentialRepositoryProvider,
Provider<BalanceCache> balanceCacheProvider) {
this.okHttpClientProvider = okHttpClientProvider;
this.credentialRepositoryProvider = credentialRepositoryProvider;
this.balanceCacheProvider = balanceCacheProvider;
}
@Override
public OpenCodeGoRepository get() {
return provideOpenCodeGoRepository(okHttpClientProvider.get(), credentialRepositoryProvider.get(), balanceCacheProvider.get());
}
public static NetworkModule_ProvideOpenCodeGoRepositoryFactory create(
Provider<OkHttpClient> okHttpClientProvider,
Provider<CredentialRepository> credentialRepositoryProvider,
Provider<BalanceCache> balanceCacheProvider) {
return new NetworkModule_ProvideOpenCodeGoRepositoryFactory(okHttpClientProvider, credentialRepositoryProvider, balanceCacheProvider);
}
public static OpenCodeGoRepository provideOpenCodeGoRepository(OkHttpClient okHttpClient,
CredentialRepository credentialRepository, BalanceCache balanceCache) {
return Preconditions.checkNotNullFromProvides(NetworkModule.INSTANCE.provideOpenCodeGoRepository(okHttpClient, credentialRepository, balanceCache));
}
}

View File

@ -1,57 +0,0 @@
package com.rainy.token.di;
import com.rainy.token.data.repository.CredentialRepository;
import com.rainy.token.data.repository.OpenCodeUsageRepository;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
import okhttp3.OkHttpClient;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class NetworkModule_ProvideOpenCodeUsageRepositoryFactory implements Factory<OpenCodeUsageRepository> {
private final Provider<OkHttpClient> okHttpClientProvider;
private final Provider<CredentialRepository> credentialRepositoryProvider;
private NetworkModule_ProvideOpenCodeUsageRepositoryFactory(
Provider<OkHttpClient> okHttpClientProvider,
Provider<CredentialRepository> credentialRepositoryProvider) {
this.okHttpClientProvider = okHttpClientProvider;
this.credentialRepositoryProvider = credentialRepositoryProvider;
}
@Override
public OpenCodeUsageRepository get() {
return provideOpenCodeUsageRepository(okHttpClientProvider.get(), credentialRepositoryProvider.get());
}
public static NetworkModule_ProvideOpenCodeUsageRepositoryFactory create(
Provider<OkHttpClient> okHttpClientProvider,
Provider<CredentialRepository> credentialRepositoryProvider) {
return new NetworkModule_ProvideOpenCodeUsageRepositoryFactory(okHttpClientProvider, credentialRepositoryProvider);
}
public static OpenCodeUsageRepository provideOpenCodeUsageRepository(OkHttpClient okHttpClient,
CredentialRepository credentialRepository) {
return Preconditions.checkNotNullFromProvides(NetworkModule.INSTANCE.provideOpenCodeUsageRepository(okHttpClient, credentialRepository));
}
}

View File

@ -1,54 +0,0 @@
package com.rainy.token.di;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
import kotlinx.serialization.json.Json;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class NetworkModule_ProvideRetrofitFactory implements Factory<Retrofit> {
private final Provider<OkHttpClient> clientProvider;
private final Provider<Json> jsonProvider;
private NetworkModule_ProvideRetrofitFactory(Provider<OkHttpClient> clientProvider,
Provider<Json> jsonProvider) {
this.clientProvider = clientProvider;
this.jsonProvider = jsonProvider;
}
@Override
public Retrofit get() {
return provideRetrofit(clientProvider.get(), jsonProvider.get());
}
public static NetworkModule_ProvideRetrofitFactory create(Provider<OkHttpClient> clientProvider,
Provider<Json> jsonProvider) {
return new NetworkModule_ProvideRetrofitFactory(clientProvider, jsonProvider);
}
public static Retrofit provideRetrofit(OkHttpClient client, Json json) {
return Preconditions.checkNotNullFromProvides(NetworkModule.INSTANCE.provideRetrofit(client, json));
}
}

View File

@ -1,55 +0,0 @@
package com.rainy.token.di;
import androidx.datastore.core.DataStore;
import androidx.datastore.preferences.core.Preferences;
import com.rainy.token.data.local.SecureStorage;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
import kotlinx.serialization.json.Json;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata("javax.inject.Named")
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class NetworkModule_ProvideSecureStorageFactory implements Factory<SecureStorage> {
private final Provider<DataStore<Preferences>> dataStoreProvider;
private final Provider<Json> jsonProvider;
private NetworkModule_ProvideSecureStorageFactory(
Provider<DataStore<Preferences>> dataStoreProvider, Provider<Json> jsonProvider) {
this.dataStoreProvider = dataStoreProvider;
this.jsonProvider = jsonProvider;
}
@Override
public SecureStorage get() {
return provideSecureStorage(dataStoreProvider.get(), jsonProvider.get());
}
public static NetworkModule_ProvideSecureStorageFactory create(
Provider<DataStore<Preferences>> dataStoreProvider, Provider<Json> jsonProvider) {
return new NetworkModule_ProvideSecureStorageFactory(dataStoreProvider, jsonProvider);
}
public static SecureStorage provideSecureStorage(DataStore<Preferences> dataStore, Json json) {
return Preconditions.checkNotNullFromProvides(NetworkModule.INSTANCE.provideSecureStorage(dataStore, json));
}
}

View File

@ -1,55 +0,0 @@
package com.rainy.token.di;
import androidx.datastore.core.DataStore;
import androidx.datastore.preferences.core.Preferences;
import com.rainy.token.data.local.UsageCache;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
import kotlinx.serialization.json.Json;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata("javax.inject.Named")
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class NetworkModule_ProvideUsageCacheFactory implements Factory<UsageCache> {
private final Provider<DataStore<Preferences>> dataStoreProvider;
private final Provider<Json> jsonProvider;
private NetworkModule_ProvideUsageCacheFactory(Provider<DataStore<Preferences>> dataStoreProvider,
Provider<Json> jsonProvider) {
this.dataStoreProvider = dataStoreProvider;
this.jsonProvider = jsonProvider;
}
@Override
public UsageCache get() {
return provideUsageCache(dataStoreProvider.get(), jsonProvider.get());
}
public static NetworkModule_ProvideUsageCacheFactory create(
Provider<DataStore<Preferences>> dataStoreProvider, Provider<Json> jsonProvider) {
return new NetworkModule_ProvideUsageCacheFactory(dataStoreProvider, jsonProvider);
}
public static UsageCache provideUsageCache(DataStore<Preferences> dataStore, Json json) {
return Preconditions.checkNotNullFromProvides(NetworkModule.INSTANCE.provideUsageCache(dataStore, json));
}
}

View File

@ -1,53 +0,0 @@
package com.rainy.token.di;
import android.content.Context;
import androidx.datastore.core.DataStore;
import androidx.datastore.preferences.core.Preferences;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata({
"javax.inject.Named",
"dagger.hilt.android.qualifiers.ApplicationContext"
})
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class StorageModule_ProvideSecureStorageDataStoreFactory implements Factory<DataStore<Preferences>> {
private final Provider<Context> contextProvider;
private StorageModule_ProvideSecureStorageDataStoreFactory(Provider<Context> contextProvider) {
this.contextProvider = contextProvider;
}
@Override
public DataStore<Preferences> get() {
return provideSecureStorageDataStore(contextProvider.get());
}
public static StorageModule_ProvideSecureStorageDataStoreFactory create(
Provider<Context> contextProvider) {
return new StorageModule_ProvideSecureStorageDataStoreFactory(contextProvider);
}
public static DataStore<Preferences> provideSecureStorageDataStore(Context context) {
return Preconditions.checkNotNullFromProvides(StorageModule.INSTANCE.provideSecureStorageDataStore(context));
}
}

View File

@ -1,53 +0,0 @@
package com.rainy.token.di;
import android.content.Context;
import androidx.datastore.core.DataStore;
import androidx.datastore.preferences.core.Preferences;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Preconditions;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata("javax.inject.Singleton")
@QualifierMetadata({
"javax.inject.Named",
"dagger.hilt.android.qualifiers.ApplicationContext"
})
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class StorageModule_ProvideUsageCacheDataStoreFactory implements Factory<DataStore<Preferences>> {
private final Provider<Context> contextProvider;
private StorageModule_ProvideUsageCacheDataStoreFactory(Provider<Context> contextProvider) {
this.contextProvider = contextProvider;
}
@Override
public DataStore<Preferences> get() {
return provideUsageCacheDataStore(contextProvider.get());
}
public static StorageModule_ProvideUsageCacheDataStoreFactory create(
Provider<Context> contextProvider) {
return new StorageModule_ProvideUsageCacheDataStoreFactory(contextProvider);
}
public static DataStore<Preferences> provideUsageCacheDataStore(Context context) {
return Preconditions.checkNotNullFromProvides(StorageModule.INSTANCE.provideUsageCacheDataStore(context));
}
}

View File

@ -1,55 +0,0 @@
package com.rainy.token.domain.usecase;
import com.rainy.token.data.repository.DeepSeekRepository;
import com.rainy.token.data.repository.OpenCodeGoRepository;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class RefreshBalanceUseCase_Factory implements Factory<RefreshBalanceUseCase> {
private final Provider<DeepSeekRepository> deepSeekRepositoryProvider;
private final Provider<OpenCodeGoRepository> openCodeGoRepositoryProvider;
private RefreshBalanceUseCase_Factory(Provider<DeepSeekRepository> deepSeekRepositoryProvider,
Provider<OpenCodeGoRepository> openCodeGoRepositoryProvider) {
this.deepSeekRepositoryProvider = deepSeekRepositoryProvider;
this.openCodeGoRepositoryProvider = openCodeGoRepositoryProvider;
}
@Override
public RefreshBalanceUseCase get() {
return newInstance(deepSeekRepositoryProvider, openCodeGoRepositoryProvider);
}
public static RefreshBalanceUseCase_Factory create(
Provider<DeepSeekRepository> deepSeekRepositoryProvider,
Provider<OpenCodeGoRepository> openCodeGoRepositoryProvider) {
return new RefreshBalanceUseCase_Factory(deepSeekRepositoryProvider, openCodeGoRepositoryProvider);
}
public static RefreshBalanceUseCase newInstance(
javax.inject.Provider<DeepSeekRepository> deepSeekRepositoryProvider,
javax.inject.Provider<OpenCodeGoRepository> openCodeGoRepositoryProvider) {
return new RefreshBalanceUseCase(deepSeekRepositoryProvider, openCodeGoRepositoryProvider);
}
}

View File

@ -1,54 +0,0 @@
package com.rainy.token.domain.usecase;
import com.rainy.token.data.local.UsageCache;
import com.rainy.token.data.repository.OpenCodeUsageRepository;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class SyncUsageUseCase_Factory implements Factory<SyncUsageUseCase> {
private final Provider<OpenCodeUsageRepository> usageRepoProvider;
private final Provider<UsageCache> cacheProvider;
private SyncUsageUseCase_Factory(Provider<OpenCodeUsageRepository> usageRepoProvider,
Provider<UsageCache> cacheProvider) {
this.usageRepoProvider = usageRepoProvider;
this.cacheProvider = cacheProvider;
}
@Override
public SyncUsageUseCase get() {
return newInstance(usageRepoProvider, cacheProvider);
}
public static SyncUsageUseCase_Factory create(Provider<OpenCodeUsageRepository> usageRepoProvider,
Provider<UsageCache> cacheProvider) {
return new SyncUsageUseCase_Factory(usageRepoProvider, cacheProvider);
}
public static SyncUsageUseCase newInstance(
javax.inject.Provider<OpenCodeUsageRepository> usageRepoProvider,
javax.inject.Provider<UsageCache> cacheProvider) {
return new SyncUsageUseCase(usageRepoProvider, cacheProvider);
}
}

View File

@ -1,66 +0,0 @@
package com.rainy.token.ui.dashboard;
import android.content.Context;
import com.rainy.token.data.cache.BalanceCache;
import com.rainy.token.data.repository.CredentialRepository;
import com.rainy.token.domain.usecase.RefreshBalanceUseCase;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata("dagger.hilt.android.qualifiers.ApplicationContext")
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class DashboardViewModel_Factory implements Factory<DashboardViewModel> {
private final Provider<CredentialRepository> credentialRepositoryProvider;
private final Provider<BalanceCache> balanceCacheProvider;
private final Provider<RefreshBalanceUseCase> refreshBalanceUseCaseProvider;
private final Provider<Context> appContextProvider;
private DashboardViewModel_Factory(Provider<CredentialRepository> credentialRepositoryProvider,
Provider<BalanceCache> balanceCacheProvider,
Provider<RefreshBalanceUseCase> refreshBalanceUseCaseProvider,
Provider<Context> appContextProvider) {
this.credentialRepositoryProvider = credentialRepositoryProvider;
this.balanceCacheProvider = balanceCacheProvider;
this.refreshBalanceUseCaseProvider = refreshBalanceUseCaseProvider;
this.appContextProvider = appContextProvider;
}
@Override
public DashboardViewModel get() {
return newInstance(credentialRepositoryProvider.get(), balanceCacheProvider.get(), refreshBalanceUseCaseProvider.get(), appContextProvider.get());
}
public static DashboardViewModel_Factory create(
Provider<CredentialRepository> credentialRepositoryProvider,
Provider<BalanceCache> balanceCacheProvider,
Provider<RefreshBalanceUseCase> refreshBalanceUseCaseProvider,
Provider<Context> appContextProvider) {
return new DashboardViewModel_Factory(credentialRepositoryProvider, balanceCacheProvider, refreshBalanceUseCaseProvider, appContextProvider);
}
public static DashboardViewModel newInstance(CredentialRepository credentialRepository,
BalanceCache balanceCache, RefreshBalanceUseCase refreshBalanceUseCase, Context appContext) {
return new DashboardViewModel(credentialRepository, balanceCache, refreshBalanceUseCase, appContext);
}
}

View File

@ -1,51 +0,0 @@
package com.rainy.token.ui.dashboard;
import androidx.lifecycle.ViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.ActivityRetainedComponent;
import dagger.hilt.android.components.ViewModelComponent;
import dagger.hilt.android.internal.lifecycle.HiltViewModelMap;
import dagger.hilt.codegen.OriginatingElement;
import dagger.multibindings.IntoMap;
import dagger.multibindings.LazyClassKey;
import javax.annotation.processing.Generated;
@Generated("dagger.hilt.android.processor.internal.viewmodel.ViewModelProcessor")
@OriginatingElement(
topLevelClass = DashboardViewModel.class
)
public final class DashboardViewModel_HiltModules {
private DashboardViewModel_HiltModules() {
}
@Module
@InstallIn(ViewModelComponent.class)
public abstract static class BindsModule {
private BindsModule() {
}
@Binds
@IntoMap
@LazyClassKey(DashboardViewModel.class)
@HiltViewModelMap
public abstract ViewModel binds(DashboardViewModel vm);
}
@Module
@InstallIn(ActivityRetainedComponent.class)
public static final class KeyModule {
private KeyModule() {
}
@Provides
@IntoMap
@LazyClassKey(DashboardViewModel.class)
@HiltViewModelMap.KeySet
public static boolean provide() {
return true;
}
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.dashboard;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class DashboardViewModel_HiltModules_BindsModule_Binds_LazyMapKey {
@KeepFieldType
static DashboardViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.dashboard.DashboardViewModel";
}

View File

@ -1,42 +0,0 @@
package com.rainy.token.ui.dashboard;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata("dagger.hilt.android.internal.lifecycle.HiltViewModelMap.KeySet")
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class DashboardViewModel_HiltModules_KeyModule_ProvideFactory implements Factory<Boolean> {
@Override
public Boolean get() {
return provide();
}
public static DashboardViewModel_HiltModules_KeyModule_ProvideFactory create() {
return InstanceHolder.INSTANCE;
}
public static boolean provide() {
return DashboardViewModel_HiltModules.KeyModule.provide();
}
private static final class InstanceHolder {
static final DashboardViewModel_HiltModules_KeyModule_ProvideFactory INSTANCE = new DashboardViewModel_HiltModules_KeyModule_ProvideFactory();
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.dashboard;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class DashboardViewModel_HiltModules_KeyModule_Provide_LazyMapKey {
@KeepFieldType
static DashboardViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.dashboard.DashboardViewModel";
}

View File

@ -1,53 +0,0 @@
package com.rainy.token.ui.dashboard;
import com.rainy.token.data.local.UsageCache;
import com.rainy.token.data.repository.CredentialRepository;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class UsageChartViewModel_Factory implements Factory<UsageChartViewModel> {
private final Provider<UsageCache> cacheProvider;
private final Provider<CredentialRepository> credentialRepositoryProvider;
private UsageChartViewModel_Factory(Provider<UsageCache> cacheProvider,
Provider<CredentialRepository> credentialRepositoryProvider) {
this.cacheProvider = cacheProvider;
this.credentialRepositoryProvider = credentialRepositoryProvider;
}
@Override
public UsageChartViewModel get() {
return newInstance(cacheProvider, credentialRepositoryProvider.get());
}
public static UsageChartViewModel_Factory create(Provider<UsageCache> cacheProvider,
Provider<CredentialRepository> credentialRepositoryProvider) {
return new UsageChartViewModel_Factory(cacheProvider, credentialRepositoryProvider);
}
public static UsageChartViewModel newInstance(javax.inject.Provider<UsageCache> cacheProvider,
CredentialRepository credentialRepository) {
return new UsageChartViewModel(cacheProvider, credentialRepository);
}
}

View File

@ -1,51 +0,0 @@
package com.rainy.token.ui.dashboard;
import androidx.lifecycle.ViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.ActivityRetainedComponent;
import dagger.hilt.android.components.ViewModelComponent;
import dagger.hilt.android.internal.lifecycle.HiltViewModelMap;
import dagger.hilt.codegen.OriginatingElement;
import dagger.multibindings.IntoMap;
import dagger.multibindings.LazyClassKey;
import javax.annotation.processing.Generated;
@Generated("dagger.hilt.android.processor.internal.viewmodel.ViewModelProcessor")
@OriginatingElement(
topLevelClass = UsageChartViewModel.class
)
public final class UsageChartViewModel_HiltModules {
private UsageChartViewModel_HiltModules() {
}
@Module
@InstallIn(ViewModelComponent.class)
public abstract static class BindsModule {
private BindsModule() {
}
@Binds
@IntoMap
@LazyClassKey(UsageChartViewModel.class)
@HiltViewModelMap
public abstract ViewModel binds(UsageChartViewModel vm);
}
@Module
@InstallIn(ActivityRetainedComponent.class)
public static final class KeyModule {
private KeyModule() {
}
@Provides
@IntoMap
@LazyClassKey(UsageChartViewModel.class)
@HiltViewModelMap.KeySet
public static boolean provide() {
return true;
}
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.dashboard;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class UsageChartViewModel_HiltModules_BindsModule_Binds_LazyMapKey {
@KeepFieldType
static UsageChartViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.dashboard.UsageChartViewModel";
}

View File

@ -1,42 +0,0 @@
package com.rainy.token.ui.dashboard;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata("dagger.hilt.android.internal.lifecycle.HiltViewModelMap.KeySet")
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class UsageChartViewModel_HiltModules_KeyModule_ProvideFactory implements Factory<Boolean> {
@Override
public Boolean get() {
return provide();
}
public static UsageChartViewModel_HiltModules_KeyModule_ProvideFactory create() {
return InstanceHolder.INSTANCE;
}
public static boolean provide() {
return UsageChartViewModel_HiltModules.KeyModule.provide();
}
private static final class InstanceHolder {
static final UsageChartViewModel_HiltModules_KeyModule_ProvideFactory INSTANCE = new UsageChartViewModel_HiltModules_KeyModule_ProvideFactory();
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.dashboard;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class UsageChartViewModel_HiltModules_KeyModule_Provide_LazyMapKey {
@KeepFieldType
static UsageChartViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.dashboard.UsageChartViewModel";
}

View File

@ -1,53 +0,0 @@
package com.rainy.token.ui.dashboard;
import com.rainy.token.data.local.UsageCache;
import com.rainy.token.data.repository.CredentialRepository;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class UsageDataViewModel_Factory implements Factory<UsageDataViewModel> {
private final Provider<UsageCache> cacheProvider;
private final Provider<CredentialRepository> credentialRepositoryProvider;
private UsageDataViewModel_Factory(Provider<UsageCache> cacheProvider,
Provider<CredentialRepository> credentialRepositoryProvider) {
this.cacheProvider = cacheProvider;
this.credentialRepositoryProvider = credentialRepositoryProvider;
}
@Override
public UsageDataViewModel get() {
return newInstance(cacheProvider, credentialRepositoryProvider.get());
}
public static UsageDataViewModel_Factory create(Provider<UsageCache> cacheProvider,
Provider<CredentialRepository> credentialRepositoryProvider) {
return new UsageDataViewModel_Factory(cacheProvider, credentialRepositoryProvider);
}
public static UsageDataViewModel newInstance(javax.inject.Provider<UsageCache> cacheProvider,
CredentialRepository credentialRepository) {
return new UsageDataViewModel(cacheProvider, credentialRepository);
}
}

View File

@ -1,51 +0,0 @@
package com.rainy.token.ui.dashboard;
import androidx.lifecycle.ViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.ActivityRetainedComponent;
import dagger.hilt.android.components.ViewModelComponent;
import dagger.hilt.android.internal.lifecycle.HiltViewModelMap;
import dagger.hilt.codegen.OriginatingElement;
import dagger.multibindings.IntoMap;
import dagger.multibindings.LazyClassKey;
import javax.annotation.processing.Generated;
@Generated("dagger.hilt.android.processor.internal.viewmodel.ViewModelProcessor")
@OriginatingElement(
topLevelClass = UsageDataViewModel.class
)
public final class UsageDataViewModel_HiltModules {
private UsageDataViewModel_HiltModules() {
}
@Module
@InstallIn(ViewModelComponent.class)
public abstract static class BindsModule {
private BindsModule() {
}
@Binds
@IntoMap
@LazyClassKey(UsageDataViewModel.class)
@HiltViewModelMap
public abstract ViewModel binds(UsageDataViewModel vm);
}
@Module
@InstallIn(ActivityRetainedComponent.class)
public static final class KeyModule {
private KeyModule() {
}
@Provides
@IntoMap
@LazyClassKey(UsageDataViewModel.class)
@HiltViewModelMap.KeySet
public static boolean provide() {
return true;
}
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.dashboard;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class UsageDataViewModel_HiltModules_BindsModule_Binds_LazyMapKey {
@KeepFieldType
static UsageDataViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.dashboard.UsageDataViewModel";
}

View File

@ -1,42 +0,0 @@
package com.rainy.token.ui.dashboard;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata("dagger.hilt.android.internal.lifecycle.HiltViewModelMap.KeySet")
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class UsageDataViewModel_HiltModules_KeyModule_ProvideFactory implements Factory<Boolean> {
@Override
public Boolean get() {
return provide();
}
public static UsageDataViewModel_HiltModules_KeyModule_ProvideFactory create() {
return InstanceHolder.INSTANCE;
}
public static boolean provide() {
return UsageDataViewModel_HiltModules.KeyModule.provide();
}
private static final class InstanceHolder {
static final UsageDataViewModel_HiltModules_KeyModule_ProvideFactory INSTANCE = new UsageDataViewModel_HiltModules_KeyModule_ProvideFactory();
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.dashboard;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class UsageDataViewModel_HiltModules_KeyModule_Provide_LazyMapKey {
@KeepFieldType
static UsageDataViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.dashboard.UsageDataViewModel";
}

View File

@ -1,60 +0,0 @@
package com.rainy.token.ui.dashboard;
import com.rainy.token.data.local.UsageCache;
import com.rainy.token.data.repository.CredentialRepository;
import com.rainy.token.domain.usecase.SyncUsageUseCase;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class UsageViewModel_Factory implements Factory<UsageViewModel> {
private final Provider<UsageCache> cacheProvider;
private final Provider<SyncUsageUseCase> syncUseCaseProvider;
private final Provider<CredentialRepository> credentialRepositoryProvider;
private UsageViewModel_Factory(Provider<UsageCache> cacheProvider,
Provider<SyncUsageUseCase> syncUseCaseProvider,
Provider<CredentialRepository> credentialRepositoryProvider) {
this.cacheProvider = cacheProvider;
this.syncUseCaseProvider = syncUseCaseProvider;
this.credentialRepositoryProvider = credentialRepositoryProvider;
}
@Override
public UsageViewModel get() {
return newInstance(cacheProvider, syncUseCaseProvider, credentialRepositoryProvider.get());
}
public static UsageViewModel_Factory create(Provider<UsageCache> cacheProvider,
Provider<SyncUsageUseCase> syncUseCaseProvider,
Provider<CredentialRepository> credentialRepositoryProvider) {
return new UsageViewModel_Factory(cacheProvider, syncUseCaseProvider, credentialRepositoryProvider);
}
public static UsageViewModel newInstance(javax.inject.Provider<UsageCache> cacheProvider,
javax.inject.Provider<SyncUsageUseCase> syncUseCaseProvider,
CredentialRepository credentialRepository) {
return new UsageViewModel(cacheProvider, syncUseCaseProvider, credentialRepository);
}
}

View File

@ -1,51 +0,0 @@
package com.rainy.token.ui.dashboard;
import androidx.lifecycle.ViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.ActivityRetainedComponent;
import dagger.hilt.android.components.ViewModelComponent;
import dagger.hilt.android.internal.lifecycle.HiltViewModelMap;
import dagger.hilt.codegen.OriginatingElement;
import dagger.multibindings.IntoMap;
import dagger.multibindings.LazyClassKey;
import javax.annotation.processing.Generated;
@Generated("dagger.hilt.android.processor.internal.viewmodel.ViewModelProcessor")
@OriginatingElement(
topLevelClass = UsageViewModel.class
)
public final class UsageViewModel_HiltModules {
private UsageViewModel_HiltModules() {
}
@Module
@InstallIn(ViewModelComponent.class)
public abstract static class BindsModule {
private BindsModule() {
}
@Binds
@IntoMap
@LazyClassKey(UsageViewModel.class)
@HiltViewModelMap
public abstract ViewModel binds(UsageViewModel vm);
}
@Module
@InstallIn(ActivityRetainedComponent.class)
public static final class KeyModule {
private KeyModule() {
}
@Provides
@IntoMap
@LazyClassKey(UsageViewModel.class)
@HiltViewModelMap.KeySet
public static boolean provide() {
return true;
}
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.dashboard;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class UsageViewModel_HiltModules_BindsModule_Binds_LazyMapKey {
@KeepFieldType
static UsageViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.dashboard.UsageViewModel";
}

View File

@ -1,42 +0,0 @@
package com.rainy.token.ui.dashboard;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata("dagger.hilt.android.internal.lifecycle.HiltViewModelMap.KeySet")
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class UsageViewModel_HiltModules_KeyModule_ProvideFactory implements Factory<Boolean> {
@Override
public Boolean get() {
return provide();
}
public static UsageViewModel_HiltModules_KeyModule_ProvideFactory create() {
return InstanceHolder.INSTANCE;
}
public static boolean provide() {
return UsageViewModel_HiltModules.KeyModule.provide();
}
private static final class InstanceHolder {
static final UsageViewModel_HiltModules_KeyModule_ProvideFactory INSTANCE = new UsageViewModel_HiltModules_KeyModule_ProvideFactory();
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.dashboard;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class UsageViewModel_HiltModules_KeyModule_Provide_LazyMapKey {
@KeepFieldType
static UsageViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.dashboard.UsageViewModel";
}

View File

@ -1,61 +0,0 @@
package com.rainy.token.ui.servicedetail;
import com.rainy.token.data.cache.BalanceCache;
import com.rainy.token.data.repository.CredentialRepository;
import com.rainy.token.domain.usecase.RefreshBalanceUseCase;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class ServiceDetailViewModel_Factory implements Factory<ServiceDetailViewModel> {
private final Provider<CredentialRepository> credentialRepositoryProvider;
private final Provider<BalanceCache> balanceCacheProvider;
private final Provider<RefreshBalanceUseCase> refreshBalanceUseCaseProvider;
private ServiceDetailViewModel_Factory(
Provider<CredentialRepository> credentialRepositoryProvider,
Provider<BalanceCache> balanceCacheProvider,
Provider<RefreshBalanceUseCase> refreshBalanceUseCaseProvider) {
this.credentialRepositoryProvider = credentialRepositoryProvider;
this.balanceCacheProvider = balanceCacheProvider;
this.refreshBalanceUseCaseProvider = refreshBalanceUseCaseProvider;
}
@Override
public ServiceDetailViewModel get() {
return newInstance(credentialRepositoryProvider.get(), balanceCacheProvider.get(), refreshBalanceUseCaseProvider.get());
}
public static ServiceDetailViewModel_Factory create(
Provider<CredentialRepository> credentialRepositoryProvider,
Provider<BalanceCache> balanceCacheProvider,
Provider<RefreshBalanceUseCase> refreshBalanceUseCaseProvider) {
return new ServiceDetailViewModel_Factory(credentialRepositoryProvider, balanceCacheProvider, refreshBalanceUseCaseProvider);
}
public static ServiceDetailViewModel newInstance(CredentialRepository credentialRepository,
BalanceCache balanceCache, RefreshBalanceUseCase refreshBalanceUseCase) {
return new ServiceDetailViewModel(credentialRepository, balanceCache, refreshBalanceUseCase);
}
}

View File

@ -1,51 +0,0 @@
package com.rainy.token.ui.servicedetail;
import androidx.lifecycle.ViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.ActivityRetainedComponent;
import dagger.hilt.android.components.ViewModelComponent;
import dagger.hilt.android.internal.lifecycle.HiltViewModelMap;
import dagger.hilt.codegen.OriginatingElement;
import dagger.multibindings.IntoMap;
import dagger.multibindings.LazyClassKey;
import javax.annotation.processing.Generated;
@Generated("dagger.hilt.android.processor.internal.viewmodel.ViewModelProcessor")
@OriginatingElement(
topLevelClass = ServiceDetailViewModel.class
)
public final class ServiceDetailViewModel_HiltModules {
private ServiceDetailViewModel_HiltModules() {
}
@Module
@InstallIn(ViewModelComponent.class)
public abstract static class BindsModule {
private BindsModule() {
}
@Binds
@IntoMap
@LazyClassKey(ServiceDetailViewModel.class)
@HiltViewModelMap
public abstract ViewModel binds(ServiceDetailViewModel vm);
}
@Module
@InstallIn(ActivityRetainedComponent.class)
public static final class KeyModule {
private KeyModule() {
}
@Provides
@IntoMap
@LazyClassKey(ServiceDetailViewModel.class)
@HiltViewModelMap.KeySet
public static boolean provide() {
return true;
}
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.servicedetail;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class ServiceDetailViewModel_HiltModules_BindsModule_Binds_LazyMapKey {
@KeepFieldType
static ServiceDetailViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.servicedetail.ServiceDetailViewModel";
}

View File

@ -1,42 +0,0 @@
package com.rainy.token.ui.servicedetail;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata("dagger.hilt.android.internal.lifecycle.HiltViewModelMap.KeySet")
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class ServiceDetailViewModel_HiltModules_KeyModule_ProvideFactory implements Factory<Boolean> {
@Override
public Boolean get() {
return provide();
}
public static ServiceDetailViewModel_HiltModules_KeyModule_ProvideFactory create() {
return InstanceHolder.INSTANCE;
}
public static boolean provide() {
return ServiceDetailViewModel_HiltModules.KeyModule.provide();
}
private static final class InstanceHolder {
static final ServiceDetailViewModel_HiltModules_KeyModule_ProvideFactory INSTANCE = new ServiceDetailViewModel_HiltModules_KeyModule_ProvideFactory();
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.servicedetail;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class ServiceDetailViewModel_HiltModules_KeyModule_Provide_LazyMapKey {
@KeepFieldType
static ServiceDetailViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.servicedetail.ServiceDetailViewModel";
}

View File

@ -1,62 +0,0 @@
package com.rainy.token.ui.settings;
import com.rainy.token.data.repository.CredentialRepository;
import com.rainy.token.data.repository.OpenCodeGoRepository;
import com.rainy.token.domain.usecase.RefreshBalanceUseCase;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class CredentialEditViewModel_Factory implements Factory<CredentialEditViewModel> {
private final Provider<CredentialRepository> credentialRepositoryProvider;
private final Provider<OpenCodeGoRepository> openCodeGoRepositoryProvider;
private final Provider<RefreshBalanceUseCase> refreshBalanceUseCaseProvider;
private CredentialEditViewModel_Factory(
Provider<CredentialRepository> credentialRepositoryProvider,
Provider<OpenCodeGoRepository> openCodeGoRepositoryProvider,
Provider<RefreshBalanceUseCase> refreshBalanceUseCaseProvider) {
this.credentialRepositoryProvider = credentialRepositoryProvider;
this.openCodeGoRepositoryProvider = openCodeGoRepositoryProvider;
this.refreshBalanceUseCaseProvider = refreshBalanceUseCaseProvider;
}
@Override
public CredentialEditViewModel get() {
return newInstance(credentialRepositoryProvider.get(), openCodeGoRepositoryProvider, refreshBalanceUseCaseProvider);
}
public static CredentialEditViewModel_Factory create(
Provider<CredentialRepository> credentialRepositoryProvider,
Provider<OpenCodeGoRepository> openCodeGoRepositoryProvider,
Provider<RefreshBalanceUseCase> refreshBalanceUseCaseProvider) {
return new CredentialEditViewModel_Factory(credentialRepositoryProvider, openCodeGoRepositoryProvider, refreshBalanceUseCaseProvider);
}
public static CredentialEditViewModel newInstance(CredentialRepository credentialRepository,
javax.inject.Provider<OpenCodeGoRepository> openCodeGoRepositoryProvider,
javax.inject.Provider<RefreshBalanceUseCase> refreshBalanceUseCaseProvider) {
return new CredentialEditViewModel(credentialRepository, openCodeGoRepositoryProvider, refreshBalanceUseCaseProvider);
}
}

View File

@ -1,51 +0,0 @@
package com.rainy.token.ui.settings;
import androidx.lifecycle.ViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.ActivityRetainedComponent;
import dagger.hilt.android.components.ViewModelComponent;
import dagger.hilt.android.internal.lifecycle.HiltViewModelMap;
import dagger.hilt.codegen.OriginatingElement;
import dagger.multibindings.IntoMap;
import dagger.multibindings.LazyClassKey;
import javax.annotation.processing.Generated;
@Generated("dagger.hilt.android.processor.internal.viewmodel.ViewModelProcessor")
@OriginatingElement(
topLevelClass = CredentialEditViewModel.class
)
public final class CredentialEditViewModel_HiltModules {
private CredentialEditViewModel_HiltModules() {
}
@Module
@InstallIn(ViewModelComponent.class)
public abstract static class BindsModule {
private BindsModule() {
}
@Binds
@IntoMap
@LazyClassKey(CredentialEditViewModel.class)
@HiltViewModelMap
public abstract ViewModel binds(CredentialEditViewModel vm);
}
@Module
@InstallIn(ActivityRetainedComponent.class)
public static final class KeyModule {
private KeyModule() {
}
@Provides
@IntoMap
@LazyClassKey(CredentialEditViewModel.class)
@HiltViewModelMap.KeySet
public static boolean provide() {
return true;
}
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.settings;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class CredentialEditViewModel_HiltModules_BindsModule_Binds_LazyMapKey {
@KeepFieldType
static CredentialEditViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.settings.CredentialEditViewModel";
}

View File

@ -1,42 +0,0 @@
package com.rainy.token.ui.settings;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata("dagger.hilt.android.internal.lifecycle.HiltViewModelMap.KeySet")
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class CredentialEditViewModel_HiltModules_KeyModule_ProvideFactory implements Factory<Boolean> {
@Override
public Boolean get() {
return provide();
}
public static CredentialEditViewModel_HiltModules_KeyModule_ProvideFactory create() {
return InstanceHolder.INSTANCE;
}
public static boolean provide() {
return CredentialEditViewModel_HiltModules.KeyModule.provide();
}
private static final class InstanceHolder {
static final CredentialEditViewModel_HiltModules_KeyModule_ProvideFactory INSTANCE = new CredentialEditViewModel_HiltModules_KeyModule_ProvideFactory();
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.settings;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class CredentialEditViewModel_HiltModules_KeyModule_Provide_LazyMapKey {
@KeepFieldType
static CredentialEditViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.settings.CredentialEditViewModel";
}

View File

@ -1,47 +0,0 @@
package com.rainy.token.ui.settings;
import com.rainy.token.data.repository.CredentialRepository;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class SettingsViewModel_Factory implements Factory<SettingsViewModel> {
private final Provider<CredentialRepository> credentialRepositoryProvider;
private SettingsViewModel_Factory(Provider<CredentialRepository> credentialRepositoryProvider) {
this.credentialRepositoryProvider = credentialRepositoryProvider;
}
@Override
public SettingsViewModel get() {
return newInstance(credentialRepositoryProvider.get());
}
public static SettingsViewModel_Factory create(
Provider<CredentialRepository> credentialRepositoryProvider) {
return new SettingsViewModel_Factory(credentialRepositoryProvider);
}
public static SettingsViewModel newInstance(CredentialRepository credentialRepository) {
return new SettingsViewModel(credentialRepository);
}
}

View File

@ -1,51 +0,0 @@
package com.rainy.token.ui.settings;
import androidx.lifecycle.ViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.ActivityRetainedComponent;
import dagger.hilt.android.components.ViewModelComponent;
import dagger.hilt.android.internal.lifecycle.HiltViewModelMap;
import dagger.hilt.codegen.OriginatingElement;
import dagger.multibindings.IntoMap;
import dagger.multibindings.LazyClassKey;
import javax.annotation.processing.Generated;
@Generated("dagger.hilt.android.processor.internal.viewmodel.ViewModelProcessor")
@OriginatingElement(
topLevelClass = SettingsViewModel.class
)
public final class SettingsViewModel_HiltModules {
private SettingsViewModel_HiltModules() {
}
@Module
@InstallIn(ViewModelComponent.class)
public abstract static class BindsModule {
private BindsModule() {
}
@Binds
@IntoMap
@LazyClassKey(SettingsViewModel.class)
@HiltViewModelMap
public abstract ViewModel binds(SettingsViewModel vm);
}
@Module
@InstallIn(ActivityRetainedComponent.class)
public static final class KeyModule {
private KeyModule() {
}
@Provides
@IntoMap
@LazyClassKey(SettingsViewModel.class)
@HiltViewModelMap.KeySet
public static boolean provide() {
return true;
}
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.settings;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class SettingsViewModel_HiltModules_BindsModule_Binds_LazyMapKey {
@KeepFieldType
static SettingsViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.settings.SettingsViewModel";
}

View File

@ -1,42 +0,0 @@
package com.rainy.token.ui.settings;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata("dagger.hilt.android.internal.lifecycle.HiltViewModelMap.KeySet")
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class SettingsViewModel_HiltModules_KeyModule_ProvideFactory implements Factory<Boolean> {
@Override
public Boolean get() {
return provide();
}
public static SettingsViewModel_HiltModules_KeyModule_ProvideFactory create() {
return InstanceHolder.INSTANCE;
}
public static boolean provide() {
return SettingsViewModel_HiltModules.KeyModule.provide();
}
private static final class InstanceHolder {
static final SettingsViewModel_HiltModules_KeyModule_ProvideFactory INSTANCE = new SettingsViewModel_HiltModules_KeyModule_ProvideFactory();
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.settings;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class SettingsViewModel_HiltModules_KeyModule_Provide_LazyMapKey {
@KeepFieldType
static SettingsViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.settings.SettingsViewModel";
}

View File

@ -1,47 +0,0 @@
package com.rainy.token.ui.webview;
import com.rainy.token.data.repository.WebViewSessionSaver;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.Provider;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class WebViewLoginViewModel_Factory implements Factory<WebViewLoginViewModel> {
private final Provider<WebViewSessionSaver> sessionSaverProvider;
private WebViewLoginViewModel_Factory(Provider<WebViewSessionSaver> sessionSaverProvider) {
this.sessionSaverProvider = sessionSaverProvider;
}
@Override
public WebViewLoginViewModel get() {
return newInstance(sessionSaverProvider.get());
}
public static WebViewLoginViewModel_Factory create(
Provider<WebViewSessionSaver> sessionSaverProvider) {
return new WebViewLoginViewModel_Factory(sessionSaverProvider);
}
public static WebViewLoginViewModel newInstance(WebViewSessionSaver sessionSaver) {
return new WebViewLoginViewModel(sessionSaver);
}
}

View File

@ -1,51 +0,0 @@
package com.rainy.token.ui.webview;
import androidx.lifecycle.ViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.ActivityRetainedComponent;
import dagger.hilt.android.components.ViewModelComponent;
import dagger.hilt.android.internal.lifecycle.HiltViewModelMap;
import dagger.hilt.codegen.OriginatingElement;
import dagger.multibindings.IntoMap;
import dagger.multibindings.LazyClassKey;
import javax.annotation.processing.Generated;
@Generated("dagger.hilt.android.processor.internal.viewmodel.ViewModelProcessor")
@OriginatingElement(
topLevelClass = WebViewLoginViewModel.class
)
public final class WebViewLoginViewModel_HiltModules {
private WebViewLoginViewModel_HiltModules() {
}
@Module
@InstallIn(ViewModelComponent.class)
public abstract static class BindsModule {
private BindsModule() {
}
@Binds
@IntoMap
@LazyClassKey(WebViewLoginViewModel.class)
@HiltViewModelMap
public abstract ViewModel binds(WebViewLoginViewModel vm);
}
@Module
@InstallIn(ActivityRetainedComponent.class)
public static final class KeyModule {
private KeyModule() {
}
@Provides
@IntoMap
@LazyClassKey(WebViewLoginViewModel.class)
@HiltViewModelMap.KeySet
public static boolean provide() {
return true;
}
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.webview;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class WebViewLoginViewModel_HiltModules_BindsModule_Binds_LazyMapKey {
@KeepFieldType
static WebViewLoginViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.webview.WebViewLoginViewModel";
}

View File

@ -1,42 +0,0 @@
package com.rainy.token.ui.webview;
import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
@ScopeMetadata
@QualifierMetadata("dagger.hilt.android.internal.lifecycle.HiltViewModelMap.KeySet")
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class WebViewLoginViewModel_HiltModules_KeyModule_ProvideFactory implements Factory<Boolean> {
@Override
public Boolean get() {
return provide();
}
public static WebViewLoginViewModel_HiltModules_KeyModule_ProvideFactory create() {
return InstanceHolder.INSTANCE;
}
public static boolean provide() {
return WebViewLoginViewModel_HiltModules.KeyModule.provide();
}
private static final class InstanceHolder {
static final WebViewLoginViewModel_HiltModules_KeyModule_ProvideFactory INSTANCE = new WebViewLoginViewModel_HiltModules_KeyModule_ProvideFactory();
}
}

View File

@ -1,28 +0,0 @@
package com.rainy.token.ui.webview;
import dagger.internal.DaggerGenerated;
import dagger.internal.IdentifierNameString;
import dagger.internal.KeepFieldType;
import javax.annotation.processing.Generated;
@IdentifierNameString
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast",
"deprecation",
"nullness:initialization.field.uninitialized"
})
public final class WebViewLoginViewModel_HiltModules_KeyModule_Provide_LazyMapKey {
@KeepFieldType
static WebViewLoginViewModel keepFieldType;
public static String lazyClassKeyName = "com.rainy.token.ui.webview.WebViewLoginViewModel";
}

View File

@ -1,23 +0,0 @@
package dagger.hilt.internal.aggregatedroot.codegen;
import dagger.hilt.android.HiltAndroidApp;
import dagger.hilt.internal.aggregatedroot.AggregatedRoot;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedRoot(
root = "com.rainy.token.RainyTokenApplication",
rootPackage = "com.rainy.token",
originatingRoot = "com.rainy.token.RainyTokenApplication",
originatingRootPackage = "com.rainy.token",
rootAnnotation = HiltAndroidApp.class,
rootComponentPackage = "dagger.hilt.components",
rootSimpleNames = "RainyTokenApplication",
originatingRootSimpleNames = "RainyTokenApplication",
rootComponentSimpleNames = "SingletonComponent"
)
@Generated("dagger.hilt.processor.internal.root.AggregatedRootGenerator")
public class _com_rainy_token_RainyTokenApplication {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ActivityComponent",
entryPoints = "com.rainy.token.MainActivity_GeneratedInjector"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_MainActivity_GeneratedInjector {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.components.SingletonComponent",
entryPoints = "com.rainy.token.RainyTokenApplication_GeneratedInjector"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_RainyTokenApplication_GeneratedInjector {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.components.SingletonComponent",
modules = "com.rainy.token.di.NetworkModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_di_NetworkModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.components.SingletonComponent",
modules = "com.rainy.token.di.StorageModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_di_StorageModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ViewModelComponent",
modules = "com.rainy.token.ui.dashboard.DashboardViewModel_HiltModules.BindsModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_dashboard_DashboardViewModel_HiltModules_BindsModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ActivityRetainedComponent",
modules = "com.rainy.token.ui.dashboard.DashboardViewModel_HiltModules.KeyModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_dashboard_DashboardViewModel_HiltModules_KeyModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ViewModelComponent",
modules = "com.rainy.token.ui.dashboard.UsageChartViewModel_HiltModules.BindsModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_dashboard_UsageChartViewModel_HiltModules_BindsModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ActivityRetainedComponent",
modules = "com.rainy.token.ui.dashboard.UsageChartViewModel_HiltModules.KeyModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_dashboard_UsageChartViewModel_HiltModules_KeyModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ViewModelComponent",
modules = "com.rainy.token.ui.dashboard.UsageDataViewModel_HiltModules.BindsModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_dashboard_UsageDataViewModel_HiltModules_BindsModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ActivityRetainedComponent",
modules = "com.rainy.token.ui.dashboard.UsageDataViewModel_HiltModules.KeyModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_dashboard_UsageDataViewModel_HiltModules_KeyModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ViewModelComponent",
modules = "com.rainy.token.ui.dashboard.UsageViewModel_HiltModules.BindsModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_dashboard_UsageViewModel_HiltModules_BindsModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ActivityRetainedComponent",
modules = "com.rainy.token.ui.dashboard.UsageViewModel_HiltModules.KeyModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_dashboard_UsageViewModel_HiltModules_KeyModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ViewModelComponent",
modules = "com.rainy.token.ui.servicedetail.ServiceDetailViewModel_HiltModules.BindsModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_servicedetail_ServiceDetailViewModel_HiltModules_BindsModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ActivityRetainedComponent",
modules = "com.rainy.token.ui.servicedetail.ServiceDetailViewModel_HiltModules.KeyModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_servicedetail_ServiceDetailViewModel_HiltModules_KeyModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ViewModelComponent",
modules = "com.rainy.token.ui.settings.CredentialEditViewModel_HiltModules.BindsModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_settings_CredentialEditViewModel_HiltModules_BindsModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ActivityRetainedComponent",
modules = "com.rainy.token.ui.settings.CredentialEditViewModel_HiltModules.KeyModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_settings_CredentialEditViewModel_HiltModules_KeyModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ViewModelComponent",
modules = "com.rainy.token.ui.settings.SettingsViewModel_HiltModules.BindsModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_settings_SettingsViewModel_HiltModules_BindsModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ActivityRetainedComponent",
modules = "com.rainy.token.ui.settings.SettingsViewModel_HiltModules.KeyModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_settings_SettingsViewModel_HiltModules_KeyModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ViewModelComponent",
modules = "com.rainy.token.ui.webview.WebViewLoginViewModel_HiltModules.BindsModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_webview_WebViewLoginViewModel_HiltModules_BindsModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.android.components.ActivityRetainedComponent",
modules = "com.rainy.token.ui.webview.WebViewLoginViewModel_HiltModules.KeyModule"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_webview_WebViewLoginViewModel_HiltModules_KeyModule {
}

View File

@ -1,15 +0,0 @@
package hilt_aggregated_deps;
import dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps;
import javax.annotation.processing.Generated;
/**
* This class should only be referenced by generated code! This class aggregates information across multiple compilations.
*/
@AggregatedDeps(
components = "dagger.hilt.components.SingletonComponent",
entryPoints = "com.rainy.token.ui.widget.WidgetRefreshEntryPoint"
)
@Generated("dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator")
public class _com_rainy_token_ui_widget_WidgetRefreshEntryPoint {
}

View File

@ -1 +0,0 @@
-keep,allowobfuscation,allowshrinking class com.rainy.token.ui.dashboard.DashboardViewModel

Some files were not shown because too many files have changed in this diff Show More