diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumItem.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumItem.kt index 2dc64b2fa33991551fb3da1e92ae44816377276b..58a2e587b5912d5389f96f247d2d53702a4e1192 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumItem.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumItem.kt @@ -42,6 +42,7 @@ data class ForumItem( override val id: GroupId = forum.id override val name: String = forum.name override val creator: String? = null + override val isDissolved: Boolean = false fun updateOnPostReceived(header: PostHeader) = copy( diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupItem.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupItem.kt index cb5a83397dbbc997d985a86bdf5f8e6a84d4eade..38b2ad8dc7701ce174cb6599a1c45c9e351de6a3 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupItem.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupItem.kt @@ -28,17 +28,24 @@ import org.briarproject.briar.desktop.utils.UiUtils.getContactDisplayName import kotlin.math.max data class PrivateGroupItem( - val privateGroup: PrivateGroup, - val creatorInfo: AuthorInfo, + private val privateGroup: PrivateGroup, + private val creatorInfo: AuthorInfo, + override val isDissolved: Boolean, override val msgCount: Int, override val unread: Int, override val timestamp: Long, ) : ThreadedGroupItem { - constructor(privateGroup: PrivateGroup, creatorInfo: AuthorInfo, groupCount: MessageTracker.GroupCount) : + constructor( + privateGroup: PrivateGroup, + creatorInfo: AuthorInfo, + isDissolved: Boolean, + groupCount: MessageTracker.GroupCount, + ) : this( privateGroup, creatorInfo, + isDissolved = isDissolved, msgCount = groupCount.msgCount, unread = groupCount.unreadCount, timestamp = groupCount.latestMsgTime @@ -57,4 +64,7 @@ data class PrivateGroupItem( fun updateOnMessagesRead(num: Int) = copy(unread = unread - num) + + fun updateOnDissolve() = + copy(isDissolved = true) } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupListViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupListViewModel.kt index 7b215505db83316bbfe19ec8869ce0902102c2b0..548c09e63b100b705b5625f82d50cd132433314d 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupListViewModel.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupListViewModel.kt @@ -40,6 +40,7 @@ import org.briarproject.briar.api.identity.AuthorManager import org.briarproject.briar.api.privategroup.GroupMessageFactory import org.briarproject.briar.api.privategroup.PrivateGroupFactory import org.briarproject.briar.api.privategroup.PrivateGroupManager +import org.briarproject.briar.api.privategroup.event.GroupDissolvedEvent import org.briarproject.briar.api.privategroup.event.GroupMessageAddedEvent import org.briarproject.briar.desktop.privategroup.conversation.PrivateGroupConversationViewModel import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupListViewModel @@ -82,6 +83,10 @@ class PrivateGroupListViewModel if (e.clientId != clientId) return updateItem(e.groupId) { it.updateOnMessagesRead(e.numMarkedRead) } } + + is GroupDissolvedEvent -> { + updateItem(e.groupId) { it.updateOnDissolve() } + } } } @@ -90,6 +95,7 @@ class PrivateGroupListViewModel return PrivateGroupItem( privateGroup = privateGroup, creatorInfo = authorManager.getAuthorInfo(txn, privateGroup.creator.id), + isDissolved = privateGroupManager.isDissolved(txn, id), groupCount = privateGroupManager.getGroupCount(txn, id), ) } @@ -113,6 +119,7 @@ class PrivateGroupListViewModel privateGroupManager.getPrivateGroups(txn).map { privateGroup -> PrivateGroupItem( privateGroup = privateGroup, + isDissolved = privateGroupManager.isDissolved(txn, privateGroup.id), creatorInfo = authorManager.getAuthorInfo(txn, privateGroup.creator.id), groupCount = privateGroupManager.getGroupCount(txn, privateGroup.id), ) diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupStrings.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupStrings.kt index 0ea2f4f32013d11d8bc47a4d817c1e175293b3c6..9b166b0a06aa339ccf06fba6c1e25d7ccd6b674c 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupStrings.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupStrings.kt @@ -44,6 +44,7 @@ object PrivateGroupStrings : ThreadedGroupStrings( lastMessage = { timestamp -> i18nF("access.group.last_post_timestamp", timestamp) }, + groupDissolved = i18n("group.card.dissolved"), groupNameMaxLength = MAX_GROUP_NAME_LENGTH, sharedWith = { total, online -> i18nF("group.sharing.status.with", total, online) diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItem.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItem.kt index 2ed41af40c802f157b3c31734dcbe2c278e40148..bf3da60bfcf66c7713f1fe09072e703bbf74351f 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItem.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItem.kt @@ -24,6 +24,7 @@ interface ThreadedGroupItem { val id: GroupId val name: String val creator: String? + val isDissolved: Boolean val msgCount: Int val unread: Int val timestamp: Long diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItemView.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItemView.kt index afe98b0ef3bc5e3dcd41e245df877e40ee7b4e0b..9b726370d934065295521ef68b721cb950d0df19 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItemView.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItemView.kt @@ -38,6 +38,7 @@ import androidx.compose.ui.Alignment.Companion.Start import androidx.compose.ui.Alignment.Companion.Top import androidx.compose.ui.Alignment.Companion.TopEnd import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.text import androidx.compose.ui.text.style.TextOverflow @@ -56,6 +57,7 @@ import java.time.Instant fun main() = preview( "name" to "This is a test forum! This is a test forum! This is a test forum! This is a test forum!", "creator" to "Bobby", + "isDissolved" to false, "msgCount" to 42, "unread" to 23, "timestamp" to Instant.now().toEpochMilli(), @@ -64,6 +66,7 @@ fun main() = preview( override val id: GroupId = GroupId(getRandomIdPersistent()) override val name: String = getStringParameter("name") override val creator: String = getStringParameter("creator") + override val isDissolved: Boolean = getBooleanParameter("isDissolved") override val msgCount: Int = getIntParameter("msgCount") override val unread: Int = getIntParameter("unread") override val timestamp: Long = getLongParameter("timestamp") @@ -84,7 +87,7 @@ fun ThreadedGroupItemView( .height(IntrinsicSize.Min) .semantics { text = getDescription(strings, threadedGroupItem) - }, + }.alpha(if (threadedGroupItem.isDissolved) 0.5f else 1f), ) { Box(Modifier.align(Top).padding(vertical = 8.dp)) { ThreadedGroupCircle(threadedGroupItem) @@ -129,13 +132,20 @@ private fun ThreadedGroupItemViewInfo(strings: ThreadedGroupStrings, threadedGro horizontalArrangement = SpaceBetween, modifier = Modifier.fillMaxWidth() ) { - Text( - text = strings.messageCount(threadedGroupItem.msgCount), - style = MaterialTheme.typography.caption - ) - if (threadedGroupItem.msgCount > 0) { + if (!threadedGroupItem.isDissolved) { + Text( + text = strings.messageCount(threadedGroupItem.msgCount), + style = MaterialTheme.typography.caption + ) + if (threadedGroupItem.msgCount > 0) { + Text( + text = getFormattedTimestamp(threadedGroupItem.timestamp), + style = MaterialTheme.typography.caption + ) + } + } else { Text( - text = getFormattedTimestamp(threadedGroupItem.timestamp), + text = strings.groupDissolved, style = MaterialTheme.typography.caption ) } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupList.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupList.kt index c320af81f153f73fcab70d81b2d601947aed48ef..05079c443e7946ba6c4acda94bbb86e2f086a685 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupList.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupList.kt @@ -60,6 +60,7 @@ fun main() = preview { override val name: String = "This is a test forum! This is a test forum! This is a test forum! This is a test forum!" override val creator: String? = null + override val isDissolved: Boolean = false override val msgCount: Int = 42 override val unread: Int = 23 override val timestamp: Long = (Instant.now().minusSeconds(300)).toEpochMilli() @@ -68,6 +69,7 @@ fun main() = preview { override val id: GroupId = GroupId(getRandomId()) override val name: String = "Newly added group" override val creator: String = "Alicia" + override val isDissolved: Boolean = false override val msgCount: Int = 0 override val unread: Int = 0 override val timestamp: Long = (Instant.now()).toEpochMilli() @@ -75,7 +77,8 @@ fun main() = preview { object : ThreadedGroupItem { override val id: GroupId = GroupId(getRandomId()) override val name: String = "Old forum" - override val creator: String? = null + override val creator: String = "Bernard" + override val isDissolved: Boolean = true override val msgCount: Int = 123 override val unread: Int = 5 override val timestamp: Long = (Instant.now().minusSeconds(1200)).toEpochMilli() diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupStrings.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupStrings.kt index 32476e5a2f7704d42834742a1812a3eb8dbfd261..ce8bb7b8b91840d8f04b700320a6eb674cb14f67 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupStrings.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupStrings.kt @@ -30,6 +30,7 @@ abstract class ThreadedGroupStrings( val messageCount: (Int) -> String, val unreadCount: (Int) -> String, val lastMessage: (String) -> String, + val groupDissolved: String = "", val groupNameMaxLength: Int, val sharedWith: (total: Int, online: Int) -> String, val unreadJumpToPrevious: String, diff --git a/briar-desktop/src/main/resources/strings/BriarDesktop.properties b/briar-desktop/src/main/resources/strings/BriarDesktop.properties index 327cf981bbdef395e682b82504017b7868d42e0b..7efbf66b3d8daea7550d1ccea950d8f6f46a8b7b 100644 --- a/briar-desktop/src/main/resources/strings/BriarDesktop.properties +++ b/briar-desktop/src/main/resources/strings/BriarDesktop.properties @@ -185,6 +185,7 @@ group.card.no_posts=No messages group.card.posts={0, plural, one {{0} post} other {{0} messages}} group.card.created=Created by {0} group.card.messages={0, plural, one {{0} message} other {{0} messages}} +group.card.dissolved=This group has been dissolved group.sharing.status.with=Shared with {0} ({1} online) group.message.hint=New Message group.message.reply.hint=New Reply