From 68dcb851eb2141e1392d570db2abdb2077791a59 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 31 Aug 2026 12:54:59 -0400 Subject: [PATCH] Keep screen on during recording. --- .../signal/core/ui/compose/KeepScreenOnEffect.kt | 14 ++++++++------ .../main/java/org/signal/camera/CameraScreen.kt | 3 +++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/core/ui/src/main/java/org/signal/core/ui/compose/KeepScreenOnEffect.kt b/core/ui/src/main/java/org/signal/core/ui/compose/KeepScreenOnEffect.kt index de910100ba..4da46a6e71 100644 --- a/core/ui/src/main/java/org/signal/core/ui/compose/KeepScreenOnEffect.kt +++ b/core/ui/src/main/java/org/signal/core/ui/compose/KeepScreenOnEffect.kt @@ -5,22 +5,24 @@ package org.signal.core.ui.compose -import android.app.Activity import android.view.WindowManager +import androidx.activity.compose.LocalActivity import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect -import androidx.compose.ui.platform.LocalContext /** * Keeps the screen on while this composable is in the composition by toggling * [WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON] on the host activity window. + * + * @param enabled When false, the flag is left alone, letting callers scope the effect to a piece of state without + * having to conditionally compose it. */ @Composable -fun KeepScreenOnEffect() { - val context = LocalContext.current +fun KeepScreenOnEffect(enabled: Boolean = true) { + val activity = LocalActivity.current - DisposableEffect(Unit) { - val window = (context as? Activity)?.window + DisposableEffect(activity, enabled) { + val window = if (enabled) activity?.window else null window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) onDispose { diff --git a/feature/camera/src/main/java/org/signal/camera/CameraScreen.kt b/feature/camera/src/main/java/org/signal/camera/CameraScreen.kt index 7be94cbbf7..a08b878ad1 100644 --- a/feature/camera/src/main/java/org/signal/camera/CameraScreen.kt +++ b/feature/camera/src/main/java/org/signal/camera/CameraScreen.kt @@ -43,6 +43,7 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.signal.core.ui.compose.AllNightPreviews +import org.signal.core.ui.compose.KeepScreenOnEffect import org.signal.core.ui.compose.Previews import kotlin.time.Duration.Companion.milliseconds import androidx.camera.core.Preview as CameraPreview @@ -92,6 +93,8 @@ fun CameraScreen( var surfaceRequest by remember { mutableStateOf(null) } + KeepScreenOnEffect(enabled = state.isRecording) + // Bind once; a screen rotation rebuilds just the preview (below), not the whole camera. LaunchedEffect(lifecycleOwner, state.lensFacing) { val cameraProvider = ProcessCameraProvider.getInstance(context).get()