From 8a18781048bb82ddf8fdc34100872ba5a107e7a0 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Fri, 24 Nov 2023 12:33:10 -0300 Subject: [PATCH] support for sending/receiving multiple events from external signer --- .../quartz/signers/ExternalSignerLauncher.kt | 48 ++++++++++++++++--- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/signers/ExternalSignerLauncher.kt b/quartz/src/main/java/com/vitorpamplona/quartz/signers/ExternalSignerLauncher.kt index acb50e5ff..5428c55bb 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/signers/ExternalSignerLauncher.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/signers/ExternalSignerLauncher.kt @@ -5,10 +5,13 @@ import android.content.Intent import android.net.Uri import android.util.Log import android.util.LruCache +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.databind.ObjectMapper import com.vitorpamplona.quartz.encoders.HexKey import com.vitorpamplona.quartz.events.EventInterface import com.vitorpamplona.quartz.events.LnZapRequestEvent + enum class SignerType { SIGN_EVENT, NIP04_ENCRYPT, @@ -28,6 +31,15 @@ class Permission( } } +class Result( + @JsonProperty("package") + val `package`: String?, + @JsonProperty("signature") + val signature: String?, + @JsonProperty("id") + val id: String? +) + class ExternalSignerLauncher( private val npub: String, val signerPackageName: String = "com.greenart7c3.nostrsigner" @@ -57,16 +69,36 @@ class ExternalSignerLauncher( } fun newResult(data: Intent) { - val signature = data.getStringExtra("signature") ?: "" - val packageName = data.getStringExtra("package") ?: "" - val id = data.getStringExtra("id") ?: "" - if (id.isNotBlank()) { - val result = if (packageName.isNotBlank()) "$signature-$packageName" else signature - contentCache.get(id)?.invoke(result) + val results = data.getStringExtra("results") + if (results != null) { + val objectMapper = ObjectMapper() + val localResults: Array = objectMapper.readValue( + results, + Array::class.java + ) + + localResults.forEach { + val signature = it.signature ?: "" + val packageName = it.`package` ?: "" + val id = it.id ?: "" + if (id.isNotBlank()) { + val result = if (packageName.isNotBlank()) "$signature-$packageName" else signature + val contentCache = contentCache.get(id) + contentCache?.invoke(result) + } + } + } else { + val signature = data.getStringExtra("signature") ?: "" + val packageName = data.getStringExtra("package") ?: "" + val id = data.getStringExtra("id") ?: "" + if (id.isNotBlank()) { + val result = if (packageName.isNotBlank()) "$signature-$packageName" else signature + val contentCache = contentCache.get(id) + contentCache?.invoke(result) + } } } - fun openSignerApp( data: String, type: SignerType, @@ -145,6 +177,8 @@ class ExternalSignerLauncher( intent.`package` = signerPackageName } + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP) + contentCache.put(id, onReady) intentLauncher(intent)