Skip to content

Commit 1b1316d

Browse files
committed
feat(InstallScreen): use wakelock while running
1 parent 82096ad commit 1b1316d

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

app/src/main/AndroidManifest.xml

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools">
44

5-
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
65
<uses-permission android:name="android.permission.INTERNET" />
6+
<uses-permission android:name="android.permission.WAKE_LOCK" />
7+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
78
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
89
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
910
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.aliucord.manager.ui.components
2+
3+
import android.app.Activity
4+
import android.content.Context
5+
import android.content.ContextWrapper
6+
import android.view.WindowManager
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.runtime.DisposableEffect
9+
import androidx.compose.ui.platform.LocalContext
10+
11+
/**
12+
* Maintain an active screen wakelock as long as [active] is true and this component is in scope.
13+
*/
14+
@Composable
15+
fun Wakelock(active: Boolean = false) {
16+
val context = LocalContext.current
17+
DisposableEffect(active) {
18+
val window = context.findActivity()?.window
19+
20+
if (active) {
21+
window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
22+
} else {
23+
window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
24+
}
25+
26+
onDispose {
27+
window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
28+
}
29+
}
30+
}
31+
32+
private fun Context.findActivity(): Activity? {
33+
var context = this
34+
while (context is ContextWrapper) {
35+
if (context is Activity) return context
36+
context = context.baseContext
37+
}
38+
return null
39+
}

app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallScreen.kt

+4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import cafe.adriel.voyager.navigator.LocalNavigator
2525
import cafe.adriel.voyager.navigator.currentOrThrow
2626
import com.aliucord.manager.R
2727
import com.aliucord.manager.installer.steps.StepGroup
28+
import com.aliucord.manager.ui.components.Wakelock
2829
import com.aliucord.manager.ui.components.back
2930
import com.aliucord.manager.ui.components.dialogs.InstallerAbortDialog
3031
import com.aliucord.manager.ui.screens.install.components.StepGroupCard
@@ -45,6 +46,9 @@ class InstallScreen(private val data: InstallOptions) : Screen {
4546
navigator.back(currentActivity = null)
4647
}
4748

49+
// Prevent screen from turning off while working
50+
Wakelock(active = state.value is InstallScreenState.Working)
51+
4852
// Exit warning dialog (dismiss itself if install process state changes, esp. for Success)
4953
var showAbortWarning by remember(model.state.collectAsState()) { mutableStateOf(false) }
5054

0 commit comments

Comments
 (0)