From 632400f52cd24fccbe628602ac4f32d5cd69ee7c Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Wed, 23 Aug 2023 13:43:25 -0300 Subject: [PATCH] add login with amber button --- .../amethyst/LocalPreferences.kt | 6 ++- .../vitorpamplona/amethyst/model/Account.kt | 3 +- .../amethyst/ui/actions/SignerDialog.kt | 4 +- .../ui/screen/AccountStateViewModel.kt | 10 ++-- .../ui/screen/loggedOff/LoginScreen.kt | 54 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 6 files changed, 70 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index a4bbd919e..fca97daae 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -74,6 +74,7 @@ private object PrefKeys { const val THEME = "theme" const val PREFERRED_LANGUAGE = "preferred_Language" const val AUTOMATICALLY_LOAD_URL_PREVIEW = "automatically_load_url_preview" + const val LOGIN_WITH_AMBER = "login_with_amber" val LAST_READ: (String) -> String = { route -> "last_read_route_$route" } } @@ -245,6 +246,7 @@ object LocalPreferences { } else { putBoolean(PrefKeys.SHOW_SENSITIVE_CONTENT, account.showSensitiveContent!!) } + putBoolean(PrefKeys.LOGIN_WITH_AMBER, account.loginWithAmber) }.apply() val globalPrefs = encryptedPreferences() @@ -363,6 +365,7 @@ object LocalPreferences { val useProxy = getBoolean(PrefKeys.USE_PROXY, false) val proxyPort = getInt(PrefKeys.PROXY_PORT, 9050) val proxy = HttpClient.initProxy(useProxy, "127.0.0.1", proxyPort) + val loginWithAmber = getBoolean(PrefKeys.LOGIN_WITH_AMBER, false) val showSensitiveContent = if (contains(PrefKeys.SHOW_SENSITIVE_CONTENT)) { getBoolean(PrefKeys.SHOW_SENSITIVE_CONTENT, false) @@ -431,7 +434,8 @@ object LocalPreferences { warnAboutPostsWithReports = warnAboutReports, filterSpamFromStrangers = filterSpam, lastReadPerRoute = lastReadPerRoute, - settings = settings + settings = settings, + loginWithAmber = loginWithAmber ) return a diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index dff781c9a..a894dfe6e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -84,7 +84,8 @@ class Account( var warnAboutPostsWithReports: Boolean = true, var filterSpamFromStrangers: Boolean = true, var lastReadPerRoute: Map = mapOf(), - var settings: Settings = Settings() + var settings: Settings = Settings(), + var loginWithAmber: Boolean = false ) { var transientHiddenUsers: ImmutableSet = persistentSetOf() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SignerDialog.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SignerDialog.kt index 53cd12326..c176d402b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SignerDialog.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SignerDialog.kt @@ -52,7 +52,8 @@ enum class SignerType { NIP04_ENCRYPT, NIP04_DECRYPT, NIP44_ENCRYPT, - NIP44_DECRYPT + NIP44_DECRYPT, + GET_PUBLIC_KEY } fun openAmber( @@ -69,6 +70,7 @@ fun openAmber( SignerType.NIP04_DECRYPT -> "nip04_decrypt" SignerType.NIP44_ENCRYPT -> "nip44_encrypt" SignerType.NIP44_DECRYPT -> "nip44_decrypt" + SignerType.GET_PUBLIC_KEY -> "get_public_key" } intent.putExtra("type", signerType) intent.putExtra("pubKey", pubKey) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt index 7dbdccf30..4aa530171 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt @@ -45,21 +45,21 @@ class AccountStateViewModel(val context: Context) : ViewModel() { } } - fun startUI(key: String, useProxy: Boolean, proxyPort: Int) { + fun startUI(key: String, useProxy: Boolean, proxyPort: Int, loginWithAmber: Boolean = false) { val parsed = Nip19.uriToRoute(key) val pubKeyParsed = parsed?.hex?.hexToByteArray() val proxy = HttpClient.initProxy(useProxy, "127.0.0.1", proxyPort) val account = if (key.startsWith("nsec")) { - Account(KeyPair(privKey = key.bechToBytes()), proxy = proxy, proxyPort = proxyPort) + Account(KeyPair(privKey = key.bechToBytes()), proxy = proxy, proxyPort = proxyPort, loginWithAmber = loginWithAmber) } else if (pubKeyParsed != null) { - Account(KeyPair(pubKey = pubKeyParsed), proxy = proxy, proxyPort = proxyPort) + Account(KeyPair(pubKey = pubKeyParsed), proxy = proxy, proxyPort = proxyPort, loginWithAmber = loginWithAmber) } else if (EMAIL_PATTERN.matcher(key).matches()) { // Evaluate NIP-5 - Account(KeyPair(), proxy = proxy, proxyPort = proxyPort) + Account(KeyPair(), proxy = proxy, proxyPort = proxyPort, loginWithAmber = loginWithAmber) } else { - Account(KeyPair(Hex.decode(key)), proxy = proxy, proxyPort = proxyPort) + Account(KeyPair(Hex.decode(key)), proxy = proxy, proxyPort = proxyPort, loginWithAmber = loginWithAmber) } LocalPreferences.updatePrefsForLogin(account) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt index acdd48c0c..71411abe2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt @@ -37,6 +37,8 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.service.PackageUtils +import com.vitorpamplona.amethyst.ui.actions.SignerDialog +import com.vitorpamplona.amethyst.ui.actions.SignerType import com.vitorpamplona.amethyst.ui.qrcode.SimpleQrCodeScanner import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.ConnectOrbotDialog @@ -63,6 +65,7 @@ fun LoginPage( val useProxy = remember { mutableStateOf(false) } val proxyPort = remember { mutableStateOf("9050") } var connectOrbotDialogOpen by remember { mutableStateOf(false) } + var loginWithAmber by remember { mutableStateOf(false) } Column( modifier = Modifier @@ -255,6 +258,37 @@ fun LoginPage( } } + if (loginWithAmber) { + SignerDialog( + onClose = { + loginWithAmber = false + }, + onPost = { + key.value = TextFieldValue(it) + if (!acceptedTerms.value) { + termsAcceptanceIsRequired = + context.getString(R.string.acceptance_of_terms_is_required) + } + + if (key.value.text.isBlank()) { + errorMessage = context.getString(R.string.key_is_required) + } + + if (acceptedTerms.value && key.value.text.isNotBlank()) { + try { + accountViewModel.startUI(key.value.text, useProxy.value, proxyPort.value.toInt(), true) + } catch (e: Exception) { + Log.e("Login", "Could not sign in", e) + errorMessage = context.getString(R.string.invalid_key) + } + } + loginWithAmber = false + }, + data = "", + type = SignerType.GET_PUBLIC_KEY + ) + } + Spacer(modifier = Modifier.height(20.dp)) Box(modifier = Modifier.padding(40.dp, 0.dp, 40.dp, 0.dp)) { @@ -290,6 +324,26 @@ fun LoginPage( Text(text = stringResource(R.string.login)) } } + + if (PackageUtils.isAmberInstalled(context)) { + Box(modifier = Modifier.padding(40.dp, 40.dp, 40.dp, 0.dp)) { + Button( + onClick = { + loginWithAmber = true + }, + shape = RoundedCornerShape(Size35dp), + modifier = Modifier + .fillMaxWidth() + .height(50.dp), + colors = ButtonDefaults + .buttonColors( + backgroundColor = if (acceptedTerms.value) MaterialTheme.colors.primary else Color.Gray + ) + ) { + Text(text = stringResource(R.string.login_with_amber)) + } + } + } } // The last child is glued to the bottom. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 907376010..ed8fbb0a6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -551,4 +551,5 @@ Created at Rules + Login with Amber