From 87ee602457abe10335f9b1299be18cf7a4834c5e Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 24 Apr 2024 12:39:16 +0100 Subject: [PATCH 1/4] MS-368 Opting out of setting worker service foreground when battery optimization on --- .../core/tools/utils/BatteryOptimizationUtils.kt | 13 +++++++++++++ .../simprints/core/workers/SimCoroutineWorker.kt | 4 ++++ 2 files changed, 17 insertions(+) create mode 100644 infra/core/src/main/java/com/simprints/core/tools/utils/BatteryOptimizationUtils.kt diff --git a/infra/core/src/main/java/com/simprints/core/tools/utils/BatteryOptimizationUtils.kt b/infra/core/src/main/java/com/simprints/core/tools/utils/BatteryOptimizationUtils.kt new file mode 100644 index 0000000000..ffe023fa3e --- /dev/null +++ b/infra/core/src/main/java/com/simprints/core/tools/utils/BatteryOptimizationUtils.kt @@ -0,0 +1,13 @@ +package com.simprints.core.tools.utils + +import android.content.Context +import android.os.PowerManager + +object BatteryOptimizationUtils { + + fun isFollowingBatteryOptimizations(context: Context): Boolean = + (context.getSystemService(Context.POWER_SERVICE) as PowerManager) + .isIgnoringBatteryOptimizations(context.packageName) + .not() + +} diff --git a/infra/core/src/main/java/com/simprints/core/workers/SimCoroutineWorker.kt b/infra/core/src/main/java/com/simprints/core/workers/SimCoroutineWorker.kt index cf9ddf4e16..0854c68f05 100644 --- a/infra/core/src/main/java/com/simprints/core/workers/SimCoroutineWorker.kt +++ b/infra/core/src/main/java/com/simprints/core/workers/SimCoroutineWorker.kt @@ -13,6 +13,7 @@ import androidx.work.Data import androidx.work.ForegroundInfo import androidx.work.WorkerParameters import com.simprints.core.ExcludedFromGeneratedTestCoverageReports +import com.simprints.core.tools.utils.BatteryOptimizationUtils import com.simprints.infra.logging.LoggingConstants.CrashReportTag import com.simprints.infra.logging.Simber import com.simprints.infra.network.exceptions.NetworkConnectionException @@ -57,6 +58,9 @@ abstract class SimCoroutineWorker( } protected suspend fun showProgressNotification() { + if (BatteryOptimizationUtils.isFollowingBatteryOptimizations(context)) { + return + } try { setForeground(getForegroundInfo()) } catch (setForegroundException: Throwable) { From 8ab5915f31ce989a1246a8e29417d19647159421 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 24 Apr 2024 13:06:44 +0100 Subject: [PATCH 2/4] MS-368 Foreground status for workers to be set as early as possible --- .../sync/down/workers/EventDownSyncDownloaderWorker.kt | 2 +- .../infra/eventsync/sync/master/EventEndSyncReporterWorker.kt | 2 +- .../infra/eventsync/sync/master/EventStartSyncReporterWorker.kt | 2 +- .../infra/eventsync/sync/master/EventSyncMasterWorker.kt | 2 +- .../eventsync/sync/up/workers/EventUpSyncUploaderWorker.kt | 2 +- .../infra/sync/config/worker/DeviceConfigDownSyncWorker.kt | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/workers/EventDownSyncDownloaderWorker.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/workers/EventDownSyncDownloaderWorker.kt index 7fa133f457..4fc678e921 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/workers/EventDownSyncDownloaderWorker.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/workers/EventDownSyncDownloaderWorker.kt @@ -76,8 +76,8 @@ internal class EventDownSyncDownloaderWorker @AssistedInject constructor( override suspend fun doWork(): Result = withContext(dispatcher) { try { - Simber.tag(SYNC_LOG_TAG).d("[DOWNLOADER] Started") showProgressNotification() + Simber.tag(SYNC_LOG_TAG).d("[DOWNLOADER] Started") val workerId = this@EventDownSyncDownloaderWorker.id.toString() var count = syncCache.readProgress(workerId) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventEndSyncReporterWorker.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventEndSyncReporterWorker.kt index f80f3c44df..dec4b9d700 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventEndSyncReporterWorker.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventEndSyncReporterWorker.kt @@ -32,9 +32,9 @@ internal class EventEndSyncReporterWorker @AssistedInject constructor( override suspend fun doWork(): Result = withContext(dispatcher) { try { + showProgressNotification() val syncId = inputData.getString(SYNC_ID_TO_MARK_AS_COMPLETED) crashlyticsLog("Start - Params: $syncId") - showProgressNotification() inputData.getString(EVENT_DOWN_SYNC_SCOPE_TO_CLOSE)?.let { scopeId -> eventRepository.closeEventScope(scopeId, EventScopeEndCause.WORKFLOW_ENDED) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventStartSyncReporterWorker.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventStartSyncReporterWorker.kt index 417250e36d..fd06c6f0a9 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventStartSyncReporterWorker.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventStartSyncReporterWorker.kt @@ -30,9 +30,9 @@ internal class EventStartSyncReporterWorker @AssistedInject constructor( override suspend fun doWork(): Result = withContext(dispatcher) { try { + showProgressNotification() val syncId = inputData.getString(SYNC_ID_STARTED) crashlyticsLog("Start - Params: $syncId") - showProgressNotification() success(inputData) } catch (t: Throwable) { fail(t) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorker.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorker.kt index 83830bc093..924f631261 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorker.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorker.kt @@ -63,10 +63,10 @@ class EventSyncMasterWorker @AssistedInject internal constructor( override suspend fun doWork(): Result = withContext(dispatcher) { try { + showProgressNotification() // check if device is rooted before starting the sync securityManager.checkIfDeviceIsRooted() crashlyticsLog("Start") - showProgressNotification() val configuration = configRepository.getProjectConfiguration() if (!configuration.canSyncDataToSimprints() && !isEventDownSyncAllowed(configuration)) return@withContext success( diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/up/workers/EventUpSyncUploaderWorker.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/up/workers/EventUpSyncUploaderWorker.kt index acbd0f75d0..e2bcdfc30e 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/up/workers/EventUpSyncUploaderWorker.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/up/workers/EventUpSyncUploaderWorker.kt @@ -74,8 +74,8 @@ internal class EventUpSyncUploaderWorker @AssistedInject constructor( override suspend fun doWork(): Result = withContext(dispatcher) { try { - Simber.tag(SYNC_LOG_TAG).d("[UPLOADER] Started") showProgressNotification() + Simber.tag(SYNC_LOG_TAG).d("[UPLOADER] Started") val workerId = this@EventUpSyncUploaderWorker.id.toString() var count = eventSyncCache.readProgress(workerId) diff --git a/infra/sync/src/main/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorker.kt b/infra/sync/src/main/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorker.kt index 22184eeecc..d2f46734a8 100644 --- a/infra/sync/src/main/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorker.kt +++ b/infra/sync/src/main/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorker.kt @@ -27,8 +27,8 @@ internal class DeviceConfigDownSyncWorker @AssistedInject constructor( override suspend fun doWork(): Result = withContext(dispatcher) { - crashlyticsLog("Fetching device config state") showProgressNotification() + crashlyticsLog("Fetching device config state") try { val state = configRepository.getDeviceState() From 3843763a91908cef7809cf9cf05f58fa79905555 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 24 Apr 2024 13:08:37 +0100 Subject: [PATCH 3/4] MS-368 Battery optimization check potential exceptions catching --- .../java/com/simprints/core/workers/SimCoroutineWorker.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/infra/core/src/main/java/com/simprints/core/workers/SimCoroutineWorker.kt b/infra/core/src/main/java/com/simprints/core/workers/SimCoroutineWorker.kt index 0854c68f05..ad06909f05 100644 --- a/infra/core/src/main/java/com/simprints/core/workers/SimCoroutineWorker.kt +++ b/infra/core/src/main/java/com/simprints/core/workers/SimCoroutineWorker.kt @@ -58,10 +58,10 @@ abstract class SimCoroutineWorker( } protected suspend fun showProgressNotification() { - if (BatteryOptimizationUtils.isFollowingBatteryOptimizations(context)) { - return - } try { + if (BatteryOptimizationUtils.isFollowingBatteryOptimizations(context)) { + return + } setForeground(getForegroundInfo()) } catch (setForegroundException: Throwable) { // Setting foreground (showing the notification) may be restricted by the system From 9edf2cb9b48dca58082d0ae09c04a5e0d6147977 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 24 Apr 2024 14:35:14 +0100 Subject: [PATCH 4/4] MS-368 Battery optimization check platform code excluded from test coverage --- .../com/simprints/core/tools/utils/BatteryOptimizationUtils.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/infra/core/src/main/java/com/simprints/core/tools/utils/BatteryOptimizationUtils.kt b/infra/core/src/main/java/com/simprints/core/tools/utils/BatteryOptimizationUtils.kt index ffe023fa3e..61e5b4842f 100644 --- a/infra/core/src/main/java/com/simprints/core/tools/utils/BatteryOptimizationUtils.kt +++ b/infra/core/src/main/java/com/simprints/core/tools/utils/BatteryOptimizationUtils.kt @@ -2,7 +2,9 @@ package com.simprints.core.tools.utils import android.content.Context import android.os.PowerManager +import com.simprints.core.ExcludedFromGeneratedTestCoverageReports +@ExcludedFromGeneratedTestCoverageReports("Platform glue code") object BatteryOptimizationUtils { fun isFollowingBatteryOptimizations(context: Context): Boolean =