diff --git a/FEATURES.md b/FEATURES.md index e217318000..c40f236484 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -15,7 +15,7 @@ Note that following list of changes compared to Element X is likely incomplete, ## Chat overview ("room list") - Filter for spaces, including support for hierarchical spaces †‡ -- Filter for favorites, DMs, and group chat via our spaces navigation +- Filter for favorites, unreads, DMs, and group chats via our spaces navigation - Sort room list by unread first ‡ - Non-expanding compact app bar in the chat overview † - Show unread counts ([MSC2654](https://github.com/matrix-org/matrix-spec-proposals/pull/2654)) ‡[^1] diff --git a/features/roomlist/impl/src/main/kotlin/chat/schildi/features/roomlist/spaces/SpaceListDataSource.kt b/features/roomlist/impl/src/main/kotlin/chat/schildi/features/roomlist/spaces/SpaceListDataSource.kt index c650efec39..4c2ade4396 100644 --- a/features/roomlist/impl/src/main/kotlin/chat/schildi/features/roomlist/spaces/SpaceListDataSource.kt +++ b/features/roomlist/impl/src/main/kotlin/chat/schildi/features/roomlist/spaces/SpaceListDataSource.kt @@ -3,7 +3,9 @@ package chat.schildi.features.roomlist.spaces import android.content.Context import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Groups +import androidx.compose.material.icons.filled.Notifications import androidx.compose.material.icons.filled.Person +import androidx.compose.material.icons.filled.RemoveRedEye import androidx.compose.material.icons.filled.Rocket import androidx.compose.material.icons.filled.Star import androidx.compose.material.icons.filled.Tag @@ -137,6 +139,27 @@ class SpaceListDataSource @Inject constructor( ) } } + if (pseudoSpaceSettings.notifications) { + pseudoSpaces.add( + NotificationsPseudoSpaceItem( + context.getString( + if (pseudoSpaceSettings.unread) + chat.schildi.lib.R.string.sc_pseudo_space_notifications_short + else + chat.schildi.lib.R.string.sc_pseudo_space_unread + ), + pseudoSpaceSettings.clientUnreadCounts + ) + ) + } + if (pseudoSpaceSettings.unread) { + pseudoSpaces.add( + UnreadPseudoSpaceItem( + context.getString(chat.schildi.lib.R.string.sc_pseudo_space_unread), + pseudoSpaceSettings.clientUnreadCounts + ) + ) + } _allSpaces.emit(buildSpaceHierarchy(spaceListRoomSummaries, pseudoSpaces)) } @@ -299,14 +322,43 @@ class SpaceListDataSource @Inject constructor( rooms.filter { !excludedRooms.contains(it.roomId.value) }.toImmutableList() } + @Immutable + data class NotificationsPseudoSpaceItem(override val name: String, val clientUnreadCounts: Boolean) : PseudoSpaceItem( + "notif", + Icons.Default.Notifications, + ) { + override fun applyFilter(rooms: List): ImmutableList { + return if (clientUnreadCounts) + rooms.filter { it.numberOfUnreadNotifications > 0 || it.numberOfUnreadMentions > 0 || it.isMarkedUnread }.toImmutableList() + else + rooms.filter { it.notificationCount > 0 || it.highlightCount > 0 || it.numberOfUnreadMentions > 0 || it.isMarkedUnread }.toImmutableList() + } + } + + @Immutable + data class UnreadPseudoSpaceItem(override val name: String, val clientUnreadCounts: Boolean) : PseudoSpaceItem( + "unread", + Icons.Default.RemoveRedEye, + ) { + override fun applyFilter(rooms: List): ImmutableList { + return if (clientUnreadCounts) + rooms.filter { it.numberOfUnreadMessages > 0 || it.isMarkedUnread }.toImmutableList() + else + rooms.filter { it.unreadCount > 0 || it.isMarkedUnread }.toImmutableList() + } + } + data class PseudoSpaceSettings( val favorites: Boolean, val dms: Boolean, val groups: Boolean, val spacelessGroups: Boolean, val spaceless: Boolean, + val notifications: Boolean, + val unread: Boolean, + val clientUnreadCounts: Boolean, ) { - fun hasSpaceIndependentPseudoSpace() = favorites || dms || groups + fun hasSpaceIndependentPseudoSpace() = favorites || dms || groups || notifications || unread } } @@ -318,6 +370,9 @@ fun ScPreferencesStore.pseudoSpaceSettingsFlow(): FlowSpace orphans Group chats not added to spaces Groups + Unread notifications and mentions + Notifications + Unread Quick settings Debug read marker