From 4e4d041e748965bc5d06a5d5ac2984b5d1c46821 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Fri, 19 Apr 2024 14:52:27 -0300 Subject: [PATCH] opent edit screen when adding new app, add edit relays dialog --- .../nostrsigner/ui/EditPermission.kt | 183 +++++++++++++++++- .../greenart7c3/nostrsigner/ui/MainScreen.kt | 5 +- .../nostrsigner/ui/PermissionsScreen.kt | 6 - app/src/main/res/values/strings.xml | 1 + 4 files changed, 179 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/EditPermission.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/EditPermission.kt index 3f8d8a66..18093d41 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/EditPermission.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/EditPermission.kt @@ -1,9 +1,12 @@ package com.greenart7c3.nostrsigner.ui +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -11,6 +14,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.ContentPaste @@ -20,7 +24,9 @@ import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Surface import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TextButton @@ -47,16 +53,20 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.toLowerCase import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties import androidx.navigation.NavController import com.greenart7c3.nostrsigner.LocalPreferences import com.greenart7c3.nostrsigner.R import com.greenart7c3.nostrsigner.database.AppDatabase import com.greenart7c3.nostrsigner.database.ApplicationEntity import com.greenart7c3.nostrsigner.database.ApplicationPermissionsEntity +import com.greenart7c3.nostrsigner.database.ApplicationWithPermissions import com.greenart7c3.nostrsigner.models.Account import com.greenart7c3.nostrsigner.models.Permission -import com.greenart7c3.nostrsigner.nostrsigner import com.greenart7c3.nostrsigner.ui.actions.QrCodeDialog +import com.greenart7c3.nostrsigner.ui.components.CloseButton +import com.greenart7c3.nostrsigner.ui.components.PostButton import com.greenart7c3.nostrsigner.ui.navigation.Route import com.vitorpamplona.quartz.encoders.toHexKey import com.vitorpamplona.quartz.encoders.toNpub @@ -90,13 +100,148 @@ fun EditPermission( mutableStateOf(applicationData.useSecret) } val secret = if (checked) "&secret=${applicationData.secret}" else "" - val bunkerUri = "bunker://${account.keyPair.pubKey.toHexKey()}?relay=wss://relay.nsec.app$secret" + var bunkerUri by remember { + mutableStateOf("bunker://${account.keyPair.pubKey.toHexKey()}?relay=wss://relay.nsec.app$secret") + } + var editRelaysDialog by remember { + mutableStateOf(false) + } LaunchedEffect(Unit) { scope.launch(Dispatchers.IO) { permissions.addAll(database.applicationDao().getAllByKey(selectedPackage).sortedBy { "${it.type}-${it.kind}" }) applicationData = database.applicationDao().getByKey(selectedPackage)!!.application checked = applicationData.useSecret + val relays = applicationData.relays.joinToString(separator = "&") { "relay=$it" } + val localSecret = if (checked) "&secret=${applicationData.secret}" else "" + bunkerUri = "bunker://${account.keyPair.pubKey.toHexKey()}?$relays$localSecret" + } + } + + if (editRelaysDialog) { + val relays2 = remember { + val localRelays = mutableStateListOf() + applicationData.relays.forEach { + localRelays.add(it) + } + localRelays + } + Dialog( + onDismissRequest = { + editRelaysDialog = false + }, + 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 { + editRelaysDialog = false + } + PostButton( + isActive = true, + onPost = { + applicationData = applicationData.copy( + relays = relays2.map { it } + ) + val relays = applicationData.relays.joinToString(separator = "&") { "relay=$it" } + bunkerUri = "bunker://${account.keyPair.pubKey.toHexKey()}?$relays$secret" + editRelaysDialog = false + } + ) + } + LazyColumn( + Modifier + .fillMaxHeight(0.9f) + .fillMaxWidth() + ) { + items(relays2.size) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + relays2[it], + Modifier + .weight(0.9f) + .padding(8.dp), + fontWeight = FontWeight.Bold, + fontSize = 18.sp, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + IconButton( + onClick = { + relays2.removeAt(it) + } + ) { + Icon( + Icons.Default.Delete, + stringResource(R.string.delete) + ) + } + } + } + } + Row( + Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + OutlinedTextField( + modifier = Modifier + .fillMaxWidth(0.9f) + .padding(horizontal = 16.dp), + value = textFieldvalue.text, + keyboardOptions = KeyboardOptions( + imeAction = ImeAction.Done + ), + onValueChange = { + textFieldvalue = TextFieldValue(it) + }, + label = { + Text("Relay") + } + ) + IconButton( + onClick = { + val url = textFieldvalue.text + if (url.isNotBlank() && url != "/") { + var addedWSS = + if (!url.startsWith("wss://") && !url.startsWith("ws://")) { + if (url.endsWith(".onion") || url.endsWith(".onion/")) { + "ws://$url" + } else { + "wss://$url" + } + } else { + url + } + if (url.endsWith("/")) addedWSS = addedWSS.dropLast(1) + relays2.add(addedWSS) + textFieldvalue = TextFieldValue("") + } + } + ) { + Icon( + Icons.Default.Add, + null + ) + } + } + } + } } } @@ -182,6 +327,9 @@ fun EditPermission( .padding(horizontal = 8.dp) .clickable { checked = !checked + val relays = applicationData.relays.joinToString(separator = "&") { "relay=$it" } + val localSecret = if (checked) "&secret=${applicationData.secret}" else "" + bunkerUri = "bunker://${account.keyPair.pubKey.toHexKey()}?$relays$localSecret" } ) { Text( @@ -211,6 +359,21 @@ fun EditPermission( Text("Name") } ) + if (!applicationData.isConnected) { + Row( + Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + Button( + onClick = { + editRelaysDialog = true + }, + Modifier.padding(6.dp) + ) { + Text(stringResource(R.string.relays)) + } + } + } LazyColumn( Modifier.weight(1f) ) { @@ -303,11 +466,17 @@ fun EditPermission( Button( onClick = { scope.launch(Dispatchers.IO) { - database.applicationDao().deletePermissions(selectedPackage) - database.applicationDao().insertPermissions(permissions) - database - .applicationDao() - .changeApplicationName(selectedPackage, textFieldvalue.text) + val localApplicationData = applicationData.copy( + name = textFieldvalue.text, + useSecret = checked + ) + database.applicationDao().delete(applicationData) + database.applicationDao().insertApplicationWithPermissions( + ApplicationWithPermissions( + localApplicationData, + permissions + ) + ) scope.launch(Dispatchers.Main) { navController.popBackStack() diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt index 781e929b..97eacde7 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt @@ -552,8 +552,8 @@ fun MainScreen( accountStateViewModel, account ) { + val secret = UUID.randomUUID().toString().substring(0, 6) scope.launch(Dispatchers.IO) { - val secret = UUID.randomUUID().toString().substring(0, 6) val application = ApplicationEntity( secret, "", @@ -573,8 +573,7 @@ fun MainScreen( val bunkerUrl = "bunker://${account.keyPair.pubKey.toHexKey()}?relay=wss://relay.nsec.app" clipboardManager.setText(AnnotatedString(bunkerUrl)) scope.launch(Dispatchers.Main) { - navController.popBackStack() - accountStateViewModel.switchUser(account.keyPair.pubKey.toNpub(), Route.Permissions.route) + navController.navigate("Permission/$secret") } } } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/PermissionsScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/PermissionsScreen.kt index e439dcf5..b8f886d4 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/PermissionsScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/PermissionsScreen.kt @@ -26,14 +26,12 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.lifecycle.Lifecycle import androidx.navigation.NavController import com.greenart7c3.nostrsigner.LocalPreferences import com.greenart7c3.nostrsigner.R import com.greenart7c3.nostrsigner.database.AppDatabase import com.greenart7c3.nostrsigner.database.ApplicationEntity import com.greenart7c3.nostrsigner.models.Account -import com.greenart7c3.nostrsigner.nostrsigner import com.greenart7c3.nostrsigner.service.toShortenHex import com.greenart7c3.nostrsigner.ui.components.IconRow import com.greenart7c3.nostrsigner.ui.navigation.Route @@ -57,13 +55,9 @@ fun PermissionsScreen( } var resetPermissions by remember { mutableStateOf(false) } - var selectedPackage by remember { mutableStateOf(null) } val scope = rememberCoroutineScope() LaunchedEffect(lifecycleEvent) { - if (lifecycleEvent == Lifecycle.Event.ON_RESUME) { - selectedPackage = null - } scope.launch(Dispatchers.IO) { applications.clear() applications.addAll(database.applicationDao().getAll(localAccount.keyPair.pubKey.toHexKey())) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e2f94423..57cd27a3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -114,4 +114,5 @@ Yes No Could not connect to Tor + Relays \ No newline at end of file