From efb9d9268bdb6bc7ed82d0a0451d66170f00e5ee Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 12 Mar 2024 17:16:50 -0400 Subject: [PATCH] Avoids parsing metadata events several times due to the json parser stopping coroutines. --- .../com/vitorpamplona/amethyst/model/Account.kt | 2 +- .../vitorpamplona/amethyst/model/LocalCache.kt | 15 +++++++++++---- .../java/com/vitorpamplona/amethyst/model/User.kt | 3 +-- .../amethyst/ui/navigation/AppTopBar.kt | 2 +- .../amethyst/ui/note/elements/ForkInfo.kt | 3 +-- .../amethyst/ui/qrcode/ShowQRDialog.kt | 3 +-- .../ui/screen/SharedPreferencesViewModel.kt | 3 +-- .../amethyst/ui/screen/loggedIn/ProfileScreen.kt | 6 ++---- .../quartz/events/ContactListEvent.kt | 6 ------ .../vitorpamplona/quartz/events/MetadataEvent.kt | 5 +---- 10 files changed, 20 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 039090ac7..ffcfd11db 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -572,7 +572,7 @@ class Account( if (!isWriteable()) return MetadataEvent.updateFromPast( - latest = userProfile().info?.latestMetadata, + latest = userProfile().latestMetadata, name = name, picture = picture, banner = banner, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index aa25df2be..f211e30f4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -304,15 +304,22 @@ object LocalCache { return note } - fun consume(event: MetadataEvent) { + fun consume( + event: MetadataEvent, + relay: Relay?, + ) { // new event val oldUser = getOrCreateUser(event.pubKey) - if (oldUser.info == null || event.createdAt > oldUser.info!!.updatedMetadataAt) { + val currentMetadata = oldUser.latestMetadata + + if (currentMetadata == null || event.createdAt > currentMetadata.createdAt) { + oldUser.latestMetadata = event + val newUserMetadata = event.contactMetaData() if (newUserMetadata != null) { oldUser.updateUserInfo(newUserMetadata, event) } - // Log.d("MT", "New User Metadata ${oldUser.pubkeyDisplayHex} ${oldUser.toBestDisplayName()}") + // Log.d("MT", "New User Metadata ${oldUser.pubkeyDisplayHex()} ${oldUser.toBestDisplayName()} from ${relay?.url}") } else { // Log.d("MT","Relay sent a previous Metadata Event ${oldUser.toBestDisplayName()} // ${formattedDateTime(event.createdAt)} > ${formattedDateTime(oldUser.updatedAt)}") @@ -2099,7 +2106,7 @@ object LocalCache { is LnZapPaymentRequestEvent -> consume(event) is LnZapPaymentResponseEvent -> consume(event) is LongTextNoteEvent -> consume(event, relay) - is MetadataEvent -> consume(event) + is MetadataEvent -> consume(event, relay) is MuteListEvent -> consume(event, relay) is NNSEvent -> comsume(event, relay) is OtsEvent -> consume(event, relay) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt index a2985bc28..68aee2203 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -52,6 +52,7 @@ import java.math.BigDecimal class User(val pubkeyHex: String) { var info: UserMetadata? = null + var latestMetadata: MetadataEvent? = null var latestContactList: ContactListEvent? = null var latestBookmarkList: BookmarkListEvent? = null @@ -307,8 +308,6 @@ class User(val pubkeyHex: String) { latestMetadata: MetadataEvent, ) { info = newUserInfo - info?.latestMetadata = latestMetadata - info?.updatedMetadataAt = latestMetadata.createdAt info?.tags = latestMetadata.tags.toImmutableListOfLists() info?.cleanBlankNames() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt index e661a20e9..c5c99e203 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt @@ -993,7 +993,7 @@ fun debugState(context: Context) { "Users: " + LocalCache.userListCache.filter { it.liveSet != null }.size + " / " + - LocalCache.userListCache.filter { it.info?.latestMetadata != null }.size + + LocalCache.userListCache.filter { it.latestMetadata != null }.size + " / " + LocalCache.userListCache.size, ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/ForkInfo.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/ForkInfo.kt index 62ccc2ce3..83d60539f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/ForkInfo.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/ForkInfo.kt @@ -45,7 +45,6 @@ import com.vitorpamplona.amethyst.ui.theme.Font14SP import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer import com.vitorpamplona.amethyst.ui.theme.nip05 import com.vitorpamplona.quartz.events.BaseTextNoteEvent -import com.vitorpamplona.quartz.events.toImmutableListOfLists @Composable fun ShowForkInformation( @@ -107,7 +106,7 @@ fun ForkInformationRowLightColor( val userState by author.live().metadata.observeAsState() val userDisplayName = remember(userState) { userState?.user?.toBestDisplayName() } val userTags = - remember(userState) { userState?.user?.info?.latestMetadata?.tags?.toImmutableListOfLists() } + remember(userState) { userState?.user?.info?.tags } if (userDisplayName != null) { CreateClickableTextWithEmoji( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/ShowQRDialog.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/ShowQRDialog.kt index 5c4f33f0f..3b47c5edc 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/ShowQRDialog.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/ShowQRDialog.kt @@ -59,7 +59,6 @@ import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage import com.vitorpamplona.amethyst.ui.theme.Size35dp import com.vitorpamplona.quartz.events.UserMetadata -import com.vitorpamplona.quartz.events.toImmutableListOfLists @Preview @Composable @@ -135,7 +134,7 @@ fun ShowQRDialog( ) { CreateTextWithEmoji( text = user.bestDisplayName() ?: user.bestUsername() ?: "", - tags = user.info?.latestMetadata?.tags?.toImmutableListOfLists(), + tags = user.info?.tags, fontWeight = FontWeight.Bold, fontSize = 18.sp, ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt index cf5796ba5..83f506cfd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt @@ -104,8 +104,7 @@ class SharedPreferencesViewModel : ViewModel() { fun init() { viewModelScope.launch(Dispatchers.IO) { val savedSettings = - LocalPreferences.loadSharedSettings() - ?: LocalPreferences.migrateOldSharedSettings() ?: Settings() + LocalPreferences.loadSharedSettings() ?: Settings() sharedPrefs.theme = savedSettings.theme sharedPrefs.language = savedSettings.preferredLanguage diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index aa2fcbf83..c8aa22d38 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -176,7 +176,6 @@ import com.vitorpamplona.quartz.events.PayInvoiceSuccessResponse import com.vitorpamplona.quartz.events.ReportEvent import com.vitorpamplona.quartz.events.TelegramIdentity import com.vitorpamplona.quartz.events.TwitterIdentity -import com.vitorpamplona.quartz.events.toImmutableListOfLists import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.Dispatchers @@ -961,8 +960,7 @@ private fun DrawAdditionalInfo( ) { val userState by baseUser.live().metadata.observeAsState() val user = remember(userState) { userState?.user } ?: return - val tags = - remember(userState) { userState?.user?.info?.latestMetadata?.tags?.toImmutableListOfLists() } + val tags = userState?.user?.info?.tags val uri = LocalUriHandler.current val clipboardManager = LocalClipboardManager.current @@ -1071,7 +1069,7 @@ private fun DrawAdditionalInfo( val pubkeyHex = remember { baseUser.pubkeyHex } DisplayLNAddress(lud16, pubkeyHex, accountViewModel, nav) - val identities = user.info?.latestMetadata?.identityClaims() + val identities = user.latestMetadata?.identityClaims() if (!identities.isNullOrEmpty()) { identities.forEach { identity: IdentityClaim -> Row(verticalAlignment = Alignment.CenterVertically) { diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ContactListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ContactListEvent.kt index 4d800ecdb..a7ed88b62 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ContactListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ContactListEvent.kt @@ -414,12 +414,6 @@ class UserMetadata { var twitter: String? = null - @Transient - var updatedMetadataAt: Long = 0 - - @Transient - var latestMetadata: MetadataEvent? = null - @Transient var tags: ImmutableListOfLists? = null diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/MetadataEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/MetadataEvent.kt index a72995ae1..b0af7212e 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/MetadataEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/MetadataEvent.kt @@ -154,10 +154,7 @@ class MetadataEvent( ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { fun contactMetaData() = try { - mapper.readValue( - ByteArrayInputStream(content.toByteArray(Charsets.UTF_8)), - UserMetadata::class.java, - ) + mapper.readValue(content, UserMetadata::class.java) } catch (e: Exception) { // e.printStackTrace() Log.w("MT", "Content Parse Error: ${e.localizedMessage} $content")