From af59b385e699ae1d592caaa3a4751b2d910cd5bd Mon Sep 17 00:00:00 2001 From: rasputin Date: Wed, 10 Jun 2026 16:44:48 +0200 Subject: [PATCH] refactor: extract pairing dialogue from nwc --- .../gudariwallet/ui/nwc/NwcPairingDialog.kt | 101 ++++++++++++++++++ .../gudariwallet/ui/nwc/NwcScreen.kt | 87 --------------- 2 files changed, 101 insertions(+), 87 deletions(-) create mode 100644 app/src/main/java/com/bitcointxoko/gudariwallet/ui/nwc/NwcPairingDialog.kt diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/nwc/NwcPairingDialog.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/nwc/NwcPairingDialog.kt new file mode 100644 index 0000000..433b92f --- /dev/null +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/nwc/NwcPairingDialog.kt @@ -0,0 +1,101 @@ +package com.bitcointxoko.gudariwallet.ui.nwc + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.view.WindowManager +import android.widget.Toast +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.core.net.toUri +import com.bitcointxoko.gudariwallet.ui.receive.QrDisplayCard + +@Composable +internal fun NwcPairingUrlDialog( + url : String, + onDismiss : () -> Unit +) { + // Brightness state lives here so the dialog owns the screen-brightness side-effect + var brightnessOn by remember { mutableStateOf(false) } + val window = (LocalContext.current as? Activity)?.window + val context = LocalContext.current + + // Boost / restore screen brightness when the toggle changes + LaunchedEffect(brightnessOn) { + window?.attributes = window.attributes?.apply { + screenBrightness = if (brightnessOn) 1f + else WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE + } + } + + // Restore brightness unconditionally when the dialog leaves composition + DisposableEffect(Unit) { + onDispose { + window?.attributes = window.attributes?.apply { + screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE + } + } + } + + AlertDialog( + onDismissRequest = onDismiss, + title = { Text("Connection created") }, + text = { + Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { + Text( + text = "Scan or copy this connection string into your app. It will not be shown again.", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + QrDisplayCard( + modifier = Modifier.fillMaxWidth(), + content = url, + contentDescription = "NWC pairing QR code", + clipLabel = "NWC connection string", + shareTitle = "Share NWC connection string", + textToCopy = url, + brightnessOn = brightnessOn, + onToggleBrightness = { brightnessOn = !brightnessOn }, + // No NFC for a one-shot pairing string + isNfcEmulating = null, + qrModifier = Modifier.fillMaxWidth(), + onOpenUri = { + val intent = Intent(Intent.ACTION_VIEW, url.toUri()) + try { + context.startActivity( + Intent.createChooser(intent, "Open in app") + ) + } catch (e: ActivityNotFoundException) { + // No app installed that handles nostr+walletconnect:// + // Show a snackbar / toast as appropriate for your app + Toast.makeText( + context, + "No compatible app found", // "No compatible app found" + Toast.LENGTH_SHORT + ).show() + } + } + ) + } + }, + confirmButton = {}, // actions live inside QrDisplayCard + dismissButton = { + TextButton(onClick = onDismiss) { Text("Done") } + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/nwc/NwcScreen.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/nwc/NwcScreen.kt index d59968b..905ef33 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/nwc/NwcScreen.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/nwc/NwcScreen.kt @@ -1,10 +1,5 @@ package com.bitcointxoko.gudariwallet.ui.nwc -import android.app.Activity -import android.content.ActivityNotFoundException -import android.content.Intent -import android.view.WindowManager -import android.widget.Toast import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items @@ -22,16 +17,13 @@ import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitcointxoko.gudariwallet.api.NwcNewBudget -import com.bitcointxoko.gudariwallet.ui.receive.QrDisplayCard import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale -import androidx.core.net.toUri // ── Screen ──────────────────────────────────────────────────────────────────── @@ -521,83 +513,4 @@ private fun BudgetRow( } } } -} - - - -// ── Pairing URL dialog ──────────────────────────────────────────────────────── - -@Composable -private fun NwcPairingUrlDialog( - url : String, - onDismiss : () -> Unit -) { - // Brightness state lives here so the dialog owns the screen-brightness side-effect - var brightnessOn by remember { mutableStateOf(false) } - val window = (LocalContext.current as? Activity)?.window - val context = LocalContext.current - - // Boost / restore screen brightness when the toggle changes - LaunchedEffect(brightnessOn) { - window?.attributes = window.attributes?.apply { - screenBrightness = if (brightnessOn) 1f - else WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE - } - } - - // Restore brightness unconditionally when the dialog leaves composition - DisposableEffect(Unit) { - onDispose { - window?.attributes = window.attributes?.apply { - screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE - } - } - } - - AlertDialog( - onDismissRequest = onDismiss, - title = { Text("Connection created") }, - text = { - Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { - Text( - text = "Scan or copy this connection string into your app. It will not be shown again.", - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant - ) - QrDisplayCard( - modifier = Modifier.fillMaxWidth(), - content = url, - contentDescription = "NWC pairing QR code", - clipLabel = "NWC connection string", - shareTitle = "Share NWC connection string", - textToCopy = url, - brightnessOn = brightnessOn, - onToggleBrightness = { brightnessOn = !brightnessOn }, - // No NFC for a one-shot pairing string - isNfcEmulating = null, - qrModifier = Modifier.fillMaxWidth(), - onOpenUri = { - val intent = Intent(Intent.ACTION_VIEW, url.toUri()) - try { - context.startActivity( - Intent.createChooser(intent, "Open in app") - ) - } catch (e: ActivityNotFoundException) { - // No app installed that handles nostr+walletconnect:// - // Show a snackbar / toast as appropriate for your app - Toast.makeText( - context, - "No compatible app found", // "No compatible app found" - Toast.LENGTH_SHORT - ).show() - } - } - ) - } - }, - confirmButton = {}, // actions live inside QrDisplayCard - dismissButton = { - TextButton(onClick = onDismiss) { Text("Done") } - } - ) } \ No newline at end of file