From 4271ae77d2c12124cc9f62227469febc30e98448 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 18 Jan 2023 17:12:43 -0500 Subject: [PATCH] Batch updates to enhance performance. --- .../com/vitorpamplona/amethyst/model/Note.kt | 24 ++++++++++++----- .../com/vitorpamplona/amethyst/model/User.kt | 27 ++++++++++++++----- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt index bffb292e8..a2fdd3265 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt @@ -1,5 +1,7 @@ package com.vitorpamplona.amethyst.model +import android.os.Handler +import android.os.Looper import androidx.lifecycle.LiveData import com.vitorpamplona.amethyst.service.NostrSingleEventDataSource import com.vitorpamplona.amethyst.ui.note.toShortenHex @@ -40,7 +42,7 @@ class Note(val idHex: String) { this.mentions = mentions this.replyTo = replyTo - refreshObservers() + invalidateData() } fun formattedDateTime(timestamp: Long): String { @@ -72,17 +74,17 @@ class Note(val idHex: String) { fun addReply(note: Note) { if (replies.add(note)) - refreshObservers() + invalidateData() } fun addBoost(note: Note) { if (boosts.add(note)) - refreshObservers() + invalidateData() } fun addReaction(note: Note) { if (reactions.add(note)) - refreshObservers() + invalidateData() } fun isReactedBy(user: User): Boolean { @@ -96,8 +98,18 @@ class Note(val idHex: String) { // Observers line up here. val live: NoteLiveData = NoteLiveData(this) - private fun refreshObservers() { - live.refresh() + // Refreshes observers in batches. + val filterHandler = Handler(Looper.getMainLooper()) + var handlerWaiting = false + @Synchronized + fun invalidateData() { + if (handlerWaiting) return + + handlerWaiting = true + filterHandler.postDelayed({ + live.refresh() + handlerWaiting = false + }, 100) } } 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 93673bd8e..5e85e934a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -1,5 +1,7 @@ package com.vitorpamplona.amethyst.model +import android.os.Handler +import android.os.Looper import androidx.lifecycle.LiveData import com.vitorpamplona.amethyst.service.NostrSingleEventDataSource import com.vitorpamplona.amethyst.service.NostrSingleUserDataSource @@ -28,7 +30,6 @@ class User(val pubkey: ByteArray) { val taggedPosts = Collections.synchronizedSet(mutableSetOf()) val followers = Collections.synchronizedSet(mutableSetOf()) - val messages = ConcurrentHashMap>() fun toBestDisplayName(): String { @@ -51,10 +52,16 @@ class User(val pubkey: ByteArray) { fun follow(user: User) { follows.add(user) user.followers.add(this) + + invalidateData() + user.invalidateData() } fun unfollow(user: User) { follows.remove(user) user.followers.remove(this) + + invalidateData() + user.invalidateData() } @Synchronized @@ -86,15 +93,13 @@ class User(val pubkey: ByteArray) { } updatedFollowsAt = updateAt - - refreshObservers() } fun updateUserInfo(newUserInfo: UserMetadata, updateAt: Long) { info = newUserInfo updatedMetadataAt = updateAt - refreshObservers() + invalidateData() } fun isFollowing(user: User): Boolean { @@ -106,8 +111,18 @@ class User(val pubkey: ByteArray) { // Observers line up here. val live: UserLiveData = UserLiveData(this) - private fun refreshObservers() { - live.refresh() + // Refreshes observers in batches. + val filterHandler = Handler(Looper.getMainLooper()) + var handlerWaiting = false + @Synchronized + fun invalidateData() { + if (handlerWaiting) return + + handlerWaiting = true + filterHandler.postDelayed({ + live.refresh() + handlerWaiting = false + }, 100) } }