From 43339b8d36962e0f90a9f2a2c39724949001dc53 Mon Sep 17 00:00:00 2001 From: VASH Date: Sat, 15 Jun 2024 18:15:16 +0200 Subject: [PATCH 01/14] redesign emoji selector --- .../ui/actions/relays/AllRelayListView.kt | 2 + .../amethyst/ui/note/ReactionsRow.kt | 162 +++++++++--------- .../ui/note/UpdateReactionTypeDialog.kt | 35 ++-- 3 files changed, 104 insertions(+), 95 deletions(-) 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 0dbf3bc8f..b0f74cc86 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 @@ -27,6 +27,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme @@ -112,6 +113,7 @@ fun AllRelayListView( Text( text = stringResource(R.string.relay_settings), style = MaterialTheme.typography.titleLarge, + modifier = Modifier.widthIn(max = 200.dp), ) SaveButton( 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 0d48b980a..30d17ece1 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.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LinearProgressIndicator @@ -1305,16 +1310,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, + ) + } + } } } } @@ -1330,24 +1344,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, @@ -1357,63 +1358,64 @@ 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) { - "+" -> { - Icon( - painter = painterResource(R.drawable.ic_liked), - null, - modifier = remember { 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) { + "+" -> { + Icon( + painter = painterResource(R.drawable.ic_liked), + null, + modifier = remember { 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 68d1109c8..15a26db15 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 @@ -269,15 +272,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(":") @@ -291,7 +296,7 @@ private fun RenderReactionOption( InLineIconRenderer( renderable, - style = SpanStyle(color = Color.White), + style = SpanStyle(color = MaterialTheme.colorScheme.onBackground), maxLines = 1, ) } else { @@ -301,24 +306,24 @@ private fun RenderReactionOption( painter = painterResource(R.drawable.ic_liked), null, modifier = remember { Modifier.size(16.dp) }, - tint = Color.White, + 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, ) } From d33befe1ad8b3fe46012822bddcfd3343ee99227 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 20 Jun 2024 09:42:10 -0400 Subject: [PATCH 02/14] Removes account migration and unused keys for shared preferences. --- .../amethyst/LocalPreferences.kt | 33 ++----------------- 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index 765456d70..a1aa03e1b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -72,7 +72,6 @@ data class AccountInfo( private object PrefKeys { const val CURRENT_ACCOUNT = "currently_logged_in_account" - const val SAVED_ACCOUNTS = "all_saved_accounts" const val NOSTR_PRIVKEY = "nostr_privkey" const val NOSTR_PUBKEY = "nostr_pubkey" const val RELAYS = "relays" @@ -99,14 +98,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" @@ -150,20 +142,6 @@ object LocalPreferences { if (newSystemOfAccounts != null && newSystemOfAccounts.isNotEmpty()) { savedAccounts = newSystemOfAccounts - } else { - val oldAccounts = getString(PrefKeys.SAVED_ACCOUNTS, null)?.split(COMMA) ?: listOf() - - val migrated = - oldAccounts.map { npub -> - AccountInfo( - npub, - encryptedPreferences(npub).getBoolean(PrefKeys.LOGIN_WITH_EXTERNAL_SIGNER, false), - (encryptedPreferences(npub).getString(PrefKeys.NOSTR_PRIVKEY, "") ?: "") - .isNotBlank(), - ) - } - - savedAccounts = migrated } } } @@ -265,9 +243,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 +321,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, From 3a4e2e962363b3120bcd16fe5de6f691fa4c7424 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 20 Jun 2024 09:47:11 -0400 Subject: [PATCH 03/14] Don't use DM kinds to get information about other logged-in accounts --- .../service/NostrAccountDataSource.kt | 44 ++++++++----------- 1 file changed, 18 insertions(+), 26 deletions(-) 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, From 0d956c2f39e3f2fd7405c2f720ae98f89d85c52b Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 20 Jun 2024 09:47:43 -0400 Subject: [PATCH 04/14] Removes the need to exclude byte-buddy due to jackson's earlier version bug. --- quartz/build.gradle | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 From eaa09055fc4b8bff7de414409392e474e3e41e82 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 20 Jun 2024 09:48:10 -0400 Subject: [PATCH 05/14] v0.88.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a40084a07..0b028c989 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 378 + versionName "0.88.1" buildConfigField "String", "RELEASE_NOTES_ID", "\"2a34cbadd03212c8162e1ff896ba12641821088a2ec8d5e40d54aa80c0510800\"" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From ec19038e5c39d28c419e71ef195dd386c56e3965 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Thu, 20 Jun 2024 13:50:41 +0000 Subject: [PATCH 06/14] New Crowdin translations by GitHub Action --- app/src/main/res/values-es-rES/strings.xml | 8 ++++++++ app/src/main/res/values-es-rMX/strings.xml | 8 ++++++++ app/src/main/res/values-es-rUS/strings.xml | 8 ++++++++ 3 files changed, 24 insertions(+) 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 From 82f99faec849985fc977180c91788dbbd58c4d7e Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 20 Jun 2024 12:22:07 -0400 Subject: [PATCH 07/14] Fixes name instead of uri --- .../vitorpamplona/amethyst/ui/components/VideoView.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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 { From 9e9e0667cde3b1a4acef8f5fb059dc00c4a1525f Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 20 Jun 2024 16:29:48 -0400 Subject: [PATCH 08/14] Reverts old migration of accounts due the fact that some people were still in the old model --- .../amethyst/LocalPreferences.kt | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index a1aa03e1b..3b21ef66d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -72,6 +72,7 @@ data class AccountInfo( private object PrefKeys { const val CURRENT_ACCOUNT = "currently_logged_in_account" + const val SAVED_ACCOUNTS = "all_saved_accounts" const val NOSTR_PRIVKEY = "nostr_privkey" const val NOSTR_PUBKEY = "nostr_pubkey" const val RELAYS = "relays" @@ -140,8 +141,24 @@ 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() + + val migrated = + oldAccounts.map { npub -> + AccountInfo( + npub, + encryptedPreferences(npub).getBoolean(PrefKeys.LOGIN_WITH_EXTERNAL_SIGNER, false), + (encryptedPreferences(npub).getString(PrefKeys.NOSTR_PRIVKEY, "") ?: "") + .isNotBlank(), + ) + } + + savedAccounts = migrated + + edit().apply { putString(PrefKeys.ALL_ACCOUNT_INFO, Event.mapper.writeValueAsString(savedAccounts)) }.apply() } } } From b39ac214a5b505ff9ce292b05d2ffad073e340dd Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 20 Jun 2024 16:30:12 -0400 Subject: [PATCH 09/14] Limits the amount of zaps on the user profile --- .../amethyst/service/NostrUserProfileDataSource.kt | 4 ++-- .../src/main/java/com/vitorpamplona/quartz/utils/TimeUtils.kt | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) 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/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()) } From 0e1e379c7dc65a99d0fabaf5fe228bca7ed310a8 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 20 Jun 2024 16:30:33 -0400 Subject: [PATCH 10/14] v0.88.2 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0b028c989..cb9b24d5d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 34 - versionCode 378 - versionName "0.88.1" + versionCode 379 + versionName "0.88.2" buildConfigField "String", "RELEASE_NOTES_ID", "\"2a34cbadd03212c8162e1ff896ba12641821088a2ec8d5e40d54aa80c0510800\"" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From fece7411c944d17903aba67651fc367ccd98de67 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Thu, 20 Jun 2024 20:32:46 +0000 Subject: [PATCH 11/14] New Crowdin translations by GitHub Action --- app/src/main/res/values-fr/strings.xml | 3 ++- app/src/main/res/values-hu/strings.xml | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) 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 From 3fa58778407a77d93fe232d709f27382dfd528bc Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 20 Jun 2024 17:39:20 -0400 Subject: [PATCH 12/14] Fixes formatting --- .../amethyst/ui/actions/relays/AllRelayListView.kt | 5 +++-- .../java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt | 4 +--- .../amethyst/ui/note/UpdateReactionTypeDialog.kt | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) 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 2d4bdbf45..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 @@ -27,7 +27,6 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme @@ -41,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 @@ -113,7 +113,8 @@ fun AllRelayListView( Text( text = stringRes(R.string.relay_settings), style = MaterialTheme.typography.titleLarge, - modifier = Modifier.widthIn(max = 200.dp), + overflow = TextOverflow.Ellipsis, + maxLines = 1, ) SaveButton( 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 ce5ff730e..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 @@ -56,8 +56,6 @@ import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.CardDefaults import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ElevatedCard -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProgressIndicatorDefaults @@ -1410,7 +1408,7 @@ private fun ActionableReactionButton( when (reactionType) { "+" -> { LikedIcon(modifier = thisModifier.size(16.dp), tint = Color.White) - + Text( text = removeSymbol, color = Color.White, 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 bae00dcd3..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 @@ -299,7 +299,7 @@ private fun RenderReactionOption( when (reactionType) { "+" -> { LikedIcon(modifier = Modifier.size(16.dp), tint = MaterialTheme.colorScheme.onBackground) - + Text( text = " ✖", color = MaterialTheme.colorScheme.onBackground, From 35a9c07636b3604c8f63108de12df8434946fea4 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 21 Jun 2024 09:24:01 -0400 Subject: [PATCH 13/14] Adds pubkey to the host filter in live events. --- .../vitorpamplona/quartz/events/LiveActivitiesEvent.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) 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 From 4470d01229aa4a90aa8c32631410b73ff6606778 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Fri, 21 Jun 2024 13:26:29 +0000 Subject: [PATCH 14/14] New Crowdin translations by GitHub Action --- app/src/main/res/values-nl/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) 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