feat: implement notification permission handling in ServerSetupScreen and ensure consistent preference updates

This commit is contained in:
2025-11-11 23:36:38 +01:00
parent d6a3abab1a
commit a7f7797616
@@ -1,6 +1,8 @@
package com.collabtable.app.ui.screens package com.collabtable.app.ui.screens
import android.os.Build import android.os.Build
import android.Manifest
import android.content.pm.PackageManager
import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
@@ -45,6 +47,7 @@ import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.collabtable.app.data.preferences.PreferencesManager import com.collabtable.app.data.preferences.PreferencesManager
import androidx.core.content.ContextCompat
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -60,25 +63,54 @@ fun ServerSetupScreen(onSetupComplete: () -> Unit) {
val validationResult by viewModel.validationResult.collectAsState() val validationResult by viewModel.validationResult.collectAsState()
val validationError by viewModel.validationError.collectAsState() val validationError by viewModel.validationError.collectAsState()
var completed by remember { mutableStateOf(false) }
fun finishOnce() {
if (!completed) {
completed = true
onSetupComplete()
}
}
val permissionLauncher = val permissionLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
// If granted, enable all; else disable all // If granted, enable all; else disable all
preferencesManager.setNotifyListAddedEnabled(granted) preferencesManager.setNotifyListAddedEnabled(granted)
preferencesManager.setNotifyListEditedEnabled(granted) preferencesManager.setNotifyListEditedEnabled(granted)
preferencesManager.setNotifyListRemovedEnabled(granted) preferencesManager.setNotifyListRemovedEnabled(granted)
onSetupComplete() // Also set content-updated preference consistently
try {
preferencesManager.setNotifyListContentUpdatedEnabled(granted)
} catch (_: Throwable) {
// Older builds may not have this preference; ignore
}
finishOnce()
} }
LaunchedEffect(validationResult) { LaunchedEffect(validationResult) {
if (validationResult == true) { if (validationResult == true && !completed) {
// On Android 13+ prompt for notifications; otherwise default to enabled // On Android 13+ prompt for notifications; otherwise default to enabled
if (Build.VERSION.SDK_INT >= 33) { if (Build.VERSION.SDK_INT >= 33) {
permissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS) val granted =
ContextCompat.checkSelfPermission(
context,
Manifest.permission.POST_NOTIFICATIONS,
) == PackageManager.PERMISSION_GRANTED
if (granted) {
preferencesManager.setNotifyListAddedEnabled(true)
preferencesManager.setNotifyListEditedEnabled(true)
preferencesManager.setNotifyListRemovedEnabled(true)
try { preferencesManager.setNotifyListContentUpdatedEnabled(true) } catch (_: Throwable) {}
finishOnce()
} else {
// Request permission; callback will complete
permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
} else { } else {
preferencesManager.setNotifyListAddedEnabled(true) preferencesManager.setNotifyListAddedEnabled(true)
preferencesManager.setNotifyListEditedEnabled(true) preferencesManager.setNotifyListEditedEnabled(true)
preferencesManager.setNotifyListRemovedEnabled(true) preferencesManager.setNotifyListRemovedEnabled(true)
onSetupComplete() try { preferencesManager.setNotifyListContentUpdatedEnabled(true) } catch (_: Throwable) {}
finishOnce()
} }
} }
} }