99package io.element.android.libraries.push.impl.workmanager
1010
1111import android.content.Context
12+ import android.os.Build
13+ import android.os.PowerManager
14+ import androidx.core.content.getSystemService
1215import androidx.work.CoroutineWorker
1316import androidx.work.WorkerParameters
1417import dev.zacsweers.metro.AppScope
@@ -62,6 +65,21 @@ class FetchNotificationsWorker(
6265 val parent = analyticsService.getLongRunningTransaction(AnalyticsLongRunningTransaction .PushToWorkManager (request.eventId.value))
6366 parent?.startChild(" Waiting for network connectivity" , " await_network" )
6467 }
68+
69+ val powerManager = context.getSystemService<PowerManager >()
70+ val isLowPowerMode = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .TIRAMISU ) {
71+ powerManager?.isLowPowerStandbyEnabled == true
72+ } else {
73+ false
74+ }
75+
76+ val exemptFromLowPowerStandby = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
77+ powerManager?.isExemptFromLowPowerStandby == true
78+ } else {
79+ false
80+ }
81+ val isNetworkBlocked = isLowPowerMode && ! exemptFromLowPowerStandby
82+
6583 val hasNetwork = withTimeoutOrNull(10 .seconds) {
6684 networkMonitor.connectivity.first { it == NetworkStatus .Connected }
6785 } != null
@@ -70,15 +88,18 @@ class FetchNotificationsWorker(
7088 span.finish()
7189 }
7290
73- if (! hasNetwork) {
74- Timber .w(" No network, retrying later" )
91+ if (! hasNetwork || isNetworkBlocked) {
7592 for (request in requests) {
7693 val eventId = request.eventId.value
77- analyticsService.finishLongRunningTransaction(AnalyticsLongRunningTransaction .PushToWorkManager (eventId))
94+ analyticsService.finishLongRunningTransaction(AnalyticsLongRunningTransaction .PushToWorkManager (eventId)) {
95+ it.putExtraData(" has_network_connection" , hasNetwork.toString())
96+ it.putExtraData(" is_network_blocked" , isNetworkBlocked.toString())
97+ }
7898 val parent = analyticsService.getLongRunningTransaction(AnalyticsLongRunningTransaction .PushToNotification (eventId))
7999 // Since we're retrying, start a new transaction
80100 analyticsService.startLongRunningTransaction(AnalyticsLongRunningTransaction .PushToWorkManager (eventId), parent)
81101 }
102+ Timber .w(" FetchNotificationsWorker will retry. Has network connectivity: $hasNetwork . Is network blocked: $isNetworkBlocked " )
82103 return Result .retry()
83104 }
84105
0 commit comments