diff --git a/git-hooks/pre-commit b/.git-hooks/pre-commit
similarity index 100%
rename from git-hooks/pre-commit
rename to .git-hooks/pre-commit
diff --git a/git-hooks/pre-push b/.git-hooks/pre-push
similarity index 100%
rename from git-hooks/pre-push
rename to .git-hooks/pre-push
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
index 26a6b8f2a7..b65547ca69 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -11,6 +11,6 @@
-
+
\ No newline at end of file
diff --git a/spotless/copyright.kt b/.spotless/copyright.kt
similarity index 99%
rename from spotless/copyright.kt
rename to .spotless/copyright.kt
index def534cf12..c1cb5f4a81 100644
--- a/spotless/copyright.kt
+++ b/.spotless/copyright.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/SKILL.md b/SKILL.md
new file mode 100644
index 0000000000..124b4742b5
--- /dev/null
+++ b/SKILL.md
@@ -0,0 +1,230 @@
+# Amethyst Builder Skill
+
+Build customized Amethyst Nostr clients for Android. Fork, rebrand, customize, and distribute your own version.
+
+## Overview
+
+[Amethyst](https://github.com/vitorpamplona/amethyst) is the premier Nostr client for Android. This skill enables you to:
+- Create rebranded versions (custom name, package, icons)
+- Build F-Droid-compatible releases (no Google Play dependencies)
+- Add or modify features
+- Sign and distribute APKs
+
+## Prerequisites
+
+### Required Tools
+
+1. **Java 21** (via SDKMAN)
+ ```bash
+ curl -s "https://get.sdkman.io" | bash
+ source "$HOME/.sdkman/bin/sdkman-init.sh"
+ sdk install java 21.0.5-tem
+ sdk use java 21.0.5-tem
+ ```
+
+2. **Android SDK**
+ - Command-line tools from https://developer.android.com/studio#command-line-tools-only
+ - Required components: build-tools, platform-tools, platforms;android-35
+
+3. **Git** for cloning the repository
+
+### Environment Setup
+
+```bash
+export ANDROID_HOME=$HOME/Android/Sdk
+export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
+export PATH=$PATH:$ANDROID_HOME/platform-tools
+```
+
+## Build Workflow
+
+### 1. Clone the Repository
+
+```bash
+mkdir -p ~/projects/your-app-name
+cd ~/projects/your-app-name
+git clone https://github.com/vitorpamplona/amethyst.git .
+```
+
+### 2. Create Signing Key
+
+```bash
+keytool -genkeypair -v \
+ -keystore ./release-key.jks \
+ -alias your-app \
+ -keyalg RSA -keysize 2048 \
+ -validity 10000
+```
+
+Create `keystore.properties` in project root:
+```properties
+storeFile=release-key.jks
+storePassword=your-password
+keyAlias=your-app
+keyPassword=your-password
+```
+
+### 3. Configure Signing
+
+Add to `amethyst/build.gradle` inside the `android {}` block:
+
+```gradle
+def keystorePropertiesFile = rootProject.file("keystore.properties")
+def keystoreProperties = new Properties()
+if (keystorePropertiesFile.exists()) {
+ keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+}
+
+signingConfigs {
+ release {
+ if (keystorePropertiesFile.exists()) {
+ storeFile rootProject.file(keystoreProperties['storeFile'])
+ storePassword keystoreProperties['storePassword']
+ keyAlias keystoreProperties['keyAlias']
+ keyPassword keystoreProperties['keyPassword']
+ }
+ }
+}
+```
+
+Update the release buildType to use the signing config:
+```gradle
+buildTypes {
+ release {
+ signingConfig signingConfigs.release
+ // ... existing config
+ }
+}
+```
+
+### 4. Disable Google Services (Required for F-Droid)
+
+**⚠️ CRITICAL:** The Google Services plugin fails when you change the package name. For F-Droid builds, disable it.
+
+Edit `amethyst/build.gradle`, comment out the plugin:
+```gradle
+plugins {
+ alias(libs.plugins.androidApplication)
+ alias(libs.plugins.jetbrainsKotlinAndroid)
+ // alias(libs.plugins.googleServices) // DISABLED for F-Droid
+ alias(libs.plugins.jetbrainsComposeCompiler)
+}
+```
+
+### 5. Build
+
+```bash
+source "$HOME/.sdkman/bin/sdkman-init.sh"
+sdk use java 21.0.5-tem
+./gradlew assembleFdroidRelease
+```
+
+**Build time:** ~9 minutes first build, faster on subsequent builds.
+
+### 6. Locate APKs
+
+Output directory: `amethyst/build/outputs/apk/fdroid/release/`
+
+Files generated:
+- `amethyst-fdroid-arm64-v8a-release.apk` - ARM64 (most phones)
+- `amethyst-fdroid-universal-release.apk` - All architectures (larger)
+
+## Customizations
+
+### Change App Name
+
+Edit `amethyst/src/main/res/values/strings.xml`:
+```xml
+YourAppName
+YourAppName Debug
+```
+
+### Change Package ID
+
+Edit `amethyst/build.gradle`:
+```gradle
+android {
+ defaultConfig {
+ applicationId = "com.yourcompany.yourapp"
+ }
+}
+```
+
+### Change Project Name
+
+Edit `settings.gradle`:
+```gradle
+rootProject.name = "YourAppName"
+```
+
+### Change App Icon
+
+Replace icon files in:
+- `amethyst/src/main/res/mipmap-*/ic_launcher.webp`
+- `amethyst/src/main/res/mipmap-*/ic_launcher_round.webp`
+
+### Add Client Tag to Posts
+
+Make your app identify itself on posts with `["client", "YourAppName"]`.
+
+**1. Create tag builder extension:**
+
+Create `quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/tags/clientTag/TagArrayBuilderExt.kt`:
+```kotlin
+package com.vitorpamplona.quartz.nip01Core.tags.clientTag
+
+import com.vitorpamplona.quartz.nip01Core.core.Event
+import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
+
+fun TagArrayBuilder.client(clientName: String) =
+ addUnique(arrayOf(ClientTag.TAG_NAME, clientName))
+```
+
+**2. Add to TextNoteEvent:**
+
+Edit `quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip10Notes/TextNoteEvent.kt`:
+
+Add import:
+```kotlin
+import com.vitorpamplona.quartz.nip01Core.tags.clientTag.client
+```
+
+In both `build()` functions, add after `alt(...)`:
+```kotlin
+client("YourAppName")
+```
+
+### Modify Default Relays
+
+Edit relay configuration in `quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/` or the UI settings files.
+
+## Troubleshooting
+
+### google-services.json error
+Disable the Google Services plugin (see step 4).
+
+### Java version error
+```bash
+sdk use java 21.0.5-tem
+java -version # Must show 21.x
+```
+
+### Out of memory
+Edit `gradle.properties`:
+```properties
+org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m
+```
+
+### Clean build
+```bash
+./gradlew --stop
+./gradlew clean
+./gradlew assembleFdroidRelease
+```
+
+## Distribution
+
+Deploy APKs via:
+- **Surge.sh:** `surge ./releases your-app.surge.sh`
+- **Zapstore:** Submit to zapstore.dev
+- **Direct download:** Host on any web server
diff --git a/amethyst/build.gradle b/amethyst/build.gradle
index 2df5a41493..432929a9f0 100644
--- a/amethyst/build.gradle
+++ b/amethyst/build.gradle
@@ -2,7 +2,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
alias(libs.plugins.androidApplication)
- alias(libs.plugins.jetbrainsKotlinAndroid)
alias(libs.plugins.googleServices)
alias(libs.plugins.jetbrainsComposeCompiler)
alias(libs.plugins.serialization)
@@ -192,6 +191,7 @@ android {
buildFeatures {
compose = true
buildConfig = true
+ resValues = true
}
packagingOptions {
diff --git a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/CashuBTest.kt b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/CashuBTest.kt
index 6e25285f05..22854e5cc8 100644
--- a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/CashuBTest.kt
+++ b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/CashuBTest.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/DMFileDecryptionTest.kt b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/DMFileDecryptionTest.kt
index 9713d7dd4d..efd2296493 100644
--- a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/DMFileDecryptionTest.kt
+++ b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/DMFileDecryptionTest.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ImageUploadTesting.kt b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ImageUploadTesting.kt
index f0159a048b..b3dcb47c54 100644
--- a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ImageUploadTesting.kt
+++ b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ImageUploadTesting.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/OkHttpOtsTest.kt b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/OkHttpOtsTest.kt
index d11351b977..0a42d05a9b 100644
--- a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/OkHttpOtsTest.kt
+++ b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/OkHttpOtsTest.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadDualAxisChartAssemblerTest.kt b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadDualAxisChartAssemblerTest.kt
index 347c5f035f..48ca191f73 100644
--- a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadDualAxisChartAssemblerTest.kt
+++ b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadDualAxisChartAssemblerTest.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/URIParserTest.kt b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/URIParserTest.kt
index 200a494213..fb8ab890cb 100644
--- a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/URIParserTest.kt
+++ b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/URIParserTest.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/UrlUserTagTransformationTest.kt b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/UrlUserTagTransformationTest.kt
index 16945e37c0..4a4a3ec156 100644
--- a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/UrlUserTagTransformationTest.kt
+++ b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/UrlUserTagTransformationTest.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
@@ -28,6 +28,7 @@ import androidx.test.platform.app.InstrumentationRegistry
import com.vitorpamplona.amethyst.model.LocalCache
import com.vitorpamplona.amethyst.ui.actions.buildAnnotatedStringWithUrlHighlighting
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
+import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent
import com.vitorpamplona.quartz.nip01Core.metadata.UserMetadata
import com.vitorpamplona.quartz.nip19Bech32.decodePublicKey
import org.junit.Assert.assertEquals
@@ -77,8 +78,19 @@ class UrlUserTagTransformationTest {
decodePublicKey("npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z")
.toHexKey(),
)
- user.info = UserMetadata()
- user.info?.displayName = "Vitor Pamplona"
+ user.metadata().newMetadata(
+ UserMetadata().also {
+ it.displayName = "Vitor Pamplona"
+ },
+ MetadataEvent(
+ id = "",
+ pubKey = "",
+ createdAt = 0,
+ tags = emptyArray(),
+ content = "",
+ sig = "",
+ ),
+ )
val original = "@npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z"
@@ -185,8 +197,19 @@ class UrlUserTagTransformationTest {
decodePublicKey("npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z")
.toHexKey(),
)
- user.info = UserMetadata()
- user.info?.displayName = "Vitor Pamplona"
+ user.metadata().newMetadata(
+ UserMetadata().also {
+ it.displayName = "Vitor Pamplona"
+ },
+ MetadataEvent(
+ id = "",
+ pubKey = "",
+ createdAt = 0,
+ tags = emptyArray(),
+ content = "",
+ sig = "",
+ ),
+ )
val transformedText =
buildAnnotatedStringWithUrlHighlighting(
@@ -224,8 +247,20 @@ class UrlUserTagTransformationTest {
decodePublicKey("npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z")
.toHexKey(),
)
- user.info = UserMetadata()
- user.info?.displayName = "Vitor Pamplona"
+
+ user.metadata().newMetadata(
+ UserMetadata().also {
+ it.displayName = "Vitor Pamplona"
+ },
+ MetadataEvent(
+ id = "",
+ pubKey = "",
+ createdAt = 0,
+ tags = emptyArray(),
+ content = "",
+ sig = "",
+ ),
+ )
val transformedText =
buildAnnotatedStringWithUrlHighlighting(
diff --git a/amethyst/src/androidTestPlay/java/com/vitorpamplona/amethyst/TranslationsTest.kt b/amethyst/src/androidTestPlay/java/com/vitorpamplona/amethyst/TranslationsTest.kt
index 884daf31bf..07bacf12d2 100644
--- a/amethyst/src/androidTestPlay/java/com/vitorpamplona/amethyst/TranslationsTest.kt
+++ b/amethyst/src/androidTestPlay/java/com/vitorpamplona/amethyst/TranslationsTest.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt
index 255b216ac5..26348ab8b1 100644
--- a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt
+++ b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushDistributorHandler.kt b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushDistributorHandler.kt
index 47df83e681..ac14ef95b2 100644
--- a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushDistributorHandler.kt
+++ b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushDistributorHandler.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushMessageReceiver.kt b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushMessageReceiver.kt
index ce1d4428e7..fe5cf2cd2e 100644
--- a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushMessageReceiver.kt
+++ b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushMessageReceiver.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationUtils.kt b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationUtils.kt
index bb25f81f2e..30c16940df 100644
--- a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationUtils.kt
+++ b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationUtils.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/SelectNotificationProvider.kt b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/SelectNotificationProvider.kt
index 3d85bf6736..b86af0db7a 100644
--- a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/SelectNotificationProvider.kt
+++ b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/SelectNotificationProvider.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt
index d3be902c0e..b52b7d568b 100644
--- a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt
+++ b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
@@ -26,10 +26,10 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
+import com.vitorpamplona.amethyst.commons.model.ImmutableListOfLists
import com.vitorpamplona.amethyst.ui.navigation.navs.INav
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import com.vitorpamplona.amethyst.ui.theme.MaxWidthPaddingTop5dp
-import com.vitorpamplona.quartz.nip01Core.core.ImmutableListOfLists
@Composable
fun TranslatableRichTextViewer(
diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt
index 868c7c275e..5c90cfd7f7 100644
--- a/amethyst/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt
+++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/AppModules.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/AppModules.kt
index 8f28543b39..f89c08a226 100644
--- a/amethyst/src/main/java/com/vitorpamplona/amethyst/AppModules.kt
+++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/AppModules.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
@@ -65,6 +65,8 @@ import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.stats.RelayReqStats
import com.vitorpamplona.quartz.nip01Core.relay.client.stats.RelayStats
import com.vitorpamplona.quartz.nip03Timestamp.VerificationStateCache
import com.vitorpamplona.quartz.nip03Timestamp.ots.OtsBlockHeightCache
+import com.vitorpamplona.quartz.nip05DnsIdentifiers.Nip05Client
+import com.vitorpamplona.quartz.nip05DnsIdentifiers.OkHttpNip05Fetcher
import com.vitorpamplona.quartz.utils.Log
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
@@ -137,6 +139,10 @@ class AppModules(
// Offers easy methods to know when connections are happening through Tor or not
val roleBasedHttpClientBuilder = RoleBasedHttpClientBuilder(okHttpClients, torPrefs.value)
+ // Custom fetcher that considers tor settings and avoids forwarding.
+ val nip05Fetcher = OkHttpNip05Fetcher(roleBasedHttpClientBuilder::okHttpClientForNip05)
+ val nip05Client = Nip05Client(nip05Fetcher)
+
// Application-wide block height request cache
val otsBlockHeightCache by lazy { OtsBlockHeightCache() }
diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/DebugUtils.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/DebugUtils.kt
index 84277731f1..7e2b8dc3f5 100644
--- a/amethyst/src/main/java/com/vitorpamplona/amethyst/DebugUtils.kt
+++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/DebugUtils.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
@@ -98,9 +98,7 @@ fun debugState(context: Context) {
Log.d(
STATE_DUMP_TAG,
"Users: " +
- LocalCache.users.filter { _, it -> it.flowSet != null }.size +
- " / " +
- LocalCache.users.filter { _, it -> it.latestMetadata != null }.size +
+ LocalCache.users.filter { _, it -> it.metadataOrNull() != null }.size +
" / " +
LocalCache.users.size(),
)
@@ -147,10 +145,8 @@ fun debugState(context: Context) {
)
Log.d(
STATE_DUMP_TAG,
- "Observable Events: " +
- LocalCache.observablesByKindAndETag.size +
- " / " +
- LocalCache.observablesByKindAndAuthor.size,
+ "Observables: " +
+ LocalCache.observables.size,
)
Log.d(
diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/EncryptedStorage.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/EncryptedStorage.kt
index 573d6bb8a0..52f3045b5d 100644
--- a/amethyst/src/main/java/com/vitorpamplona/amethyst/EncryptedStorage.kt
+++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/EncryptedStorage.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt
index 87b3575408..e7011a919f 100644
--- a/amethyst/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt
+++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt
index c45bbde5e6..d29997fae7 100644
--- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt
+++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
@@ -250,7 +250,7 @@ class Account(
val userMetadata = UserMetadataState(signer, cache, scope, settings)
- override val nip47SignerState = NwcSignerState(signer, nwcFilterAssembler, cache, scope, settings)
+ override val nip47SignerState = NwcSignerState(signer, nwcFilterAssembler, cache, scope, settings.zapPaymentRequest)
val nip65RelayList = Nip65RelayListState(signer, cache, scope, settings)
val localRelayList = LocalRelayListState(signer, cache, scope, settings)
@@ -740,7 +740,7 @@ class Account(
outboxRelays.flow.value
} else {
replyToAuthor.inboxRelays()?.ifEmpty { null }?.toSet()
- ?: replyToAuthor.relaysBeingUsed.keys.ifEmpty { null }
+ ?: replyToAuthor.allUsedRelaysOrNull()
?: cache.relayHints
.hintsForKey(replyToAuthor.pubkeyHex)
.ifEmpty { null }
@@ -767,7 +767,7 @@ class Account(
notificationRelays.flow.value
} else {
user.inboxRelays()?.ifEmpty { null }?.toSet()
- ?: (cache.relayHints.hintsForKey(user.pubkeyHex).toSet() + user.relaysBeingUsed.keys)
+ ?: (cache.relayHints.hintsForKey(user.pubkeyHex).toSet() + user.allUsedRelays())
}
private fun computeRelayListForLinkedUser(pubkey: HexKey): Set =
@@ -822,7 +822,7 @@ class Account(
} else {
val relays =
author.outboxRelays()?.ifEmpty { null }
- ?: author.relaysBeingUsed.keys.ifEmpty { null }
+ ?: author.allUsedRelaysOrNull()
?: cache.relayHints.hintsForKey(author.pubkeyHex)
relayList.addAll(relays)
@@ -1741,7 +1741,7 @@ class Account(
val relayList =
dvmPublicKey.inboxRelays()?.toSet()?.ifEmpty { null }
- ?: (dvmPublicKey.relaysBeingUsed.keys + cache.relayHints.hintsForKey(dvmPublicKey.pubkeyHex))
+ ?: (dvmPublicKey.allUsedRelays() + cache.relayHints.hintsForKey(dvmPublicKey.pubkeyHex))
cache.justConsumeMyOwnEvent(request)
onReady(request)
diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AccountSettings.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AccountSettings.kt
index 07c767ceba..d26cc68f1e 100644
--- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AccountSettings.kt
+++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AccountSettings.kt
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2025 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
@@ -81,9 +81,9 @@ val DefaultNIP65List =
val DefaultDMRelayList = listOf(Constants.auth, Constants.oxchat, Constants.nos)
-val DefaultSearchRelayList = setOf(Constants.band, Constants.wine, Constants.where, Constants.nostoday)
+val DefaultSearchRelayList = setOf(Constants.wine, Constants.where, Constants.nostoday, Constants.antiprimal)
-val DefaultIndexerRelayList = setOf(Constants.purplepages, Constants.coracle, Constants.userkinds)
+val DefaultIndexerRelayList = setOf(Constants.purplepages, Constants.coracle, Constants.userkinds, Constants.yabu, Constants.nostr1)
val DefaultSignerPermissions =
listOf(
@@ -122,7 +122,7 @@ class AccountSettings(
val defaultStoriesFollowList: MutableStateFlow = MutableStateFlow(GLOBAL_FOLLOWS),
val defaultNotificationFollowList: MutableStateFlow = MutableStateFlow(GLOBAL_FOLLOWS),
val defaultDiscoveryFollowList: MutableStateFlow = MutableStateFlow(GLOBAL_FOLLOWS),
- var zapPaymentRequest: MutableStateFlow = MutableStateFlow(null),
+ val zapPaymentRequest: MutableStateFlow = MutableStateFlow(null),
var hideDeleteRequestDialog: Boolean = false,
var hideBlockAlertDialog: Boolean = false,
var hideNIP17WarningDialog: Boolean = false,
@@ -144,7 +144,7 @@ class AccountSettings(
var backupEphemeralChatList: EphemeralChatListEvent? = null,
var backupTrustProviderList: TrustProviderListEvent? = null,
val lastReadPerRoute: MutableStateFlow