Add room notification settings (#807)
* Add room notification settings --------- Co-authored-by: ElementBot <benoitm+elementbot@element.io> Co-authored-by: Jorge Martín <jorgem@element.io> Co-authored-by: Benoit Marty <benoit@matrix.org> Co-authored-by: David Langley <langley.dave@gmail.com>
This commit is contained in:
parent
a40c9ef002
commit
4a5a01d710
68 changed files with 1381 additions and 70 deletions
|
|
@ -59,7 +59,6 @@ import io.element.android.features.networkmonitor.api.NetworkStatus
|
|||
import io.element.android.libraries.androidutils.clipboard.ClipboardHelper
|
||||
import io.element.android.libraries.architecture.Async
|
||||
import io.element.android.libraries.architecture.Presenter
|
||||
import io.element.android.libraries.architecture.runCatchingUpdatingState
|
||||
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||
|
|
@ -215,7 +214,8 @@ class MessagesPresenter @AssistedInject constructor(
|
|||
}
|
||||
|
||||
private fun CoroutineScope.reinviteOtherUser(inviteProgress: MutableState<Async<Unit>>) = launch(dispatchers.io) {
|
||||
suspend {
|
||||
inviteProgress.value = Async.Loading()
|
||||
runCatching {
|
||||
room.updateMembers()
|
||||
|
||||
val memberList = when (val memberState = room.membersStateFlow.value) {
|
||||
|
|
@ -228,7 +228,14 @@ class MessagesPresenter @AssistedInject constructor(
|
|||
room.inviteUserById(member.userId).onFailure { t ->
|
||||
Timber.e(t, "Failed to reinvite DM partner")
|
||||
}.getOrThrow()
|
||||
}.runCatchingUpdatingState(inviteProgress)
|
||||
}.fold(
|
||||
onSuccess = {
|
||||
inviteProgress.value = Async.Success(Unit)
|
||||
},
|
||||
onFailure = {
|
||||
inviteProgress.value = Async.Failure(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private suspend fun handleActionRedact(event: TimelineItem.Event) {
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ import io.element.android.libraries.core.mimetype.MimeTypes
|
|||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||
import io.element.android.libraries.designsystem.utils.SnackbarDispatcher
|
||||
import io.element.android.libraries.featureflag.api.FeatureFlags
|
||||
import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
|
||||
import io.element.android.libraries.matrix.api.media.MediaSource
|
||||
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
||||
|
|
@ -80,6 +81,7 @@ import kotlinx.coroutines.test.TestScope
|
|||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import kotlin.time.Duration.Companion.milliseconds
|
||||
|
||||
class MessagesPresenterTest {
|
||||
|
||||
|
|
@ -380,13 +382,13 @@ class MessagesPresenterTest {
|
|||
assertThat(initialState.showReinvitePrompt).isFalse()
|
||||
// When the input field is focused we show the alert
|
||||
initialState.composerState.eventSink(MessageComposerEvents.FocusChanged(true))
|
||||
val focusedState = consumeItemsUntilPredicate { state ->
|
||||
val focusedState = consumeItemsUntilPredicate(timeout = 250.milliseconds) { state ->
|
||||
state.showReinvitePrompt
|
||||
}.last()
|
||||
assertThat(focusedState.showReinvitePrompt).isTrue()
|
||||
// If it's dismissed then we stop showing the alert
|
||||
initialState.eventSink(MessagesEvents.InviteDialogDismissed(InviteDialogAction.Cancel))
|
||||
val dismissedState = consumeItemsUntilPredicate { state ->
|
||||
val dismissedState = consumeItemsUntilPredicate(timeout = 250.milliseconds) { state ->
|
||||
!state.showReinvitePrompt
|
||||
}.last()
|
||||
assertThat(dismissedState.showReinvitePrompt).isFalse()
|
||||
|
|
@ -470,7 +472,9 @@ class MessagesPresenterTest {
|
|||
val initialState = consumeItemsUntilTimeout().last()
|
||||
initialState.eventSink(MessagesEvents.InviteDialogDismissed(InviteDialogAction.Invite))
|
||||
skipItems(1)
|
||||
val loadingState = awaitItem()
|
||||
val loadingState = consumeItemsUntilPredicate { state ->
|
||||
state.inviteProgress.isLoading()
|
||||
}.last()
|
||||
assertThat(loadingState.inviteProgress.isLoading()).isTrue()
|
||||
val newState = awaitItem()
|
||||
assertThat(newState.inviteProgress.isSuccess()).isTrue()
|
||||
|
|
@ -595,7 +599,7 @@ class MessagesPresenterTest {
|
|||
appCoroutineScope = this,
|
||||
room = matrixRoom,
|
||||
mediaPickerProvider = FakePickerProvider(),
|
||||
featureFlagService = FakeFeatureFlagService(),
|
||||
featureFlagService = FakeFeatureFlagService(mapOf(FeatureFlags.NotificationSettings.key to true)),
|
||||
localMediaFactory = FakeLocalMediaFactory(mockMediaUrl),
|
||||
mediaSender = MediaSender(FakeMediaPreProcessor(), matrixRoom),
|
||||
snackbarDispatcher = SnackbarDispatcher(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue