Skip to content

Commit 6cd0ac7

Browse files
committed
BatteryStatusComplication: load state from cache
1 parent ab34da7 commit 6cd0ac7

File tree

3 files changed

+57
-12
lines changed

3 files changed

+57
-12
lines changed

wear/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@
252252
</service>
253253

254254
<service
255-
android:icon="@drawable/ic_smartphone_white_24dp"
255+
android:icon="@drawable/ic_charging_station_24dp"
256256
android:label="@string/pref_title_phone_batt_state"
257257
android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER"
258258
android:name=".wearable.complications.BatteryStatusComplicationService"

wear/src/main/java/com/thewizrd/simplewear/wearable/WearableDataListenerService.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import com.thewizrd.simplewear.datastore.media.mediaDataStore
5858
import com.thewizrd.simplewear.media.MediaPlayerActivity
5959
import com.thewizrd.simplewear.preferences.Settings
6060
import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel
61+
import com.thewizrd.simplewear.wearable.complications.BatteryStatusComplicationService
6162
import com.thewizrd.simplewear.wearable.tiles.DashboardTileProviderService
6263
import com.thewizrd.simplewear.wearable.tiles.MediaPlayerTileProviderService
6364
import kotlinx.coroutines.Dispatchers
@@ -323,8 +324,13 @@ class WearableDataListenerService : WearableListenerService() {
323324
cache.copy(batteryStatus = status)
324325
}
325326

326-
if (!mLegacyTilesEnabled && currentState?.batteryStatus != status) {
327-
DashboardTileProviderService.requestTileUpdate(appLib.context)
327+
if (currentState?.batteryStatus != status) {
328+
BatteryStatusComplicationService.requestComplicationUpdate(
329+
applicationContext
330+
)
331+
if (!mLegacyTilesEnabled) {
332+
DashboardTileProviderService.requestTileUpdate(appLib.context)
333+
}
328334
}
329335
}
330336
}

wear/src/main/java/com/thewizrd/simplewear/wearable/complications/BatteryStatusComplicationService.kt

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.thewizrd.simplewear.wearable.complications
22

33
import android.app.PendingIntent
44
import android.content.ComponentName
5+
import android.content.Context
56
import android.content.Intent
67
import android.graphics.drawable.Icon
78
import androidx.wear.watchface.complications.data.ComplicationData
@@ -15,19 +16,53 @@ import androidx.wear.watchface.complications.data.ShortTextComplicationData
1516
import androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester
1617
import androidx.wear.watchface.complications.datasource.ComplicationRequest
1718
import 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
1822
import com.thewizrd.simplewear.DashboardActivity
1923
import com.thewizrd.simplewear.R
24+
import com.thewizrd.simplewear.datastore.dashboard.dashboardDataStore
2025
import com.thewizrd.simplewear.utils.asLauncherIntent
2126
import com.thewizrd.simplewear.wearable.tiles.DashboardTileMessenger
2227
import kotlinx.coroutines.CoroutineScope
2328
import kotlinx.coroutines.Dispatchers
29+
import kotlinx.coroutines.Job
2430
import kotlinx.coroutines.SupervisorJob
2531
import kotlinx.coroutines.async
2632
import 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

2839
class 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

Comments
 (0)