Room list invites: address some remarks and add small tests

This commit is contained in:
ganfra 2024-04-17 22:02:44 +02:00
parent 6e2ee7dc99
commit e8bc8c1125
9 changed files with 46 additions and 11 deletions

View file

@ -16,6 +16,7 @@
package io.element.android.features.joinroom.impl package io.element.android.features.joinroom.impl
import androidx.annotation.VisibleForTesting
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -31,7 +32,6 @@ import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.CurrentUserMembership import io.element.android.libraries.matrix.api.room.CurrentUserMembership
import io.element.android.libraries.matrix.api.room.MatrixRoomInfo import io.element.android.libraries.matrix.api.room.MatrixRoomInfo
import org.jetbrains.annotations.VisibleForTesting
import java.util.Optional import java.util.Optional
class JoinRoomPresenter @AssistedInject constructor( class JoinRoomPresenter @AssistedInject constructor(

View file

@ -16,6 +16,7 @@
package io.element.android.features.roomlist.impl package io.element.android.features.roomlist.impl
import androidx.annotation.VisibleForTesting
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
@ -74,7 +75,6 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.takeWhile import kotlinx.coroutines.flow.takeWhile
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.jetbrains.annotations.VisibleForTesting
import javax.inject.Inject import javax.inject.Inject
private const val EXTENDED_RANGE_SIZE = 40 private const val EXTENDED_RANGE_SIZE = 40
@ -225,7 +225,7 @@ class RoomListPresenter @Inject constructor(
val initialState = RoomListState.ContextMenu.Shown( val initialState = RoomListState.ContextMenu.Shown(
roomId = event.roomListRoomSummary.roomId, roomId = event.roomListRoomSummary.roomId,
roomName = event.roomListRoomSummary.name, roomName = event.roomListRoomSummary.name,
isDm = event.roomListRoomSummary.isDirect, isDm = event.roomListRoomSummary.isDm,
isFavorite = event.roomListRoomSummary.isFavorite, isFavorite = event.roomListRoomSummary.isFavorite,
markAsUnreadFeatureFlagEnabled = featureFlagService.isFeatureEnabled(FeatureFlags.MarkAsUnread), markAsUnreadFeatureFlagEnabled = featureFlagService.isFeatureEnabled(FeatureFlags.MarkAsUnread),
hasNewContent = event.roomListRoomSummary.hasNewContent hasNewContent = event.roomListRoomSummary.hasNewContent

View file

@ -52,6 +52,7 @@ class RoomListRoomSummaryFactory @Inject constructor(
isDirect = false, isDirect = false,
isFavorite = false, isFavorite = false,
inviteSender = null, inviteSender = null,
isDm = false,
canonicalAlias = null, canonicalAlias = null,
) )
} }
@ -94,6 +95,7 @@ class RoomListRoomSummaryFactory @Inject constructor(
), ),
) )
}, },
isDm = roomSummary.details.isDm,
canonicalAlias = roomSummary.details.canonicalAlias, canonicalAlias = roomSummary.details.canonicalAlias,
displayType = if (roomSummary.details.currentUserMembership == CurrentUserMembership.INVITED) { displayType = if (roomSummary.details.currentUserMembership == CurrentUserMembership.INVITED) {
RoomSummaryDisplayType.INVITE RoomSummaryDisplayType.INVITE

View file

@ -38,6 +38,7 @@ data class RoomListRoomSummary(
val userDefinedNotificationMode: RoomNotificationMode?, val userDefinedNotificationMode: RoomNotificationMode?,
val hasRoomCall: Boolean, val hasRoomCall: Boolean,
val isDirect: Boolean, val isDirect: Boolean,
val isDm: Boolean,
val isFavorite: Boolean, val isFavorite: Boolean,
val inviteSender: InviteSender?, val inviteSender: InviteSender?,
) { ) {

View file

@ -84,20 +84,18 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
listOf( listOf(
aRoomListRoomSummary( aRoomListRoomSummary(
displayType = RoomSummaryDisplayType.INVITE, displayType = RoomSummaryDisplayType.INVITE,
inviteSender = InviteSender( inviteSender = anInviteSender(
userId = UserId("@alice:matrix.org"), userId = "@alice:matrix.org",
displayName = "Alice", displayName = "Alice",
avatarData = AvatarData("@alice:matrix.org", "Alice", size = AvatarSize.InviteSender),
), ),
canonicalAlias = "#alias:matrix.org", canonicalAlias = "#alias:matrix.org",
), ),
aRoomListRoomSummary( aRoomListRoomSummary(
name = "Bob", name = "Bob",
displayType = RoomSummaryDisplayType.INVITE, displayType = RoomSummaryDisplayType.INVITE,
inviteSender = InviteSender( inviteSender = anInviteSender(
userId = UserId("@bob:matrix.org"), userId = "@bob:matrix.org",
displayName = "Bob", displayName = "Bob",
avatarData = AvatarData("@bob:matrix.org", "Bob", size = AvatarSize.InviteSender),
), ),
isDirect = true, isDirect = true,
) )
@ -105,6 +103,15 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
).flatten() ).flatten()
} }
internal fun anInviteSender(
userId: String,
displayName: String,
) = InviteSender(
userId = UserId(userId),
displayName = displayName,
avatarData = AvatarData(userId, displayName, size = AvatarSize.InviteSender),
)
internal fun aRoomListRoomSummary( internal fun aRoomListRoomSummary(
id: String = "!roomId:domain", id: String = "!roomId:domain",
name: String = "Room name", name: String = "Room name",
@ -118,6 +125,7 @@ internal fun aRoomListRoomSummary(
hasRoomCall: Boolean = false, hasRoomCall: Boolean = false,
avatarData: AvatarData = AvatarData(id, name, size = AvatarSize.RoomListItem), avatarData: AvatarData = AvatarData(id, name, size = AvatarSize.RoomListItem),
isDirect: Boolean = false, isDirect: Boolean = false,
isDm: Boolean = false,
isFavorite: Boolean = false, isFavorite: Boolean = false,
inviteSender: InviteSender? = null, inviteSender: InviteSender? = null,
displayType: RoomSummaryDisplayType = RoomSummaryDisplayType.ROOM, displayType: RoomSummaryDisplayType = RoomSummaryDisplayType.ROOM,
@ -136,6 +144,7 @@ internal fun aRoomListRoomSummary(
userDefinedNotificationMode = notificationMode, userDefinedNotificationMode = notificationMode,
hasRoomCall = hasRoomCall, hasRoomCall = hasRoomCall,
isDirect = isDirect, isDirect = isDirect,
isDm = isDm,
isFavorite = isFavorite, isFavorite = isFavorite,
inviteSender = inviteSender, inviteSender = inviteSender,
displayType = displayType, displayType = displayType,

View file

@ -64,6 +64,15 @@ class RoomListFiltersEmptyStateResourcesTest {
assertThat(result?.subtitle).isEqualTo(R.string.screen_roomlist_filter_favourites_empty_state_subtitle) assertThat(result?.subtitle).isEqualTo(R.string.screen_roomlist_filter_favourites_empty_state_subtitle)
} }
@Test
fun `fromSelectedFilters should return exact RoomListFiltersEmptyStateResources when selectedFilters has only invites filter`() {
val selectedFilters = listOf(RoomListFilter.Invites)
val result = RoomListFiltersEmptyStateResources.fromSelectedFilters(selectedFilters)
assertThat(result).isNotNull()
assertThat(result?.title).isEqualTo(R.string.screen_roomlist_filter_invites_empty_state_title)
assertThat(result?.subtitle).isEqualTo(R.string.screen_roomlist_filter_mixed_empty_state_subtitle)
}
@Test @Test
fun `fromSelectedFilters should return exact RoomListFiltersEmptyStateResources when selectedFilters has multiple filters`() { fun `fromSelectedFilters should return exact RoomListFiltersEmptyStateResources when selectedFilters has multiple filters`() {
val selectedFilters = listOf(RoomListFilter.Unread, RoomListFilter.People, RoomListFilter.Rooms, RoomListFilter.Favourites) val selectedFilters = listOf(RoomListFilter.Unread, RoomListFilter.People, RoomListFilter.Rooms, RoomListFilter.Favourites)

View file

@ -109,4 +109,5 @@ internal fun createRoomListRoomSummary(
isFavorite = isFavorite, isFavorite = isFavorite,
canonicalAlias = null, canonicalAlias = null,
inviteSender = null, inviteSender = null,
isDm = false,
) )

View file

@ -58,7 +58,7 @@ sealed interface RoomListFilter {
data object Favorite : RoomListFilter data object Favorite : RoomListFilter
/** /**
* A filter that matches rooms that with Invited membership. * A filter that matches rooms with Invited membership.
*/ */
data object Invite : RoomListFilter data object Invite : RoomListFilter

View file

@ -17,6 +17,7 @@
package io.element.android.libraries.matrix.impl.roomlist package io.element.android.libraries.matrix.impl.roomlist
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter import io.element.android.libraries.matrix.api.roomlist.RoomListFilter
import io.element.android.libraries.matrix.test.room.aRoomSummaryDetails import io.element.android.libraries.matrix.test.room.aRoomSummaryDetails
import io.element.android.libraries.matrix.test.room.aRoomSummaryFilled import io.element.android.libraries.matrix.test.room.aRoomSummaryFilled
@ -54,6 +55,11 @@ class RoomListFilterTests {
name = "Room to search" name = "Room to search"
) )
) )
private val invitedRoom = aRoomSummaryFilled(
aRoomSummaryDetails(
currentUserMembership = CurrentUserMembership.INVITED
)
)
private val roomSummaries = listOf( private val roomSummaries = listOf(
regularRoom, regularRoom,
@ -61,7 +67,8 @@ class RoomListFilterTests {
favoriteRoom, favoriteRoom,
markedAsUnreadRoom, markedAsUnreadRoom,
unreadNotificationRoom, unreadNotificationRoom,
roomToSearch roomToSearch,
invitedRoom
) )
@Test @Test
@ -100,6 +107,12 @@ class RoomListFilterTests {
assertThat(roomSummaries.filter(filter)).containsExactly(markedAsUnreadRoom, unreadNotificationRoom) assertThat(roomSummaries.filter(filter)).containsExactly(markedAsUnreadRoom, unreadNotificationRoom)
} }
@Test
fun `Room list filter invites`() = runTest {
val filter = RoomListFilter.Invite
assertThat(roomSummaries.filter(filter)).containsExactly(invitedRoom)
}
@Test @Test
fun `Room list filter normalized match room name`() = runTest { fun `Room list filter normalized match room name`() = runTest {
val filter = RoomListFilter.NormalizedMatchRoomName("search") val filter = RoomListFilter.NormalizedMatchRoomName("search")