fix(setup_activity): permission screen crash

This commit is contained in:
rhunk 2023-10-04 22:42:13 +02:00
parent d4d0362b0e
commit 2917f1b6e5
3 changed files with 53 additions and 31 deletions

View File

@ -141,6 +141,10 @@ class SetupActivity : ComponentActivity() {
) {
requiredScreens.forEach { screen ->
screen.allowNext = { canGoNext = it }
screen.goNext = {
canGoNext = true
nextScreen()
}
composable(screen.route) {
BackHandler(true) {}
Column(

View File

@ -12,6 +12,7 @@ import me.rhunk.snapenhance.RemoteSideContext
abstract class SetupScreen {
lateinit var context: RemoteSideContext
lateinit var allowNext: (Boolean) -> Unit
lateinit var goNext: () -> Unit
lateinit var route: String
@Composable

View File

@ -18,6 +18,7 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.OutlinedCard
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.launch
@ -56,56 +57,70 @@ class PermissionsScreen : SetupScreen() {
var isBatteryOptimisationIgnored by remember { mutableStateOf(false) }
val coroutineScope = rememberCoroutineScope()
LaunchedEffect(Unit) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
notificationPermissionGranted = context.androidContext.checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
}
val powerManager = context.androidContext.getSystemService(Context.POWER_SERVICE) as PowerManager
isBatteryOptimisationIgnored = powerManager.isIgnoringBatteryOptimizations(context.androidContext.packageName)
}
if (isBatteryOptimisationIgnored && notificationPermissionGranted) {
allowNext(true)
} else {
allowNext(false)
}
LaunchedEffect(Unit) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
notificationPermissionGranted =
context.androidContext.checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
}
val powerManager =
context.androidContext.getSystemService(Context.POWER_SERVICE) as PowerManager
isBatteryOptimisationIgnored =
powerManager.isIgnoringBatteryOptimizations(context.androidContext.packageName)
if (isBatteryOptimisationIgnored && notificationPermissionGranted) {
goNext()
}
}
DialogText(text = context.translation["setup.permissions.dialog"])
OutlinedCard(
modifier = Modifier
.padding(16.dp)
.fillMaxWidth(),
) {
Column(
verticalArrangement = Arrangement.spacedBy(16.dp),
modifier = Modifier
.padding(5.dp)
.padding(all = 16.dp),
) {
Row(
horizontalArrangement = Arrangement.Absolute.SpaceAround
verticalAlignment = Alignment.CenterVertically,
) {
DialogText(text = context.translation["setup.permissions.dialog"], modifier = Modifier.weight(1f))
DialogText(
text = context.translation["setup.permissions.notification_access"],
modifier = Modifier.weight(1f)
)
if (notificationPermissionGranted) {
GrantedIcon()
return@Row
}
} else {
RequestButton {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
activityLauncherHelper.requestPermission(Manifest.permission.POST_NOTIFICATIONS) { resultCode, _ ->
coroutineScope.launch {
notificationPermissionGranted = resultCode == ComponentActivity.RESULT_OK
notificationPermissionGranted =
resultCode == ComponentActivity.RESULT_OK
}
}
}
}
}
Row {
DialogText(text = context.translation["setup.permissions.battery_optimization"], modifier = Modifier.weight(1f))
}
Row(
verticalAlignment = Alignment.CenterVertically,
) {
DialogText(
text = context.translation["setup.permissions.battery_optimization"],
modifier = Modifier.weight(1f)
)
if (isBatteryOptimisationIgnored) {
GrantedIcon()
return@Row
}
} else {
RequestButton {
activityLauncherHelper.launch(Intent().apply {
action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
@ -117,6 +132,8 @@ class PermissionsScreen : SetupScreen() {
}
}
}
}
}
}
}