diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/AndroidExternalSigner.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/AndroidExternalSigner.kt index e7e3122..3f367fe 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/AndroidExternalSigner.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/AndroidExternalSigner.kt @@ -61,7 +61,7 @@ class AndroidExternalSigner( ): String? { // Try Content Resolver first queryContentResolver(type, payload, pubkey, currentUser)?.let { - return it.result + return if (resultKey == "event") it.event else it.result } // Fall back to Intent diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/ExternalSignerLauncher.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/ExternalSignerLauncher.kt index cbfb686..51bbba7 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/ExternalSignerLauncher.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/ExternalSignerLauncher.kt @@ -4,23 +4,30 @@ import android.content.Intent import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext class ExternalSignerLauncher { private var launcher: ActivityResultLauncher? = null private var pendingResult: CompletableDeferred? = null + private val mutex = Mutex() fun register(launcher: ActivityResultLauncher) { this.launcher = launcher } - suspend fun launch(intent: Intent): ActivityResult { - val deferred = CompletableDeferred() - pendingResult = deferred - launcher?.launch(intent) - ?: throw IllegalStateException("ExternalSignerLauncher not registered") - return deferred.await() + suspend fun launch(intent: Intent): ActivityResult = mutex.withLock { + withContext(Dispatchers.Main) { + val deferred = CompletableDeferred() + pendingResult = deferred + launcher?.launch(intent) ?: throw IllegalStateException("Signer not registered") + deferred.await() + } } + fun onResult(result: ActivityResult) { pendingResult?.complete(result) pendingResult = null diff --git a/shared/src/commonMain/kotlin/su/reya/coop/Nostr.kt b/shared/src/commonMain/kotlin/su/reya/coop/Nostr.kt index 7311152..f52ee6c 100644 --- a/shared/src/commonMain/kotlin/su/reya/coop/Nostr.kt +++ b/shared/src/commonMain/kotlin/su/reya/coop/Nostr.kt @@ -412,23 +412,16 @@ class Nostr { val cachedRumor = getCachedRumor(event.id()) if (cachedRumor != null) return cachedRumor - // Get all signers - val signers = listOfNotNull(signer, deviceSigner) - if (signers.isEmpty()) return null - // Try to unwrap the gift with each signer - for (signer in signers) { - try { - val gift = UnwrappedGift.fromGiftWrapAsync(signer = signer, giftWrap = event) - val rumor = gift.rumor() - // Save the rumor to the database - setCachedRumor(event.id(), rumor) - // Return the rumor - return rumor - } catch (e: Exception) { - println("Failed to unwrap gift: ${e.message}") - continue - } + try { + val gift = UnwrappedGift.fromGiftWrapAsync(signer = signer, giftWrap = event) + val rumor = gift.rumor() + // Save the rumor to the database + setCachedRumor(event.id(), rumor) + // Return the rumor + return rumor + } catch (e: Exception) { + println("Failed to unwrap gift: ${e.message}") } return null