Compare commits

...
18 Commits
Author SHA1 Message Date
Vitor Pamplona f73c9b5773 v0.85.3 2024-03-04 18:09:03 -05:00
Vitor Pamplona 5848255e72 Displaying issues and Patches in the Notification 2024-03-04 18:01:12 -05:00
Vitor Pamplona 1cf828b165 v0.85.2 2024-03-04 17:52:08 -05:00
Vitor PamplonaandGitHub 2e1f7d6587 Merge pull request #799 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2024-03-04 17:00:26 -05:00
Crowdin Bot c6977d97d3 New Crowdin translations by GitHub Action 2024-03-04 21:54:12 +00:00
Vitor Pamplona d12e886e9e Bringing GitIssues in the Notification 2024-03-04 16:52:38 -05:00
Vitor Pamplona 8299f4cfca Cleans up the fork information on new posts has been canceled or posted. 2024-03-04 16:20:59 -05:00
Vitor Pamplona 432b1e4902 Fixes forking information kept from a previous post. 2024-03-04 16:15:09 -05:00
Vitor Pamplona e9fd62dc26 Displaying correct edits on the new edit proposal 2024-03-04 15:37:29 -05:00
Vitor Pamplona f42ec3c149 Merge branch 'main' of https://github.com/vitorpamplona/amethyst 2024-03-04 15:25:43 -05:00
Vitor PamplonaandGitHub 43e1e0f23e Merge pull request #798 from greenart7c3/multiple-results-crash
fix crash parsing multiple results from amber
2024-03-04 15:17:52 -05:00
Vitor Pamplona 7bc393143c Adds link to the version notes from the drawer 2024-03-04 15:12:17 -05:00
greenart7c3 23718f51dd fix crash parsing multiple results from amber 2024-03-04 17:11:01 -03:00
Vitor Pamplona 8b2efecfbe Merge branch 'main' of https://github.com/vitorpamplona/amethyst 2024-03-04 14:13:32 -05:00
Vitor Pamplona 9081d5a54b Adds nostr git for issue management software. 2024-03-04 14:13:23 -05:00
Vitor PamplonaandGitHub 709e3bdd3a Merge pull request #797 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2024-03-04 13:22:09 -05:00
Crowdin Bot 1f66ef717b New Crowdin translations by GitHub Action 2024-03-04 18:18:38 +00:00
Vitor Pamplona cd2b5d78a1 Don't show button to edit the post if the author of the original post is not the logged in user 2024-03-04 13:16:34 -05:00
14 changed files with 308 additions and 78 deletions
+4 -2
View File
@@ -241,12 +241,14 @@ dependencyResolutionManagement {
Add the dependency
```gradle
implementation('com.github.vitorpamplona.amethyst:quartz:v0.84.3')
implementation('com.github.vitorpamplona.amethyst:quartz:v0.85.1')
```
## Contributing
[Issues](https://github.com/vitorpamplona/amethyst/issues) and [pull requests](https://github.com/vitorpamplona/amethyst/pulls) here are very welcome. Translations can be provided via [Crowdin](https://crowdin.com/project/amethyst-social)
Issues can be logged on: [https://gitworkshop.dev/repo/amethyst](https://gitworkshop.dev/repo/amethyst)
[GitHub issues](https://github.com/vitorpamplona/amethyst/issues) and [pull requests](https://github.com/vitorpamplona/amethyst/pulls) here are also welcome. Translations can be provided via [Crowdin](https://crowdin.com/project/amethyst-social)
You can also send patches through Nostr using [GitStr](https://github.com/fiatjaf/gitstr) to [this nostr address](https://patch34.pages.dev/naddr1qqyxzmt9w358jum5qyg8v6t5daezumn0wd68yvfwvdhk6qg7waehxw309ahx7um5wgkhqatz9emk2mrvdaexgetj9ehx2ap0qy2hwumn8ghj7un9d3shjtnwdaehgu3wvfnj7q3qgcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqxpqqqpmej720gac)
+2 -2
View File
@@ -12,8 +12,8 @@ android {
applicationId "com.vitorpamplona.amethyst"
minSdk 26
targetSdk 34
versionCode 360
versionName "0.85.1"
versionCode 362
versionName "0.85.3"
buildConfigField "String", "RELEASE_NOTES_ID", "\"d8da33fd13d129d86c53564aedefafbe3716f007c520431be4a8e488d3925afb\""
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -35,6 +35,9 @@ import com.vitorpamplona.quartz.events.AdvertisedRelayListEvent
import com.vitorpamplona.quartz.events.BadgeAwardEvent
import com.vitorpamplona.quartz.events.BadgeProfilesEvent
import com.vitorpamplona.quartz.events.BookmarkListEvent
import com.vitorpamplona.quartz.events.CalendarDateSlotEvent
import com.vitorpamplona.quartz.events.CalendarRSVPEvent
import com.vitorpamplona.quartz.events.CalendarTimeSlotEvent
import com.vitorpamplona.quartz.events.ChannelMessageEvent
import com.vitorpamplona.quartz.events.ContactListEvent
import com.vitorpamplona.quartz.events.EmojiPackSelectionEvent
@@ -42,6 +45,10 @@ import com.vitorpamplona.quartz.events.Event
import com.vitorpamplona.quartz.events.EventInterface
import com.vitorpamplona.quartz.events.GenericRepostEvent
import com.vitorpamplona.quartz.events.GiftWrapEvent
import com.vitorpamplona.quartz.events.GitIssueEvent
import com.vitorpamplona.quartz.events.GitPatchEvent
import com.vitorpamplona.quartz.events.GitReplyEvent
import com.vitorpamplona.quartz.events.HighlightEvent
import com.vitorpamplona.quartz.events.LnZapEvent
import com.vitorpamplona.quartz.events.LnZapPaymentResponseEvent
import com.vitorpamplona.quartz.events.MetadataEvent
@@ -120,24 +127,12 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
)
}
fun createAccountAcceptedAwardsFilter(): TypedFilter {
fun createAccountSettingsFilter(): TypedFilter {
return TypedFilter(
types = COMMON_FEED_TYPES,
filter =
JsonFilter(
kinds = listOf(BadgeProfilesEvent.KIND, EmojiPackSelectionEvent.KIND),
authors = listOf(account.userProfile().pubkeyHex),
limit = 10,
),
)
}
fun createAccountBookmarkListFilter(): TypedFilter {
return TypedFilter(
types = COMMON_FEED_TYPES,
filter =
JsonFilter(
kinds = listOf(BookmarkListEvent.KIND, PeopleListEvent.KIND, MuteListEvent.KIND),
kinds = listOf(BookmarkListEvent.KIND, PeopleListEvent.KIND, MuteListEvent.KIND, BadgeProfilesEvent.KIND, EmojiPackSelectionEvent.KIND),
authors = listOf(account.userProfile().pubkeyHex),
limit = 100,
),
@@ -204,6 +199,36 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
)
}
fun createNotificationFilter2(): TypedFilter {
val since =
latestEOSEs.users[account.userProfile()]
?.followList
?.get(account.defaultNotificationFollowList.value)
?.relayList
?: account.activeRelays()?.associate { it.url to EOSETime(TimeUtils.oneWeekAgo()) }
?: account.convertLocalRelays().associate { it.url to EOSETime(TimeUtils.oneWeekAgo()) }
return TypedFilter(
types = COMMON_FEED_TYPES,
filter =
JsonFilter(
kinds =
listOf(
GitReplyEvent.KIND,
GitIssueEvent.KIND,
GitPatchEvent.KIND,
HighlightEvent.KIND,
CalendarDateSlotEvent.KIND,
CalendarTimeSlotEvent.KIND,
CalendarRSVPEvent.KIND,
),
tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)),
limit = 400,
since = since,
),
)
}
fun createGiftWrapsToMeFilter() =
TypedFilter(
types = COMMON_FEED_TYPES,
@@ -297,10 +322,10 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
createAccountContactListFilter(),
createAccountRelayListFilter(),
createNotificationFilter(),
createNotificationFilter2(),
createGiftWrapsToMeFilter(),
createAccountReportsFilter(),
createAccountAcceptedAwardsFilter(),
createAccountBookmarkListFilter(),
createAccountSettingsFilter(),
createAccountLastPostsListFilter(),
createOtherAccountsBaseFilter(),
)
@@ -312,7 +337,7 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
createAccountMetadataFilter(),
createAccountContactListFilter(),
createAccountRelayListFilter(),
createAccountBookmarkListFilter(),
createAccountSettingsFilter(),
)
.ifEmpty { null }
}
@@ -289,6 +289,8 @@ open class NewPostViewModel() : ViewModel() {
}
forkedFromNote = it
} ?: run {
forkedFromNote = null
}
if (!forwardZapTo.items.isEmpty()) {
@@ -627,6 +629,8 @@ open class NewPostViewModel() : ViewModel() {
toUsers = TextFieldValue("")
subject = TextFieldValue("")
forkedFromNote = null
contentToAddUrl = null
urlPreview = null
isUploadingImage = false
@@ -32,6 +32,9 @@ import com.vitorpamplona.quartz.events.ChannelCreateEvent
import com.vitorpamplona.quartz.events.ChannelMetadataEvent
import com.vitorpamplona.quartz.events.GenericRepostEvent
import com.vitorpamplona.quartz.events.GiftWrapEvent
import com.vitorpamplona.quartz.events.GitIssueEvent
import com.vitorpamplona.quartz.events.GitPatchEvent
import com.vitorpamplona.quartz.events.HighlightEvent
import com.vitorpamplona.quartz.events.LnZapEvent
import com.vitorpamplona.quartz.events.LnZapRequestEvent
import com.vitorpamplona.quartz.events.MuteListEvent
@@ -94,6 +97,14 @@ class NotificationFeedFilter(val account: Account) : AdditiveFeedFilter<Note>()
): Boolean {
val event = note.event
if (event is GitIssueEvent || event is GitPatchEvent) {
return true
}
if (event is HighlightEvent) {
return true
}
if (event is BaseTextNoteEvent) {
if (note.replyTo?.any { it.author?.pubkeyHex == authorHex } == true) return true
@@ -72,10 +72,13 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -86,6 +89,7 @@ import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.service.relays.RelayPool
import com.vitorpamplona.amethyst.service.relays.RelayPoolStatus
import com.vitorpamplona.amethyst.ui.actions.NewRelayListView
import com.vitorpamplona.amethyst.ui.components.ClickableText
import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji
import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage
import com.vitorpamplona.amethyst.ui.note.LoadStatuses
@@ -736,29 +740,24 @@ fun BottomContent(
modifier = Modifier.fillMaxWidth().padding(horizontal = 15.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Text(
ClickableText(
text =
buildAnnotatedString {
withStyle(
SpanStyle(
fontSize = 12.sp,
fontWeight = FontWeight.Bold,
),
) {
append("v" + BuildConfig.VERSION_NAME + "-" + BuildConfig.FLAVOR.uppercase())
}
},
onClick = {
nav("Note/${BuildConfig.RELEASE_NOTES_ID}")
coroutineScope.launch { drawerState.close() }
},
modifier = Modifier.padding(start = 16.dp),
text = "v" + BuildConfig.VERSION_NAME + "-" + BuildConfig.FLAVOR.uppercase(),
fontSize = 12.sp,
fontWeight = FontWeight.Bold,
)
/*
IconButton(
onClick = {
when (AppCompatDelegate.getDefaultNightMode()) {
AppCompatDelegate.MODE_NIGHT_NO -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
AppCompatDelegate.MODE_NIGHT_YES -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
else -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
}
) {
Icon(
painter = painterResource(R.drawable.ic_theme),
null,
modifier = Modifier.size(24.dp),
tint = MaterialTheme.colorScheme.primary
)
}*/
Box(modifier = Modifier.weight(1F))
IconButton(
onClick = {
@@ -230,6 +230,7 @@ import com.vitorpamplona.quartz.events.FhirResourceEvent
import com.vitorpamplona.quartz.events.FileHeaderEvent
import com.vitorpamplona.quartz.events.FileStorageHeaderEvent
import com.vitorpamplona.quartz.events.GenericRepostEvent
import com.vitorpamplona.quartz.events.GitIssueEvent
import com.vitorpamplona.quartz.events.GitPatchEvent
import com.vitorpamplona.quartz.events.GitRepositoryEvent
import com.vitorpamplona.quartz.events.HighlightEvent
@@ -1136,6 +1137,11 @@ class EditState() {
fun latest() = modificationsList.lastOrNull()
fun latestBefore(createdAt: Long?): Note? {
if (createdAt == null) return latest()
return modificationsList.lastOrNull { (it.createdAt() ?: Long.MAX_VALUE) < createdAt }
}
fun nextModification() {
if (modificationToShowIndex < 0) {
modificationToShowIndex = 0
@@ -1304,6 +1310,16 @@ private fun RenderNoteRow(
nav,
)
}
is GitIssueEvent -> {
RenderGitIssueEvent(
baseNote,
makeItShort,
canPreview,
backgroundColor,
accountViewModel,
nav,
)
}
is PrivateDmEvent -> {
RenderPrivateMessage(
baseNote,
@@ -1370,7 +1386,6 @@ private fun RenderNoteRow(
makeItShort,
canPreview,
backgroundColor,
editState,
accountViewModel,
nav,
)
@@ -1509,40 +1524,31 @@ fun RenderTextModificationEvent(
makeItShort: Boolean,
canPreview: Boolean,
backgroundColor: MutableState<Color>,
editStateByAuthor: State<GenericLoadable<EditState>>,
accountViewModel: AccountViewModel,
nav: (String) -> Unit,
) {
val noteEvent = note.event as? TextNoteModificationEvent ?: return
val noteAuthor = note.author ?: return
val isAuthorTheLoggedUser = remember(note.event) { accountViewModel.isLoggedUser(note.author) }
val editState =
remember {
derivedStateOf {
val loadable = editStateByAuthor.value as? GenericLoadable.Loaded<EditState>
val state = EditState()
val latestChangeByAuthor =
if (loadable != null && loadable.loaded.hasModificationsToShow()) {
loadable.loaded.latest()
} else {
null
}
state.updateModifications(listOfNotNull(latestChangeByAuthor, note))
GenericLoadable.Loaded(state)
}
}
val wantsToEditPost =
remember {
mutableStateOf(false)
}
val isAuthorTheLoggedUser =
remember {
val authorOfTheOriginalNote = noteEvent.editedNote()?.let { accountViewModel.getNoteIfExists(it)?.author }
mutableStateOf(accountViewModel.isLoggedUser(authorOfTheOriginalNote))
}
noteEvent.editedNote()?.let {
LoadNote(baseNoteHex = it, accountViewModel = accountViewModel) { baseOriginalNote ->
baseOriginalNote?.let {
}
}
}
Card(
modifier = MaterialTheme.colorScheme.imageModifier,
) {
@@ -1574,6 +1580,38 @@ fun RenderTextModificationEvent(
noteEvent.editedNote()?.let {
LoadNote(baseNoteHex = it, accountViewModel = accountViewModel) { baseNote ->
baseNote?.let {
val noteState by baseNote.live().metadata.observeAsState()
val editStateOriginalNote = observeEdits(baseNote = baseNote, accountViewModel = accountViewModel)
val editState =
remember(note) {
derivedStateOf {
val loadable = editStateOriginalNote.value as? GenericLoadable.Loaded<EditState>
val state = EditState()
val latestChangeByAuthor =
if (loadable != null && loadable.loaded.hasModificationsToShow()) {
loadable.loaded.latestBefore(note.createdAt())
} else {
null
}
state.updateModifications(listOfNotNull(latestChangeByAuthor, note))
GenericLoadable.Loaded(state)
}
}
LaunchedEffect(key1 = noteState) {
val newAuthor = accountViewModel.isLoggedUser(noteState?.note?.author)
if (isAuthorTheLoggedUser.value != newAuthor) {
isAuthorTheLoggedUser.value = newAuthor
}
}
Column(
modifier =
MaterialTheme.colorScheme.innerPostModifier.padding(Size10dp).clickable {
@@ -1609,13 +1647,15 @@ fun RenderTextModificationEvent(
}
}
Spacer(modifier = StdVertSpacer)
if (isAuthorTheLoggedUser.value) {
Spacer(modifier = StdVertSpacer)
Button(
onClick = { wantsToEditPost.value = true },
modifier = Modifier.fillMaxWidth(),
) {
Text(text = stringResource(id = R.string.accept_the_suggestion))
Button(
onClick = { wantsToEditPost.value = true },
modifier = Modifier.fillMaxWidth(),
) {
Text(text = stringResource(id = R.string.accept_the_suggestion))
}
}
}
}
@@ -4095,6 +4135,92 @@ private fun RenderGitPatchEvent(
}
}
@Composable
fun RenderGitIssueEvent(
baseNote: Note,
makeItShort: Boolean,
canPreview: Boolean,
backgroundColor: MutableState<Color>,
accountViewModel: AccountViewModel,
nav: (String) -> Unit,
) {
val event = baseNote.event as? GitIssueEvent ?: return
RenderGitIssueEvent(event, baseNote, makeItShort, canPreview, backgroundColor, accountViewModel, nav)
}
@Composable
private fun RenderGitIssueEvent(
noteEvent: GitIssueEvent,
note: Note,
makeItShort: Boolean,
canPreview: Boolean,
backgroundColor: MutableState<Color>,
accountViewModel: AccountViewModel,
nav: (String) -> Unit,
) {
val repository = remember(noteEvent) { noteEvent.repository() }
if (repository != null) {
LoadAddressableNote(aTag = repository, accountViewModel = accountViewModel) {
if (it != null) {
RenderShortRepositoryHeader(it, accountViewModel, nav)
Spacer(modifier = DoubleVertSpacer)
}
}
}
LoadDecryptedContent(note, accountViewModel) { body ->
val eventContent by
remember(note.event) {
derivedStateOf {
val subject = (note.event as? TextNoteEvent)?.subject()?.ifEmpty { null }
if (!subject.isNullOrBlank() && !body.split("\n")[0].contains(subject)) {
"### $subject\n$body"
} else {
body
}
}
}
val isAuthorTheLoggedUser = remember(note.event) { accountViewModel.isLoggedUser(note.author) }
if (makeItShort && isAuthorTheLoggedUser) {
Text(
text = eventContent,
color = MaterialTheme.colorScheme.placeholderText,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
)
} else {
SensitivityWarning(
note = note,
accountViewModel = accountViewModel,
) {
val modifier = remember(note) { Modifier.fillMaxWidth() }
val tags = remember(note) { note.event?.tags()?.toImmutableListOfLists() ?: EmptyTagList }
TranslatableRichTextViewer(
content = eventContent,
canPreview = canPreview && !makeItShort,
modifier = modifier,
tags = tags,
backgroundColor = backgroundColor,
accountViewModel = accountViewModel,
nav = nav,
)
}
if (note.event?.hasHashtags() == true) {
val hashtags =
remember(note.event) { note.event?.hashtags()?.toImmutableList() ?: persistentListOf() }
DisplayUncitedHashtags(hashtags, eventContent, nav)
}
}
}
}
@Composable
fun RenderGitRepositoryEvent(
baseNote: Note,
@@ -124,6 +124,7 @@ import com.vitorpamplona.amethyst.ui.note.ReactionsRow
import com.vitorpamplona.amethyst.ui.note.RenderAppDefinition
import com.vitorpamplona.amethyst.ui.note.RenderEmojiPack
import com.vitorpamplona.amethyst.ui.note.RenderFhirResource
import com.vitorpamplona.amethyst.ui.note.RenderGitIssueEvent
import com.vitorpamplona.amethyst.ui.note.RenderGitPatchEvent
import com.vitorpamplona.amethyst.ui.note.RenderGitRepositoryEvent
import com.vitorpamplona.amethyst.ui.note.RenderPinListEvent
@@ -166,6 +167,7 @@ import com.vitorpamplona.quartz.events.FhirResourceEvent
import com.vitorpamplona.quartz.events.FileHeaderEvent
import com.vitorpamplona.quartz.events.FileStorageHeaderEvent
import com.vitorpamplona.quartz.events.GenericRepostEvent
import com.vitorpamplona.quartz.events.GitIssueEvent
import com.vitorpamplona.quartz.events.GitPatchEvent
import com.vitorpamplona.quartz.events.GitRepositoryEvent
import com.vitorpamplona.quartz.events.HighlightEvent
@@ -554,6 +556,8 @@ fun NoteMaster(
RenderGitRepositoryEvent(baseNote, accountViewModel, nav)
} else if (noteEvent is GitPatchEvent) {
RenderGitPatchEvent(baseNote, false, true, backgroundColor, accountViewModel, nav)
} else if (noteEvent is GitIssueEvent) {
RenderGitIssueEvent(baseNote, false, true, backgroundColor, accountViewModel, nav)
} else if (noteEvent is AppDefinitionEvent) {
RenderAppDefinition(baseNote, accountViewModel, nav)
} else if (noteEvent is HighlightEvent) {
@@ -576,7 +580,6 @@ fun NoteMaster(
makeItShort = false,
canPreview = true,
backgroundColor,
editState,
accountViewModel,
nav,
)
@@ -6,6 +6,7 @@
<string name="your_profile_image">Tu imagen de perfil</string>
<string name="scan_qr">Escanear el QR</string>
<string name="show_anyway">Mostrar de todos modos</string>
<string name="post_was_hidden">Esta publicación se ocultó porque menciona tus usuarios o palabras ocultas</string>
<string name="post_was_flagged_as_inappropriate_by">Post marcado como inapropiado por</string>
<string name="post_not_found">El evento se está cargando o no se puede encontrar en la lista de relés</string>
<string name="channel_image">Imagen del canal</string>
@@ -47,8 +48,12 @@
<string name="view_count">Total de visualizaciones</string>
<string name="boost">Impulsar</string>
<string name="boosted">Impulsada</string>
<string name="edited">editada</string>
<string name="edited_number">edición #%1$s</string>
<string name="original">original</string>
<string name="quote">Citar</string>
<string name="fork">Bifurcar</string>
<string name="propose_an_edit">Proponer una edición</string>
<string name="new_amount_in_sats">Nueva cantidad en sats</string>
<string name="add">Añadir</string>
<string name="replying_to">"respondiendo a "</string>
@@ -670,4 +675,18 @@
<string name="existed_since">OTS: %1$s</string>
<string name="ots_info_title">Prueba de marca de tiempo</string>
<string name="ots_info_description">Hay prueba de que esta publicación se firmó en algún momento antes de %1$s. La prueba se marcó en la cadena de bloques de Bitcoin en esa fecha y hora.</string>
<string name="edit_post">Editar publicación</string>
<string name="proposal_to_edit">Propuesta para mejorar una publicación</string>
<string name="message_to_author">Resumen de cambios</string>
<string name="message_to_author_placeholder">Correcciones rápidas…</string>
<string name="accept_the_suggestion">Aceptar la sugerencia</string>
<string name="accessibility_download_for_offline">Descargar</string>
<string name="accessibility_lyrics_on">Letra activada</string>
<string name="accessibility_lyrics_off">Letra desactivada</string>
<string name="accessibility_turn_on_sealed_message">Mensaje sellado desactivado. Haz clic para activar el mensaje sellado.</string>
<string name="accessibility_turn_off_sealed_message">Mensaje sellado activado. Haz clic para desactivar el mensaje sellado.</string>
<string name="accessibility_send">Enviar</string>
<string name="accessibility_play_username">Reproducir nombre de usuario como audio</string>
<string name="accessibility_scan_qr_code">Escanear código QR</string>
<string name="accessibility_navigate_to_alby">Ir al proveedor externo de monederos Alby</string>
</resources>
@@ -6,6 +6,7 @@
<string name="your_profile_image">Tu imagen de perfil</string>
<string name="scan_qr">Escanear código QR</string>
<string name="show_anyway">Mostrar de todos modos</string>
<string name="post_was_hidden">Esta publicación se ocultó porque menciona tus usuarios o palabras ocultas</string>
<string name="post_was_flagged_as_inappropriate_by">La publicación fue reportada por</string>
<string name="post_not_found">El evento se está cargando o no se puede encontrar en la lista de relés</string>
<string name="channel_image">Imagen del canal</string>
@@ -47,8 +48,12 @@
<string name="view_count">Total de visualizaciones</string>
<string name="boost">Impulsar</string>
<string name="boosted">Impulsada</string>
<string name="edited">editada</string>
<string name="edited_number">edición #%1$s</string>
<string name="original">original</string>
<string name="quote">Cita</string>
<string name="fork">Bifurcar</string>
<string name="propose_an_edit">Proponer una edición</string>
<string name="new_amount_in_sats">Nueva cantidad en sats</string>
<string name="add">Agregar</string>
<string name="replying_to">"respondiendo a "</string>
@@ -670,4 +675,18 @@
<string name="existed_since">OTS: %1$s</string>
<string name="ots_info_title">Prueba de marca de tiempo</string>
<string name="ots_info_description">Hay prueba de que esta publicación se firmó en algún momento antes de %1$s. La prueba se marcó en la cadena de bloques de Bitcoin en esa fecha y hora.</string>
<string name="edit_post">Editar publicación</string>
<string name="proposal_to_edit">Propuesta para mejorar una publicación</string>
<string name="message_to_author">Resumen de cambios</string>
<string name="message_to_author_placeholder">Correcciones rápidas…</string>
<string name="accept_the_suggestion">Aceptar la sugerencia</string>
<string name="accessibility_download_for_offline">Descargar</string>
<string name="accessibility_lyrics_on">Letra activada</string>
<string name="accessibility_lyrics_off">Letra desactivada</string>
<string name="accessibility_turn_on_sealed_message">Mensaje sellado desactivado. Haz clic para activar el mensaje sellado.</string>
<string name="accessibility_turn_off_sealed_message">Mensaje sellado activado. Haz clic para desactivar el mensaje sellado.</string>
<string name="accessibility_send">Enviar</string>
<string name="accessibility_play_username">Reproducir nombre de usuario como audio</string>
<string name="accessibility_scan_qr_code">Escanear código QR</string>
<string name="accessibility_navigate_to_alby">Ir al proveedor externo de billeteras Alby</string>
</resources>
@@ -6,6 +6,7 @@
<string name="your_profile_image">Tu imagen de perfil</string>
<string name="scan_qr">Escanear código QR</string>
<string name="show_anyway">Mostrar de todos modos</string>
<string name="post_was_hidden">Esta publicación se ocultó porque menciona tus usuarios o palabras ocultas</string>
<string name="post_was_flagged_as_inappropriate_by">La publicación fue reportada por</string>
<string name="post_not_found">El evento se está cargando o no se puede encontrar en la lista de relés</string>
<string name="channel_image">Imagen del canal</string>
@@ -47,8 +48,12 @@
<string name="view_count">Total vistas</string>
<string name="boost">Impulsar</string>
<string name="boosted">Impulsada</string>
<string name="edited">editada</string>
<string name="edited_number">edición #%1$s</string>
<string name="original">original</string>
<string name="quote">Cita</string>
<string name="fork">Bifurcar</string>
<string name="propose_an_edit">Proponer una edición</string>
<string name="new_amount_in_sats">Nueva cantidad en sats</string>
<string name="add">Agregar</string>
<string name="replying_to">"respondiendo a "</string>
@@ -670,4 +675,18 @@
<string name="existed_since">OTS: %1$s</string>
<string name="ots_info_title">Prueba de marca de tiempo</string>
<string name="ots_info_description">Hay prueba de que esta publicación se firmó en algún momento antes de %1$s. La prueba se marcó en la cadena de bloques de Bitcoin en esa fecha y hora.</string>
<string name="edit_post">Editar publicación</string>
<string name="proposal_to_edit">Propuesta para mejorar una publicación</string>
<string name="message_to_author">Resumen de cambios</string>
<string name="message_to_author_placeholder">Correcciones rápidas…</string>
<string name="accept_the_suggestion">Aceptar la sugerencia</string>
<string name="accessibility_download_for_offline">Descargar</string>
<string name="accessibility_lyrics_on">Letra activada</string>
<string name="accessibility_lyrics_off">Letra desactivada</string>
<string name="accessibility_turn_on_sealed_message">Mensaje sellado desactivado. Haz clic para activar el mensaje sellado.</string>
<string name="accessibility_turn_off_sealed_message">Mensaje sellado activado. Haz clic para desactivar el mensaje sellado.</string>
<string name="accessibility_send">Enviar</string>
<string name="accessibility_play_username">Reproducir nombre de usuario como audio</string>
<string name="accessibility_scan_qr_code">Escanear código QR</string>
<string name="accessibility_navigate_to_alby">Ir al proveedor externo de billeteras Alby</string>
</resources>
+5
View File
@@ -3,8 +3,10 @@
<string name="point_to_the_qr_code">สแกน Qr Code</string>
<string name="show_qr">โชว์ QR</string>
<string name="profile_image">รูปโปรไฟล์</string>
<string name="your_profile_image">รูปโปรไฟล์</string>
<string name="scan_qr">แสกน QR</string>
<string name="show_anyway">แสดง</string>
<string name="post_was_hidden">โน๊ตนี้ถูกซ่อนเนื่องจากมีเนื้อหา หรือผู้ใช้ ที่ท่านไม่อยากเห็น</string>
<string name="post_was_flagged_as_inappropriate_by">โพสต์ถูกรายงานว่าไม่เหมาะสมโดย</string>
<string name="post_not_found">ไม่พบโพสต์นี้</string>
<string name="channel_image">รูปของ channel</string>
@@ -15,6 +17,7 @@
<string name="spam">สแปม</string>
<string name="impersonation">เลียนแบบ</string>
<string name="illegal_behavior">พฤติกรรมที่ผิดกฎหมาย</string>
<string name="other">อื่นๆ</string>
<string name="unknown">ไม่ทราบ</string>
<string name="relay_icon">รีเลย์ไอคอน</string>
<string name="unknown_author">ไม่ทราบผู้เขียน</string>
@@ -22,6 +25,8 @@
<string name="copy_user_pubkey">คัดลอก ID ผู้เขียน</string>
<string name="copy_note_id">คัดลอก ID โน้ต</string>
<string name="broadcast">เพยแพร่</string>
<string name="timestamp_it">ประทับเวลา</string>
<string name="timestamp_pending">กำลังรอยืนยันการประทับเวลา</string>
<string name="request_deletion">ส่งคำขอให้ลบ</string>
<string name="block_report">บล๊อก / รายงาน</string>
<string name="block_hide_user"><![CDATA[บล๊อก & ซ่อนผู้ใช้นี้]]></string>
+1 -1
View File
@@ -797,7 +797,7 @@
<string name="ots_info_description">There\'s proof this post was signed sometime before %1$s. The proof was stamped in the Bitcoin blockchain at that date and time.</string>
<string name="edit_post">Edit Post</string>
<string name="proposal_to_edit">Proposal to improve your post</string>
<string name="proposal_to_edit">Proposal to improve a post</string>
<string name="message_to_author">Summary of changes</string>
<string name="message_to_author_placeholder">Quick fixes…</string>
@@ -33,8 +33,8 @@ import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.deser.std.StdDeserializer
import com.fasterxml.jackson.databind.module.SimpleModule
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import com.vitorpamplona.quartz.encoders.HexKey
import com.vitorpamplona.quartz.events.Event
import com.vitorpamplona.quartz.events.EventInterface
import com.vitorpamplona.quartz.events.LnZapRequestEvent
@@ -90,9 +90,7 @@ class Result(
* Parses the json with a string of events to an Array of Event objects.
*/
fun fromJsonArray(json: String): Array<Result> {
return Event.mapper.readTree(json).map {
fromJson(it.asText())
}.toTypedArray()
return mapper.readValue(json)
}
}
}