diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInEventProcessor.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInEventProcessor.kt index 2759e49f70..65980e3427 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInEventProcessor.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInEventProcessor.kt @@ -10,34 +10,33 @@ package io.element.android.appnav import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage import io.element.android.libraries.matrix.api.room.RoomMembershipObserver +import io.element.android.libraries.matrix.api.timeline.item.event.MembershipChange import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch import javax.inject.Inject class LoggedInEventProcessor @Inject constructor( private val snackbarDispatcher: SnackbarDispatcher, - roomMembershipObserver: RoomMembershipObserver, + private val roomMembershipObserver: RoomMembershipObserver, ) { private var observingJob: Job? = null - private val displayLeftRoomMessage = roomMembershipObserver.updates - .map { !it.isUserInRoom } - fun observeEvents(coroutineScope: CoroutineScope) { - observingJob = coroutineScope.launch { - displayLeftRoomMessage - .filter { it } - .onEach { - displayMessage(CommonStrings.common_current_user_left_room) + observingJob = roomMembershipObserver.updates + .filter { !it.isUserInRoom } + .onEach { + when (it.change) { + MembershipChange.LEFT -> displayMessage(CommonStrings.common_current_user_left_room) + MembershipChange.INVITATION_REJECTED -> displayMessage(CommonStrings.common_current_user_rejected_invite) + MembershipChange.KNOCK_RETRACTED -> displayMessage(CommonStrings.common_current_user_canceled_knock) + else -> Unit } - .launchIn(this) - } + } + .launchIn(coroutineScope) } fun stopObserving() { diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMembershipObserver.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMembershipObserver.kt index 66725e5cc1..090f196269 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMembershipObserver.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMembershipObserver.kt @@ -25,4 +25,12 @@ class RoomMembershipObserver { suspend fun notifyUserLeftRoom(roomId: RoomId) { _updates.emit(RoomMembershipUpdate(roomId, false, MembershipChange.LEFT)) } + + suspend fun notifyUserDeclinedInvite(roomId: RoomId) { + _updates.emit(RoomMembershipUpdate(roomId, false, MembershipChange.INVITATION_REJECTED)) + } + + suspend fun notifyUserCanceledKnock(roomId: RoomId) { + _updates.emit(RoomMembershipUpdate(roomId, false, MembershipChange.KNOCK_RETRACTED)) + } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomPreview.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomPreview.kt index 0739a2cd0f..88c2836a06 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomPreview.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomPreview.kt @@ -9,6 +9,7 @@ package io.element.android.libraries.matrix.impl.room import androidx.compose.runtime.Immutable import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.matrix.api.room.CurrentUserMembership import io.element.android.libraries.matrix.api.room.RoomMembershipDetails import io.element.android.libraries.matrix.api.room.RoomMembershipObserver import io.element.android.libraries.matrix.api.room.RoomPreview @@ -33,7 +34,11 @@ class RustRoomPreview( override suspend fun leave(): Result = runCatching { inner.leave() }.onSuccess { - roomMembershipObserver?.notifyUserLeftRoom(info.roomId) + when (info.membership) { + CurrentUserMembership.INVITED -> roomMembershipObserver?.notifyUserDeclinedInvite(info.roomId) + CurrentUserMembership.KNOCKED -> roomMembershipObserver?.notifyUserCanceledKnock(info.roomId) + else -> Unit + } } override suspend fun forget(): Result = runCatching { diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index 4a7668ce46..1b50a9e72c 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -145,7 +145,9 @@ "Copied to clipboard" "Copyright" "Creating room…" + "Request canceled" "Left room" + "Invite declined" "Dark" "Decryption error" "Developer options"