package com.vitorpamplona.amethyst.ui.screen.loggedIn import android.app.Activity import android.content.Context import android.content.ContextWrapper import android.widget.Toast import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.ActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth 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.material3.Button import androidx.compose.material3.ButtonDefaults 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.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ClipboardManager import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import androidx.fragment.app.FragmentActivity import com.halilibo.richtext.markdown.Markdown import com.halilibo.richtext.ui.RichTextStyle import com.halilibo.richtext.ui.material3.Material3RichText import com.halilibo.richtext.ui.resolveDefaults import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.ui.actions.CloseButton import com.vitorpamplona.amethyst.ui.note.authenticate import com.vitorpamplona.amethyst.ui.theme.ButtonBorder import com.vitorpamplona.quartz.encoders.toNsec import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @Composable fun AccountBackupDialog(account: Account, 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(onPress = onClose) } Column( modifier = Modifier .fillMaxSize() .padding(horizontal = 30.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Material3RichText( style = RichTextStyle().resolveDefaults() ) { Markdown( content = stringResource(R.string.account_backup_tips_md) ) } Spacer(modifier = Modifier.height(30.dp)) NSecCopyButton(account) } } } } } @Composable private fun NSecCopyButton( account: Account ) { val clipboardManager = LocalClipboardManager.current val context = LocalContext.current val scope = rememberCoroutineScope() val keyguardLauncher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode == Activity.RESULT_OK) { copyNSec(context, scope, account, clipboardManager) } } Button( modifier = Modifier.padding(horizontal = 3.dp), onClick = { authenticate( title = context.getString(R.string.copy_my_secret_key), context = context, scope = scope, keyguardLauncher = keyguardLauncher ) { copyNSec(context, scope, account, clipboardManager) } }, shape = ButtonBorder, colors = ButtonDefaults.buttonColors( containerColor = MaterialTheme.colorScheme.primary ), contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp) ) { Icon( tint = MaterialTheme.colorScheme.onPrimary, imageVector = Icons.Default.Key, contentDescription = stringResource(R.string.copies_the_nsec_id_your_password_to_the_clipboard_for_backup), modifier = Modifier.padding(end = 5.dp) ) Text(stringResource(id = R.string.copy_my_secret_key), color = MaterialTheme.colorScheme.onPrimary) } } fun Context.getFragmentActivity(): FragmentActivity? { var currentContext = this while (currentContext is ContextWrapper) { if (currentContext is FragmentActivity) { return currentContext } currentContext = currentContext.baseContext } return null } private fun copyNSec( context: Context, scope: CoroutineScope, account: Account, clipboardManager: ClipboardManager ) { account.keyPair.privKey?.let { clipboardManager.setText(AnnotatedString(it.toNsec())) scope.launch { Toast.makeText( context, context.getString(R.string.secret_key_copied_to_clipboard), Toast.LENGTH_SHORT ).show() } } }