Fix doze banner dismissal.

Closes signalapp/Signal-Android#14883
This commit is contained in:
Oscar Mira
2026-08-19 19:05:49 -04:00
committed by Cody Henthorne
parent a339a7a1a7
commit 6086781d68
3 changed files with 33 additions and 12 deletions
@@ -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<Unit>() {
class DozeBanner(private val context: Context) : Banner<Unit>() {
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<Unit>
get() = flowOf(Unit)
private val enabledState = MutableStateFlow(enabled)
override val stateUpdates: Flow<Unit>
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
@@ -835,10 +835,7 @@ public class ConversationListFragment extends MainFragment implements Conversati
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) -> {
@@ -20,8 +20,12 @@ public class PowerManagerCompat {
}
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()));
}
}