feat: Add support for NIP-55 #18

Merged
reya merged 5 commits from nip55 into master 2026-06-09 07:53:49 +00:00
3 changed files with 21 additions and 29 deletions
Showing only changes of commit eadf49b39d - Show all commits

View File

@@ -56,6 +56,8 @@ class AndroidExternalSigner(
payload: String, payload: String,
pubkey: PublicKey? = null, pubkey: PublicKey? = null,
currentUser: PublicKey? = null, currentUser: PublicKey? = null,
resultKey: String = "result",
extras: Map<String, String> = emptyMap(),
): String? { ): String? {
// Try Content Resolver first // Try Content Resolver first
queryContentResolver(type, payload, pubkey, currentUser)?.let { queryContentResolver(type, payload, pubkey, currentUser)?.let {
@@ -68,6 +70,7 @@ class AndroidExternalSigner(
putExtra("type", type) putExtra("type", type)
if (pubkey != null) putExtra("pubkey", pubkey.toHex()) if (pubkey != null) putExtra("pubkey", pubkey.toHex())
if (currentUser != null) putExtra("current_user", currentUser.toHex()) if (currentUser != null) putExtra("current_user", currentUser.toHex())
extras.forEach { (k, v) -> putExtra(k, v) }
} }
val result = launcher.launch(intent) val result = launcher.launch(intent)
@@ -76,7 +79,7 @@ class AndroidExternalSigner(
val data = result.data ?: return null val data = result.data ?: return null
if (data.getBooleanExtra("rejected", false)) return null if (data.getBooleanExtra("rejected", false)) return null
return data.getStringExtra("result") return data.getStringExtra(resultKey)
} }
override fun isAvailable(): Boolean { override fun isAvailable(): Boolean {
@@ -108,31 +111,14 @@ class AndroidExternalSigner(
} }
override suspend fun signEvent(event: UnsignedEvent, currentUser: PublicKey): String? { override suspend fun signEvent(event: UnsignedEvent, currentUser: PublicKey): String? {
// Try Content Resolver first val extras = event.id()?.let { mapOf("id" to it.toHex()) } ?: emptyMap()
queryContentResolver( return request(
"SIGN_EVENT", type = "sign_event",
event.asJson(), payload = event.asJson(),
null, currentUser = currentUser,
currentUser resultKey = "event",
)?.let { result -> extras = extras,
if (result.event != null) return result.event )
}
// Fall back to Intent
val intent = Intent(Intent.ACTION_VIEW, "nostrsigner:${event.asJson()}".toUri()).apply {
`package` = cachedPackageName
putExtra("type", "sign_event")
putExtra("current_user", currentUser.toHex())
if (event.id() != null) putExtra("id", event.id()!!.toHex())
}
val result = launcher.launch(intent)
if (result.resultCode != Activity.RESULT_OK) return null
val data = result.data ?: return null
if (data.getBooleanExtra("rejected", false)) return null
return data.getStringExtra("event")
} }
override suspend fun nip04Encrypt(plaintext: String, pubkey: PublicKey): String? { override suspend fun nip04Encrypt(plaintext: String, pubkey: PublicKey): String? {

View File

@@ -62,6 +62,7 @@ fun OnboardingScreen() {
val logoPainter = painterResource(Res.drawable.coop) val logoPainter = painterResource(Res.drawable.coop)
val expressiveFont = getExpressiveFontFamily() val expressiveFont = getExpressiveFontFamily()
val annotatedText = buildAnnotatedString { val annotatedText = buildAnnotatedString {
append("By using Coop, you agree to accept\nour ") append("By using Coop, you agree to accept\nour ")
// Push "Terms of Use" link // Push "Terms of Use" link

View File

@@ -508,9 +508,14 @@ class NostrViewModel(
try { try {
val permissions = SignerPermissions.toJson( val permissions = SignerPermissions.toJson(
listOf( listOf(
SignerPermissions.signEvent(), SignerPermissions.signEvent(0),
SignerPermissions.nip04Encrypt(), SignerPermissions.signEvent(3),
SignerPermissions.nip04Decrypt(), SignerPermissions.signEvent(10000),
SignerPermissions.signEvent(10050),
SignerPermissions.signEvent(10063),
SignerPermissions.signEvent(22242),
SignerPermissions.signEvent(30030),
SignerPermissions.signEvent(30315),
SignerPermissions.nip44Encrypt(), SignerPermissions.nip44Encrypt(),
SignerPermissions.nip44Decrypt(), SignerPermissions.nip44Decrypt(),
) )