From d79c0ffb9dc9431fe0757a703e10f518dfa79523 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Mon, 19 Feb 2024 17:20:35 -0300 Subject: [PATCH] add button to show qrcode with you private key --- .../nostrsigner/ui/QrCodeDrawer.kt | 5 +- .../ui/actions/AccountBackupDialog.kt | 104 ++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + 3 files changed, 108 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/QrCodeDrawer.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/QrCodeDrawer.kt index 60273ce8..a57aeb43 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/QrCodeDrawer.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/QrCodeDrawer.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier @@ -34,13 +33,13 @@ fun QrCodeDrawer(contents: String, modifier: Modifier = Modifier) { createQrCode(contents = contents) } - val foregroundColor = MaterialTheme.colorScheme.onSurface + val foregroundColor = Color.Black Box( modifier = modifier .defaultMinSize(48.dp, 48.dp) .aspectRatio(1f) - .background(MaterialTheme.colorScheme.background) + .background(Color.White) ) { Canvas(modifier = Modifier.fillMaxSize()) { // Calculate the height and width of each column/row diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/AccountBackupDialog.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/AccountBackupDialog.kt index ef312ac6..8d7293b4 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/AccountBackupDialog.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/AccountBackupDialog.kt @@ -18,13 +18,18 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Key +import androidx.compose.material.icons.filled.QrCode import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ClipboardManager @@ -38,8 +43,10 @@ import androidx.compose.ui.window.DialogProperties import com.greenart7c3.nostrsigner.R import com.greenart7c3.nostrsigner.models.Account import com.greenart7c3.nostrsigner.service.Biometrics +import com.greenart7c3.nostrsigner.ui.QrCodeDrawer import com.greenart7c3.nostrsigner.ui.components.CloseButton import com.greenart7c3.nostrsigner.ui.theme.ButtonBorder +import com.greenart7c3.nostrsigner.ui.theme.Size35dp import com.halilibo.richtext.markdown.Markdown import com.halilibo.richtext.ui.RichTextStyle import com.halilibo.richtext.ui.material3.Material3RichText @@ -89,6 +96,7 @@ fun AccountBackupDialog(account: Account, onClose: () -> Unit) { Spacer(modifier = Modifier.height(30.dp)) NSecCopyButton(account) + NSecQrButton(account) NPubCopyButton(account) } } @@ -96,6 +104,102 @@ fun AccountBackupDialog(account: Account, onClose: () -> Unit) { } } +@Composable +private fun NSecQrButton( + account: Account +) { + val context = LocalContext.current + val scope = rememberCoroutineScope() + var showDialog by remember { + mutableStateOf(false) + } + + if (showDialog) { + QrCodeDialog( + content = account.keyPair.privKey!!.toNsec() + ) { + showDialog = false + } + } + + val keyguardLauncher = + rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + showDialog = true + } + } + + Button( + modifier = Modifier.padding(horizontal = 3.dp), + onClick = { + Biometrics.authenticate( + title = context.getString(R.string.show_qr_code), + context = context, + scope = scope, + keyguardLauncher = keyguardLauncher + ) { + showDialog = true + } + }, + shape = ButtonBorder, + contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp) + ) { + Icon( + tint = MaterialTheme.colorScheme.onPrimary, + imageVector = Icons.Default.QrCode, + contentDescription = stringResource(R.string.shows_qr_code_with_you_private_key), + modifier = Modifier.padding(end = 5.dp) + ) + Text( + stringResource(id = R.string.show_qr_code), + color = MaterialTheme.colorScheme.onPrimary + ) + } +} + +@Composable +private fun QrCodeDialog(content: String, onClose: () -> Unit) { + Dialog( + onDismissRequest = onClose, + properties = DialogProperties(usePlatformDefaultWidth = false) + ) { + Surface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .background(MaterialTheme.colorScheme.background) + .fillMaxSize() + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(10.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + CloseButton(onCancel = onClose) + } + + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 30.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Row( + horizontalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = Size35dp) + ) { + QrCodeDrawer(content) + } + } + } + } + } +} + @Composable private fun NSecCopyButton( account: Account diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ebd542ac..d13c0ca9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,4 +74,6 @@ https://opensats.org https://github.com/greenart7c3/amber Made possible by + Show QR Code + Shows QR Code with you private key \ No newline at end of file