This commit is contained in:
2026-06-09 14:27:21 +07:00
parent 81ea442eac
commit 483a84c616
4 changed files with 19 additions and 26 deletions

View File

@@ -13,12 +13,6 @@ class ExternalSignerLauncher {
this.launcher = launcher this.launcher = launcher
} }
fun unregister() {
launcher = null
pendingResult?.cancel()
pendingResult = null
}
suspend fun launch(intent: Intent): ActivityResult { suspend fun launch(intent: Intent): ActivityResult {
val deferred = CompletableDeferred<ActivityResult>() val deferred = CompletableDeferred<ActivityResult>()
pendingResult = deferred pendingResult = deferred

View File

@@ -17,7 +17,9 @@ import su.reya.coop.coop.storage.SecretStore
import kotlin.system.exitProcess import kotlin.system.exitProcess
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
private val externalSignerLauncher = ExternalSignerLauncher() companion object {
val externalSignerLauncher = ExternalSignerLauncher()
}
private val viewModel: NostrViewModel by viewModels { private val viewModel: NostrViewModel by viewModels {
object : ViewModelProvider.Factory { object : ViewModelProvider.Factory {
@@ -81,9 +83,4 @@ class MainActivity : ComponentActivity() {
super.onNewIntent(intent) super.onNewIntent(intent)
setIntent(intent) setIntent(intent)
} }
override fun onDestroy() {
externalSignerLauncher.unregister()
super.onDestroy()
}
} }

View File

@@ -160,10 +160,9 @@ fun OnboardingScreen() {
if (viewModel.isExternalSignerAvailable()) { if (viewModel.isExternalSignerAvailable()) {
try { try {
viewModel.connectExternalSigner() viewModel.connectExternalSigner()
navigator.navigate(Screen.Home)
} catch (e: Exception) { } catch (e: Exception) {
e.message?.let { snackbarHostState.showSnackbar(it) } e.message?.let { snackbarHostState.showSnackbar(it) }
} finally {
navigator.navigate(Screen.Home)
} }
} else { } else {
val result = snackbarHostState.showSnackbar( val result = snackbarHostState.showSnackbar(

View File

@@ -413,10 +413,10 @@ class NostrViewModel(
val newMetadata = nostr.updateProfile(name, bio, avatarUrl) val newMetadata = nostr.updateProfile(name, bio, avatarUrl)
// Update the metadata state after successfully published // Update the metadata state after successfully published
updateMetadata(nostr.signer.currentUser!!, newMetadata) updateMetadata(nostr.signer.currentUser!!, newMetadata)
// Update local state
_isBusy.value = false
} catch (e: Exception) { } catch (e: Exception) {
showError("Error: ${e.message}") showError("Error: ${e.message}")
} finally {
_isBusy.value = false
} }
} }
@@ -435,12 +435,13 @@ class NostrViewModel(
val avatarUrl = picture?.let { blossomUpload(it, contentType ?: "image/jpeg") } val avatarUrl = picture?.let { blossomUpload(it, contentType ?: "image/jpeg") }
// Create identity // Create identity
nostr.createIdentity(keys = keys, name = name, bio, picture = avatarUrl) nostr.createIdentity(keys = keys, name = name, bio, picture = avatarUrl)
} catch (e: Exception) { // Persist the secret in the secret storage
showError("Error: ${e.message}")
} finally {
secretStore.set("user_signer", secret) secretStore.set("user_signer", secret)
// Update local states
_isBusy.value = false _isBusy.value = false
_signerRequired.value = false _signerRequired.value = false
} catch (e: Exception) {
showError("Error: ${e.message}")
} }
} }
@@ -489,13 +490,15 @@ class NostrViewModel(
_isBusy.value = true _isBusy.value = true
try { try {
val signer = createSigner(secret) val signer = createSigner(secret)
// Update signer
nostr.setSigner(signer) nostr.setSigner(signer)
} catch (e: Exception) { // Persist the secret in the secret storage
showError("Error: ${e.message}")
} finally {
secretStore.set("user_signer", secret) secretStore.set("user_signer", secret)
// Update local states
_signerRequired.value = false _signerRequired.value = false
_isBusy.value = false _isBusy.value = false
} catch (e: Exception) {
showError("Error: ${e.message}")
} }
} }
@@ -512,19 +515,19 @@ class NostrViewModel(
SignerPermissions.nip44Decrypt(), SignerPermissions.nip44Decrypt(),
) )
) )
val result = handler.getPublicKey(permissions) ?: throw Exception("Rejected") val result = handler.getPublicKey(permissions) ?: throw Exception("Rejected")
val signer = ExternalSignerProxy(handler, result.pubkey) val signer = ExternalSignerProxy(handler, result.pubkey)
// Update signer // Update signer
nostr.setSigner(signer) nostr.setSigner(signer)
// Store the signer in the secret storage // Store the signer in the secret storage
secretStore.set("user_signer", "nip55://${result.packageName}/${result.pubkey.toHex()}") secretStore.set("user_signer", "nip55://${result.packageName}/${result.pubkey.toHex()}")
} catch (e: Exception) { // Update local states
showError("Error: ${e.message}")
} finally {
_signerRequired.value = false _signerRequired.value = false
_isBusy.value = false _isBusy.value = false
} catch (e: Exception) {
throw Exception("Notice: ${e.message}")
} }
} }