Skip to content

Commit ebc827f

Browse files
committed
Take into account low power mode
when fetching notifications When low power mode/energy saving mode is enabled, it's very likely we'll have network access blocked by it
1 parent a63bc8a commit ebc827f

File tree

1 file changed

+24
-3
lines changed

1 file changed

+24
-3
lines changed

libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/workmanager/FetchNotificationsWorker.kt

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
package io.element.android.libraries.push.impl.workmanager
1010

1111
import android.content.Context
12+
import android.os.Build
13+
import android.os.PowerManager
14+
import androidx.core.content.getSystemService
1215
import androidx.work.CoroutineWorker
1316
import androidx.work.WorkerParameters
1417
import 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

Comments
 (0)