diff --git a/app/build.gradle b/app/build.gradle index a40084a07..cb9b24d5d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 34 - versionCode 377 - versionName "0.88.0" + versionCode 379 + versionName "0.88.2" buildConfigField "String", "RELEASE_NOTES_ID", "\"2a34cbadd03212c8162e1ff896ba12641821088a2ec8d5e40d54aa80c0510800\"" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index 765456d70..3b21ef66d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -99,14 +99,7 @@ private object PrefKeys { const val WARN_ABOUT_REPORTS = "warn_about_reports" const val FILTER_SPAM_FROM_STRANGERS = "filter_spam_from_strangers" const val LAST_READ_PER_ROUTE = "last_read_route_per_route" - const val AUTOMATICALLY_SHOW_IMAGES = "automatically_show_images" - const val AUTOMATICALLY_START_PLAYBACK = "automatically_start_playback" - const val THEME = "theme" - const val PREFERRED_LANGUAGE = "preferred_Language" - const val AUTOMATICALLY_LOAD_URL_PREVIEW = "automatically_load_url_preview" - const val AUTOMATICALLY_HIDE_NAV_BARS = "automatically_hide_nav_bars" const val LOGIN_WITH_EXTERNAL_SIGNER = "login_with_external_signer" - const val AUTOMATICALLY_SHOW_PROFILE_PICTURE = "automatically_show_profile_picture" const val SIGNER_PACKAGE_NAME = "signer_package_name" const val HAS_DONATED_IN_VERSION = "has_donated_in_version" const val PENDING_ATTESTATIONS = "pending_attestations" @@ -148,7 +141,7 @@ object LocalPreferences { Event.mapper.readValue>(it) } - if (newSystemOfAccounts != null && newSystemOfAccounts.isNotEmpty()) { + if (!newSystemOfAccounts.isNullOrEmpty()) { savedAccounts = newSystemOfAccounts } else { val oldAccounts = getString(PrefKeys.SAVED_ACCOUNTS, null)?.split(COMMA) ?: listOf() @@ -164,6 +157,8 @@ object LocalPreferences { } savedAccounts = migrated + + edit().apply { putString(PrefKeys.ALL_ACCOUNT_INFO, Event.mapper.writeValueAsString(savedAccounts)) }.apply() } } } @@ -265,9 +260,7 @@ object LocalPreferences { saveToEncryptedStorage(account) } - fun allSavedAccounts(): List { - return savedAccounts() - } + fun allSavedAccounts(): List = savedAccounts() suspend fun saveToEncryptedStorage(account: Account) { Log.d("LocalPreferences", "Saving to encrypted storage") @@ -345,14 +338,11 @@ object LocalPreferences { PrefKeys.PENDING_ATTESTATIONS, Event.mapper.writeValueAsString(account.pendingAttestations.value), ) - } - .apply() + }.apply() } } - suspend fun loadCurrentAccountFromEncryptedStorage(): Account? { - return currentAccount()?.let { loadCurrentAccountFromEncryptedStorage(it) } - } + suspend fun loadCurrentAccountFromEncryptedStorage(): Account? = currentAccount()?.let { loadCurrentAccountFromEncryptedStorage(it) } suspend fun saveSharedSettings( sharedSettings: Settings, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt index 7b8761b27..298bcb6b3 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt @@ -27,6 +27,7 @@ import com.vitorpamplona.amethyst.service.relays.COMMON_FEED_TYPES import com.vitorpamplona.amethyst.service.relays.Client import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.amethyst.service.relays.EOSETime +import com.vitorpamplona.amethyst.service.relays.EVENT_FINDER_TYPES import com.vitorpamplona.amethyst.service.relays.JsonFilter import com.vitorpamplona.amethyst.service.relays.Relay import com.vitorpamplona.amethyst.service.relays.TypedFilter @@ -76,8 +77,8 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { val latestEOSEs = EOSEAccount() val hasLoadedTheBasics = mutableMapOf() - fun createAccountContactListFilter(): TypedFilter { - return TypedFilter( + fun createAccountContactListFilter(): TypedFilter = + TypedFilter( types = COMMON_FEED_TYPES, filter = JsonFilter( @@ -86,10 +87,9 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { limit = 1, ), ) - } - fun createAccountMetadataFilter(): TypedFilter { - return TypedFilter( + fun createAccountMetadataFilter(): TypedFilter = + TypedFilter( types = COMMON_FEED_TYPES, filter = JsonFilter( @@ -98,10 +98,9 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { limit = 1, ), ) - } - fun createAccountRelayListFilter(): TypedFilter { - return TypedFilter( + fun createAccountRelayListFilter(): TypedFilter = + TypedFilter( types = COMMON_FEED_TYPES, filter = JsonFilter( @@ -110,12 +109,11 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { limit = 10, ), ) - } fun createOtherAccountsBaseFilter(): TypedFilter? { if (otherAccounts.isEmpty()) return null return TypedFilter( - types = COMMON_FEED_TYPES, + types = EVENT_FINDER_TYPES, filter = JsonFilter( kinds = @@ -136,8 +134,8 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { ) } - fun createAccountSettingsFilter(): TypedFilter { - return TypedFilter( + fun createAccountSettingsFilter(): TypedFilter = + TypedFilter( types = COMMON_FEED_TYPES, filter = JsonFilter( @@ -146,10 +144,9 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { limit = 100, ), ) - } - fun createAccountReportsFilter(): TypedFilter { - return TypedFilter( + fun createAccountReportsFilter(): TypedFilter = + TypedFilter( types = COMMON_FEED_TYPES, filter = JsonFilter( @@ -162,10 +159,9 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { ?.relayList, ), ) - } - fun createAccountLastPostsListFilter(): TypedFilter { - return TypedFilter( + fun createAccountLastPostsListFilter(): TypedFilter = + TypedFilter( types = COMMON_FEED_TYPES, filter = JsonFilter( @@ -173,7 +169,6 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { limit = 400, ), ) - } fun createNotificationFilter(): TypedFilter { val since = @@ -404,8 +399,8 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { } } - override fun updateChannelFilters() { - return if (hasLoadedTheBasics[account.userProfile()] != null) { + override fun updateChannelFilters() = + if (hasLoadedTheBasics[account.userProfile()] != null) { // gets everything about the user logged in accountChannel.typedFilters = listOfNotNull( @@ -419,8 +414,7 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { createAccountSettingsFilter(), createAccountLastPostsListFilter(), createOtherAccountsBaseFilter(), - ) - .ifEmpty { null } + ).ifEmpty { null } } else { // just the basics. accountChannel.typedFilters = @@ -429,10 +423,8 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { createAccountContactListFilter(), createAccountRelayListFilter(), createAccountSettingsFilter(), - ) - .ifEmpty { null } + ).ifEmpty { null } } - } override fun auth( relay: Relay, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt index 9c2db5c65..58ab69b5b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt @@ -96,6 +96,7 @@ object NostrUserProfileDataSource : NostrDataSource("UserProfileFeed") { JsonFilter( kinds = listOf(LnZapEvent.KIND), tags = mapOf("p" to listOf(it.pubkeyHex)), + limit = 200, ), ) } @@ -178,7 +179,6 @@ object NostrUserProfileDataSource : NostrDataSource("UserProfileFeed") { createAcceptedAwardsFilter(), createReceivedAwardsFilter(), createBookmarksFilter(), - ) - .ifEmpty { null } + ).ifEmpty { null } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/AllRelayListView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/AllRelayListView.kt index d4171938e..3db105155 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/AllRelayListView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/AllRelayListView.kt @@ -40,6 +40,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties @@ -112,6 +113,8 @@ fun AllRelayListView( Text( text = stringRes(R.string.relay_settings), style = MaterialTheme.typography.titleLarge, + overflow = TextOverflow.Ellipsis, + maxLines = 1, ) SaveButton( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt index 9e0801307..463690343 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt @@ -408,7 +408,15 @@ fun GetMediaItem( authorName: String?, inner: @Composable (State) -> Unit, ) { - val data = remember(videoUri) { MediaItemData(videoUri, title, artworkUri, authorName) } + val data = + remember(videoUri) { + MediaItemData( + videoUri = videoUri, + authorName = authorName, + title = title, + artworkUri = artworkUri, + ) + } val mediaItem by produceCachedState(cache = mediaItemCache, key = data) mediaItem?.let { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt index ea0f3dd53..e75103ce7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt @@ -34,6 +34,8 @@ import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.animation.togetherWith import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement @@ -47,10 +49,13 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.ripple.rememberRipple import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.CardDefaults import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ElevatedCard import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProgressIndicatorDefaults @@ -1323,16 +1328,25 @@ fun ReactionChoicePopup( offset = IntOffset(0, iconSizePx), onDismissRequest = { onDismiss() }, ) { - FlowRow(horizontalArrangement = Arrangement.Center) { - account.reactionChoices.forEach { reactionType -> - ActionableReactionButton( - baseNote, - reactionType, - accountViewModel, - onDismiss, - onChangeAmount, - toRemove, - ) + ElevatedCard( + Modifier + .border(width = 1.dp, color = MaterialTheme.colorScheme.outline, shape = RoundedCornerShape(5.dp)), + elevation = CardDefaults.elevatedCardElevation(defaultElevation = 8.dp), + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceVariant), + ) { + Box(modifier = Modifier.padding(5.dp)) { + FlowRow(horizontalArrangement = Arrangement.Center) { + account.reactionChoices.forEach { reactionType -> + ActionableReactionButton( + baseNote, + reactionType, + accountViewModel, + onDismiss, + onChangeAmount, + toRemove, + ) + } + } } } } @@ -1348,24 +1362,11 @@ private fun ActionableReactionButton( onChangeAmount: () -> Unit, toRemove: ImmutableSet, ) { - Button( - modifier = Modifier.padding(horizontal = 3.dp), - onClick = { - accountViewModel.reactToOrDelete( - baseNote, - reactionType, - ) - onDismiss() - }, - shape = ButtonBorder, - colors = - ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.primary, - ), - ) { - val thisModifier = - remember(reactionType) { - Modifier.combinedClickable( + val thisModifier = + remember(reactionType) { + Modifier + .padding(horizontal = 3.dp) + .combinedClickable( onClick = { accountViewModel.reactToOrDelete( baseNote, @@ -1375,59 +1376,60 @@ private fun ActionableReactionButton( }, onLongClick = { onChangeAmount() }, ) + .padding(5.dp) + } + + val removeSymbol = + remember(reactionType) { + if (reactionType in toRemove) { + " ✖" + } else { + "" } + } - val removeSymbol = - remember(reactionType) { - if (reactionType in toRemove) { - " ✖" - } else { - "" - } - } + if (reactionType.startsWith(":")) { + val noStartColon = reactionType.removePrefix(":") + val url = noStartColon.substringAfter(":") - if (reactionType.startsWith(":")) { - val noStartColon = reactionType.removePrefix(":") - val url = noStartColon.substringAfter(":") - - val renderable = - persistentListOf( - Nip30CustomEmoji.ImageUrlType(url), - Nip30CustomEmoji.TextType(removeSymbol), - ) - - InLineIconRenderer( - renderable, - style = SpanStyle(color = Color.White), - maxLines = 1, + val renderable = + persistentListOf( + Nip30CustomEmoji.ImageUrlType(url), + Nip30CustomEmoji.TextType(removeSymbol), ) - } else { - when (reactionType) { - "+" -> { - LikedIcon(modifier = thisModifier.size(16.dp), tint = Color.White) - Text( - text = removeSymbol, - color = Color.White, - textAlign = TextAlign.Center, - modifier = thisModifier, - ) - } - "-" -> - Text( - text = "\uD83D\uDC4E$removeSymbol", - color = Color.White, - textAlign = TextAlign.Center, - modifier = thisModifier, - ) - else -> - Text( - "$reactionType$removeSymbol", - color = Color.White, - textAlign = TextAlign.Center, - modifier = thisModifier, - ) + InLineIconRenderer( + renderable, + style = SpanStyle(color = Color.White), + maxLines = 1, + modifier = thisModifier, + ) + } else { + when (reactionType) { + "+" -> { + LikedIcon(modifier = thisModifier.size(16.dp), tint = Color.White) + + Text( + text = removeSymbol, + color = Color.White, + textAlign = TextAlign.Center, + modifier = thisModifier, + ) } + "-" -> + Text( + text = "\uD83D\uDC4E$removeSymbol", + color = Color.White, + textAlign = TextAlign.Center, + modifier = thisModifier, + ) + else -> + Text( + "$reactionType$removeSymbol", + color = Color.White, + textAlign = TextAlign.Center, + modifier = thisModifier, + ) } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UpdateReactionTypeDialog.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UpdateReactionTypeDialog.kt index dda328e88..ce474e245 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UpdateReactionTypeDialog.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UpdateReactionTypeDialog.kt @@ -21,12 +21,14 @@ package com.vitorpamplona.amethyst.ui.note import androidx.compose.animation.animateContentSize +import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth @@ -38,6 +40,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button @@ -265,15 +268,17 @@ private fun RenderReactionOption( reactionType: String, postViewModel: UpdateReactionTypeViewModel, ) { - Button( - modifier = Modifier.padding(horizontal = 3.dp), - shape = ButtonBorder, - colors = - ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.primary, - ), - onClick = { postViewModel.removeChoice(reactionType) }, - contentPadding = PaddingValues(horizontal = 5.dp), + Box( + modifier = + Modifier + .padding(3.dp) + .clickable { postViewModel.removeChoice(reactionType) } + .border( + width = 1.dp, + color = MaterialTheme.colorScheme.surfaceDim, + shape = RoundedCornerShape(8.dp), + ) + .padding(8.dp), ) { if (reactionType.startsWith(":")) { val noStartColon = reactionType.removePrefix(":") @@ -287,30 +292,30 @@ private fun RenderReactionOption( InLineIconRenderer( renderable, - style = SpanStyle(color = Color.White), + style = SpanStyle(color = MaterialTheme.colorScheme.onBackground), maxLines = 1, ) } else { when (reactionType) { "+" -> { - LikedIcon(modifier = Modifier.size(16.dp), tint = Color.White) + LikedIcon(modifier = Modifier.size(16.dp), tint = MaterialTheme.colorScheme.onBackground) Text( text = " ✖", - color = Color.White, + color = MaterialTheme.colorScheme.onBackground, textAlign = TextAlign.Center, ) } "-" -> Text( text = "\uD83D\uDC4E ✖", - color = Color.White, + color = MaterialTheme.colorScheme.onBackground, textAlign = TextAlign.Center, ) else -> Text( text = "$reactionType ✖", - color = Color.White, + color = MaterialTheme.colorScheme.onBackground, textAlign = TextAlign.Center, ) } diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index de844f632..e5b2b3327 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -113,6 +113,7 @@ Dirección web Dirección LN Dirección LN (antigua) + Guardar en la galería Imagen guardada en la galería Error al guardar la imagen Cargar imagen @@ -407,6 +408,7 @@ Idiomas Etiquetas Política de publicación + Errores y avisos de este relé Longitud del mensaje Suscripciones Filtros @@ -449,6 +451,7 @@ Nunca Completo Simplificado + Rendimiento Sistema Claro Oscuro @@ -500,6 +503,7 @@ Cuándo cargar imágenes Copiar al portapapeles Copiar npub al portapapeles + Compartir o guardar Copiar URL al portapapeles Copiar ID de la nota al portapapeles Creado @@ -512,6 +516,10 @@ Mensaje para el usuario OK No se pudo llegar a %1$s: %2$s + Error al ensamblar la url NIP-11 para %1$s: %2$s + No se pudo contactar %1$s: %2$s + Error al analizar la respuesta de %1$s: %2$s + El relé rechazó la solicitud %1$s: %2$s No se pudo llegar a %1$s: %2$s Error al analizar el resultado de %1$s: %2$s %1$s falló con el código %2$s diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index 5b632d029..31b18062b 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -113,6 +113,7 @@ URL del sitio web Dirección de Lightning URL de Lightning (obsoleta) + Guardar en la galería Imagen guardada en la galería Error al guardar la imagen Subir imagen @@ -407,6 +408,7 @@ Idiomas Etiquetas Política de publicación + Errores y avisos de este relé Longitud del mensaje Suscripciones Filtros @@ -449,6 +451,7 @@ Nunca Completo Simplificado + Rendimiento Sistema Claro Oscuro @@ -500,6 +503,7 @@ Cuándo cargar imágenes Copiar al portapapeles Copiar npub al portapapeles + Compartir o guardar Copiar URL al portapapeles Copiar ID de la nota al portapapeles Creado @@ -512,6 +516,10 @@ Mensaje para el usuario OK No se pudo llegar a %1$s: %2$s + Error al ensamblar la url NIP-11 para %1$s: %2$s + No se pudo contactar %1$s: %2$s + Error al analizar la respuesta de %1$s: %2$s + El relé rechazó la solicitud %1$s: %2$s No se pudo llegar a %1$s: %2$s Error al analizar el resultado de %1$s: %2$s %1$s falló con el código %2$s diff --git a/app/src/main/res/values-es-rUS/strings.xml b/app/src/main/res/values-es-rUS/strings.xml index c51b76879..a52f9e805 100644 --- a/app/src/main/res/values-es-rUS/strings.xml +++ b/app/src/main/res/values-es-rUS/strings.xml @@ -113,6 +113,7 @@ URL del sitio web Dirección de Lightning URL de Lightning (obsoleta) + Guardar en la galería Imagen guardada en la galería Error al guardar la imagen Subir imagen @@ -407,6 +408,7 @@ Idiomas Etiquetas Política de publicación + Errores y avisos de este relé Longitud del mensaje Suscripciones Filtros @@ -449,6 +451,7 @@ Nunca Completo Simplificado + Rendimiento Sistema Claro Oscuro @@ -500,6 +503,7 @@ Cuándo cargar imágenes Copiar al portapapeles Copiar npub al portapapeles + Compartir o guardar Copiar URL al portapapeles Copiar ID de la nota al portapapeles Creado @@ -512,6 +516,10 @@ Mensaje para el usuario OK No se pudo llegar a %1$s: %2$s + Error al ensamblar la url NIP-11 para %1$s: %2$s + No se pudo contactar %1$s: %2$s + Error al analizar la respuesta de %1$s: %2$s + El relé rechazó la solicitud %1$s: %2$s No se pudo llegar a %1$s: %2$s Error al analizar el resultado de %1$s: %2$s %1$s falló con el código %2$s diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 8ef284a6b..c63292a5e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -8,7 +8,7 @@ Montrer quand même Ce message a été masqué car il mentionne vos utilisateurs ou mots cachés Post signalé inapproprié par - Post non trouvé + L\'événement est en cours de chargement ou ne peut pas être trouvé dans votre liste de relais Image du canal référence de l\'évènement non trouvée Impossible de déchiffrer le message @@ -451,6 +451,7 @@ Jamais Complet Simplifié + Performance Système Clair Sombre diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 78bb18d81..7672545ad 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -113,6 +113,7 @@ Oldalam URL-je LN Cím LN URL (elavult) + Mentés a galériába A kép a galériába mentve Nem sikerült menteni a képet Kép feltöltése @@ -449,6 +450,7 @@ Soha Teljes Egyszerűsített + Teljesítmény-beállítások Rendszer Világos Sötét @@ -500,6 +502,7 @@ Mikor kell a képeket betölteni Másolás a vágólapra Npub másolása a vágólapra + Megosztás vagy Mentés Az URL vágólapra másolása A bejegyzésazonosító vágólapra másolása Létrehozva @@ -512,6 +515,10 @@ Üzenet a Felhasználónak Ok Nem sikerült elérni %1$s: %2$s + Nem sikerült összeállítani a NIP-11 URL-t a következőhöz: %1$s: %2$s + Nem sikerült elérni %1$s: %2$s + Nem sikerült a válasz elemzése a %1$s: %2$s + A csomópont elutasította a(z) %1$s kérést: %2$s Nem sikerült elérni %1$s: %2$s Nem sikerült az eredmény elemzése a %1$s: %2$s %1$s hiba a következő kóddal %2$s diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index b4055fe8d..5cc12cf94 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -451,6 +451,7 @@ Nooit Voltooid Vereenvoudigd + Prestaties Systeem Licht Donker @@ -515,6 +516,10 @@ Bericht de gebruiker Ok Mislukt om %1$s te bereiken: %2$s + Fout bij het verzamelen van de NIP-11 url voor %1$s: %2$s + Mislukt om %1$s te bereiken: %2$s + Mislukt om het resultaat van %1$s te parsen: %2$s + Relay wijst aanvraag %1$s af: %2$s Mislukt om %1$s te bereiken: %2$s Mislukt om het resultaat van %1$s te parsen: %2$s %1$s mislukt met code %2$s diff --git a/quartz/build.gradle b/quartz/build.gradle index fb153c6f0..f775df581 100644 --- a/quartz/build.gradle +++ b/quartz/build.gradle @@ -57,9 +57,7 @@ dependencies { implementation 'net.java.dev.jna:jna:5.14.0@aar' // Performant Parser of JSONs into Events - api(libs.jackson.module.kotlin) { - exclude(module: 'byte-buddy') // Workaround https://github.com/FasterXML/jackson-databind/issues/4428 until Jackson 2.17.1 - } + api(libs.jackson.module.kotlin) // immutable collections to avoid recomposition api libs.kotlinx.collections.immutable diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/LiveActivitiesEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/LiveActivitiesEvent.kt index 131d34c6e..564c94200 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/LiveActivitiesEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/LiveActivitiesEvent.kt @@ -60,17 +60,14 @@ class LiveActivitiesEvent( fun hosts() = tags.filter { it.size > 3 && it[0] == "p" && it[3].equals("Host", true) }.map { it[1] } - fun checkStatus(eventStatus: String?): String? { - return if (eventStatus == STATUS_LIVE && createdAt < TimeUtils.eightHoursAgo()) { + fun checkStatus(eventStatus: String?): String? = + if (eventStatus == STATUS_LIVE && createdAt < TimeUtils.eightHoursAgo()) { STATUS_ENDED } else { eventStatus } - } - fun participantsIntersect(keySet: Set): Boolean { - return tags.any { it.size > 1 && it[0] == "p" && it[1] in keySet } - } + fun participantsIntersect(keySet: Set): Boolean = keySet.contains(pubKey) || tags.any { it.size > 1 && it[0] == "p" && it[1] in keySet } companion object { const val KIND = 30311 diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/utils/TimeUtils.kt b/quartz/src/main/java/com/vitorpamplona/quartz/utils/TimeUtils.kt index bb13e4f99..2b71a4e60 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/utils/TimeUtils.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/utils/TimeUtils.kt @@ -55,5 +55,7 @@ object TimeUtils { fun oneWeekAgo() = now() - ONE_WEEK + fun oneMonthAgo() = now() - ONE_MONTH + fun randomWithTwoDays() = System.currentTimeMillis() / 1000 - CryptoUtils.randomInt(twoDays()) }