Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -23,28 +27,44 @@ 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)

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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()));
}
}