@@ -2,6 +2,7 @@ package com.thewizrd.simplewear.wearable.complications
22
33import android.app.PendingIntent
44import android.content.ComponentName
5+ import android.content.Context
56import android.content.Intent
67import android.graphics.drawable.Icon
78import androidx.wear.watchface.complications.data.ComplicationData
@@ -15,19 +16,53 @@ import androidx.wear.watchface.complications.data.ShortTextComplicationData
1516import androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester
1617import androidx.wear.watchface.complications.datasource.ComplicationRequest
1718import androidx.wear.watchface.complications.datasource.SuspendingComplicationDataSourceService
19+ import com.thewizrd.shared_resources.actions.BatteryStatus
20+ import com.thewizrd.shared_resources.appLib
21+ import com.thewizrd.shared_resources.utils.Logger
1822import com.thewizrd.simplewear.DashboardActivity
1923import com.thewizrd.simplewear.R
24+ import com.thewizrd.simplewear.datastore.dashboard.dashboardDataStore
2025import com.thewizrd.simplewear.utils.asLauncherIntent
2126import com.thewizrd.simplewear.wearable.tiles.DashboardTileMessenger
2227import kotlinx.coroutines.CoroutineScope
2328import kotlinx.coroutines.Dispatchers
29+ import kotlinx.coroutines.Job
2430import kotlinx.coroutines.SupervisorJob
2531import kotlinx.coroutines.async
2632import kotlinx.coroutines.cancel
33+ import kotlinx.coroutines.delay
34+ import kotlinx.coroutines.flow.firstOrNull
35+ import kotlinx.coroutines.flow.map
36+ import kotlinx.coroutines.isActive
37+ import kotlinx.coroutines.launch
2738
2839class BatteryStatusComplicationService : SuspendingComplicationDataSourceService () {
2940 companion object {
3041 private const val TAG = " BatteryStatusComplicationService"
42+
43+ fun requestComplicationUpdate (context : Context , complicationInstanceId : Int? = null) {
44+ updateJob?.cancel()
45+
46+ updateJob = appLib.appScope.launch {
47+ delay(1000 )
48+ if (isActive) {
49+ Logger .debug(TAG , " requesting complication update" )
50+
51+ ComplicationDataSourceUpdateRequester .create(
52+ context,
53+ ComponentName (context, this ::class .java)
54+ ).run {
55+ if (complicationInstanceId != null ) {
56+ requestUpdate(complicationInstanceId)
57+ } else {
58+ requestUpdateAll()
59+ }
60+ }
61+ }
62+ }
63+ }
64+
65+ private var updateJob: Job ? = null
3166 }
3267
3368 private val scope = CoroutineScope (SupervisorJob () + Dispatchers .Default )
@@ -47,13 +82,7 @@ class BatteryStatusComplicationService : SuspendingComplicationDataSourceService
4782
4883 override fun onComplicationActivated (complicationInstanceId : Int , type : ComplicationType ) {
4984 super .onComplicationActivated(complicationInstanceId, type)
50-
51- ComplicationDataSourceUpdateRequester .create(
52- applicationContext,
53- ComponentName (applicationContext, this ::class .java)
54- ).run {
55- requestUpdate(complicationInstanceId)
56- }
85+ requestComplicationUpdate(applicationContext, complicationInstanceId)
5786 }
5887
5988 override suspend fun onComplicationRequest (request : ComplicationRequest ): ComplicationData {
@@ -62,8 +91,7 @@ class BatteryStatusComplicationService : SuspendingComplicationDataSourceService
6291 }
6392
6493 return scope.async {
65- val batteryStatus = tileMessenger.requestBatteryStatusAsync()
66- ? : return @async NoDataComplicationData ()
94+ val batteryStatus = latestStatus() ? : return @async NoDataComplicationData ()
6795
6896 val batteryLvl = batteryStatus.batteryLevel
6997 val statusText = if (batteryStatus.isCharging) {
@@ -197,4 +225,15 @@ class BatteryStatusComplicationService : SuspendingComplicationDataSourceService
197225 )
198226 }
199227 }
228+
229+ private suspend fun latestStatus (): BatteryStatus ? {
230+ var status = this .dashboardDataStore.data.map { it.batteryStatus }.firstOrNull()
231+
232+ if (status == null ) {
233+ Logger .debug(TAG , " No battery status available. loading from remote..." )
234+ status = tileMessenger.requestBatteryStatusAsync()
235+ }
236+
237+ return status
238+ }
200239}
0 commit comments