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