Merge pull request #3667 from element-hq/feature/bma/asyncActionConfirmingWithParam

AsyncAction confirming with param
This commit is contained in:
Benoit Marty
2024-10-15 12:28:03 +02:00
committed by GitHub
52 changed files with 128 additions and 141 deletions
@@ -51,7 +51,7 @@ class AccountDeactivationPresenter @Inject constructor(
action action
) )
} else { } else {
action.value = AsyncAction.Confirming action.value = AsyncAction.ConfirmingNoParams
} }
AccountDeactivationEvents.CloseDialogs -> { AccountDeactivationEvents.CloseDialogs -> {
action.value = AsyncAction.Uninitialized action.value = AsyncAction.Uninitialized
@@ -20,7 +20,7 @@ open class AccountDeactivationStateProvider : PreviewParameterProvider<AccountDe
), ),
anAccountDeactivationState( anAccountDeactivationState(
deactivateFormState = filledForm, deactivateFormState = filledForm,
accountDeactivationAction = AsyncAction.Confirming, accountDeactivationAction = AsyncAction.ConfirmingNoParams,
), ),
anAccountDeactivationState( anAccountDeactivationState(
deactivateFormState = filledForm, deactivateFormState = filledForm,
@@ -24,7 +24,7 @@ fun AccountDeactivationActionDialog(
when (state) { when (state) {
AsyncAction.Uninitialized -> AsyncAction.Uninitialized ->
Unit Unit
AsyncAction.Confirming -> is AsyncAction.Confirming ->
AccountDeactivationConfirmationDialog( AccountDeactivationConfirmationDialog(
onSubmitClick = onConfirmClick, onSubmitClick = onConfirmClick,
onDismiss = onDismissDialog onDismiss = onDismissDialog
@@ -74,7 +74,7 @@ class AccountDeactivationPresenterTest {
skipItems(1) skipItems(1)
initialState.eventSink(AccountDeactivationEvents.DeactivateAccount(isRetry = false)) initialState.eventSink(AccountDeactivationEvents.DeactivateAccount(isRetry = false))
val updatedState = awaitItem() val updatedState = awaitItem()
assertThat(updatedState.accountDeactivationAction).isEqualTo(AsyncAction.Confirming) assertThat(updatedState.accountDeactivationAction).isEqualTo(AsyncAction.ConfirmingNoParams)
updatedState.eventSink(AccountDeactivationEvents.DeactivateAccount(isRetry = false)) updatedState.eventSink(AccountDeactivationEvents.DeactivateAccount(isRetry = false))
val updatedState2 = awaitItem() val updatedState2 = awaitItem()
assertThat(updatedState2.accountDeactivationAction).isEqualTo(AsyncAction.Loading) assertThat(updatedState2.accountDeactivationAction).isEqualTo(AsyncAction.Loading)
@@ -102,7 +102,7 @@ class AccountDeactivationPresenterTest {
skipItems(2) skipItems(2)
initialState.eventSink(AccountDeactivationEvents.DeactivateAccount(isRetry = false)) initialState.eventSink(AccountDeactivationEvents.DeactivateAccount(isRetry = false))
val updatedState = awaitItem() val updatedState = awaitItem()
assertThat(updatedState.accountDeactivationAction).isEqualTo(AsyncAction.Confirming) assertThat(updatedState.accountDeactivationAction).isEqualTo(AsyncAction.ConfirmingNoParams)
updatedState.eventSink(AccountDeactivationEvents.DeactivateAccount(isRetry = false)) updatedState.eventSink(AccountDeactivationEvents.DeactivateAccount(isRetry = false))
val updatedState2 = awaitItem() val updatedState2 = awaitItem()
assertThat(updatedState2.accountDeactivationAction).isEqualTo(AsyncAction.Loading) assertThat(updatedState2.accountDeactivationAction).isEqualTo(AsyncAction.Loading)
@@ -135,7 +135,7 @@ class AccountDeactivationPresenterTest {
skipItems(2) skipItems(2)
initialState.eventSink(AccountDeactivationEvents.DeactivateAccount(isRetry = false)) initialState.eventSink(AccountDeactivationEvents.DeactivateAccount(isRetry = false))
val updatedState = awaitItem() val updatedState = awaitItem()
assertThat(updatedState.accountDeactivationAction).isEqualTo(AsyncAction.Confirming) assertThat(updatedState.accountDeactivationAction).isEqualTo(AsyncAction.ConfirmingNoParams)
updatedState.eventSink(AccountDeactivationEvents.DeactivateAccount(isRetry = false)) updatedState.eventSink(AccountDeactivationEvents.DeactivateAccount(isRetry = false))
val updatedState2 = awaitItem() val updatedState2 = awaitItem()
assertThat(updatedState2.accountDeactivationAction).isEqualTo(AsyncAction.Loading) assertThat(updatedState2.accountDeactivationAction).isEqualTo(AsyncAction.Loading)
@@ -71,7 +71,7 @@ class AccountDeactivationViewTest {
deactivateFormState = aDeactivateFormState( deactivateFormState = aDeactivateFormState(
password = A_PASSWORD, password = A_PASSWORD,
), ),
accountDeactivationAction = AsyncAction.Confirming, accountDeactivationAction = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder, eventSink = eventsRecorder,
), ),
) )
@@ -9,10 +9,8 @@ package io.element.android.features.invite.api.response
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import java.util.Optional
data class AcceptDeclineInviteState( data class AcceptDeclineInviteState(
val invite: Optional<InviteData>,
val acceptAction: AsyncAction<RoomId>, val acceptAction: AsyncAction<RoomId>,
val declineAction: AsyncAction<RoomId>, val declineAction: AsyncAction<RoomId>,
val eventSink: (AcceptDeclineInviteEvents) -> Unit, val eventSink: (AcceptDeclineInviteEvents) -> Unit,
@@ -10,23 +10,20 @@ package io.element.android.features.invite.api.response
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import java.util.Optional
open class AcceptDeclineInviteStateProvider : PreviewParameterProvider<AcceptDeclineInviteState> { open class AcceptDeclineInviteStateProvider : PreviewParameterProvider<AcceptDeclineInviteState> {
override val values: Sequence<AcceptDeclineInviteState> override val values: Sequence<AcceptDeclineInviteState>
get() = sequenceOf( get() = sequenceOf(
anAcceptDeclineInviteState(), anAcceptDeclineInviteState(),
anAcceptDeclineInviteState( anAcceptDeclineInviteState(
invite = Optional.of( declineAction = ConfirmingDeclineInvite(
InviteData(RoomId("!room:matrix.org"), isDm = true, roomName = "Alice"), InviteData(RoomId("!room:matrix.org"), isDm = true, roomName = "Alice")
), ),
declineAction = AsyncAction.Confirming,
), ),
anAcceptDeclineInviteState( anAcceptDeclineInviteState(
invite = Optional.of( declineAction = ConfirmingDeclineInvite(
InviteData(RoomId("!room:matrix.org"), isDm = false, roomName = "Some room"), InviteData(RoomId("!room:matrix.org"), isDm = false, roomName = "Some room")
), ),
declineAction = AsyncAction.Confirming,
), ),
anAcceptDeclineInviteState( anAcceptDeclineInviteState(
acceptAction = AsyncAction.Failure(Throwable("Whoops")), acceptAction = AsyncAction.Failure(Throwable("Whoops")),
@@ -38,12 +35,10 @@ open class AcceptDeclineInviteStateProvider : PreviewParameterProvider<AcceptDec
} }
fun anAcceptDeclineInviteState( fun anAcceptDeclineInviteState(
invite: Optional<InviteData> = Optional.empty(),
acceptAction: AsyncAction<RoomId> = AsyncAction.Uninitialized, acceptAction: AsyncAction<RoomId> = AsyncAction.Uninitialized,
declineAction: AsyncAction<RoomId> = AsyncAction.Uninitialized, declineAction: AsyncAction<RoomId> = AsyncAction.Uninitialized,
eventSink: (AcceptDeclineInviteEvents) -> Unit = {} eventSink: (AcceptDeclineInviteEvents) -> Unit = {}
) = AcceptDeclineInviteState( ) = AcceptDeclineInviteState(
invite = invite,
acceptAction = acceptAction, acceptAction = acceptAction,
declineAction = declineAction, declineAction = declineAction,
eventSink = eventSink, eventSink = eventSink,
@@ -0,0 +1,14 @@
/*
* Copyright 2024 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only
* Please see LICENSE in the repository root for full details.
*/
package io.element.android.features.invite.api.response
import io.element.android.libraries.architecture.AsyncAction
data class ConfirmingDeclineInvite(
val inviteData: InviteData,
) : AsyncAction.Confirming
@@ -9,15 +9,13 @@ package io.element.android.features.invite.impl.response
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import im.vector.app.features.analytics.plan.JoinedRoom import im.vector.app.features.analytics.plan.JoinedRoom
import io.element.android.features.invite.api.response.AcceptDeclineInviteEvents import io.element.android.features.invite.api.response.AcceptDeclineInviteEvents
import io.element.android.features.invite.api.response.AcceptDeclineInviteState import io.element.android.features.invite.api.response.AcceptDeclineInviteState
import io.element.android.features.invite.api.response.InviteData import io.element.android.features.invite.api.response.ConfirmingDeclineInvite
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.architecture.runCatchingUpdatingState
@@ -29,9 +27,7 @@ import io.element.android.libraries.matrix.api.room.join.JoinRoom
import io.element.android.libraries.push.api.notifications.NotificationCleaner import io.element.android.libraries.push.api.notifications.NotificationCleaner
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.Optional
import javax.inject.Inject import javax.inject.Inject
import kotlin.jvm.optionals.getOrNull
class AcceptDeclineInvitePresenter @Inject constructor( class AcceptDeclineInvitePresenter @Inject constructor(
private val client: MatrixClient, private val client: MatrixClient,
@@ -43,35 +39,22 @@ class AcceptDeclineInvitePresenter @Inject constructor(
val localCoroutineScope = rememberCoroutineScope() val localCoroutineScope = rememberCoroutineScope()
val acceptedAction: MutableState<AsyncAction<RoomId>> = remember { mutableStateOf(AsyncAction.Uninitialized) } val acceptedAction: MutableState<AsyncAction<RoomId>> = remember { mutableStateOf(AsyncAction.Uninitialized) }
val declinedAction: MutableState<AsyncAction<RoomId>> = remember { mutableStateOf(AsyncAction.Uninitialized) } val declinedAction: MutableState<AsyncAction<RoomId>> = remember { mutableStateOf(AsyncAction.Uninitialized) }
var currentInvite by remember {
mutableStateOf<Optional<InviteData>>(Optional.empty())
}
fun handleEvents(event: AcceptDeclineInviteEvents) { fun handleEvents(event: AcceptDeclineInviteEvents) {
when (event) { when (event) {
is AcceptDeclineInviteEvents.AcceptInvite -> { is AcceptDeclineInviteEvents.AcceptInvite -> {
// currentInvite is used to render the decline confirmation dialog
// and to reuse the roomId when the user confirm the rejection of the invitation.
// Just set it to empty here.
currentInvite = Optional.empty()
localCoroutineScope.acceptInvite(event.invite.roomId, acceptedAction) localCoroutineScope.acceptInvite(event.invite.roomId, acceptedAction)
} }
is AcceptDeclineInviteEvents.DeclineInvite -> { is AcceptDeclineInviteEvents.DeclineInvite -> {
currentInvite = Optional.of(event.invite) declinedAction.value = ConfirmingDeclineInvite(event.invite)
declinedAction.value = AsyncAction.Confirming
} }
is InternalAcceptDeclineInviteEvents.ConfirmDeclineInvite -> { is InternalAcceptDeclineInviteEvents.ConfirmDeclineInvite -> {
declinedAction.value = AsyncAction.Uninitialized localCoroutineScope.declineInvite(event.roomId, declinedAction)
currentInvite.getOrNull()?.let {
localCoroutineScope.declineInvite(it.roomId, declinedAction)
}
currentInvite = Optional.empty()
} }
is InternalAcceptDeclineInviteEvents.CancelDeclineInvite -> { is InternalAcceptDeclineInviteEvents.CancelDeclineInvite -> {
currentInvite = Optional.empty()
declinedAction.value = AsyncAction.Uninitialized declinedAction.value = AsyncAction.Uninitialized
} }
@@ -86,7 +69,6 @@ class AcceptDeclineInvitePresenter @Inject constructor(
} }
return AcceptDeclineInviteState( return AcceptDeclineInviteState(
invite = currentInvite,
acceptAction = acceptedAction.value, acceptAction = acceptedAction.value,
declineAction = declinedAction.value, declineAction = declinedAction.value,
eventSink = ::handleEvents eventSink = ::handleEvents
@@ -14,6 +14,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.features.invite.api.response.AcceptDeclineInviteState import io.element.android.features.invite.api.response.AcceptDeclineInviteState
import io.element.android.features.invite.api.response.AcceptDeclineInviteStateProvider import io.element.android.features.invite.api.response.AcceptDeclineInviteStateProvider
import io.element.android.features.invite.api.response.ConfirmingDeclineInvite
import io.element.android.features.invite.api.response.InviteData import io.element.android.features.invite.api.response.InviteData
import io.element.android.features.invite.impl.R import io.element.android.features.invite.impl.R
import io.element.android.libraries.designsystem.components.async.AsyncActionView import io.element.android.libraries.designsystem.components.async.AsyncActionView
@@ -22,7 +23,6 @@ import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
import kotlin.jvm.optionals.getOrNull
@Composable @Composable
fun AcceptDeclineInviteView( fun AcceptDeclineInviteView(
@@ -45,13 +45,13 @@ fun AcceptDeclineInviteView(
onErrorDismiss = { onErrorDismiss = {
state.eventSink(InternalAcceptDeclineInviteEvents.DismissDeclineError) state.eventSink(InternalAcceptDeclineInviteEvents.DismissDeclineError)
}, },
confirmationDialog = { confirmationDialog = { confirming ->
val invite = state.invite.getOrNull() // Note: confirming will always be of type ConfirmingDeclineInvite.
if (invite != null) { if (confirming is ConfirmingDeclineInvite) {
DeclineConfirmationDialog( DeclineConfirmationDialog(
invite = invite, invite = confirming.inviteData,
onConfirmClick = { onConfirmClick = {
state.eventSink(InternalAcceptDeclineInviteEvents.ConfirmDeclineInvite) state.eventSink(InternalAcceptDeclineInviteEvents.ConfirmDeclineInvite(confirming.inviteData.roomId))
}, },
onDismissClick = { onDismissClick = {
state.eventSink(InternalAcceptDeclineInviteEvents.CancelDeclineInvite) state.eventSink(InternalAcceptDeclineInviteEvents.CancelDeclineInvite)
@@ -8,9 +8,10 @@
package io.element.android.features.invite.impl.response package io.element.android.features.invite.impl.response
import io.element.android.features.invite.api.response.AcceptDeclineInviteEvents import io.element.android.features.invite.api.response.AcceptDeclineInviteEvents
import io.element.android.libraries.matrix.api.core.RoomId
sealed interface InternalAcceptDeclineInviteEvents : AcceptDeclineInviteEvents { sealed interface InternalAcceptDeclineInviteEvents : AcceptDeclineInviteEvents {
data object ConfirmDeclineInvite : InternalAcceptDeclineInviteEvents data class ConfirmDeclineInvite(val roomId: RoomId) : InternalAcceptDeclineInviteEvents
data object CancelDeclineInvite : InternalAcceptDeclineInviteEvents data object CancelDeclineInvite : InternalAcceptDeclineInviteEvents
data object DismissAcceptError : InternalAcceptDeclineInviteEvents data object DismissAcceptError : InternalAcceptDeclineInviteEvents
data object DismissDeclineError : InternalAcceptDeclineInviteEvents data object DismissDeclineError : InternalAcceptDeclineInviteEvents
@@ -10,6 +10,7 @@ package io.element.android.features.invite.impl.response
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import im.vector.app.features.analytics.plan.JoinedRoom import im.vector.app.features.analytics.plan.JoinedRoom
import io.element.android.features.invite.api.response.AcceptDeclineInviteEvents import io.element.android.features.invite.api.response.AcceptDeclineInviteEvents
import io.element.android.features.invite.api.response.ConfirmingDeclineInvite
import io.element.android.features.invite.api.response.InviteData import io.element.android.features.invite.api.response.InviteData
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
@@ -33,7 +34,6 @@ import io.element.android.tests.testutils.test
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
import java.util.Optional
class AcceptDeclineInvitePresenterTest { class AcceptDeclineInvitePresenterTest {
@get:Rule @get:Rule
@@ -46,7 +46,6 @@ class AcceptDeclineInvitePresenterTest {
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.acceptAction).isInstanceOf(AsyncAction.Uninitialized::class.java) assertThat(state.acceptAction).isInstanceOf(AsyncAction.Uninitialized::class.java)
assertThat(state.declineAction).isInstanceOf(AsyncAction.Uninitialized::class.java) assertThat(state.declineAction).isInstanceOf(AsyncAction.Uninitialized::class.java)
assertThat(state.invite).isEqualTo(Optional.empty<InviteData>())
} }
} }
} }
@@ -61,17 +60,13 @@ class AcceptDeclineInvitePresenterTest {
AcceptDeclineInviteEvents.DeclineInvite(inviteData) AcceptDeclineInviteEvents.DeclineInvite(inviteData)
) )
} }
skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.invite).isEqualTo(Optional.of(inviteData)) assertThat(state.declineAction).isEqualTo(ConfirmingDeclineInvite(inviteData))
assertThat(state.declineAction).isInstanceOf(AsyncAction.Confirming::class.java)
state.eventSink( state.eventSink(
InternalAcceptDeclineInviteEvents.CancelDeclineInvite InternalAcceptDeclineInviteEvents.CancelDeclineInvite
) )
} }
skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.invite).isEqualTo(Optional.empty<InviteData>())
assertThat(state.declineAction).isInstanceOf(AsyncAction.Uninitialized::class.java) assertThat(state.declineAction).isInstanceOf(AsyncAction.Uninitialized::class.java)
} }
} }
@@ -93,22 +88,20 @@ class AcceptDeclineInvitePresenterTest {
AcceptDeclineInviteEvents.DeclineInvite(inviteData) AcceptDeclineInviteEvents.DeclineInvite(inviteData)
) )
} }
skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.declineAction).isEqualTo(ConfirmingDeclineInvite(inviteData))
state.eventSink( state.eventSink(
InternalAcceptDeclineInviteEvents.ConfirmDeclineInvite InternalAcceptDeclineInviteEvents.ConfirmDeclineInvite(inviteData.roomId)
) )
} }
skipItems(2) assertThat(awaitItem().declineAction.isLoading()).isTrue()
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.declineAction).isInstanceOf(AsyncAction.Failure::class.java) assertThat(state.declineAction).isInstanceOf(AsyncAction.Failure::class.java)
state.eventSink( state.eventSink(
InternalAcceptDeclineInviteEvents.DismissDeclineError InternalAcceptDeclineInviteEvents.DismissDeclineError
) )
} }
skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.invite).isEqualTo(Optional.empty<InviteData>())
assertThat(state.declineAction).isInstanceOf(AsyncAction.Uninitialized::class.java) assertThat(state.declineAction).isInstanceOf(AsyncAction.Uninitialized::class.java)
} }
cancelAndConsumeRemainingEvents() cancelAndConsumeRemainingEvents()
@@ -141,13 +134,13 @@ class AcceptDeclineInvitePresenterTest {
AcceptDeclineInviteEvents.DeclineInvite(inviteData) AcceptDeclineInviteEvents.DeclineInvite(inviteData)
) )
} }
skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.declineAction).isEqualTo(ConfirmingDeclineInvite(inviteData))
state.eventSink( state.eventSink(
InternalAcceptDeclineInviteEvents.ConfirmDeclineInvite InternalAcceptDeclineInviteEvents.ConfirmDeclineInvite(inviteData.roomId)
) )
} }
skipItems(2) assertThat(awaitItem().declineAction.isLoading()).isTrue()
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.declineAction).isInstanceOf(AsyncAction.Success::class.java) assertThat(state.declineAction).isInstanceOf(AsyncAction.Success::class.java)
} }
@@ -173,7 +166,6 @@ class AcceptDeclineInvitePresenterTest {
) )
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.invite).isEqualTo(Optional.empty<InviteData>())
assertThat(state.acceptAction).isEqualTo(AsyncAction.Loading) assertThat(state.acceptAction).isEqualTo(AsyncAction.Loading)
} }
awaitItem().also { state -> awaitItem().also { state ->
@@ -183,7 +175,6 @@ class AcceptDeclineInvitePresenterTest {
) )
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.invite).isEqualTo(Optional.empty<InviteData>())
assertThat(state.acceptAction).isInstanceOf(AsyncAction.Uninitialized::class.java) assertThat(state.acceptAction).isInstanceOf(AsyncAction.Uninitialized::class.java)
} }
cancelAndConsumeRemainingEvents() cancelAndConsumeRemainingEvents()
@@ -220,7 +211,6 @@ class AcceptDeclineInvitePresenterTest {
) )
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.invite).isEqualTo(Optional.empty<InviteData>())
assertThat(state.acceptAction).isEqualTo(AsyncAction.Loading) assertThat(state.acceptAction).isEqualTo(AsyncAction.Loading)
} }
awaitItem().also { state -> awaitItem().also { state ->
@@ -96,7 +96,7 @@ fun PinUnlockView(
latestOnSuccessLogout(state.signOutAction.data) latestOnSuccessLogout(state.signOutAction.data)
} }
} }
AsyncAction.Confirming, is AsyncAction.Confirming,
is AsyncAction.Failure, is AsyncAction.Failure,
AsyncAction.Uninitialized -> Unit AsyncAction.Uninitialized -> Unit
} }
@@ -189,7 +189,7 @@ private fun ColumnScope.Buttons(
} }
} }
AsyncAction.Uninitialized, AsyncAction.Uninitialized,
AsyncAction.Confirming -> Unit is AsyncAction.Confirming -> Unit
} }
} }
} }
@@ -14,7 +14,7 @@ open class DirectLogoutStateProvider : PreviewParameterProvider<DirectLogoutStat
override val values: Sequence<DirectLogoutState> override val values: Sequence<DirectLogoutState>
get() = sequenceOf( get() = sequenceOf(
aDirectLogoutState(), aDirectLogoutState(),
aDirectLogoutState(logoutAction = AsyncAction.Confirming), aDirectLogoutState(logoutAction = AsyncAction.ConfirmingNoParams),
aDirectLogoutState(logoutAction = AsyncAction.Loading), aDirectLogoutState(logoutAction = AsyncAction.Loading),
aDirectLogoutState(logoutAction = AsyncAction.Failure(Exception("Error"))), aDirectLogoutState(logoutAction = AsyncAction.Failure(Exception("Error"))),
aDirectLogoutState(logoutAction = AsyncAction.Success("success")), aDirectLogoutState(logoutAction = AsyncAction.Success("success")),
@@ -64,7 +64,7 @@ class LogoutPresenter @Inject constructor(
if (logoutAction.value.isConfirming() || event.ignoreSdkError) { if (logoutAction.value.isConfirming() || event.ignoreSdkError) {
localCoroutineScope.logout(logoutAction, event.ignoreSdkError) localCoroutineScope.logout(logoutAction, event.ignoreSdkError)
} else { } else {
logoutAction.value = AsyncAction.Confirming logoutAction.value = AsyncAction.ConfirmingNoParams
} }
} }
LogoutEvents.CloseDialogs -> { LogoutEvents.CloseDialogs -> {
@@ -21,7 +21,7 @@ open class LogoutStateProvider : PreviewParameterProvider<LogoutState> {
aLogoutState(isLastDevice = true), aLogoutState(isLastDevice = true),
aLogoutState(isLastDevice = false, backupUploadState = BackupUploadState.Uploading(66, 200)), aLogoutState(isLastDevice = false, backupUploadState = BackupUploadState.Uploading(66, 200)),
aLogoutState(isLastDevice = true, backupUploadState = BackupUploadState.Done), aLogoutState(isLastDevice = true, backupUploadState = BackupUploadState.Done),
aLogoutState(logoutAction = AsyncAction.Confirming), aLogoutState(logoutAction = AsyncAction.ConfirmingNoParams),
aLogoutState(logoutAction = AsyncAction.Loading), aLogoutState(logoutAction = AsyncAction.Loading),
aLogoutState(logoutAction = AsyncAction.Failure(Exception("Failed to logout"))), aLogoutState(logoutAction = AsyncAction.Failure(Exception("Failed to logout"))),
aLogoutState(backupUploadState = BackupUploadState.SteadyException(SteadyStateException.Connection("No network"))), aLogoutState(backupUploadState = BackupUploadState.SteadyException(SteadyStateException.Connection("No network"))),
@@ -52,7 +52,7 @@ class DirectLogoutPresenter @Inject constructor(
if (logoutAction.value.isConfirming() || event.ignoreSdkError) { if (logoutAction.value.isConfirming() || event.ignoreSdkError) {
localCoroutineScope.logout(logoutAction, event.ignoreSdkError) localCoroutineScope.logout(logoutAction, event.ignoreSdkError)
} else { } else {
logoutAction.value = AsyncAction.Confirming logoutAction.value = AsyncAction.ConfirmingNoParams
} }
} }
DirectLogoutEvents.CloseDialogs -> { DirectLogoutEvents.CloseDialogs -> {
@@ -29,7 +29,7 @@ fun LogoutActionDialog(
when (state) { when (state) {
AsyncAction.Uninitialized -> AsyncAction.Uninitialized ->
Unit Unit
AsyncAction.Confirming -> is AsyncAction.Confirming ->
LogoutConfirmationDialog( LogoutConfirmationDialog(
onSubmitClick = onConfirmClick, onSubmitClick = onConfirmClick,
onDismiss = onDismissDialog onDismiss = onDismissDialog
@@ -107,7 +107,7 @@ class LogoutPresenterTest {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false))
val confirmationState = awaitItem() val confirmationState = awaitItem()
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.ConfirmingNoParams)
initialState.eventSink.invoke(LogoutEvents.CloseDialogs) initialState.eventSink.invoke(LogoutEvents.CloseDialogs)
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.logoutAction).isEqualTo(AsyncAction.Uninitialized) assertThat(finalState.logoutAction).isEqualTo(AsyncAction.Uninitialized)
@@ -123,7 +123,7 @@ class LogoutPresenterTest {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false))
val confirmationState = awaitItem() val confirmationState = awaitItem()
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.ConfirmingNoParams)
confirmationState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) confirmationState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false))
val loadingState = awaitItem() val loadingState = awaitItem()
assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java)
@@ -148,7 +148,7 @@ class LogoutPresenterTest {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false))
val confirmationState = awaitItem() val confirmationState = awaitItem()
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.ConfirmingNoParams)
confirmationState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) confirmationState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false))
val loadingState = awaitItem() val loadingState = awaitItem()
assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java)
@@ -180,7 +180,7 @@ class LogoutPresenterTest {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false))
val confirmationState = awaitItem() val confirmationState = awaitItem()
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.ConfirmingNoParams)
confirmationState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) confirmationState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false))
val loadingState = awaitItem() val loadingState = awaitItem()
assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java)
@@ -48,7 +48,7 @@ class LogoutViewTest {
val eventsRecorder = EventsRecorder<LogoutEvents>() val eventsRecorder = EventsRecorder<LogoutEvents>()
rule.setLogoutView( rule.setLogoutView(
aLogoutState( aLogoutState(
logoutAction = AsyncAction.Confirming, logoutAction = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder eventSink = eventsRecorder
), ),
) )
@@ -36,7 +36,7 @@ class DefaultDirectLogoutViewTest {
val eventsRecorder = EventsRecorder<DirectLogoutEvents>() val eventsRecorder = EventsRecorder<DirectLogoutEvents>()
rule.setDefaultDirectLogoutView( rule.setDefaultDirectLogoutView(
state = aDirectLogoutState( state = aDirectLogoutState(
logoutAction = AsyncAction.Confirming, logoutAction = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder, eventSink = eventsRecorder,
) )
) )
@@ -49,7 +49,7 @@ class DefaultDirectLogoutViewTest {
val eventsRecorder = EventsRecorder<DirectLogoutEvents>() val eventsRecorder = EventsRecorder<DirectLogoutEvents>()
rule.setDefaultDirectLogoutView( rule.setDefaultDirectLogoutView(
state = aDirectLogoutState( state = aDirectLogoutState(
logoutAction = AsyncAction.Confirming, logoutAction = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder, eventSink = eventsRecorder,
) )
) )
@@ -63,7 +63,7 @@ class DefaultDirectLogoutViewTest {
val eventsRecorder = EventsRecorder<DirectLogoutEvents>() val eventsRecorder = EventsRecorder<DirectLogoutEvents>()
rule.setDefaultDirectLogoutView( rule.setDefaultDirectLogoutView(
state = aDirectLogoutState( state = aDirectLogoutState(
logoutAction = AsyncAction.Confirming, logoutAction = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder, eventSink = eventsRecorder,
) )
) )
@@ -88,7 +88,7 @@ class DirectLogoutPresenterTest {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
initialState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false)) initialState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false))
val confirmationState = awaitItem() val confirmationState = awaitItem()
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.ConfirmingNoParams)
initialState.eventSink.invoke(DirectLogoutEvents.CloseDialogs) initialState.eventSink.invoke(DirectLogoutEvents.CloseDialogs)
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.logoutAction).isEqualTo(AsyncAction.Uninitialized) assertThat(finalState.logoutAction).isEqualTo(AsyncAction.Uninitialized)
@@ -104,7 +104,7 @@ class DirectLogoutPresenterTest {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
initialState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false)) initialState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false))
val confirmationState = awaitItem() val confirmationState = awaitItem()
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.ConfirmingNoParams)
confirmationState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false)) confirmationState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false))
val loadingState = awaitItem() val loadingState = awaitItem()
assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java)
@@ -129,7 +129,7 @@ class DirectLogoutPresenterTest {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
initialState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false)) initialState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false))
val confirmationState = awaitItem() val confirmationState = awaitItem()
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.ConfirmingNoParams)
confirmationState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false)) confirmationState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false))
val loadingState = awaitItem() val loadingState = awaitItem()
assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java)
@@ -161,7 +161,7 @@ class DirectLogoutPresenterTest {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
initialState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false)) initialState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false))
val confirmationState = awaitItem() val confirmationState = awaitItem()
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.ConfirmingNoParams)
confirmationState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false)) confirmationState.eventSink.invoke(DirectLogoutEvents.Logout(ignoreSdkError = false))
val loadingState = awaitItem() val loadingState = awaitItem()
assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java)
@@ -67,7 +67,7 @@ class BlockedUsersPresenter @Inject constructor(
when (event) { when (event) {
is BlockedUsersEvents.Unblock -> { is BlockedUsersEvents.Unblock -> {
pendingUserToUnblock = event.userId pendingUserToUnblock = event.userId
unblockUserAction.value = AsyncAction.Confirming unblockUserAction.value = AsyncAction.ConfirmingNoParams
} }
BlockedUsersEvents.ConfirmUnblock -> { BlockedUsersEvents.ConfirmUnblock -> {
pendingUserToUnblock?.let { pendingUserToUnblock?.let {
@@ -19,7 +19,7 @@ class BlockedUsersStatePreviewProvider : PreviewParameterProvider<BlockedUsersSt
aBlockedUsersState(), aBlockedUsersState(),
aBlockedUsersState(blockedUsers = aMatrixUserList().map { it.copy(displayName = null, avatarUrl = null) }), aBlockedUsersState(blockedUsers = aMatrixUserList().map { it.copy(displayName = null, avatarUrl = null) }),
aBlockedUsersState(blockedUsers = emptyList()), aBlockedUsersState(blockedUsers = emptyList()),
aBlockedUsersState(unblockUserAction = AsyncAction.Confirming), aBlockedUsersState(unblockUserAction = AsyncAction.ConfirmingNoParams),
aBlockedUsersState(unblockUserAction = AsyncAction.Loading), aBlockedUsersState(unblockUserAction = AsyncAction.Loading),
aBlockedUsersState(unblockUserAction = AsyncAction.Failure(Throwable("Failed to unblock user"))), aBlockedUsersState(unblockUserAction = AsyncAction.Failure(Throwable("Failed to unblock user"))),
aBlockedUsersState(unblockUserAction = AsyncAction.Success(Unit)), aBlockedUsersState(unblockUserAction = AsyncAction.Success(Unit)),
@@ -65,7 +65,7 @@ class BlockedUserViewTest {
val eventsRecorder = EventsRecorder<BlockedUsersEvents>() val eventsRecorder = EventsRecorder<BlockedUsersEvents>()
rule.setBlockedUsersView( rule.setBlockedUsersView(
aBlockedUsersState( aBlockedUsersState(
unblockUserAction = AsyncAction.Confirming, unblockUserAction = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder eventSink = eventsRecorder
), ),
) )
@@ -78,7 +78,7 @@ class BlockedUserViewTest {
val eventsRecorder = EventsRecorder<BlockedUsersEvents>() val eventsRecorder = EventsRecorder<BlockedUsersEvents>()
rule.setBlockedUsersView( rule.setBlockedUsersView(
aBlockedUsersState( aBlockedUsersState(
unblockUserAction = AsyncAction.Confirming, unblockUserAction = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder eventSink = eventsRecorder
), ),
) )
@@ -77,7 +77,7 @@ class RoomMembersModerationPresenter @Inject constructor(
coroutineScope.launch { coroutineScope.launch {
selectedMember = event.roomMember selectedMember = event.roomMember
if (event.roomMember.membership == RoomMembershipState.BAN && canBan()) { if (event.roomMember.membership == RoomMembershipState.BAN && canBan()) {
unbanUserAsyncAction.value = AsyncAction.Confirming unbanUserAsyncAction.value = AsyncAction.ConfirmingNoParams
} else { } else {
moderationActions = buildList { moderationActions = buildList {
add(ModerationAction.DisplayProfile(event.roomMember.userId)) add(ModerationAction.DisplayProfile(event.roomMember.userId))
@@ -109,7 +109,7 @@ class RoomMembersModerationPresenter @Inject constructor(
coroutineScope.banUser(it.userId, banUserAsyncAction) coroutineScope.banUser(it.userId, banUserAsyncAction)
} }
} else { } else {
banUserAsyncAction.value = AsyncAction.Confirming banUserAsyncAction.value = AsyncAction.ConfirmingNoParams
} }
} }
is RoomMembersModerationEvents.UnbanUser -> { is RoomMembersModerationEvents.UnbanUser -> {
@@ -119,7 +119,7 @@ class RoomMembersModerationPresenter @Inject constructor(
coroutineScope.unbanUser(it.userId, unbanUserAsyncAction) coroutineScope.unbanUser(it.userId, unbanUserAsyncAction)
} }
} else { } else {
unbanUserAsyncAction.value = AsyncAction.Confirming unbanUserAsyncAction.value = AsyncAction.ConfirmingNoParams
} }
} }
is RoomMembersModerationEvents.Reset -> { is RoomMembersModerationEvents.Reset -> {
@@ -56,11 +56,11 @@ class RoomMembersModerationStatePreviewProvider : PreviewParameterProvider<RoomM
), ),
aRoomMembersModerationState( aRoomMembersModerationState(
selectedRoomMember = anAlice(), selectedRoomMember = anAlice(),
banUserAsyncAction = AsyncAction.Confirming, banUserAsyncAction = AsyncAction.ConfirmingNoParams,
), ),
aRoomMembersModerationState( aRoomMembersModerationState(
selectedRoomMember = anAlice(), selectedRoomMember = anAlice(),
unbanUserAsyncAction = AsyncAction.Confirming, unbanUserAsyncAction = AsyncAction.ConfirmingNoParams,
), ),
aRoomMembersModerationState( aRoomMembersModerationState(
kickUserAsyncAction = AsyncAction.Success(Unit), kickUserAsyncAction = AsyncAction.Success(Unit),
@@ -64,7 +64,7 @@ class RolesAndPermissionsPresenter @Inject constructor(
fun handleEvent(event: RolesAndPermissionsEvents) { fun handleEvent(event: RolesAndPermissionsEvents) {
when (event) { when (event) {
is RolesAndPermissionsEvents.ChangeOwnRole -> { is RolesAndPermissionsEvents.ChangeOwnRole -> {
changeOwnRoleAction.value = AsyncAction.Confirming changeOwnRoleAction.value = AsyncAction.ConfirmingNoParams
} }
is RolesAndPermissionsEvents.CancelPendingAction -> { is RolesAndPermissionsEvents.CancelPendingAction -> {
changeOwnRoleAction.value = AsyncAction.Uninitialized changeOwnRoleAction.value = AsyncAction.Uninitialized
@@ -77,7 +77,7 @@ class RolesAndPermissionsPresenter @Inject constructor(
is RolesAndPermissionsEvents.ResetPermissions -> if (resetPermissionsAction.value.isConfirming()) { is RolesAndPermissionsEvents.ResetPermissions -> if (resetPermissionsAction.value.isConfirming()) {
coroutineScope.resetPermissions(resetPermissionsAction) coroutineScope.resetPermissions(resetPermissionsAction)
} else { } else {
resetPermissionsAction.value = AsyncAction.Confirming resetPermissionsAction.value = AsyncAction.ConfirmingNoParams
} }
} }
} }
@@ -18,7 +18,7 @@ class RolesAndPermissionsStateProvider : PreviewParameterProvider<RolesAndPermis
aRolesAndPermissionsState( aRolesAndPermissionsState(
adminCount = 1, adminCount = 1,
moderatorCount = 2, moderatorCount = 2,
changeOwnRoleAction = AsyncAction.Confirming, changeOwnRoleAction = AsyncAction.ConfirmingNoParams,
), ),
aRolesAndPermissionsState( aRolesAndPermissionsState(
adminCount = 1, adminCount = 1,
@@ -33,7 +33,7 @@ class RolesAndPermissionsStateProvider : PreviewParameterProvider<RolesAndPermis
aRolesAndPermissionsState( aRolesAndPermissionsState(
adminCount = 1, adminCount = 1,
moderatorCount = 2, moderatorCount = 2,
resetPermissionsAction = AsyncAction.Confirming, resetPermissionsAction = AsyncAction.ConfirmingNoParams,
), ),
aRolesAndPermissionsState( aRolesAndPermissionsState(
adminCount = 1, adminCount = 1,
@@ -134,7 +134,7 @@ class ChangeRolesPresenter @AssistedInject constructor(
is ChangeRolesEvent.Save -> { is ChangeRolesEvent.Save -> {
if (role == RoomMember.Role.ADMIN && selectedUsers != usersWithRole && !saveState.value.isConfirming()) { if (role == RoomMember.Role.ADMIN && selectedUsers != usersWithRole && !saveState.value.isConfirming()) {
// Confirm adding admin // Confirm adding admin
saveState.value = AsyncAction.Confirming saveState.value = AsyncAction.ConfirmingNoParams
} else if (!saveState.value.isLoading()) { } else if (!saveState.value.isLoading()) {
coroutineScope.save(usersWithRole.value, selectedUsers, saveState) coroutineScope.save(usersWithRole.value, selectedUsers, saveState)
} }
@@ -145,7 +145,7 @@ class ChangeRolesPresenter @AssistedInject constructor(
is ChangeRolesEvent.Exit -> { is ChangeRolesEvent.Exit -> {
exitState.value = if (exitState.value.isUninitialized() && hasPendingChanges) { exitState.value = if (exitState.value.isUninitialized() && hasPendingChanges) {
// Has pending changes, confirm exit // Has pending changes, confirm exit
AsyncAction.Confirming AsyncAction.ConfirmingNoParams
} else { } else {
// No pending changes, exit immediately // No pending changes, exit immediately
AsyncAction.Success(Unit) AsyncAction.Success(Unit)
@@ -36,8 +36,8 @@ class ChangeRolesStateProvider : PreviewParameterProvider<ChangeRolesState> {
searchResults = SearchBarResultState.Results(MembersByRole(aRoomMemberList().take(1).toImmutableList())), searchResults = SearchBarResultState.Results(MembersByRole(aRoomMemberList().take(1).toImmutableList())),
selectedUsers = aMatrixUserList().take(1).toImmutableList(), selectedUsers = aMatrixUserList().take(1).toImmutableList(),
), ),
aChangeRolesStateWithSelectedUsers().copy(exitState = AsyncAction.Confirming), aChangeRolesStateWithSelectedUsers().copy(exitState = AsyncAction.ConfirmingNoParams),
aChangeRolesStateWithSelectedUsers().copy(savingState = AsyncAction.Confirming), aChangeRolesStateWithSelectedUsers().copy(savingState = AsyncAction.ConfirmingNoParams),
aChangeRolesStateWithSelectedUsers().copy(savingState = AsyncAction.Loading), aChangeRolesStateWithSelectedUsers().copy(savingState = AsyncAction.Loading),
aChangeRolesStateWithSelectedUsers().copy(savingState = AsyncAction.Success(Unit)), aChangeRolesStateWithSelectedUsers().copy(savingState = AsyncAction.Success(Unit)),
aChangeRolesStateWithSelectedUsers().copy(savingState = AsyncAction.Failure(Exception("boom"))), aChangeRolesStateWithSelectedUsers().copy(savingState = AsyncAction.Failure(Exception("boom"))),
@@ -95,7 +95,7 @@ class ChangeRoomPermissionsPresenter @AssistedInject constructor(
confirmExitAction = if (!hasChanges || confirmExitAction.isConfirming()) { confirmExitAction = if (!hasChanges || confirmExitAction.isConfirming()) {
AsyncAction.Success(Unit) AsyncAction.Success(Unit)
} else { } else {
AsyncAction.Confirming AsyncAction.ConfirmingNoParams
} }
} }
is ChangeRoomPermissionsEvent.ResetPendingActions -> { is ChangeRoomPermissionsEvent.ResetPendingActions -> {
@@ -26,7 +26,11 @@ class ChangeRoomPermissionsStatePreviewProvider : PreviewParameterProvider<Chang
hasChanges = true, hasChanges = true,
saveAction = AsyncAction.Failure(IllegalStateException("Failed to save changes")) saveAction = AsyncAction.Failure(IllegalStateException("Failed to save changes"))
), ),
aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.RoomDetails, hasChanges = true, confirmExitAction = AsyncAction.Confirming), aChangeRoomPermissionsState(
section = ChangeRoomPermissionsSection.RoomDetails,
hasChanges = true,
confirmExitAction = AsyncAction.ConfirmingNoParams,
),
) )
} }
@@ -142,7 +142,7 @@ class RoomMembersModerationPresenterTest {
awaitItem().eventSink(RoomMembersModerationEvents.SelectRoomMember(selectedMember)) awaitItem().eventSink(RoomMembersModerationEvents.SelectRoomMember(selectedMember))
with(awaitItem()) { with(awaitItem()) {
assertThat(selectedRoomMember).isNotNull() assertThat(selectedRoomMember).isNotNull()
assertThat(unbanUserAsyncAction).isEqualTo(AsyncAction.Confirming) assertThat(unbanUserAsyncAction).isEqualTo(AsyncAction.ConfirmingNoParams)
} }
} }
} }
@@ -193,7 +193,7 @@ class RoomMembersModerationPresenterTest {
awaitItem().eventSink(RoomMembersModerationEvents.SelectRoomMember(selectedMember)) awaitItem().eventSink(RoomMembersModerationEvents.SelectRoomMember(selectedMember))
awaitItem().eventSink(RoomMembersModerationEvents.BanUser) awaitItem().eventSink(RoomMembersModerationEvents.BanUser)
val confirmingState = awaitItem() val confirmingState = awaitItem()
assertThat(confirmingState.banUserAsyncAction).isEqualTo(AsyncAction.Confirming) assertThat(confirmingState.banUserAsyncAction).isEqualTo(AsyncAction.ConfirmingNoParams)
// Confirm // Confirm
confirmingState.eventSink(RoomMembersModerationEvents.BanUser) confirmingState.eventSink(RoomMembersModerationEvents.BanUser)
@@ -130,7 +130,7 @@ class RoomMembersModerationViewTest {
val roomMember = anAlice() val roomMember = anAlice()
val state = aRoomMembersModerationState( val state = aRoomMembersModerationState(
selectedRoomMember = roomMember, selectedRoomMember = roomMember,
banUserAsyncAction = AsyncAction.Confirming, banUserAsyncAction = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder eventSink = eventsRecorder
) )
rule.setRoomMembersModerationView( rule.setRoomMembersModerationView(
@@ -147,7 +147,7 @@ class RoomMembersModerationViewTest {
val roomMember = anAlice() val roomMember = anAlice()
val state = aRoomMembersModerationState( val state = aRoomMembersModerationState(
selectedRoomMember = roomMember, selectedRoomMember = roomMember,
banUserAsyncAction = AsyncAction.Confirming, banUserAsyncAction = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder eventSink = eventsRecorder
) )
rule.setRoomMembersModerationView( rule.setRoomMembersModerationView(
@@ -164,7 +164,7 @@ class RoomMembersModerationViewTest {
val roomMember = anAlice() val roomMember = anAlice()
val state = aRoomMembersModerationState( val state = aRoomMembersModerationState(
selectedRoomMember = roomMember, selectedRoomMember = roomMember,
unbanUserAsyncAction = AsyncAction.Confirming, unbanUserAsyncAction = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder eventSink = eventsRecorder
) )
rule.setRoomMembersModerationView( rule.setRoomMembersModerationView(
@@ -181,7 +181,7 @@ class RoomMembersModerationViewTest {
val roomMember = anAlice() val roomMember = anAlice()
val state = aRoomMembersModerationState( val state = aRoomMembersModerationState(
selectedRoomMember = roomMember, selectedRoomMember = roomMember,
unbanUserAsyncAction = AsyncAction.Confirming, unbanUserAsyncAction = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder eventSink = eventsRecorder
) )
rule.setRoomMembersModerationView( rule.setRoomMembersModerationView(
@@ -52,7 +52,7 @@ class RolesAndPermissionPresenterTest {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(RolesAndPermissionsEvents.ChangeOwnRole) initialState.eventSink(RolesAndPermissionsEvents.ChangeOwnRole)
assertThat(awaitItem().changeOwnRoleAction).isEqualTo(AsyncAction.Confirming) assertThat(awaitItem().changeOwnRoleAction).isEqualTo(AsyncAction.ConfirmingNoParams)
} }
} }
@@ -98,7 +98,7 @@ class RolesAndPermissionsViewTest {
val recorder = EventsRecorder<RolesAndPermissionsEvents>() val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView( rule.setRolesAndPermissionsView(
state = aRolesAndPermissionsState( state = aRolesAndPermissionsState(
resetPermissionsAction = AsyncAction.Confirming, resetPermissionsAction = AsyncAction.ConfirmingNoParams,
eventSink = recorder, eventSink = recorder,
), ),
) )
@@ -111,7 +111,7 @@ class RolesAndPermissionsViewTest {
val recorder = EventsRecorder<RolesAndPermissionsEvents>() val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView( rule.setRolesAndPermissionsView(
state = aRolesAndPermissionsState( state = aRolesAndPermissionsState(
resetPermissionsAction = AsyncAction.Confirming, resetPermissionsAction = AsyncAction.ConfirmingNoParams,
eventSink = recorder, eventSink = recorder,
), ),
) )
@@ -124,7 +124,7 @@ class RolesAndPermissionsViewTest {
val recorder = EventsRecorder<RolesAndPermissionsEvents>() val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView( rule.setRolesAndPermissionsView(
state = aRolesAndPermissionsState( state = aRolesAndPermissionsState(
changeOwnRoleAction = AsyncAction.Confirming, changeOwnRoleAction = AsyncAction.ConfirmingNoParams,
eventSink = recorder, eventSink = recorder,
), ),
) )
@@ -138,7 +138,7 @@ class RolesAndPermissionsViewTest {
val recorder = EventsRecorder<RolesAndPermissionsEvents>() val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView( rule.setRolesAndPermissionsView(
state = aRolesAndPermissionsState( state = aRolesAndPermissionsState(
changeOwnRoleAction = AsyncAction.Confirming, changeOwnRoleAction = AsyncAction.ConfirmingNoParams,
eventSink = recorder, eventSink = recorder,
), ),
) )
@@ -152,7 +152,7 @@ class RolesAndPermissionsViewTest {
val recorder = EventsRecorder<RolesAndPermissionsEvents>() val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView( rule.setRolesAndPermissionsView(
state = aRolesAndPermissionsState( state = aRolesAndPermissionsState(
changeOwnRoleAction = AsyncAction.Confirming, changeOwnRoleAction = AsyncAction.ConfirmingNoParams,
eventSink = recorder, eventSink = recorder,
), ),
) )
@@ -229,7 +229,7 @@ class ChangeRolesPresenterTest {
awaitItem().eventSink(ChangeRolesEvent.Exit) awaitItem().eventSink(ChangeRolesEvent.Exit)
val confirmingState = awaitItem() val confirmingState = awaitItem()
assertThat(confirmingState.exitState).isEqualTo(AsyncAction.Confirming) assertThat(confirmingState.exitState).isEqualTo(AsyncAction.ConfirmingNoParams)
confirmingState.eventSink(ChangeRolesEvent.CancelExit) confirmingState.eventSink(ChangeRolesEvent.CancelExit)
assertThat(awaitItem().exitState).isEqualTo(AsyncAction.Uninitialized) assertThat(awaitItem().exitState).isEqualTo(AsyncAction.Uninitialized)
@@ -257,7 +257,7 @@ class ChangeRolesPresenterTest {
skipItems(1) skipItems(1)
updatedState.eventSink(ChangeRolesEvent.Exit) updatedState.eventSink(ChangeRolesEvent.Exit)
assertThat(awaitItem().exitState).isEqualTo(AsyncAction.Confirming) assertThat(awaitItem().exitState).isEqualTo(AsyncAction.ConfirmingNoParams)
updatedState.eventSink(ChangeRolesEvent.Exit) updatedState.eventSink(ChangeRolesEvent.Exit)
assertThat(awaitItem().exitState).isEqualTo(AsyncAction.Success(Unit)) assertThat(awaitItem().exitState).isEqualTo(AsyncAction.Success(Unit))
@@ -284,7 +284,7 @@ class ChangeRolesPresenterTest {
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(MatrixUser(A_USER_ID_2))) initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(MatrixUser(A_USER_ID_2)))
awaitItem().eventSink(ChangeRolesEvent.Save) awaitItem().eventSink(ChangeRolesEvent.Save)
val confirmingState = awaitItem() val confirmingState = awaitItem()
assertThat(confirmingState.savingState).isEqualTo(AsyncAction.Confirming) assertThat(confirmingState.savingState).isEqualTo(AsyncAction.ConfirmingNoParams)
confirmingState.eventSink(ChangeRolesEvent.Save) confirmingState.eventSink(ChangeRolesEvent.Save)
assertThat(awaitItem().savingState).isEqualTo(AsyncAction.Success(Unit)) assertThat(awaitItem().savingState).isEqualTo(AsyncAction.Success(Unit))
@@ -309,7 +309,7 @@ class ChangeRolesPresenterTest {
awaitItem().eventSink(ChangeRolesEvent.Save) awaitItem().eventSink(ChangeRolesEvent.Save)
val confirmingState = awaitItem() val confirmingState = awaitItem()
assertThat(confirmingState.savingState).isEqualTo(AsyncAction.Confirming) assertThat(confirmingState.savingState).isEqualTo(AsyncAction.ConfirmingNoParams)
confirmingState.eventSink(ChangeRolesEvent.CancelSave) confirmingState.eventSink(ChangeRolesEvent.CancelSave)
assertThat(awaitItem().savingState).isEqualTo(AsyncAction.Uninitialized) assertThat(awaitItem().savingState).isEqualTo(AsyncAction.Uninitialized)
@@ -140,7 +140,7 @@ class ChangeRolesViewTest {
rule.setChangeRolesContent( rule.setChangeRolesContent(
state = aChangeRolesState( state = aChangeRolesState(
isSearchActive = true, isSearchActive = true,
exitState = AsyncAction.Confirming, exitState = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder, eventSink = eventsRecorder,
), ),
) )
@@ -156,7 +156,7 @@ class ChangeRolesViewTest {
rule.setChangeRolesContent( rule.setChangeRolesContent(
state = aChangeRolesState( state = aChangeRolesState(
isSearchActive = true, isSearchActive = true,
exitState = AsyncAction.Confirming, exitState = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder, eventSink = eventsRecorder,
), ),
) )
@@ -173,7 +173,7 @@ class ChangeRolesViewTest {
state = aChangeRolesState( state = aChangeRolesState(
role = RoomMember.Role.ADMIN, role = RoomMember.Role.ADMIN,
isSearchActive = true, isSearchActive = true,
savingState = AsyncAction.Confirming, savingState = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder, eventSink = eventsRecorder,
), ),
) )
@@ -190,7 +190,7 @@ class ChangeRolesViewTest {
state = aChangeRolesState( state = aChangeRolesState(
role = RoomMember.Role.ADMIN, role = RoomMember.Role.ADMIN,
isSearchActive = true, isSearchActive = true,
savingState = AsyncAction.Confirming, savingState = AsyncAction.ConfirmingNoParams,
eventSink = eventsRecorder, eventSink = eventsRecorder,
), ),
) )
@@ -267,7 +267,7 @@ class ChangeRoomPermissionsPresenterTest {
assertThat(awaitItem().hasChanges).isTrue() assertThat(awaitItem().hasChanges).isTrue()
state.eventSink(ChangeRoomPermissionsEvent.Exit) state.eventSink(ChangeRoomPermissionsEvent.Exit)
assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.Confirming) assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.ConfirmingNoParams)
state.eventSink(ChangeRoomPermissionsEvent.Exit) state.eventSink(ChangeRoomPermissionsEvent.Exit)
assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.Success(Unit)) assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.Success(Unit))
@@ -82,7 +82,7 @@ class ChangeRoomPermissionsViewTest {
state = aChangeRoomPermissionsState( state = aChangeRoomPermissionsState(
section = ChangeRoomPermissionsSection.RoomDetails, section = ChangeRoomPermissionsSection.RoomDetails,
hasChanges = true, hasChanges = true,
confirmExitAction = AsyncAction.Confirming, confirmExitAction = AsyncAction.ConfirmingNoParams,
eventSink = recorder, eventSink = recorder,
), ),
eventsRecorder = recorder, eventsRecorder = recorder,
@@ -98,7 +98,7 @@ class ChangeRoomPermissionsViewTest {
state = aChangeRoomPermissionsState( state = aChangeRoomPermissionsState(
section = ChangeRoomPermissionsSection.RoomDetails, section = ChangeRoomPermissionsSection.RoomDetails,
hasChanges = true, hasChanges = true,
confirmExitAction = AsyncAction.Confirming, confirmExitAction = AsyncAction.ConfirmingNoParams,
eventSink = recorder, eventSink = recorder,
), ),
eventsRecorder = recorder, eventsRecorder = recorder,
@@ -40,7 +40,7 @@ class SecureBackupDisablePresenter @Inject constructor(
is SecureBackupDisableEvents.DisableBackup -> if (disableAction.value.isConfirming()) { is SecureBackupDisableEvents.DisableBackup -> if (disableAction.value.isConfirming()) {
coroutineScope.disableBackup(disableAction) coroutineScope.disableBackup(disableAction)
} else { } else {
disableAction.value = AsyncAction.Confirming disableAction.value = AsyncAction.ConfirmingNoParams
} }
SecureBackupDisableEvents.DismissDialogs -> { SecureBackupDisableEvents.DismissDialogs -> {
disableAction.value = AsyncAction.Uninitialized disableAction.value = AsyncAction.Uninitialized
@@ -15,7 +15,7 @@ open class SecureBackupDisableStateProvider : PreviewParameterProvider<SecureBac
override val values: Sequence<SecureBackupDisableState> override val values: Sequence<SecureBackupDisableState>
get() = sequenceOf( get() = sequenceOf(
aSecureBackupDisableState(), aSecureBackupDisableState(),
aSecureBackupDisableState(disableAction = AsyncAction.Confirming), aSecureBackupDisableState(disableAction = AsyncAction.ConfirmingNoParams),
aSecureBackupDisableState(disableAction = AsyncAction.Loading), aSecureBackupDisableState(disableAction = AsyncAction.Loading),
aSecureBackupDisableState(disableAction = AsyncAction.Failure(Exception("Failed to disable"))), aSecureBackupDisableState(disableAction = AsyncAction.Failure(Exception("Failed to disable"))),
// Add other states here // Add other states here
@@ -47,7 +47,7 @@ class SecureBackupDisablePresenterTest {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(SecureBackupDisableEvents.DisableBackup) initialState.eventSink(SecureBackupDisableEvents.DisableBackup)
val state = awaitItem() val state = awaitItem()
assertThat(state.disableAction).isEqualTo(AsyncAction.Confirming) assertThat(state.disableAction).isEqualTo(AsyncAction.ConfirmingNoParams)
initialState.eventSink(SecureBackupDisableEvents.DismissDialogs) initialState.eventSink(SecureBackupDisableEvents.DismissDialogs)
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.disableAction).isEqualTo(AsyncAction.Uninitialized) assertThat(finalState.disableAction).isEqualTo(AsyncAction.Uninitialized)
@@ -64,7 +64,7 @@ class SecureBackupDisablePresenterTest {
assertThat(initialState.disableAction).isEqualTo(AsyncAction.Uninitialized) assertThat(initialState.disableAction).isEqualTo(AsyncAction.Uninitialized)
initialState.eventSink(SecureBackupDisableEvents.DisableBackup) initialState.eventSink(SecureBackupDisableEvents.DisableBackup)
val state = awaitItem() val state = awaitItem()
assertThat(state.disableAction).isEqualTo(AsyncAction.Confirming) assertThat(state.disableAction).isEqualTo(AsyncAction.ConfirmingNoParams)
initialState.eventSink(SecureBackupDisableEvents.DisableBackup) initialState.eventSink(SecureBackupDisableEvents.DisableBackup)
val loadingState = awaitItem() val loadingState = awaitItem()
assertThat(loadingState.disableAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(loadingState.disableAction).isInstanceOf(AsyncAction.Loading::class.java)
@@ -88,7 +88,7 @@ class SecureBackupDisablePresenterTest {
assertThat(initialState.disableAction).isEqualTo(AsyncAction.Uninitialized) assertThat(initialState.disableAction).isEqualTo(AsyncAction.Uninitialized)
initialState.eventSink(SecureBackupDisableEvents.DisableBackup) initialState.eventSink(SecureBackupDisableEvents.DisableBackup)
val state = awaitItem() val state = awaitItem()
assertThat(state.disableAction).isEqualTo(AsyncAction.Confirming) assertThat(state.disableAction).isEqualTo(AsyncAction.ConfirmingNoParams)
initialState.eventSink(SecureBackupDisableEvents.DisableBackup) initialState.eventSink(SecureBackupDisableEvents.DisableBackup)
val loadingState = awaitItem() val loadingState = awaitItem()
assertThat(loadingState.disableAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(loadingState.disableAction).isInstanceOf(AsyncAction.Loading::class.java)
@@ -158,7 +158,7 @@ fun VerifySelfSessionView(
latestOnSuccessLogout(state.signOutAction.data) latestOnSuccessLogout(state.signOutAction.data)
} }
} }
AsyncAction.Confirming, is AsyncAction.Confirming,
is AsyncAction.Failure, is AsyncAction.Failure,
AsyncAction.Uninitialized -> Unit AsyncAction.Uninitialized -> Unit
} }
@@ -26,7 +26,9 @@ sealed interface AsyncAction<out T> {
/** /**
* Represents an operation that is currently waiting for user confirmation. * Represents an operation that is currently waiting for user confirmation.
*/ */
data object Confirming : AsyncAction<Nothing> interface Confirming : AsyncAction<Nothing>
data object ConfirmingNoParams : Confirming
/** /**
* Represents an operation that is currently ongoing. * Represents an operation that is currently ongoing.
@@ -70,7 +72,7 @@ sealed interface AsyncAction<out T> {
fun isUninitialized(): Boolean = this == Uninitialized fun isUninitialized(): Boolean = this == Uninitialized
fun isConfirming(): Boolean = this == Confirming fun isConfirming(): Boolean = this is Confirming
fun isLoading(): Boolean = this == Loading fun isLoading(): Boolean = this == Loading
@@ -14,7 +14,7 @@ open class AsyncActionProvider : PreviewParameterProvider<AsyncAction<Unit>> {
override val values: Sequence<AsyncAction<Unit>> override val values: Sequence<AsyncAction<Unit>>
get() = sequenceOf( get() = sequenceOf(
AsyncAction.Uninitialized, AsyncAction.Uninitialized,
AsyncAction.Confirming, AsyncAction.ConfirmingNoParams,
AsyncAction.Loading, AsyncAction.Loading,
AsyncAction.Failure(Exception("An error occurred")), AsyncAction.Failure(Exception("An error occurred")),
AsyncAction.Success(Unit), AsyncAction.Success(Unit),
@@ -34,7 +34,7 @@ fun <T> AsyncActionView(
async: AsyncAction<T>, async: AsyncAction<T>,
onSuccess: (T) -> Unit, onSuccess: (T) -> Unit,
onErrorDismiss: () -> Unit, onErrorDismiss: () -> Unit,
confirmationDialog: @Composable () -> Unit = { }, confirmationDialog: @Composable (AsyncAction.Confirming) -> Unit = { },
progressDialog: @Composable () -> Unit = { AsyncActionViewDefaults.ProgressDialog() }, progressDialog: @Composable () -> Unit = { AsyncActionViewDefaults.ProgressDialog() },
errorTitle: @Composable (Throwable) -> String = { ErrorDialogDefaults.title }, errorTitle: @Composable (Throwable) -> String = { ErrorDialogDefaults.title },
errorMessage: @Composable (Throwable) -> String = { it.message ?: it.toString() }, errorMessage: @Composable (Throwable) -> String = { it.message ?: it.toString() },
@@ -42,7 +42,7 @@ fun <T> AsyncActionView(
) { ) {
when (async) { when (async) {
AsyncAction.Uninitialized -> Unit AsyncAction.Uninitialized -> Unit
AsyncAction.Confirming -> confirmationDialog() is AsyncAction.Confirming -> confirmationDialog(async)
is AsyncAction.Loading -> progressDialog() is AsyncAction.Loading -> progressDialog()
is AsyncAction.Failure -> { is AsyncAction.Failure -> {
if (onRetry == null) { if (onRetry == null) {
@@ -13,14 +13,15 @@ import io.element.android.libraries.matrix.api.room.InvitedRoom
import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.A_SESSION_ID
import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.lambda.lambdaError
import io.element.android.tests.testutils.simulateLongTask
class FakeInvitedRoom( class FakeInvitedRoom(
override val sessionId: SessionId = A_SESSION_ID, override val sessionId: SessionId = A_SESSION_ID,
override val roomId: RoomId = A_ROOM_ID, override val roomId: RoomId = A_ROOM_ID,
private val declineInviteResult: () -> Result<Unit> = { lambdaError() } private val declineInviteResult: () -> Result<Unit> = { lambdaError() }
) : InvitedRoom { ) : InvitedRoom {
override suspend fun declineInvite(): Result<Unit> { override suspend fun declineInvite(): Result<Unit> = simulateLongTask {
return declineInviteResult() declineInviteResult()
} }
override fun close() = Unit override fun close() = Unit
@@ -122,7 +122,7 @@ private fun ColumnScope.TroubleshootTestView(
private fun ColumnScope.TroubleshootNotificationsContent(state: TroubleshootNotificationsState) { private fun ColumnScope.TroubleshootNotificationsContent(state: TroubleshootNotificationsState) {
when (state.testSuiteState.mainState) { when (state.testSuiteState.mainState) {
AsyncAction.Loading, AsyncAction.Loading,
AsyncAction.Confirming, is AsyncAction.Confirming,
is AsyncAction.Success, is AsyncAction.Success,
is AsyncAction.Failure -> { is AsyncAction.Failure -> {
TestSuiteView( TestSuiteView(
@@ -150,7 +150,7 @@ private fun ColumnScope.TroubleshootNotificationsContent(state: TroubleshootNoti
}) })
RunTestButton(state = state) RunTestButton(state = state)
} }
AsyncAction.Confirming -> { is AsyncAction.Confirming -> {
ListItem(headlineContent = { ListItem(headlineContent = {
Text( Text(
text = stringResource(id = R.string.troubleshoot_notifications_screen_waiting) text = stringResource(id = R.string.troubleshoot_notifications_screen_waiting)
@@ -102,7 +102,7 @@ fun List<NotificationTroubleshootTestState>.computeMainState(): AsyncAction<Unit
isRunning -> AsyncAction.Loading isRunning -> AsyncAction.Loading
else -> { else -> {
if (any { it.status is NotificationTroubleshootTestState.Status.WaitingForUser }) { if (any { it.status is NotificationTroubleshootTestState.Status.WaitingForUser }) {
AsyncAction.Confirming AsyncAction.ConfirmingNoParams
} else if (any { it.status is NotificationTroubleshootTestState.Status.Failure }) { } else if (any { it.status is NotificationTroubleshootTestState.Status.Failure }) {
AsyncAction.Failure(Exception("Some tests failed")) AsyncAction.Failure(Exception("Some tests failed"))
} else { } else {