From db766c2acc1d349a697d47164e81e24bccd53713 Mon Sep 17 00:00:00 2001 From: Sweetbread Date: Sat, 3 May 2025 17:19:54 +0300 Subject: [PATCH] feat: ask permissions --- app/src/main/AndroidManifest.xml | 5 + .../ru/risdeveau/geotracker/MainActivity.kt | 99 ++++++++++++++++--- 2 files changed, 90 insertions(+), 14 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b5b7bc1..e2b8fbe 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,11 @@ + + + + (Screen.Loading) } when (screen) { - Screen.Main -> TODO() + Screen.Main -> { + Text("Hello world") + } Screen.Settings -> { - Settings(Modifier.align(Alignment.Center)) + Settings(Modifier.align(Alignment.Center)) { + screen = Screen.Main + } } Screen.Loading -> { @@ -90,8 +98,9 @@ sealed class Screen { object Loading : Screen() } +@OptIn(ExperimentalSplittiesApi::class) @Composable -fun Settings(modifier: Modifier = Modifier) { +fun Settings(modifier: Modifier = Modifier, onConfirm: () -> Unit) { var username by remember { mutableStateOf("") } var url by remember { mutableStateOf("") } var urlIsValid by remember { mutableStateOf(false) } @@ -116,13 +125,75 @@ fun Settings(modifier: Modifier = Modifier) { OutlinedTextField( value = url, onValueChange = { url = it }, - placeholder = { Text("https://geo.example.com", style = TextStyle(color = MaterialTheme.colorScheme.onSurfaceVariant)) }, + placeholder = { + Text("https://geo.example.com", + style = TextStyle(color = MaterialTheme.colorScheme.onSurfaceVariant) + ) + }, label = { Text(appStr(R.string.server_url)) }, - trailingIcon = { if (loading) CircularProgressIndicator() } + trailingIcon = { + if (loading) CircularProgressIndicator() + else if (urlIsValid) Icon(Icons.Outlined.Done, "Done") + } ) - Button({}, enabled = urlIsValid) { + LocationPermissionScreen() + + Button({ + SettingsPreferences.username = username.trim() + SettingsPreferences.url = url + onConfirm() + }, enabled = urlIsValid + && !loading + && username.trim().isNotEmpty() + && hasLocationPermissions(appCtx) + ) { Text(appStr(R.string.apply)) } } +} + +@Composable +fun LocationPermissionScreen() { + val context = LocalContext.current + val locationPermissions = arrayOf( + Manifest.permission.ACCESS_FINE_LOCATION + ) + + val hasLocationPermissions = remember { + mutableStateOf( + locationPermissions.all { + ContextCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED + } + ) + } + + val permissionLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.RequestMultiplePermissions() + ) { permissions -> + hasLocationPermissions.value = permissions.all { it.value } + } + + if (hasLocationPermissions.value) { + Button({}, enabled = false) { + Icon(Icons.Outlined.Done, "Done") + Text("Разрешения получены") + } + } else { + Button(onClick = { + permissionLauncher.launch(locationPermissions) + }) { + Text("Получить разрешения") + } + } +} + +fun hasLocationPermissions(context: Context): Boolean { + return ContextCompat.checkSelfPermission( + context, + Manifest.permission.ACCESS_FINE_LOCATION + ) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission( + context, + Manifest.permission.ACCESS_COARSE_LOCATION + ) == PackageManager.PERMISSION_GRANTED } \ No newline at end of file