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)) }
        },
    )
}