diff --git a/ammolite/.gitignore b/ammolite/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/ammolite/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/ammolite/build.gradle b/ammolite/build.gradle
new file mode 100644
index 000000000..b81832b59
--- /dev/null
+++ b/ammolite/build.gradle
@@ -0,0 +1,42 @@
+plugins {
+ alias(libs.plugins.androidLibrary)
+ alias(libs.plugins.jetbrainsKotlinAndroid)
+}
+
+android {
+ namespace 'com.vitorpamplona.ammolite'
+ compileSdk 34
+
+ defaultConfig {
+ minSdk 26
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+}
+
+dependencies {
+
+ implementation libs.androidx.core.ktx
+ implementation libs.androidx.appcompat
+ implementation libs.material
+ testImplementation libs.junit
+ androidTestImplementation libs.androidx.junit
+ androidTestImplementation libs.androidx.espresso.core
+
+ implementation libs.okhttp
+}
\ No newline at end of file
diff --git a/ammolite/consumer-rules.pro b/ammolite/consumer-rules.pro
new file mode 100644
index 000000000..e69de29bb
diff --git a/ammolite/proguard-rules.pro b/ammolite/proguard-rules.pro
new file mode 100644
index 000000000..481bb4348
--- /dev/null
+++ b/ammolite/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/ammolite/src/main/AndroidManifest.xml b/ammolite/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..a5918e68a
--- /dev/null
+++ b/ammolite/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClientManager.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/service/HttpClientManager.kt
similarity index 91%
rename from app/src/main/java/com/vitorpamplona/amethyst/service/HttpClientManager.kt
rename to ammolite/src/main/java/com/vitorpamplona/ammolite/service/HttpClientManager.kt
index 0bf677167..56d96feed 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClientManager.kt
+++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/service/HttpClientManager.kt
@@ -18,10 +18,9 @@
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-package com.vitorpamplona.amethyst.service
+package com.vitorpamplona.ammolite.service
import android.util.Log
-import com.vitorpamplona.amethyst.BuildConfig
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Request
@@ -40,6 +39,7 @@ object HttpClientManager {
private var defaultTimeout = DEFAULT_TIMEOUT_ON_WIFI
private var defaultHttpClient: OkHttpClient? = null
private var defaultHttpClientWithoutProxy: OkHttpClient? = null
+ private var internalInterceptor: Interceptor = DefaultContentTypeInterceptor()
// fires off every time value of the property changes
private var internalProxy: Proxy? by
@@ -73,6 +73,12 @@ object HttpClientManager {
}
}
+ fun setDefaultInterceptor(interceptor: Interceptor) {
+ Log.d("HttpClient", "Changing interceptor")
+ this.internalInterceptor = interceptor
+ this.defaultHttpClient = buildHttpClient(internalProxy, defaultTimeout)
+ }
+
private fun buildHttpClient(
proxy: Proxy?,
timeout: Duration,
@@ -84,7 +90,7 @@ object HttpClientManager {
.readTimeout(duration)
.connectTimeout(duration)
.writeTimeout(duration)
- .addInterceptor(DefaultContentTypeInterceptor())
+ .addInterceptor(internalInterceptor)
.followRedirects(true)
.followSslRedirects(true)
.build()
@@ -97,7 +103,7 @@ object HttpClientManager {
val requestWithUserAgent: Request =
originalRequest
.newBuilder()
- .header("User-Agent", "Amethyst/${BuildConfig.VERSION_NAME}")
+ .header("User-Agent", "Amethyst")
.build()
return chain.proceed(requestWithUserAgent)
}
diff --git a/app/build.gradle b/app/build.gradle
index cb9b24d5d..77b1af158 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -165,6 +165,7 @@ dependencies {
implementation project(path: ':quartz')
implementation project(path: ':commons')
+ implementation project(path: ':ammolite')
implementation libs.androidx.core.ktx
implementation libs.androidx.activity.compose
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt b/app/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt
index f3dde4d65..1199f184b 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt
@@ -70,6 +70,7 @@ class Amethyst : Application() {
override fun onCreate() {
super.onCreate()
+
instance = this
OtsEvent.otsInstance = OpenTimestamps(OkHttpBlockstreamExplorer(), OkHttpCalendarBuilder())
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt
index 3b21ef66d..4cb6574e6 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt
@@ -33,9 +33,9 @@ import com.vitorpamplona.amethyst.model.GLOBAL_FOLLOWS
import com.vitorpamplona.amethyst.model.KIND3_FOLLOWS
import com.vitorpamplona.amethyst.model.RelaySetupInfo
import com.vitorpamplona.amethyst.model.Settings
-import com.vitorpamplona.amethyst.service.HttpClientManager
import com.vitorpamplona.amethyst.service.Nip96MediaServers
import com.vitorpamplona.amethyst.service.checkNotInMainThread
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.crypto.KeyPair
import com.vitorpamplona.quartz.encoders.HexKey
import com.vitorpamplona.quartz.encoders.Nip47WalletConnect
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt b/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt
index de9a28a1e..6136950c7 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt
@@ -30,7 +30,6 @@ import coil.decode.SvgDecoder
import coil.size.Precision
import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.model.LocalCache
-import com.vitorpamplona.amethyst.service.HttpClientManager
import com.vitorpamplona.amethyst.service.NostrAccountDataSource
import com.vitorpamplona.amethyst.service.NostrChannelDataSource
import com.vitorpamplona.amethyst.service.NostrChatroomDataSource
@@ -48,6 +47,7 @@ import com.vitorpamplona.amethyst.service.NostrThreadDataSource
import com.vitorpamplona.amethyst.service.NostrUserProfileDataSource
import com.vitorpamplona.amethyst.service.NostrVideoDataSource
import com.vitorpamplona.amethyst.service.relays.Client
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.encoders.bechToBytes
import com.vitorpamplona.quartz.encoders.decodePublicKeyAsHexOrNull
import com.vitorpamplona.quartz.encoders.toHexKey
@@ -60,6 +60,10 @@ import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
+import okhttp3.Interceptor
+import okhttp3.Request
+import okhttp3.Response
+import java.io.IOException
@Stable
class ServiceManager {
@@ -86,6 +90,7 @@ class ServiceManager {
// Resets Proxy Use
HttpClientManager.setDefaultProxy(account?.proxy)
+ HttpClientManager.setDefaultInterceptor(DefaultContentTypeInterceptor())
LocalCache.antiSpam.active = account?.filterSpamFromStrangers ?: true
Coil.setImageLoader {
Amethyst.instance
@@ -249,3 +254,16 @@ class ServiceManager {
forceRestart(null, false, true)
}
}
+
+class DefaultContentTypeInterceptor : Interceptor {
+ @Throws(IOException::class)
+ override fun intercept(chain: Interceptor.Chain): Response {
+ val originalRequest: Request = chain.request()
+ val requestWithUserAgent: Request =
+ originalRequest
+ .newBuilder()
+ .header("User-Agent", "Amethyst/${BuildConfig.VERSION_NAME}")
+ .build()
+ return chain.proceed(requestWithUserAgent)
+ }
+}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/CashuProcessor.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/CashuProcessor.kt
index 50203703b..9d603e50f 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/CashuProcessor.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/CashuProcessor.kt
@@ -29,6 +29,7 @@ import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.service.lnurl.LightningAddressResolver
import com.vitorpamplona.amethyst.ui.components.GenericLoadable
import com.vitorpamplona.amethyst.ui.stringRes
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.events.Event
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.Request
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05NostrAddressVerifier.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05NostrAddressVerifier.kt
index 184612497..1771e29ec 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05NostrAddressVerifier.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05NostrAddressVerifier.kt
@@ -22,6 +22,7 @@ package com.vitorpamplona.amethyst.service
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.vitorpamplona.amethyst.BuildConfig
+import com.vitorpamplona.ammolite.service.HttpClientManager
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip11RelayInfoRetriever.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip11RelayInfoRetriever.kt
index f5cbf8e68..b0f4134a1 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip11RelayInfoRetriever.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip11RelayInfoRetriever.kt
@@ -22,6 +22,7 @@ package com.vitorpamplona.amethyst.service
import android.util.Log
import android.util.LruCache
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.encoders.Nip11RelayInformation
import com.vitorpamplona.quartz.encoders.RelayUrlFormatter
import com.vitorpamplona.quartz.utils.TimeUtils
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip96MediaServers.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip96MediaServers.kt
index 8b4771a9a..07f7244eb 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip96MediaServers.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip96MediaServers.kt
@@ -24,6 +24,7 @@ import android.util.Log
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
+import com.vitorpamplona.ammolite.service.HttpClientManager
import kotlinx.coroutines.CancellationException
import okhttp3.Request
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip96Uploader.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip96Uploader.kt
index 923538ed5..7d069d0f1 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip96Uploader.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip96Uploader.kt
@@ -30,6 +30,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.vitorpamplona.amethyst.BuildConfig
import com.vitorpamplona.amethyst.model.Account
+import com.vitorpamplona.ammolite.service.HttpClientManager
import kotlinx.coroutines.delay
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withTimeoutOrNull
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/OnlineCheck.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/OnlineCheck.kt
index b2eff00bd..72e11ab2e 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/OnlineCheck.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/OnlineCheck.kt
@@ -24,6 +24,7 @@ import android.util.Log
import android.util.LruCache
import androidx.compose.runtime.Immutable
import com.vitorpamplona.amethyst.BuildConfig
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.crypto.CryptoUtils
import okhttp3.EventListener
import okhttp3.Protocol
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt
index 85b19ebce..4f142daf0 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt
@@ -24,9 +24,9 @@ import android.content.Context
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.vitorpamplona.amethyst.BuildConfig
import com.vitorpamplona.amethyst.R
-import com.vitorpamplona.amethyst.service.HttpClientManager
import com.vitorpamplona.amethyst.service.checkNotInMainThread
import com.vitorpamplona.amethyst.ui.stringRes
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.encoders.LnInvoiceUtil
import com.vitorpamplona.quartz.encoders.Lud06
import okhttp3.Request
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt
index 2049d817d..6ce76450b 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt
@@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.AccountInfo
import com.vitorpamplona.amethyst.BuildConfig
import com.vitorpamplona.amethyst.LocalPreferences
import com.vitorpamplona.amethyst.model.Account
-import com.vitorpamplona.amethyst.service.HttpClientManager
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.events.RelayAuthEvent
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpBlockstreamExplorer.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpBlockstreamExplorer.kt
index 9b074670a..eeb092395 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpBlockstreamExplorer.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpBlockstreamExplorer.kt
@@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.service.ots
import android.util.Log
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.vitorpamplona.amethyst.BuildConfig
-import com.vitorpamplona.amethyst.service.HttpClientManager
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.ots.BitcoinExplorer
import com.vitorpamplona.quartz.ots.BlockHeader
import com.vitorpamplona.quartz.ots.exceptions.UrlException
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendar.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendar.kt
index 91db7a2b4..0e16a2320 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendar.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendar.kt
@@ -21,7 +21,7 @@
package com.vitorpamplona.amethyst.service.ots
import com.vitorpamplona.amethyst.BuildConfig
-import com.vitorpamplona.amethyst.service.HttpClientManager
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.encoders.Hex
import com.vitorpamplona.quartz.ots.ICalendar
import com.vitorpamplona.quartz.ots.StreamDeserializationContext
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendarAsyncSubmit.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendarAsyncSubmit.kt
index be082413f..515f9150e 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendarAsyncSubmit.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendarAsyncSubmit.kt
@@ -21,7 +21,7 @@
package com.vitorpamplona.amethyst.service.ots
import com.vitorpamplona.amethyst.BuildConfig
-import com.vitorpamplona.amethyst.service.HttpClientManager
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.ots.ICalendarAsyncSubmit
import com.vitorpamplona.quartz.ots.StreamDeserializationContext
import com.vitorpamplona.quartz.ots.Timestamp
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/playback/PlaybackService.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/playback/PlaybackService.kt
index 82167f0ad..449055818 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/playback/PlaybackService.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/playback/PlaybackService.kt
@@ -33,7 +33,7 @@ import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy
import androidx.media3.session.MediaSession
import androidx.media3.session.MediaSessionService
import com.vitorpamplona.amethyst.Amethyst
-import com.vitorpamplona.amethyst.service.HttpClientManager
+import com.vitorpamplona.ammolite.service.HttpClientManager
/**
* HLS LiveStreams cannot use cache.
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/previews/UrlPreviewUtils.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/previews/UrlPreviewUtils.kt
index ea2425fc3..79fb36e32 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/previews/UrlPreviewUtils.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/previews/UrlPreviewUtils.kt
@@ -22,8 +22,8 @@ package com.vitorpamplona.amethyst.service.previews
import com.vitorpamplona.amethyst.commons.preview.MetaTag
import com.vitorpamplona.amethyst.commons.preview.MetaTagsParser
-import com.vitorpamplona.amethyst.service.HttpClientManager
import com.vitorpamplona.amethyst.service.checkNotInMainThread
+import com.vitorpamplona.ammolite.service.HttpClientManager
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.MediaType
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt
index 22d449c4c..34c494813 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt
@@ -234,6 +234,7 @@ object Client : RelayPool.Listener {
GlobalScope.launch(Dispatchers.Default) { listeners.forEach { it.onAuth(relay, challenge) } }
}
+ @OptIn(DelicateCoroutinesApi::class)
override fun onNotify(
relay: Relay,
description: String,
@@ -245,6 +246,38 @@ object Client : RelayPool.Listener {
}
}
+ @OptIn(DelicateCoroutinesApi::class)
+ override fun onSend(
+ relay: Relay,
+ msg: String,
+ success: Boolean,
+ ) {
+ GlobalScope.launch(Dispatchers.Default) {
+ listeners.forEach { it.onSend(relay, msg, success) }
+ }
+ }
+
+ @OptIn(DelicateCoroutinesApi::class)
+ override fun onBeforeSend(
+ relay: Relay,
+ event: EventInterface,
+ ) {
+ GlobalScope.launch(Dispatchers.Default) {
+ listeners.forEach { it.onBeforeSend(relay, event) }
+ }
+ }
+
+ @OptIn(DelicateCoroutinesApi::class)
+ override fun onError(
+ error: Error,
+ subscriptionId: String,
+ relay: Relay,
+ ) {
+ GlobalScope.launch(Dispatchers.Default) {
+ listeners.forEach { it.onError(error, subscriptionId, relay) }
+ }
+ }
+
fun subscribe(listener: Listener) {
listeners = listeners.plus(listener)
}
@@ -298,5 +331,22 @@ object Client : RelayPool.Listener {
relay: Relay,
description: String,
) = Unit
+
+ open fun onSend(
+ relay: Relay,
+ msg: String,
+ success: Boolean,
+ ) = Unit
+
+ open fun onBeforeSend(
+ relay: Relay,
+ event: EventInterface,
+ ) = Unit
+
+ open fun onError(
+ error: Error,
+ subscriptionId: String,
+ relay: Relay,
+ ) = Unit
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt
index ab7108d84..0475ed4c3 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt
@@ -24,8 +24,8 @@ import android.util.Log
import com.vitorpamplona.amethyst.BuildConfig
import com.vitorpamplona.amethyst.model.RelayBriefInfoCache
import com.vitorpamplona.amethyst.model.RelaySetupInfo
-import com.vitorpamplona.amethyst.service.HttpClientManager
import com.vitorpamplona.amethyst.service.checkNotInMainThread
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.encoders.HexKey
import com.vitorpamplona.quartz.events.Event
import com.vitorpamplona.quartz.events.EventInterface
@@ -452,6 +452,10 @@ class Relay(
fun sendOverride(signedEvent: EventInterface) {
checkNotInMainThread()
+ listeners.forEach { listener ->
+ listener.onBeforeSend(this@Relay, signedEvent)
+ }
+
if (signedEvent is RelayAuthEvent) {
sendAuth(signedEvent)
} else {
@@ -462,6 +466,10 @@ class Relay(
fun send(signedEvent: EventInterface) {
checkNotInMainThread()
+ listeners.forEach { listener ->
+ listener.onBeforeSend(this@Relay, signedEvent)
+ }
+
if (signedEvent is RelayAuthEvent) {
sendAuth(signedEvent)
} else {
@@ -496,6 +504,10 @@ class Relay(
if (isConnected()) {
if (isReady) {
writeToSocket("""["EVENT",${signedEvent.toJson()}]""")
+ } else {
+ synchronized(sendWhenReady) {
+ sendWhenReady.add(signedEvent)
+ }
}
} else {
// sends all filters after connection is successful.
@@ -512,7 +524,10 @@ class Relay(
socket?.let {
checkNotInMainThread()
- it.send(str)
+ val result = it.send(str)
+ listeners.forEach { listener ->
+ listener.onSend(this@Relay, str, result)
+ }
RelayStats.addBytesSent(url, str.bytesUsedInMemory())
if (BuildConfig.DEBUG) {
@@ -588,5 +603,16 @@ class Relay(
relay: Relay,
description: String,
)
+
+ fun onSend(
+ relay: Relay,
+ msg: String,
+ success: Boolean,
+ )
+
+ fun onBeforeSend(
+ relay: Relay,
+ event: EventInterface,
+ )
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt
index b7470feca..3a3ffaa74 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt
@@ -64,6 +64,8 @@ object RelayPool : Relay.Listener {
return relays.filter { it.url == url }
}
+ fun getAll() = relays
+
fun getOrCreateRelay(
url: String,
feedTypes: Set? = null,
@@ -221,6 +223,23 @@ object RelayPool : Relay.Listener {
relay: Relay,
description: String,
)
+
+ fun onSend(
+ relay: Relay,
+ msg: String,
+ success: Boolean,
+ )
+
+ fun onBeforeSend(
+ relay: Relay,
+ event: EventInterface,
+ )
+
+ fun onError(
+ error: Error,
+ subscriptionId: String,
+ relay: Relay,
+ )
}
override fun onEvent(
@@ -237,6 +256,7 @@ object RelayPool : Relay.Listener {
subscriptionId: String,
error: Error,
) {
+ listeners.forEach { it.onError(error, subscriptionId, relay) }
updateStatus()
}
@@ -274,6 +294,21 @@ object RelayPool : Relay.Listener {
listeners.forEach { it.onNotify(relay, description) }
}
+ override fun onSend(
+ relay: Relay,
+ msg: String,
+ success: Boolean,
+ ) {
+ listeners.forEach { it.onSend(relay, msg, success) }
+ }
+
+ override fun onBeforeSend(
+ relay: Relay,
+ event: EventInterface,
+ ) {
+ listeners.forEach { it.onBeforeSend(relay, event) }
+ }
+
private fun updateStatus() {
val connected = connectedRelays()
val available = availableRelays()
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt
index ba1ead032..9a3515bf1 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt
@@ -37,13 +37,13 @@ import androidx.compose.runtime.mutableStateOf
import com.vitorpamplona.amethyst.LocalPreferences
import com.vitorpamplona.amethyst.ServiceManager
import com.vitorpamplona.amethyst.model.LocalCache
-import com.vitorpamplona.amethyst.service.HttpClientManager
import com.vitorpamplona.amethyst.service.lang.LanguageTranslatorService
import com.vitorpamplona.amethyst.service.notifications.PushNotificationUtils
import com.vitorpamplona.amethyst.ui.components.DEFAULT_MUTED_SETTING
import com.vitorpamplona.amethyst.ui.components.keepPlayingMutex
import com.vitorpamplona.amethyst.ui.navigation.Route
import com.vitorpamplona.amethyst.ui.navigation.debugState
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.encoders.Nip19Bech32
import com.vitorpamplona.quartz.encoders.Nip47WalletConnect
import com.vitorpamplona.quartz.events.ChannelCreateEvent
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageDownloader.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageDownloader.kt
index e61c88ccd..466fd0a7f 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageDownloader.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageDownloader.kt
@@ -20,7 +20,7 @@
*/
package com.vitorpamplona.amethyst.ui.actions
-import com.vitorpamplona.amethyst.service.HttpClientManager
+import com.vitorpamplona.ammolite.service.HttpClientManager
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.delay
import java.net.HttpURLConnection
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt
index b734e01ee..d044d249e 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt
@@ -32,7 +32,7 @@ import androidx.annotation.RequiresApi
import androidx.core.net.toFile
import androidx.core.net.toUri
import com.vitorpamplona.amethyst.BuildConfig
-import com.vitorpamplona.amethyst.service.HttpClientManager
+import com.vitorpamplona.ammolite.service.HttpClientManager
import kotlinx.coroutines.CancellationException
import okhttp3.Call
import okhttp3.Callback
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt
index 18e4803c2..cffbdf57b 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt
@@ -28,9 +28,9 @@ import com.vitorpamplona.amethyst.AccountInfo
import com.vitorpamplona.amethyst.LocalPreferences
import com.vitorpamplona.amethyst.ServiceManager
import com.vitorpamplona.amethyst.model.Account
-import com.vitorpamplona.amethyst.service.HttpClientManager
import com.vitorpamplona.amethyst.service.Nip05NostrAddressVerifier
import com.vitorpamplona.amethyst.service.relays.Client
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.crypto.CryptoUtils
import com.vitorpamplona.quartz.crypto.KeyPair
import com.vitorpamplona.quartz.crypto.nip06.Nip06
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt
index 23371bf3c..c1d0fac33 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt
@@ -52,7 +52,6 @@ import com.vitorpamplona.amethyst.model.UserState
import com.vitorpamplona.amethyst.model.observables.CreatedAtComparator
import com.vitorpamplona.amethyst.service.CashuProcessor
import com.vitorpamplona.amethyst.service.CashuToken
-import com.vitorpamplona.amethyst.service.HttpClientManager
import com.vitorpamplona.amethyst.service.Nip05NostrAddressVerifier
import com.vitorpamplona.amethyst.service.Nip11CachedRetriever
import com.vitorpamplona.amethyst.service.Nip11Retriever
@@ -70,6 +69,7 @@ import com.vitorpamplona.amethyst.ui.note.showAmount
import com.vitorpamplona.amethyst.ui.screen.CombinedZap
import com.vitorpamplona.amethyst.ui.screen.SettingsState
import com.vitorpamplona.amethyst.ui.stringRes
+import com.vitorpamplona.ammolite.service.HttpClientManager
import com.vitorpamplona.quartz.encoders.ATag
import com.vitorpamplona.quartz.encoders.HexKey
import com.vitorpamplona.quartz.encoders.Nip11RelayInformation
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 78eae2453..1525c4cd1 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -44,6 +44,8 @@ zelory = "3.0.1"
zoomable = "1.6.1"
zxing = "3.5.3"
zxingAndroidEmbedded = "4.3.0"
+material = "1.10.0"
+materialVersion = "1.10.0"
[libraries]
abedElazizShe-image-compressor = { group = "com.github.AbedElazizShe", name = "LightCompressor", version.ref = "lightcompressor" }
@@ -114,6 +116,7 @@ zelory-video-compressor = { group = "id.zelory", name = "compressor", version.re
zoomable = { group = "net.engawapg.lib", name = "zoomable", version.ref = "zoomable" }
zxing = { group = "com.google.zxing", name = "core", version.ref = "zxing" }
zxing-embedded = { group = "com.journeyapps", name = "zxing-android-embedded", version.ref = "zxingAndroidEmbedded" }
+material = { group = "com.google.android.material", name = "material", version.ref = "materialVersion" }
[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }
diff --git a/settings.gradle b/settings.gradle
index 45a4461c7..5c054bd44 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -32,3 +32,4 @@ include ':app'
include ':benchmark'
include ':quartz'
include ':commons'
+include ':ammolite'