LocalNetworkPermissionDialog.kt
/*
* This file is part of GNU Taler
* (C) 2026 Taler Systems S.A.
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package net.taler.merchantpos.config
import android.content.Context
import android.content.Intent
import android.provider.Settings
import androidx.activity.compose.LocalActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.core.app.ActivityCompat
import androidx.core.content.edit
import androidx.core.net.toUri
import net.taler.merchantpos.R
@Composable
fun LocalNetworkPermissionDialog(access: LocalNetworkAccess)
{
val context = LocalContext.current
val activity = LocalActivity.current ?: return
val prefs = remember { context.getSharedPreferences("local-network-permission", Context.MODE_PRIVATE) }
val permission =
rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) {
access.permissionResult()
}
val settings =
rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
access.permissionResult()
}
val host = access.host ?: return
val blocked =
remember(access.permissionResults, host) {
prefs.getBoolean("requested", false) &&
!ActivityCompat.shouldShowRequestPermissionRationale(activity, LOCAL_NETWORK_PERMISSION)
}
AlertDialog(
onDismissRequest = access::dismiss,
title = { Text(stringResource(R.string.config_local_network_title)) },
text = {
Text(
stringResource(
if (blocked) R.string.config_local_network_settings else R.string.config_local_network_explanation,
host,
),
)
},
confirmButton = {
TextButton(
onClick = {
if (blocked)
{
settings.launch(
Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
"package:${context.packageName}".toUri(),
)
)
}
else
{
prefs.edit { putBoolean("requested", true) }
permission.launch(LOCAL_NETWORK_PERMISSION)
}
}
) {
Text(
stringResource(
if (blocked) R.string.config_camera_open_settings else R.string.config_local_network_allow
)
)
}
},
dismissButton = {
TextButton(onClick = access::dismiss) { Text(stringResource(android.R.string.cancel)) }
},
)
}