diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt index 1b01dd7d213e24fe9e55648b6f44e548e6ef6602..fc95fb753f3cf66d3516cbf55c9cd825fcdf7a78 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt @@ -48,7 +48,7 @@ fun ContactCard( Row(horizontalArrangement = Arrangement.SpaceBetween) { Row(modifier = Modifier.align(Alignment.CenterVertically).padding(horizontal = 16.dp)) { // TODO Pull profile pictures - ProfileCircle(36.dp, contactItem.contact.author.id.bytes) + ProfileCircle(36.dp, contactItem.authorId.bytes) // Draw notification badges if (contactItem.unread > 0) { Canvas( @@ -64,7 +64,7 @@ fun ContactCard( } Column(modifier = Modifier.align(Alignment.CenterVertically).padding(start = 12.dp)) { Text( - contactItem.contact.author.name, + contactItem.displayName, fontSize = 14.sp, modifier = Modifier.align(Alignment.Start).padding(bottom = 2.dp) ) diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactInfoDrawer.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactInfoDrawer.kt index a0732821932654c0afdad88ad942abafb77c1d13..43462c4da9fe403ef300db44546669ca03b86490 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactInfoDrawer.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactInfoDrawer.kt @@ -1,7 +1,6 @@ package org.briarproject.briar.desktop.contact import androidx.compose.runtime.Composable -import org.briarproject.bramble.api.contact.Contact import org.briarproject.briar.desktop.contact.ContactInfoDrawerState.MakeIntro import org.briarproject.briar.desktop.introduction.ContactDrawerMakeIntro @@ -14,11 +13,11 @@ enum class ContactInfoDrawerState { @Composable fun ContactInfoDrawer( - contact: Contact, + contactItem: ContactItem, setInfoDrawer: (Boolean) -> Unit, drawerState: ContactInfoDrawerState ) { when (drawerState) { - MakeIntro -> ContactDrawerMakeIntro(contact, setInfoDrawer) + MakeIntro -> ContactDrawerMakeIntro(contactItem, setInfoDrawer) } } diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt index d169ac99ef21cfb9103a2be8feba887fda723b2b..62ebc584ecb602dde7bd4478d65345c8fc6f51a5 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt @@ -1,20 +1,31 @@ package org.briarproject.briar.desktop.contact import org.briarproject.bramble.api.contact.Contact +import org.briarproject.bramble.api.contact.ContactId +import org.briarproject.bramble.api.identity.AuthorId import org.briarproject.briar.api.client.MessageTracker import kotlin.math.max data class ContactItem( - val contact: Contact, + val contactId: ContactId, + val authorId: AuthorId, + val name: String, + val alias: String?, val isConnected: Boolean, val isEmpty: Boolean, val unread: Int, val timestamp: Long ) { + val displayName = if (alias == null) name else "$alias ($name)" + constructor(contact: Contact, isConnected: Boolean, groupCount: MessageTracker.GroupCount) : this( - contact, isConnected, + contactId = contact.id, + authorId = contact.author.id, + name = contact.author.name, + alias = contact.alias, + isConnected = isConnected, isEmpty = groupCount.msgCount == 0, unread = groupCount.unreadCount, timestamp = groupCount.latestMsgTime @@ -32,10 +43,6 @@ data class ContactItem( } fun updateAlias(a: String?): ContactItem { - return copy(contact = contact.updateAlias(a)) - } - - private fun Contact.updateAlias(a: String?): Contact { - return Contact(id, author, localAuthorId, a, handshakePublicKey, isVerified) + return copy(alias = a) } } diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt index 16b1f0a3bc25f02e4b428488ca36781b67e1af3a..fd0d2957599f867b943d1134996179fd6cd8fbc0 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt @@ -51,8 +51,8 @@ fun ContactList( items(contactList) { contactItem -> ContactCard( contactItem, - { selectContact(contactItem.contact.id) }, - isSelected(contactItem.contact.id) + { selectContact(contactItem.contactId) }, + isSelected(contactItem.contactId) ) } } diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt index 6cd88d2945616bc263f7c851b6c575bc467dace8..254ce8fe4ed9f48d0c2fb13f3db319de203b41e1 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt @@ -4,7 +4,6 @@ import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import mu.KotlinLogging 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.contact.ContactManager import org.briarproject.bramble.api.contact.event.ContactAliasChangedEvent @@ -44,9 +43,8 @@ constructor( fun isSelected(contactId: ContactId) = _selectedContactId.value == contactId - override fun filterContact(contact: Contact) = - // todo: also filter on alias - contact.author.name.contains(_filterBy.value, ignoreCase = true) + override fun filterContactItem(contactItem: ContactItem) = + contactItem.displayName.contains(_filterBy.value, ignoreCase = true) fun setFilterBy(filter: String) { _filterBy.value = filter @@ -58,7 +56,7 @@ constructor( // reset selected contact to null if not available after filtering val id = _selectedContactId.value - if (id != null && !contactList.map { it.contact.id }.contains(id)) { + if (id != null && !contactList.map { it.contactId }.contains(id)) { _selectedContactId.value = null } } diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt index 157e028f680982d1a629373808fd3768355971d0..46a6c68684cdc70754470313ec1659a4c83a2a2c 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt @@ -3,7 +3,6 @@ package org.briarproject.briar.desktop.contact import androidx.compose.runtime.mutableStateListOf import mu.KotlinLogging 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.contact.ContactManager import org.briarproject.bramble.api.contact.event.ContactAddedEvent @@ -33,7 +32,7 @@ abstract class ContactsViewModel( val contactList: List<ContactItem> = _filteredContactList - protected open fun filterContact(contact: Contact) = true + protected open fun filterContactItem(contactItem: ContactItem) = true open fun loadContacts() { _fullContactList.apply { @@ -55,7 +54,7 @@ abstract class ContactsViewModel( protected open fun updateFilteredList() { _filteredContactList.apply { clear() - addAll(_fullContactList.filter { filterContact(it.contact) }.sortedByDescending { it.timestamp }) + addAll(_fullContactList.filter(::filterContactItem).sortedByDescending { it.timestamp }) } } @@ -81,12 +80,12 @@ abstract class ContactsViewModel( } protected open fun updateItem(contactId: ContactId, update: (ContactItem) -> ContactItem) { - _fullContactList.replaceFirst({ it.contact.id == contactId }, update) + _fullContactList.replaceFirst({ it.contactId == contactId }, update) updateFilteredList() } protected open fun removeItem(contactId: ContactId) { - _fullContactList.removeFirst { it.contact.id == contactId } + _fullContactList.removeFirst { it.contactId == contactId } updateFilteredList() } } diff --git a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationHeader.kt b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationHeader.kt index 8f28474fe8fe0c501ff327f7348012d715c9da91..deeca393355e666042958afdb4135950c970ba6a 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationHeader.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationHeader.kt @@ -42,7 +42,7 @@ fun ConversationHeader( Box(modifier = Modifier.fillMaxWidth().height(HEADER_SIZE + 1.dp)) { Row(modifier = Modifier.align(Alignment.Center)) { - ProfileCircle(36.dp, contactItem.contact.author.id.bytes) + ProfileCircle(36.dp, contactItem.authorId.bytes) Canvas( modifier = Modifier.align(Alignment.CenterVertically), onDraw = { @@ -54,7 +54,7 @@ fun ConversationHeader( } ) Text( - contactItem.contact.author.name, + contactItem.displayName, modifier = Modifier.align(Alignment.CenterVertically).padding(start = 12.dp), fontSize = 20.sp ) diff --git a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt index 97604a38d77f6725c8ae7de446b663cca6a40a2a..8390eb90a048f227da1e3020f47c7d32036d24d8 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt @@ -108,7 +108,7 @@ fun ConversationScreen( RoundedCornerShape(topStart = 10.dp, bottomStart = 10.dp) ) ) { - ContactInfoDrawer(contactItem.contact, setInfoDrawer, contactDrawerState) + ContactInfoDrawer(contactItem, setInfoDrawer, contactDrawerState) } } } diff --git a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt index e157bf065fc5194d0894285f3f7df21f3211fc9e..affc255f9a9a4a2b55502f5ac0cbd898d9f687db 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt @@ -110,7 +110,7 @@ constructor( @Throws(DbException::class) private fun createMessage(text: String): PrivateMessage { - val groupId = messagingManager.getContactGroup(_contactItem.value!!.contact).id + val groupId = messagingManager.getConversationId(_contactItem.value!!.contactId) // todo: this API call needs a database transaction context // val timestamp = conversationManager.getTimestampForOutgoingMessage(_contactId.value!!) val timestamp = Date().time diff --git a/src/main/kotlin/org/briarproject/briar/desktop/introduction/ContactDrawerMakeIntro.kt b/src/main/kotlin/org/briarproject/briar/desktop/introduction/ContactDrawerMakeIntro.kt index c10f6f4519bc0922cf8f5f9065809440158a6e67..e2c12e52f778a113df66011e052d9082661ea1b8 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/introduction/ContactDrawerMakeIntro.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/introduction/ContactDrawerMakeIntro.kt @@ -26,8 +26,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import org.briarproject.bramble.api.contact.Contact import org.briarproject.briar.desktop.contact.ContactCard +import org.briarproject.briar.desktop.contact.ContactItem import org.briarproject.briar.desktop.contact.ProfileCircle import org.briarproject.briar.desktop.ui.Constants.HEADER_SIZE import org.briarproject.briar.desktop.ui.HorizontalDivider @@ -38,12 +38,12 @@ import java.util.Locale @Composable fun ContactDrawerMakeIntro( - contact: Contact, + contactItem: ContactItem, setInfoDrawer: (Boolean) -> Unit, viewModel: IntroductionViewModel = viewModel(), ) { - LaunchedEffect(contact) { - viewModel.setFirstContact(contact) + LaunchedEffect(contactItem) { + viewModel.setFirstContact(contactItem) } if (!viewModel.secondScreen.value) { Surface { @@ -56,7 +56,7 @@ fun ContactDrawerMakeIntro( Icon(Icons.Filled.Close, i18n("access.introduction.close")) } Text( - text = i18nF("introduction.title_first", contact.author.name), + text = i18nF("introduction.title_first", contactItem.displayName), fontSize = 16.sp, modifier = Modifier.align(Alignment.CenterVertically) ) @@ -66,7 +66,7 @@ fun ContactDrawerMakeIntro( items(viewModel.contactList) { contactItem -> ContactCard( contactItem, - { viewModel.setSecondContact(contactItem.contact) }, + { viewModel.setSecondContact(contactItem) }, false ) } @@ -90,13 +90,13 @@ fun ContactDrawerMakeIntro( } Row(Modifier.fillMaxWidth().padding(12.dp), horizontalArrangement = Arrangement.SpaceAround) { Column(Modifier.align(Alignment.CenterVertically)) { - ProfileCircle(36.dp, viewModel.firstContact.value!!.author.id.bytes) - Text(viewModel.firstContact.value!!.author.name, Modifier.padding(top = 4.dp), Color.White, 16.sp) + ProfileCircle(36.dp, viewModel.firstContact.value!!.authorId.bytes) + Text(viewModel.firstContact.value!!.displayName, Modifier.padding(top = 4.dp), Color.White, 16.sp) } Icon(Icons.Filled.SwapHoriz, i18n("access.swap"), modifier = Modifier.size(48.dp)) Column(Modifier.align(Alignment.CenterVertically)) { - ProfileCircle(36.dp, viewModel.secondContact.value!!.author.id.bytes) - Text(viewModel.secondContact.value!!.author.name, Modifier.padding(top = 4.dp), Color.White, 16.sp) + ProfileCircle(36.dp, viewModel.secondContact.value!!.authorId.bytes) + Text(viewModel.secondContact.value!!.displayName, Modifier.padding(top = 4.dp), Color.White, 16.sp) } } Row(Modifier.padding(8.dp)) { diff --git a/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt index e8b2e63bfdfba6959305f49b6c85c6b3f1830001..c57773fb6156f3273b9e5da884c63d987a2cae93 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt @@ -3,10 +3,10 @@ package org.briarproject.briar.desktop.introduction import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import org.briarproject.bramble.api.connection.ConnectionRegistry -import org.briarproject.bramble.api.contact.Contact import org.briarproject.bramble.api.contact.ContactManager import org.briarproject.bramble.api.event.EventBus import org.briarproject.briar.api.conversation.ConversationManager +import org.briarproject.briar.desktop.contact.ContactItem import org.briarproject.briar.desktop.contact.ContactsViewModel import javax.inject.Inject @@ -19,24 +19,24 @@ constructor( eventBus: EventBus, ) : ContactsViewModel(contactManager, conversationManager, connectionRegistry, eventBus) { - private val _firstContact = mutableStateOf<Contact?>(null) - private val _secondContact = mutableStateOf<Contact?>(null) + private val _firstContact = mutableStateOf<ContactItem?>(null) + private val _secondContact = mutableStateOf<ContactItem?>(null) private val _secondScreen = mutableStateOf(false) private val _introductionMessage = mutableStateOf("") - val firstContact: State<Contact?> = _firstContact - val secondContact: State<Contact?> = _secondContact + val firstContact: State<ContactItem?> = _firstContact + val secondContact: State<ContactItem?> = _secondContact val secondScreen: State<Boolean> = _secondScreen val introductionMessage: State<String> = _introductionMessage - fun setFirstContact(contact: Contact) { - _firstContact.value = contact + fun setFirstContact(contactItem: ContactItem) { + _firstContact.value = contactItem loadContacts() backToFirstScreen() } - fun setSecondContact(contact: Contact) { - _secondContact.value = contact + fun setSecondContact(contactItem: ContactItem) { + _secondContact.value = contactItem _secondScreen.value = true } @@ -49,7 +49,7 @@ constructor( _introductionMessage.value = msg } - override fun filterContact(contact: Contact): Boolean { - return _firstContact.value?.id != contact.id + override fun filterContactItem(contactItem: ContactItem): Boolean { + return _firstContact.value?.contactId != contactItem.contactId } }