From 98ccab394a3bf628375b0d4452aa735659d454ca Mon Sep 17 00:00:00 2001 From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com> Date: Thu, 15 Sep 2022 18:34:20 +0300 Subject: [PATCH] android: require to disable battery optimizations for periodic notifications mode (#1053) * Changed requirements for ignoring battery for Periodic notifications mode * Add delay before running ON_RESUME events because some data is not ready yet on that stage * Better idea of when to show background notice Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> --- .../app/src/main/java/chat/simplex/app/SimplexApp.kt | 11 +++++++++-- .../main/java/chat/simplex/app/model/SimpleXAPI.kt | 3 --- .../views/usersettings/NotificationsSettingsView.kt | 8 ++++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/apps/android/app/src/main/java/chat/simplex/app/SimplexApp.kt b/apps/android/app/src/main/java/chat/simplex/app/SimplexApp.kt index 2cd3094951..198c58bb84 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/SimplexApp.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/SimplexApp.kt @@ -59,6 +59,9 @@ class SimplexApp: Application(), LifecycleEventObserver { chatModel.onboardingStage.value = OnboardingStage.Step1_SimpleXInfo } else { chatController.startChat(user) + chatController.showBackgroundServiceNoticeIfNeeded() + if (appPreferences.notificationsMode.get() == NotificationsMode.SERVICE.name) + SimplexService.start(applicationContext) } } } @@ -104,10 +107,14 @@ class SimplexApp: Application(), LifecycleEventObserver { } fun allowToStartServiceAfterAppExit() = with(chatModel.controller) { - appPrefs.notificationsMode.get() == NotificationsMode.SERVICE.name && isIgnoringBatteryOptimizations(chatModel.controller.appContext) + appPrefs.notificationsMode.get() == NotificationsMode.SERVICE.name && + (!NotificationsMode.SERVICE.requiresIgnoringBattery || isIgnoringBatteryOptimizations(chatModel.controller.appContext)) } - private fun allowToStartPeriodically() = chatModel.controller.appPrefs.notificationsMode.get() == NotificationsMode.PERIODIC.name + private fun allowToStartPeriodically() = with(chatModel.controller) { + appPrefs.notificationsMode.get() == NotificationsMode.PERIODIC.name && + (!NotificationsMode.PERIODIC.requiresIgnoringBattery || isIgnoringBatteryOptimizations(chatModel.controller.appContext)) + } /* * It takes 1-10 milliseconds to process this function. Better to do it in a background thread diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt index d6996d8a26..2198820b3e 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt @@ -1137,14 +1137,11 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a } fun isIgnoringBatteryOptimizations(context: Context): Boolean { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) return true val powerManager = context.getSystemService(Application.POWER_SERVICE) as PowerManager return powerManager.isIgnoringBatteryOptimizations(context.packageName) } private fun askAboutIgnoringBatteryOptimization(context: Context) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) return - Intent().apply { @SuppressLint("BatteryLife") action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/NotificationsSettingsView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/NotificationsSettingsView.kt index c3b519f0dc..18d989a810 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/NotificationsSettingsView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/NotificationsSettingsView.kt @@ -3,6 +3,7 @@ package chat.simplex.app.views.usersettings import SectionItemViewSpaceBetween import SectionTextFooter import SectionView +import android.os.Build import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.* @@ -24,8 +25,11 @@ import chat.simplex.app.views.helpers.* import kotlinx.coroutines.* import kotlin.collections.ArrayList -enum class NotificationsMode(val requiresIgnoringBattery: Boolean) { - OFF(false), PERIODIC(false), SERVICE(true), /*INSTANT(false) - for Firebase notifications */; +enum class NotificationsMode(private val requiresIgnoringBatterySinceSdk: Int) { + OFF(Int.MAX_VALUE), PERIODIC(Build.VERSION_CODES.M), SERVICE(Build.VERSION_CODES.S), /*INSTANT(Int.MAX_VALUE) - for Firebase notifications */; + + val requiresIgnoringBattery + get() = requiresIgnoringBatterySinceSdk <= Build.VERSION.SDK_INT companion object { val default: NotificationsMode = SERVICE