diff --git a/.gitignore b/.gitignore index 77b01b7..6a0676c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .learnings/ .tools/ .android-sdk/ +.gradle/ local.properties app/build/ build/ diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 16527d9..f3b95c4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -22,6 +22,15 @@ android { buildFeatures { compose = true } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } } dependencies { diff --git a/app/src/main/java/com/sub2api/monitor/widget/RefreshWidgetAction.kt b/app/src/main/java/com/sub2api/monitor/widget/RefreshWidgetAction.kt index 5ec08e6..c4eeb89 100644 --- a/app/src/main/java/com/sub2api/monitor/widget/RefreshWidgetAction.kt +++ b/app/src/main/java/com/sub2api/monitor/widget/RefreshWidgetAction.kt @@ -2,9 +2,9 @@ package com.sub2api.monitor.widget import android.content.Context import androidx.glance.GlanceId -import androidx.glance.action.ActionCallback import androidx.glance.action.ActionParameters -import androidx.glance.appwidget.update +import androidx.glance.appwidget.action.ActionCallback +import androidx.glance.appwidget.updateAll import com.sub2api.monitor.data.DataStoreConfigRepository import com.sub2api.monitor.data.MockSub2ApiRepository import kotlinx.coroutines.flow.first @@ -19,7 +19,7 @@ class RefreshWidgetAction : ActionCallback { val widgetStateRepository = WidgetStateRepository(context) if (!config.isConfigured) { - Sub2ApiMonitorWidget().update(context, glanceId) + Sub2ApiMonitorWidget().updateAll(context) return } @@ -34,6 +34,6 @@ class RefreshWidgetAction : ActionCallback { }, ) - Sub2ApiMonitorWidget().update(context, glanceId) + Sub2ApiMonitorWidget().updateAll(context) } } diff --git a/app/src/main/java/com/sub2api/monitor/widget/Sub2ApiMonitorWidget.kt b/app/src/main/java/com/sub2api/monitor/widget/Sub2ApiMonitorWidget.kt index f4e32f5..7fa1135 100644 --- a/app/src/main/java/com/sub2api/monitor/widget/Sub2ApiMonitorWidget.kt +++ b/app/src/main/java/com/sub2api/monitor/widget/Sub2ApiMonitorWidget.kt @@ -9,8 +9,8 @@ import androidx.glance.GlanceId import androidx.glance.GlanceModifier import androidx.glance.Image import androidx.glance.ImageProvider -import androidx.glance.action.actionRunCallback import androidx.glance.appwidget.GlanceAppWidget +import androidx.glance.appwidget.action.actionRunCallback import androidx.glance.appwidget.cornerRadius import androidx.glance.appwidget.provideContent import androidx.glance.background @@ -19,7 +19,6 @@ import androidx.glance.layout.Box import androidx.glance.layout.Column import androidx.glance.layout.Row import androidx.glance.layout.Spacer -import androidx.glance.layout.defaultWeight import androidx.glance.layout.fillMaxSize import androidx.glance.layout.fillMaxWidth import androidx.glance.layout.height @@ -118,7 +117,7 @@ private fun DashboardState(state: Sub2ApiWidgetState) { modifier = GlanceModifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { - Column(modifier = GlanceModifier.defaultWeight()) { + Column(modifier = GlanceModifier.width(180.dp)) { Text("Sub2API", style = titleStyle()) Text( text = "更新 ${formatDisplayTime(snapshot.lastUpdatedAtMillis)}", @@ -135,34 +134,34 @@ private fun DashboardState(state: Sub2ApiWidgetState) { Spacer(modifier = GlanceModifier.height(8.dp)) Row(modifier = GlanceModifier.fillMaxWidth()) { - MetricBlock("今日 Token", formatTokens(snapshot.todayTokens), Color(0xFF2563EB), GlanceModifier.defaultWeight()) + MetricBlock("今日 Token", formatTokens(snapshot.todayTokens), Color(0xFF2563EB), GlanceModifier.width(130.dp)) Spacer(modifier = GlanceModifier.width(8.dp)) - MetricBlock("今日消耗", formatCurrency(snapshot.todayCost), Color(0xFF0F766E), GlanceModifier.defaultWeight()) + MetricBlock("今日消耗", formatCurrency(snapshot.todayCost), Color(0xFF0F766E), GlanceModifier.width(130.dp)) } Spacer(modifier = GlanceModifier.height(8.dp)) Row(modifier = GlanceModifier.fillMaxWidth()) { - MetricBlock("请求次数", snapshot.todayRequests.toString(), Color(0xFF7C3AED), GlanceModifier.defaultWeight()) + MetricBlock("请求次数", snapshot.todayRequests.toString(), Color(0xFF7C3AED), GlanceModifier.width(130.dp)) Spacer(modifier = GlanceModifier.width(8.dp)) - MetricBlock("服务状态", statusText(snapshot.serviceStatus), statusColor(snapshot.serviceStatus), GlanceModifier.defaultWeight()) + MetricBlock("服务状态", statusText(snapshot.serviceStatus), statusColor(snapshot.serviceStatus), GlanceModifier.width(130.dp)) } Spacer(modifier = GlanceModifier.height(8.dp)) Row(modifier = GlanceModifier.fillMaxWidth()) { - TinyMetric("平均", formatLatency(snapshot.averageLatencyMs), GlanceModifier.defaultWeight()) - TinyMetric("RPM", formatRpm(snapshot.rpm), GlanceModifier.defaultWeight()) - TinyMetric("TPM", formatTpm(snapshot.tpm), GlanceModifier.defaultWeight()) - TinyMetric("Key", snapshot.activeKeyCount.toString(), GlanceModifier.defaultWeight()) - TinyMetric("用户", snapshot.userCount.toString(), GlanceModifier.defaultWeight()) + TinyMetric("平均", formatLatency(snapshot.averageLatencyMs), GlanceModifier.width(58.dp)) + TinyMetric("RPM", formatRpm(snapshot.rpm), GlanceModifier.width(54.dp)) + TinyMetric("TPM", formatTpm(snapshot.tpm), GlanceModifier.width(62.dp)) + TinyMetric("Key", snapshot.activeKeyCount.toString(), GlanceModifier.width(42.dp)) + TinyMetric("用户", snapshot.userCount.toString(), GlanceModifier.width(42.dp)) } Spacer(modifier = GlanceModifier.height(8.dp)) Row(modifier = GlanceModifier.fillMaxWidth()) { - Column(modifier = GlanceModifier.defaultWeight()) { + Column(modifier = GlanceModifier.width(145.dp)) { SectionTitle("最近调用") snapshot.recentCalls.take(5).forEach { RecentCallRow(it) } } Spacer(modifier = GlanceModifier.width(10.dp)) - Column(modifier = GlanceModifier.defaultWeight()) { + Column(modifier = GlanceModifier.width(125.dp)) { SectionTitle("模型 TOP4") snapshot.modelTop.take(4).forEach { ModelUsageRow(it) } } @@ -170,7 +169,7 @@ private fun DashboardState(state: Sub2ApiWidgetState) { Spacer(modifier = GlanceModifier.height(6.dp)) Row(modifier = GlanceModifier.fillMaxWidth()) { - Text("累计 ${formatTokens(snapshot.totalTokens)}", style = mutedStyle(), modifier = GlanceModifier.defaultWeight()) + Text("累计 ${formatTokens(snapshot.totalTokens)}", style = mutedStyle(), modifier = GlanceModifier.width(140.dp)) Text("累计 ${formatCurrency(snapshot.totalCost)}", style = mutedStyle()) } } @@ -212,7 +211,7 @@ private fun SectionTitle(text: String) { @Composable private fun RecentCallRow(call: RecentCall) { Row(modifier = GlanceModifier.fillMaxWidth()) { - Text(call.model, style = mutedStyle(), modifier = GlanceModifier.defaultWeight()) + Text(call.model, style = mutedStyle(), modifier = GlanceModifier.width(95.dp)) Text("${call.statusCode}", style = mutedStyle()) } } @@ -220,7 +219,7 @@ private fun RecentCallRow(call: RecentCall) { @Composable private fun ModelUsageRow(model: ModelUsage) { Row(modifier = GlanceModifier.fillMaxWidth()) { - Text(model.model, style = mutedStyle(), modifier = GlanceModifier.defaultWeight()) + Text(model.model, style = mutedStyle(), modifier = GlanceModifier.width(82.dp)) Text(formatCurrency(model.cost), style = mutedStyle()) } }