diff --git a/app/src/main/java/org/thoughtcrime/securesms/banner/banners/DozeBanner.kt b/app/src/main/java/org/thoughtcrime/securesms/banner/banners/DozeBanner.kt index 84627cbb30c..9c8c7c7d9f5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/banner/banners/DozeBanner.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/banner/banners/DozeBanner.kt @@ -6,12 +6,16 @@ package org.thoughtcrime.securesms.banner.banners import android.content.Context +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.PaddingValues import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map import org.signal.core.ui.compose.DayNightPreviews import org.signal.core.ui.compose.Previews import org.signal.core.util.ServiceUtil @@ -23,7 +27,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.util.PowerManagerCompat import org.thoughtcrime.securesms.util.TextSecurePreferences -class DozeBanner(private val context: Context, private val onDismissListener: () -> Unit) : Banner() { +class DozeBanner(private val context: Context) : Banner() { override val enabled: Boolean get() = !SignalStore.account.fcmEnabled && !TextSecurePreferences.hasPromptedOptimizeDoze(context) && !ServiceUtil.getPowerManager(context).isIgnoringBatteryOptimizations(context.packageName) @@ -31,20 +35,36 @@ class DozeBanner(private val context: Context, private val onDismissListener: () override val dataFlow: Flow get() = flowOf(Unit) + private val enabledState = MutableStateFlow(enabled) + + override val stateUpdates: Flow + get() = enabledState.map { } + @Composable override fun DisplayBanner(model: Unit, contentPadding: PaddingValues) { + val batteryOptLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.StartActivityForResult() + ) { _ -> + markAsPrompted() + } + Banner( contentPadding = contentPadding, onDismissListener = { - TextSecurePreferences.setPromptedOptimizeDoze(context, true) - onDismissListener.invoke() + markAsPrompted() }, onOkListener = { - TextSecurePreferences.setPromptedOptimizeDoze(context, true) - PowerManagerCompat.requestIgnoreBatteryOptimizations(context) + batteryOptLauncher.launch( + PowerManagerCompat.buildRequestIgnoreBatteryOptimizationsIntent(context) + ) } ) } + + private fun markAsPrompted() { + TextSecurePreferences.setPromptedOptimizeDoze(context, true) + enabledState.value = false + } } @Composable diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index 9bf8dda77fa..107925eff93 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -836,10 +836,7 @@ private void initializeBanners() { new UnauthorizedBanner(requireContext()), new ServiceOutageBanner(requireContext()), new OutdatedBuildBanner(), - new DozeBanner(requireContext(), () -> { - bannerManager.updateContent(bannerView.get()); - return Unit.INSTANCE; - }), + new DozeBanner(requireContext()), new CdsTemporaryErrorBanner(getChildFragmentManager()), new CdsPermanentErrorBanner(getChildFragmentManager()), new UsernameOutOfSyncBanner((usernameSyncState) -> { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/PowerManagerCompat.java b/app/src/main/java/org/thoughtcrime/securesms/util/PowerManagerCompat.java index 066b9dba992..003cbd8da39 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/PowerManagerCompat.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/PowerManagerCompat.java @@ -20,8 +20,12 @@ public static boolean isIgnoringBatteryOptimizations(@NonNull Context context) { } public static void requestIgnoreBatteryOptimizations(@NonNull Context context) { - Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, - Uri.parse("package:" + context.getPackageName())); - context.startActivity(intent); + context.startActivity(buildRequestIgnoreBatteryOptimizationsIntent(context)); + } + + @NonNull + public static Intent buildRequestIgnoreBatteryOptimizationsIntent(@NonNull Context context) { + return new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, + Uri.parse("package:" + context.getPackageName())); } }