首页与用量明细(用户反馈 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 默认英文资源误写中文。
107 lines
4.7 KiB
TOML
107 lines
4.7 KiB
TOML
[versions]
|
||
# Build tools
|
||
agp = "9.0.0"
|
||
kotlin = "2.3.10"
|
||
ksp = "2.3.9"
|
||
|
||
# Core AndroidX
|
||
coreKtx = "1.13.1"
|
||
lifecycleRuntimeKtx = "2.8.7"
|
||
activityCompose = "1.9.3"
|
||
composeBom = "2024.10.01"
|
||
|
||
# Navigation
|
||
navigationCompose = "2.9.8"
|
||
|
||
# Network (Retrofit 2.11.0 配 OkHttp 4.12.0 — 稳定组合,避开 Retrofit 3.x + OkHttp 5.x 的前沿兼容性问题)
|
||
retrofit = "2.11.0"
|
||
okhttp = "4.12.0"
|
||
kotlinxSerializationJson = "1.7.3"
|
||
retrofitKotlinxSerializationConverter = "1.0.0"
|
||
|
||
# DataStore
|
||
datastorePreferences = "1.1.1"
|
||
|
||
# WebKit
|
||
webkit = "1.12.1"
|
||
|
||
# WorkManager
|
||
workRuntimeKtx = "2.9.1"
|
||
|
||
# DI
|
||
hilt = "2.59.2"
|
||
hiltNavigationCompose = "1.2.0"
|
||
|
||
# Room
|
||
room = "2.7.1"
|
||
|
||
# Test
|
||
junit = "4.13.2"
|
||
junitVersion = "1.2.1"
|
||
espressoCore = "3.6.1"
|
||
androidsvg = "1.4"
|
||
|
||
[libraries]
|
||
# Core
|
||
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
|
||
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
|
||
androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycleRuntimeKtx" }
|
||
androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleRuntimeKtx" }
|
||
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
|
||
|
||
# Compose BOM
|
||
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
|
||
androidx-ui = { group = "androidx.compose.ui", name = "ui" }
|
||
androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
|
||
androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
|
||
androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
|
||
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
|
||
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
|
||
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
|
||
androidx-material3-window-size = { group = "androidx.compose.material3", name = "material3-window-size-class" }
|
||
|
||
# Navigation
|
||
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }
|
||
|
||
# Network
|
||
retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" }
|
||
okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" }
|
||
okhttp-logging-interceptor = { group = "com.squareup.okhttp3", name = "logging-interceptor", version.ref = "okhttp" }
|
||
kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" }
|
||
retrofit-kotlinx-serialization-converter = { group = "com.jakewharton.retrofit", name = "retrofit2-kotlinx-serialization-converter", version.ref = "retrofitKotlinxSerializationConverter" }
|
||
|
||
# DataStore
|
||
androidx-datastore-preferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "datastorePreferences" }
|
||
|
||
# WebKit
|
||
androidx-webkit = { group = "androidx.webkit", name = "webkit", version.ref = "webkit" }
|
||
|
||
# WorkManager
|
||
androidx-work-runtime-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "workRuntimeKtx" }
|
||
|
||
# DI
|
||
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
|
||
hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" }
|
||
androidx-hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hiltNavigationCompose" }
|
||
|
||
# Room
|
||
room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
|
||
room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" }
|
||
room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
|
||
|
||
# SVG(站点 Logo 渲染)
|
||
androidsvg = { group = "com.caverock", name = "androidsvg", version.ref = "androidsvg" }
|
||
|
||
# Test
|
||
junit = { group = "junit", name = "junit", version.ref = "junit" }
|
||
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
|
||
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
|
||
|
||
[plugins]
|
||
android-application = { id = "com.android.application", version.ref = "agp" }
|
||
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
|
||
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
|
||
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
|
||
hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
|
||
|