From 05008ca20f1ffa39a497766f6c3b71c218669d91 Mon Sep 17 00:00:00 2001 From: WaterRain <109326062+CATMIAOZHI@users.noreply.github.com> Date: Fri, 19 Jun 2026 06:36:24 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B0=8F=E7=BB=84=E4=BB=B6=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=88=B7=E6=96=B0=E2=80=94=E2=80=94=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA/=E8=B6=855=E5=88=86=E9=92=9F=E5=86=B7?= =?UTF-8?q?=E5=8D=B4=E6=97=B6=E8=A7=A6=E5=8F=91=E5=90=8E=E5=8F=B0=E5=88=B7?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/widget/OpenCodeGoWidgetProvider.kt | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/rainy/token/ui/widget/OpenCodeGoWidgetProvider.kt b/app/src/main/java/com/rainy/token/ui/widget/OpenCodeGoWidgetProvider.kt index 66b067e..fa2c64c 100644 --- a/app/src/main/java/com/rainy/token/ui/widget/OpenCodeGoWidgetProvider.kt +++ b/app/src/main/java/com/rainy/token/ui/widget/OpenCodeGoWidgetProvider.kt @@ -22,7 +22,7 @@ import java.util.Locale * OpenCode Go 桌面小组件。 * * 显示 3 个用量窗口(5h / 本周 / 本月)的百分比 + 进度条 + 重置倒计时。 - * 数据来自 [BalanceCache](DataStore),不触发网络请求。 + * 优先展示缓存数据;缓存为空或超过 5 分钟冷却时间时,自动触发后台网络刷新。 */ class OpenCodeGoWidgetProvider : AppWidgetProvider() { @@ -31,6 +31,8 @@ class OpenCodeGoWidgetProvider : AppWidgetProvider() { appWidgetManager: AppWidgetManager, appWidgetIds: IntArray ) { + var hasCachedData = false + for (widgetId in appWidgetIds) { val views = RemoteViews(context.packageName, R.layout.widget_opencode_go) @@ -58,6 +60,7 @@ class OpenCodeGoWidgetProvider : AppWidgetProvider() { val cache = BalanceCache(dataStore) val cached = cache.get(ServiceType.OPENCODE_GO) if (cached != null) { + hasCachedData = true val bal = cached.balance val extras = bal.extras @@ -74,7 +77,7 @@ class OpenCodeGoWidgetProvider : AppWidgetProvider() { val sdf = SimpleDateFormat("MM-dd HH:mm", Locale.getDefault()) val timeText = "更新 " + sdf.format(Date(cached.fetchedAt)) views.setTextViewText(R.id.widget_updated, timeText) -} else { + } else { setEmptyState(views) } @@ -94,6 +97,12 @@ class OpenCodeGoWidgetProvider : AppWidgetProvider() { appWidgetManager.updateAppWidget(widgetId, views) } + + // 自动刷新:缓存为空 或 超过冷却时间 → 触发后台刷新 + if (!hasCachedData || shouldAutoRefresh(context)) { + markAutoRefreshTime(context) + context.sendBroadcast(WidgetRefreshReceiver.createIntent(context)) + } } private fun populateRow( @@ -144,10 +153,32 @@ class OpenCodeGoWidgetProvider : AppWidgetProvider() { } companion object { + + /** 两次自动刷新的最小间隔(5分钟),防止频繁网络请求 */ + private const val AUTO_REFRESH_COOLDOWN_MS = 5 * 60 * 1000L + private const val PREFS_NAME = "widget_auto_refresh" + private const val KEY_LAST_AUTO_REFRESH = "last_auto_refresh" + + private fun autoRefreshPrefs(context: Context) = + context.applicationContext.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) + + private fun shouldAutoRefresh(context: Context): Boolean { + val lastRefresh = autoRefreshPrefs(context).getLong(KEY_LAST_AUTO_REFRESH, 0L) + return System.currentTimeMillis() - lastRefresh > AUTO_REFRESH_COOLDOWN_MS + } + + private fun markAutoRefreshTime(context: Context) { + autoRefreshPrefs(context).edit() + .putLong(KEY_LAST_AUTO_REFRESH, System.currentTimeMillis()) + .apply() + } + /** * APP 内刷新后主动更新 Widget。 + * 同时更新自动刷新时间戳,避免后续 onUpdate() 重复触发网络请求。 */ fun notifyDataChanged(context: Context) { + markAutoRefreshTime(context) // 重置冷却计时器 val appWidgetManager = AppWidgetManager.getInstance(context) val component = ComponentName(context, OpenCodeGoWidgetProvider::class.java) val ids = appWidgetManager.getAppWidgetIds(component)