From 1b1316d4dcbe6e9e96ecacd3107208e47b00e6b9 Mon Sep 17 00:00:00 2001 From: rushiiMachine <33725716+rushiiMachine@users.noreply.github.com> Date: Sat, 2 Mar 2024 16:43:26 -0800 Subject: [PATCH] feat(InstallScreen): use wakelock while running --- app/src/main/AndroidManifest.xml | 3 +- .../manager/ui/components/Wakelock.kt | 39 +++++++++++++++++++ .../ui/screens/install/InstallScreen.kt | 4 ++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/components/Wakelock.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c38cc8..42f1ae2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,8 +2,9 @@ - + + diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/components/Wakelock.kt b/app/src/main/kotlin/com/aliucord/manager/ui/components/Wakelock.kt new file mode 100644 index 0000000..69de57a --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/ui/components/Wakelock.kt @@ -0,0 +1,39 @@ +package com.aliucord.manager.ui.components + +import android.app.Activity +import android.content.Context +import android.content.ContextWrapper +import android.view.WindowManager +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.ui.platform.LocalContext + +/** + * Maintain an active screen wakelock as long as [active] is true and this component is in scope. + */ +@Composable +fun Wakelock(active: Boolean = false) { + val context = LocalContext.current + DisposableEffect(active) { + val window = context.findActivity()?.window + + if (active) { + window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } else { + window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } + + onDispose { + window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } + } +} + +private fun Context.findActivity(): Activity? { + var context = this + while (context is ContextWrapper) { + if (context is Activity) return context + context = context.baseContext + } + return null +} diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallScreen.kt index 99e8634..cc7255b 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallScreen.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallScreen.kt @@ -25,6 +25,7 @@ import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup +import com.aliucord.manager.ui.components.Wakelock import com.aliucord.manager.ui.components.back import com.aliucord.manager.ui.components.dialogs.InstallerAbortDialog import com.aliucord.manager.ui.screens.install.components.StepGroupCard @@ -45,6 +46,9 @@ class InstallScreen(private val data: InstallOptions) : Screen { navigator.back(currentActivity = null) } + // Prevent screen from turning off while working + Wakelock(active = state.value is InstallScreenState.Working) + // Exit warning dialog (dismiss itself if install process state changes, esp. for Success) var showAbortWarning by remember(model.state.collectAsState()) { mutableStateOf(false) }