@@ -3,13 +3,22 @@ package cash.p.terminal.widgets
33import android.appwidget.AppWidgetManager
44import android.content.ComponentName
55import android.content.Context
6+ import android.os.Build
7+ import androidx.glance.GlanceId
68import androidx.glance.appwidget.GlanceAppWidgetManager
9+ import androidx.work.Constraints
710import androidx.work.CoroutineWorker
811import androidx.work.ExistingPeriodicWorkPolicy
12+ import androidx.work.ExistingWorkPolicy
13+ import androidx.work.NetworkType
14+ import androidx.work.OneTimeWorkRequestBuilder
15+ import androidx.work.OutOfQuotaPolicy
916import androidx.work.PeriodicWorkRequestBuilder
1017import androidx.work.WorkManager
1118import androidx.work.WorkerParameters
12- import cash.p.terminal.core.App
19+ import androidx.work.workDataOf
20+ import cash.p.terminal.core.getKoinInstance
21+ import cash.p.terminal.core.tryOrNull
1322import kotlinx.coroutines.async
1423import kotlinx.coroutines.awaitAll
1524import kotlinx.coroutines.coroutineScope
@@ -20,24 +29,48 @@ class MarketWidgetWorker(
2029 workerParameters : WorkerParameters
2130) : CoroutineWorker(context, workerParameters) {
2231
32+ private val marketWidgetManager: MarketWidgetManager by lazy { getKoinInstance() }
33+
2334 companion object {
2435 private const val updatePeriodMillis: Long = 15 * 60 * 1000 // 15 minutes
25- private const val workName = " widget_update_work"
36+ private const val periodicWorkName = " widget_update_work"
37+ private const val refreshWorkName = " widget_refresh_work"
38+ private const val appWidgetIdKey = " app_widget_id"
39+ private val networkConstraints = Constraints .Builder ()
40+ .setRequiredNetworkType(NetworkType .CONNECTED )
41+ .build()
2642
27- fun enqueueWork (context : Context ) {
43+ fun enqueuePeriodicRefresh (context : Context ) {
2844 val manager = WorkManager .getInstance(context)
2945 val requestBuilder = PeriodicWorkRequestBuilder <MarketWidgetWorker >(Duration .ofMillis(updatePeriodMillis))
46+ .setConstraints(networkConstraints)
3047
3148 manager.enqueueUniquePeriodicWork(
32- workName ,
49+ periodicWorkName ,
3350 ExistingPeriodicWorkPolicy .UPDATE ,
3451 requestBuilder.build()
3552 )
3653 }
3754
55+ fun enqueueRefresh (context : Context , glanceId : GlanceId ) {
56+ val appWidgetId = GlanceAppWidgetManager (context).getAppWidgetId(glanceId)
57+ val requestBuilder = OneTimeWorkRequestBuilder <MarketWidgetWorker >()
58+ .setInputData(workDataOf(appWidgetIdKey to appWidgetId))
59+ .setConstraints(networkConstraints)
60+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .S ) {
61+ requestBuilder.setExpedited(OutOfQuotaPolicy .RUN_AS_NON_EXPEDITED_WORK_REQUEST )
62+ }
63+
64+ WorkManager .getInstance(context).enqueueUniqueWork(
65+ " $refreshWorkName :$appWidgetId " ,
66+ ExistingWorkPolicy .KEEP ,
67+ requestBuilder.build()
68+ )
69+ }
70+
3871 fun cancel (context : Context ) {
3972 if (! hasEnabledWidgets(context)) {
40- WorkManager .getInstance(context).cancelUniqueWork(workName )
73+ WorkManager .getInstance(context).cancelUniqueWork(periodicWorkName )
4174 }
4275 }
4376
@@ -59,14 +92,26 @@ class MarketWidgetWorker(
5992 }
6093
6194 override suspend fun doWork (): Result = coroutineScope {
62- val manager = GlanceAppWidgetManager (context)
63- val glanceIds = manager.getGlanceIds(MarketWidget ::class .java)
64-
65- glanceIds.map { glanceId ->
66- async { App .marketWidgetManager.refreshSync(glanceId) }
95+ val appWidgetId = inputData.getInt(appWidgetIdKey, AppWidgetManager .INVALID_APPWIDGET_ID )
96+ targetGlanceIds(appWidgetId).map { glanceId ->
97+ async {
98+ marketWidgetManager.refreshSync(
99+ glanceId = glanceId,
100+ showLoading = appWidgetId != AppWidgetManager .INVALID_APPWIDGET_ID
101+ )
102+ }
67103 }.awaitAll()
68104
69105 Result .success()
70106 }
71107
108+ private suspend fun targetGlanceIds (appWidgetId : Int ): List <GlanceId > {
109+ val manager = GlanceAppWidgetManager (context)
110+ if (appWidgetId == AppWidgetManager .INVALID_APPWIDGET_ID ) {
111+ return manager.getGlanceIds(MarketWidget ::class .java)
112+ }
113+
114+ return listOfNotNull(tryOrNull { manager.getGlanceIdBy(appWidgetId) })
115+ }
116+
72117}
0 commit comments