Accepting and declining invites

Hook up accept and decline buttons in the invites UI. Accept
will attempt to accept and then navigate to the room; decline
shows a confirmation dialog.

Fixes #106
This commit is contained in:
Chris Smith 2023-04-20 16:13:14 +01:00
parent 114e9725fa
commit ff5672597a
26 changed files with 582 additions and 77 deletions

View file

@ -23,7 +23,7 @@ import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
import kotlinx.coroutines.flow.Flow
import java.io.Closeable
interface MatrixRoom: Closeable {
interface MatrixRoom : Closeable {
val roomId: RoomId
val name: String?
val bestName: String
@ -36,7 +36,7 @@ interface MatrixRoom: Closeable {
val isDirect: Boolean
val isPublic: Boolean
suspend fun members() : List<RoomMember>
suspend fun members(): List<RoomMember>
suspend fun memberCount(): Int
@ -63,4 +63,8 @@ interface MatrixRoom: Closeable {
suspend fun redactEvent(eventId: EventId, reason: String? = null): Result<Unit>
suspend fun leave(): Result<Unit>
suspend fun acceptInvitation(): Result<Unit>
suspend fun rejectInvitation(): Result<Unit>
}

View file

@ -33,7 +33,7 @@ class RoomSummaryDetailsFactory(private val roomMessageFactory: RoomMessageFacto
roomId = RoomId(slidingSyncRoom.roomId()),
name = slidingSyncRoom.name() ?: slidingSyncRoom.roomId(),
canonicalAlias = room?.canonicalAlias(),
isDirect = slidingSyncRoom.isDm() ?: false,
isDirect = room?.isDirect() ?: false,
avatarURLString = room?.avatarUrl(),
unreadNotificationCount = slidingSyncRoom.unreadNotifications().use { it.notificationCount().toInt() },
lastMessage = latestRoomMessage,

View file

@ -206,4 +206,17 @@ class RustMatrixRoom(
innerRoom.leave()
}
}
override suspend fun acceptInvitation(): Result<Unit> = withContext(coroutineDispatchers.io) {
kotlin.runCatching {
innerRoom.acceptInvitation()
}
}
override suspend fun rejectInvitation(): Result<Unit> = withContext(coroutineDispatchers.io) {
kotlin.runCatching {
innerRoom.rejectInvitation()
}
}
}

View file

@ -52,9 +52,10 @@ class FakeMatrixClient(
private var createDmFailure: Throwable? = null
private var findDmResult: MatrixRoom? = FakeMatrixRoom()
private var logoutFailure: Throwable? = null
private val getRoomResults = mutableMapOf<RoomId, MatrixRoom>()
override fun getRoom(roomId: RoomId): MatrixRoom? {
return FakeMatrixRoom(roomId)
return getRoomResults[roomId]
}
override fun findDM(userId: UserId): MatrixRoom? {
@ -136,4 +137,8 @@ class FakeMatrixClient(
fun givenFindDmResult(result: MatrixRoom?) {
findDmResult = result
}
fun givenGetRoomResult(roomId: RoomId, result: MatrixRoom) {
getRoomResults[roomId] = result
}
}

View file

@ -21,9 +21,9 @@ import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.MatrixRoom
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.test.timeline.FakeMatrixTimeline
import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow
@ -46,12 +46,20 @@ class FakeMatrixRoom(
private var userDisplayNameResult = Result.success<String?>(null)
private var userAvatarUrlResult = Result.success<String?>(null)
private var acceptInviteResult = Result.success(Unit)
private var rejectInviteResult = Result.success(Unit)
private var dmMember: RoomMember? = null
private var fetchMemberResult: Result<Unit> = Result.success(Unit)
var areMembersFetched: Boolean = false
private set
var isInviteAccepted: Boolean = false
private set
var isInviteRejected: Boolean = false
private set
private var leaveRoomError: Throwable? = null
override fun syncUpdateFlow(): Flow<Long> {
@ -131,6 +139,15 @@ class FakeMatrixRoom(
}
override suspend fun leave(): Result<Unit> = leaveRoomError?.let { Result.failure(it) } ?: Result.success(Unit)
override suspend fun acceptInvitation(): Result<Unit> {
isInviteAccepted = true
return acceptInviteResult
}
override suspend fun rejectInvitation(): Result<Unit> {
isInviteRejected = true
return rejectInviteResult
}
override fun close() = Unit
@ -153,4 +170,13 @@ class FakeMatrixRoom(
fun givenUserAvatarUrlResult(avatarUrl: Result<String?>) {
userAvatarUrlResult = avatarUrl
}
fun givenAcceptInviteResult(result: Result<Unit>) {
acceptInviteResult = result
}
fun givenRejectInviteResult(result: Result<Unit>) {
rejectInviteResult = result
}
}