diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt index ae8a42a5330bd5bd7bdca97ea26d9b41bfe9733c..d3af262321545cff1c6faf4873e6c19a39c37801 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt @@ -18,53 +18,48 @@ package org.briarproject.briar.desktop.contact -import androidx.compose.ui.graphics.ImageBitmap import org.briarproject.bramble.api.connection.ConnectionRegistry import org.briarproject.bramble.api.contact.Contact import org.briarproject.bramble.api.contact.ContactId import org.briarproject.bramble.api.db.Transaction import org.briarproject.bramble.api.identity.AuthorId -import org.briarproject.briar.api.attachment.AttachmentReader import org.briarproject.briar.api.client.MessageTracker import org.briarproject.briar.api.conversation.ConversationManager import org.briarproject.briar.api.identity.AuthorInfo import org.briarproject.briar.api.identity.AuthorManager -import org.briarproject.briar.desktop.utils.ImageUtils import org.briarproject.briar.desktop.utils.UiUtils.getContactDisplayName import kotlin.math.max data class ContactItem( val id: ContactId, val authorId: AuthorId, - val trustLevel: AuthorInfo.Status, + val authorInfo: AuthorInfo, private val name: String, val alias: String?, val isConnected: Boolean, val isEmpty: Boolean, val unread: Int, override val timestamp: Long, - val avatar: ImageBitmap?, ) : ContactListItem { override val uniqueId: ByteArray = ByteArray(4) { i -> (id.int shr (i * 8)).toByte() } override val displayName = getContactDisplayName(name, alias) + val trustLevel: AuthorInfo.Status = authorInfo.status constructor( contact: Contact, authorInfo: AuthorInfo, isConnected: Boolean, groupCount: MessageTracker.GroupCount, - avatar: ImageBitmap?, ) : this( id = contact.id, authorId = contact.author.id, - trustLevel = authorInfo.status, + authorInfo = authorInfo, name = contact.author.name, alias = contact.alias, isConnected = isConnected, isEmpty = groupCount.msgCount == 0, unread = groupCount.unreadCount, timestamp = groupCount.latestMsgTime, - avatar = avatar, ) fun updateTimestampAndUnread(timestamp: Long, read: Boolean) = @@ -83,8 +78,8 @@ data class ContactItem( fun updateFromMessagesRead(c: Int) = copy(unread = unread - c) - fun updateAvatar(avatar: ImageBitmap?) = - copy(avatar = avatar) + fun updateAuthorInfo(authorInfo: AuthorInfo) = + copy(authorInfo = authorInfo) } fun loadContactItem( @@ -93,7 +88,6 @@ fun loadContactItem( authorManager: AuthorManager, connectionRegistry: ConnectionRegistry, conversationManager: ConversationManager, - attachmentReader: AttachmentReader, ): ContactItem { val authorInfo = authorManager.getAuthorInfo(txn, contact) return ContactItem( @@ -101,6 +95,5 @@ fun loadContactItem( authorInfo = authorInfo, isConnected = connectionRegistry.isConnected(contact.id), groupCount = conversationManager.getGroupCount(txn, contact.id), - avatar = authorInfo.avatarHeader?.let { ImageUtils.loadImage(txn, attachmentReader, it) }, ) } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItemView.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItemView.kt index 18a3a808561a29f9fa64ec746d67bfbee08531ab..6009723c2c706a134d41727567cd2b565f3f7966 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItemView.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItemView.kt @@ -32,11 +32,8 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.ProvideTextStyle import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.loadImageBitmap -import androidx.compose.ui.res.useResource import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.text import androidx.compose.ui.text.style.TextOverflow.Companion.Ellipsis @@ -56,6 +53,7 @@ import org.briarproject.briar.desktop.utils.PreviewUtils.preview import org.briarproject.briar.desktop.utils.TimeUtils.getFormattedTimestamp import org.briarproject.briar.desktop.utils.appendCommaSeparated import org.briarproject.briar.desktop.utils.buildBlankAnnotatedString +import org.briarproject.briar.desktop.utils.getRandomAuthorInfo import java.time.Instant @Suppress("HardCodedStringLiteral") @@ -68,24 +66,19 @@ fun main() = preview( "unread" to 3, "timestamp" to Instant.now().toEpochMilli(), "selected" to false, - "showAvatar" to false, ) { - val avatar = remember { - useResource("images/logo_circle.ico") { loadImageBitmap(it) } - } Column(Modifier.selectableGroup()) { ListItemView(getBooleanParameter("selected")) { val item = ContactItem( id = ContactId(0), authorId = AuthorId(getRandomIdPersistent()), - trustLevel = Status.valueOf(getStringParameter("trustLevel")), + authorInfo = getRandomAuthorInfo(Status.valueOf(getStringParameter("trustLevel"))), name = getStringParameter("name"), alias = getStringParameter("alias"), isConnected = getBooleanParameter("isConnected"), isEmpty = getBooleanParameter("isEmpty"), unread = getIntParameter("unread"), timestamp = getLongParameter("timestamp"), - avatar = if (getBooleanParameter("showAvatar")) avatar else null, ) ContactItemView(item) } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItemViewSmall.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItemViewSmall.kt index 6c7ffa1dce018294bca837b7a143c3be4bba4de2..8e5c4f6f71749b59a063270422d0024ce8702caa 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItemViewSmall.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItemViewSmall.kt @@ -44,6 +44,7 @@ import org.briarproject.briar.desktop.utils.PreviewUtils.DropDownValues import org.briarproject.briar.desktop.utils.PreviewUtils.preview import org.briarproject.briar.desktop.utils.appendCommaSeparated import org.briarproject.briar.desktop.utils.buildBlankAnnotatedString +import org.briarproject.briar.desktop.utils.getRandomAuthorInfo import java.time.Instant @Suppress("HardCodedStringLiteral") @@ -63,14 +64,13 @@ fun main() = preview( ContactItem( id = ContactId(0), authorId = AuthorId(getRandomIdPersistent()), - trustLevel = Status.valueOf(getStringParameter("trustLevel")), + authorInfo = getRandomAuthorInfo(Status.valueOf(getStringParameter("trustLevel"))), name = getStringParameter("name"), alias = getStringParameter("alias"), isConnected = getBooleanParameter("isConnected"), isEmpty = getBooleanParameter("isEmpty"), unread = getIntParameter("unread"), timestamp = getLongParameter("timestamp"), - avatar = null, ), ) } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt index a31a8015738d497ff3700072d25bc476f19fa658..59771aa3d0e9c3a901a9064bd7264cb271819153 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt @@ -42,7 +42,6 @@ import org.briarproject.bramble.api.contact.ContactId import org.briarproject.bramble.api.contact.PendingContactId import org.briarproject.bramble.api.contact.PendingContactState import org.briarproject.bramble.api.identity.AuthorId -import org.briarproject.briar.api.identity.AuthorInfo import org.briarproject.briar.desktop.contact.add.remote.PendingContactItem import org.briarproject.briar.desktop.contact.add.remote.PendingContactItemView import org.briarproject.briar.desktop.theme.surfaceVariant @@ -53,6 +52,7 @@ import org.briarproject.briar.desktop.ui.SearchTextField import org.briarproject.briar.desktop.ui.VerticallyScrollableArea import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n import org.briarproject.briar.desktop.utils.PreviewUtils.preview +import org.briarproject.briar.desktop.utils.getRandomAuthorInfo import java.time.Instant @Suppress("HardCodedStringLiteral") @@ -62,14 +62,13 @@ fun main() = preview { ContactItem( id = ContactId(0), authorId = AuthorId(getRandomId()), - trustLevel = AuthorInfo.Status.VERIFIED, + authorInfo = getRandomAuthorInfo(), name = "Maria", alias = "Mary", isConnected = true, isEmpty = false, unread = 2, timestamp = Instant.now().toEpochMilli(), - avatar = null, ), PendingContactItem( id = PendingContactId(getRandomId()), @@ -80,14 +79,13 @@ fun main() = preview { ContactItem( id = ContactId(1), authorId = AuthorId(getRandomId()), - trustLevel = AuthorInfo.Status.UNVERIFIED, + authorInfo = getRandomAuthorInfo(), name = "Anna", alias = null, isConnected = false, isEmpty = true, unread = 0, timestamp = (Instant.now().minusSeconds(300)).toEpochMilli(), - avatar = null, ), ) } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt index 85ef4586a7b0249305085d3bc415535bff24f793..9f5a20b2d8b2d6aa898a10f3087b159f716e4dfc 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt @@ -32,7 +32,6 @@ import org.briarproject.bramble.api.db.TransactionManager import org.briarproject.bramble.api.event.Event import org.briarproject.bramble.api.event.EventBus import org.briarproject.bramble.api.lifecycle.LifecycleManager -import org.briarproject.briar.api.attachment.AttachmentReader import org.briarproject.briar.api.conversation.ConversationManager import org.briarproject.briar.api.conversation.event.ConversationMessageTrackedEvent import org.briarproject.briar.api.identity.AuthorManager @@ -52,7 +51,6 @@ constructor( authorManager: AuthorManager, conversationManager: ConversationManager, connectionRegistry: ConnectionRegistry, - attachmentReader: AttachmentReader, briarExecutors: BriarExecutors, lifecycleManager: LifecycleManager, db: TransactionManager, @@ -62,7 +60,6 @@ constructor( authorManager, conversationManager, connectionRegistry, - attachmentReader, briarExecutors, lifecycleManager, db, diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt index 0cc29e6278f96beb12ea23ad1c3bd0b4d4c05882..80c0956ed6a88822c0f50d2219a258d3b6d43ef4 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt @@ -34,13 +34,12 @@ import org.briarproject.bramble.api.event.EventBus import org.briarproject.bramble.api.lifecycle.LifecycleManager import org.briarproject.bramble.api.plugin.event.ContactConnectedEvent import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent -import org.briarproject.briar.api.attachment.AttachmentReader import org.briarproject.briar.api.avatar.event.AvatarUpdatedEvent import org.briarproject.briar.api.conversation.ConversationManager +import org.briarproject.briar.api.identity.AuthorInfo import org.briarproject.briar.api.identity.AuthorManager import org.briarproject.briar.desktop.threading.BriarExecutors import org.briarproject.briar.desktop.threading.UiExecutor -import org.briarproject.briar.desktop.utils.ImageUtils import org.briarproject.briar.desktop.utils.KLoggerUtils.i import org.briarproject.briar.desktop.utils.clearAndAddAll import org.briarproject.briar.desktop.utils.removeFirst @@ -52,7 +51,6 @@ abstract class ContactsViewModel( private val authorManager: AuthorManager, private val conversationManager: ConversationManager, private val connectionRegistry: ConnectionRegistry, - private val attachmentReader: AttachmentReader, briarExecutors: BriarExecutors, lifecycleManager: LifecycleManager, db: TransactionManager, @@ -79,7 +77,7 @@ abstract class ContactsViewModel( } open fun loadContactItemWithinTransaction(txn: Transaction, contact: Contact) = - loadContactItem(txn, contact, authorManager, connectionRegistry, conversationManager, attachmentReader) + loadContactItem(txn, contact, authorManager, connectionRegistry, conversationManager) override fun eventOccurred(e: Event?) { when (e) { @@ -110,11 +108,10 @@ abstract class ContactsViewModel( is AvatarUpdatedEvent -> { LOG.i { "received avatar update: ${e.attachmentHeader}" } - runOnDbThreadWithTransaction(true) { txn -> - val image = ImageUtils.loadImage(txn, attachmentReader, e.attachmentHeader) - txn.attach { - updateContactItem(e.contactId) { it.updateAvatar(image) } - } + updateContactItem(e.contactId) { + val authorInfo = + AuthorInfo(it.authorInfo.status, it.authorInfo.alias, e.attachmentHeader) + it.updateAuthorInfo(authorInfo) } } } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ProfileCircle.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ProfileCircle.kt index fcbe3a672259a6bee04b945f59d750e840bf03f1..2fe4b97b0f77e652d8705abf79480fcbf7edf3b8 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ProfileCircle.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ProfileCircle.kt @@ -34,6 +34,7 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import org.briarproject.bramble.api.identity.Author +import org.briarproject.bramble.api.identity.AuthorId import org.briarproject.briar.api.identity.AuthorInfo import org.briarproject.briar.desktop.attachment.media.AvatarProducer import org.briarproject.briar.desktop.theme.outline @@ -60,10 +61,7 @@ fun main() = preview { */ @Composable fun ProfileCircle(size: Dp, contactItem: ContactItem) { - if (contactItem.avatar == null) - ProfileCircle(size, contactItem.authorId.bytes) - else - ProfileCircle(size, contactItem.avatar) + ProfileCircle(size, contactItem.authorId, contactItem.authorInfo) } /** @@ -74,11 +72,11 @@ fun ProfileCircle(size: Dp, contactItem: ContactItem) { * of 9 here. That helps as the image is based on a 9x9 square grid. */ @Composable -fun ProfileCircle(size: Dp, author: Author, authorInfo: AuthorInfo) { +fun ProfileCircle(size: Dp, authorId: AuthorId, authorInfo: AuthorInfo) { val avatar = AvatarProducer(authorInfo) avatar?.let { imageBitmapState -> ProfileCircle(size, imageBitmapState.value) - } ?: ProfileCircle(size, author.id.bytes) + } ?: ProfileCircle(size, authorId.bytes) } /** @@ -89,7 +87,10 @@ fun ProfileCircle(size: Dp, author: Author, authorInfo: AuthorInfo) { */ @Composable fun ProfileCircle(size: Dp, input: ByteArray) { - Canvas(Modifier.size(size).clip(CircleShape).border(1.dp, MaterialTheme.colors.outline, CircleShape)) { + Canvas( + Modifier.size(size).clip(CircleShape) + .border(1.dp, MaterialTheme.colors.outline, CircleShape) + ) { Identicon(input, this.size.width, this.size.height).draw(this) } } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt index fee8ff4c99c06eb981323d3186b6211130c555d4..4389f78f91c5a614af0a10e0c6d87e6e94c88bde 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt @@ -286,7 +286,7 @@ constructor( val contact = contactManager.getContact(txn, id) val contactItem = - loadContactItem(txn, contact, authorManager, connectionRegistry, conversationManager, attachmentReader) + loadContactItem(txn, contact, authorManager, connectionRegistry, conversationManager) LOG.logDuration("Loading contact", start) txn.attach { _contactItem.value = contactItem diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadItemView.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadItemView.kt index ea46bb752003c4164562471540944f7f1636ab96..f765f0b2b923fe84f8ec5ffbb52e51cce17e053c 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadItemView.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadItemView.kt @@ -128,7 +128,7 @@ fun ThreadItemContentComposable( horizontalArrangement = spacedBy(8.dp), verticalAlignment = CenterVertically, ) { - ProfileCircle(27.dp, item.author, item.authorInfo) + ProfileCircle(27.dp, item.author.id, item.authorInfo) Text( modifier = Modifier.weight(1f, fill = false), text = item.authorName, diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt index 11c07d0b493a54fb9d8b7b8039a57b7b327db92a..e50df04604937403a673baaed691270384671fb3 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt @@ -32,7 +32,6 @@ import org.briarproject.bramble.api.lifecycle.LifecycleManager import org.briarproject.bramble.api.plugin.event.ContactConnectedEvent import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent import org.briarproject.bramble.api.sync.GroupId -import org.briarproject.briar.api.attachment.AttachmentReader import org.briarproject.briar.api.conversation.ConversationManager import org.briarproject.briar.api.forum.ForumSharingManager import org.briarproject.briar.api.forum.event.ForumInvitationResponseReceivedEvent @@ -57,7 +56,6 @@ class ForumSharingViewModel @Inject constructor( authorManager: AuthorManager, conversationManager: ConversationManager, private val connectionRegistry: ConnectionRegistry, - attachmentReader: AttachmentReader, briarExecutors: BriarExecutors, lifecycleManager: LifecycleManager, db: TransactionManager, @@ -67,7 +65,6 @@ class ForumSharingViewModel @Inject constructor( authorManager, conversationManager, connectionRegistry, - attachmentReader, briarExecutors, lifecycleManager, db, diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt index 5327bb780d5b2e5c4bc5036419804daf9b4a7501..b5a14c2916f30f45e38b2be8ec4ad295be22a880 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt @@ -54,7 +54,6 @@ constructor( authorManager, conversationManager, connectionRegistry, - attachmentReader, briarExecutors, lifecycleManager, db, diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/utils/PreviewDataUtils.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/utils/PreviewDataUtils.kt index ab47f49b3322adcf992e2124593343d9922c9ae4..353b6db8715e7a4312fc37e2d490af2b7a531c8f 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/utils/PreviewDataUtils.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/utils/PreviewDataUtils.kt @@ -35,7 +35,7 @@ fun getRandomAuthor(): Author = Author( SignaturePublicKey(Random.nextBytes(MAX_SIGNATURE_PUBLIC_KEY_BYTES)) ) -fun getRandomAuthorInfo(): AuthorInfo = AuthorInfo(statusList.random()) +fun getRandomAuthorInfo(s: AuthorInfo.Status = statusList.random()): AuthorInfo = AuthorInfo(s) fun getRandomForumPostHeader() = ForumPostHeader( MessageId(getRandomId()), diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/contact/ContactItemTest.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/contact/ContactItemTest.kt index 7b927614517101499c2dffd5ea61de4fbf52dfe6..492d6e2e05d2c194492821513d0e9e17acf2174d 100644 --- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/contact/ContactItemTest.kt +++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/contact/ContactItemTest.kt @@ -57,7 +57,6 @@ class ContactItemTest { authorInfo = AuthorInfo(AuthorInfo.Status.UNKNOWN), isConnected = false, groupCount = MessageTracker.GroupCount(0, 0, System.currentTimeMillis()), - avatar = null ) assertEquals("Alice", item.displayName)