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'