diff --git a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenPresenter.kt b/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenPresenter.kt index 6883ebeb61..d43557c6b1 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenPresenter.kt +++ b/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenPresenter.kt @@ -34,7 +34,7 @@ import io.element.android.features.call.data.WidgetMessage import io.element.android.features.call.utils.CallWidgetProvider import io.element.android.features.call.utils.WidgetMessageInterceptor import io.element.android.features.call.utils.WidgetMessageSerializer -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.coroutine.CoroutineDispatchers @@ -75,7 +75,7 @@ class CallScreenPresenter @AssistedInject constructor( @Composable override fun present(): CallScreenState { val coroutineScope = rememberCoroutineScope() - val urlState = remember { mutableStateOf>(Async.Uninitialized) } + val urlState = remember { mutableStateOf>(AsyncData.Uninitialized) } val callWidgetDriver = remember { mutableStateOf(null) } val messageInterceptor = remember { mutableStateOf(null) } var isJoinedCall by rememberSaveable { mutableStateOf(false) } @@ -154,7 +154,7 @@ class CallScreenPresenter @AssistedInject constructor( private fun CoroutineScope.loadUrl( inputs: CallType, - urlState: MutableState>, + urlState: MutableState>, callWidgetDriver: MutableState, ) = launch { urlState.runCatchingUpdatingState { diff --git a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenState.kt b/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenState.kt index 12cd7612ae..76926bfb9f 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenState.kt +++ b/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenState.kt @@ -16,10 +16,10 @@ package io.element.android.features.call.ui -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData data class CallScreenState( - val urlState: Async, + val urlState: AsyncData, val userAgent: String, val isInWidgetMode: Boolean, val eventSink: (CallScreenEvents) -> Unit, diff --git a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenView.kt b/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenView.kt index f2c8a0cb93..c28bacf88a 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenView.kt +++ b/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenView.kt @@ -36,7 +36,7 @@ import androidx.compose.ui.viewinterop.AndroidView import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.features.call.R import io.element.android.features.call.utils.WebViewWidgetMessageInterceptor -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight @@ -96,7 +96,7 @@ internal fun CallScreenView( @Composable private fun CallWebView( - url: Async, + url: AsyncData, userAgent: String, onPermissionsRequested: (PermissionRequest) -> Unit, onWebViewCreated: (WebView) -> Unit, @@ -116,7 +116,7 @@ private fun CallWebView( } }, update = { webView -> - if (url is Async.Success && webView.url != url.data) { + if (url is AsyncData.Success && webView.url != url.data) { webView.loadUrl(url.data) } }, @@ -161,7 +161,7 @@ internal fun CallScreenViewPreview() { ElementPreview { CallScreenView( state = CallScreenState( - urlState = Async.Success("https://call.element.io/some-actual-call?with=parameters"), + urlState = AsyncData.Success("https://call.element.io/some-actual-call?with=parameters"), isInWidgetMode = false, userAgent = "", eventSink = {}, diff --git a/features/call/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt b/features/call/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt index 77f83de209..2b5365118e 100644 --- a/features/call/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt +++ b/features/call/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt @@ -23,7 +23,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.call.CallType import io.element.android.features.call.utils.FakeCallWidgetProvider import io.element.android.features.call.utils.FakeWidgetMessageInterceptor -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.matrix.api.sync.SyncState import io.element.android.libraries.matrix.test.A_ROOM_ID @@ -62,7 +62,7 @@ class CallScreenPresenterTest { skipItems(1) val initialState = awaitItem() - assertThat(initialState.urlState).isEqualTo(Async.Success("https://call.element.io")) + assertThat(initialState.urlState).isEqualTo(AsyncData.Success("https://call.element.io")) assertThat(initialState.isInWidgetMode).isFalse() } } @@ -83,7 +83,7 @@ class CallScreenPresenterTest { skipItems(1) val initialState = awaitItem() - assertThat(initialState.urlState).isInstanceOf(Async.Success::class.java) + assertThat(initialState.urlState).isInstanceOf(AsyncData.Success::class.java) assertThat(initialState.isInWidgetMode).isTrue() assertThat(widgetProvider.getWidgetCalled).isTrue() assertThat(widgetDriver.runCalledCount).isEqualTo(1) diff --git a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/StartDMAction.kt b/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/StartDMAction.kt index ef95f15dce..4e20cea5d1 100644 --- a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/StartDMAction.kt +++ b/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/StartDMAction.kt @@ -17,7 +17,7 @@ package io.element.android.features.createroom.api import androidx.compose.runtime.MutableState -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId @@ -27,5 +27,5 @@ interface StartDMAction { * @param userId The user to start a DM with. * @param actionState The state to update with the result of the action. */ - suspend fun execute(userId: UserId, actionState: MutableState>) + suspend fun execute(userId: UserId, actionState: MutableState>) } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultStartDMAction.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultStartDMAction.kt index 7145ac671e..f129071824 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultStartDMAction.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultStartDMAction.kt @@ -20,7 +20,7 @@ import androidx.compose.runtime.MutableState import com.squareup.anvil.annotations.ContributesBinding import im.vector.app.features.analytics.plan.CreatedRoom import io.element.android.features.createroom.api.StartDMAction -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId @@ -36,17 +36,17 @@ class DefaultStartDMAction @Inject constructor( private val analyticsService: AnalyticsService, ) : StartDMAction { - override suspend fun execute(userId: UserId, actionState: MutableState>) { - actionState.value = Async.Loading() + override suspend fun execute(userId: UserId, actionState: MutableState>) { + actionState.value = AsyncData.Loading() when (val result = matrixClient.startDM(userId)) { is StartDMResult.Success -> { if (result.isNew) { analyticsService.capture(CreatedRoom(isDM = true)) } - actionState.value = Async.Success(result.roomId) + actionState.value = AsyncData.Success(result.roomId) } is StartDMResult.Failure -> { - actionState.value = Async.Failure(result.throwable) + actionState.value = AsyncData.Failure(result.throwable) } } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt index 4cefa82a31..46f6113780 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt @@ -29,7 +29,7 @@ import androidx.compose.runtime.rememberCoroutineScope import im.vector.app.features.analytics.plan.CreatedRoom import io.element.android.features.createroom.impl.CreateRoomConfig import io.element.android.features.createroom.impl.CreateRoomDataStore -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.mimetype.MimeTypes @@ -91,10 +91,10 @@ class ConfigureRoomPresenter @Inject constructor( } val localCoroutineScope = rememberCoroutineScope() - val createRoomAction: MutableState> = remember { mutableStateOf(Async.Uninitialized) } + val createRoomAction: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } fun createRoom(config: CreateRoomConfig) { - createRoomAction.value = Async.Uninitialized + createRoomAction.value = AsyncData.Uninitialized localCoroutineScope.createRoom(config, createRoomAction) } @@ -118,7 +118,7 @@ class ConfigureRoomPresenter @Inject constructor( } } - ConfigureRoomEvents.CancelCreateRoom -> createRoomAction.value = Async.Uninitialized + ConfigureRoomEvents.CancelCreateRoom -> createRoomAction.value = AsyncData.Uninitialized } } @@ -133,7 +133,7 @@ class ConfigureRoomPresenter @Inject constructor( private fun CoroutineScope.createRoom( config: CreateRoomConfig, - createRoomAction: MutableState> + createRoomAction: MutableState> ) = launch { suspend { val avatarUrl = config.avatarUri?.let { uploadAvatar(it) } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt index 7e16cedaa7..7b932db9b6 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt @@ -18,7 +18,7 @@ package io.element.android.features.createroom.impl.configureroom import io.element.android.libraries.matrix.ui.media.AvatarAction import io.element.android.features.createroom.impl.CreateRoomConfig -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.permissions.api.PermissionsState import kotlinx.collections.immutable.ImmutableList @@ -26,7 +26,7 @@ import kotlinx.collections.immutable.ImmutableList data class ConfigureRoomState( val config: CreateRoomConfig, val avatarActions: ImmutableList, - val createRoomAction: Async, + val createRoomAction: AsyncData, val cameraPermissionState: PermissionsState, val eventSink: (ConfigureRoomEvents) -> Unit ) { diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt index eafbe6915b..f5a665f25e 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt @@ -19,7 +19,7 @@ package io.element.android.features.createroom.impl.configureroom import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.createroom.impl.CreateRoomConfig import io.element.android.features.createroom.impl.userlist.aListOfSelectedUsers -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.permissions.api.aPermissionsState import kotlinx.collections.immutable.persistentListOf @@ -41,7 +41,7 @@ open class ConfigureRoomStateProvider : PreviewParameterProvider> = remember { mutableStateOf(Async.Uninitialized) } + val startDmActionState: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } fun handleEvents(event: CreateRoomRootEvents) { when (event) { is CreateRoomRootEvents.StartDM -> localCoroutineScope.launch { startDMAction.execute(event.matrixUser.userId, startDmActionState) } - CreateRoomRootEvents.CancelStartDM -> startDmActionState.value = Async.Uninitialized + CreateRoomRootEvents.CancelStartDM -> startDmActionState.value = AsyncData.Uninitialized } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt index 02f64a6c86..ad583e2cbf 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt @@ -17,12 +17,12 @@ package io.element.android.features.createroom.impl.root import io.element.android.features.createroom.impl.userlist.UserListState -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.RoomId data class CreateRoomRootState( val applicationName: String, val userListState: UserListState, - val startDmAction: Async, + val startDmAction: AsyncData, val eventSink: (CreateRoomRootEvents) -> Unit, ) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt index 7a3bf6ef03..ceef8daa73 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt @@ -19,7 +19,7 @@ package io.element.android.features.createroom.impl.root import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.createroom.impl.userlist.aUserListState -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.matrix.ui.components.aMatrixUser import io.element.android.libraries.usersearch.api.UserSearchResult @@ -30,7 +30,7 @@ open class CreateRoomRootStateProvider : PreviewParameterProvider>(Async.Uninitialized) + val state = mutableStateOf>(AsyncData.Uninitialized) action.execute(A_USER_ID, state) - assertThat(state.value).isEqualTo(Async.Success(A_ROOM_ID)) + assertThat(state.value).isEqualTo(AsyncData.Success(A_ROOM_ID)) } @Test @@ -52,9 +52,9 @@ class DefaultStartDMActionTests { } val analyticsService = FakeAnalyticsService() val action = createStartDMAction(matrixClient, analyticsService) - val state = mutableStateOf>(Async.Uninitialized) + val state = mutableStateOf>(AsyncData.Uninitialized) action.execute(A_USER_ID, state) - assertThat(state.value).isEqualTo(Async.Success(A_ROOM_ID)) + assertThat(state.value).isEqualTo(AsyncData.Success(A_ROOM_ID)) assertThat(analyticsService.capturedEvents).containsExactly(CreatedRoom(isDM = true)) } @@ -65,9 +65,9 @@ class DefaultStartDMActionTests { givenCreateDmResult(Result.failure(A_THROWABLE)) } val action = createStartDMAction(matrixClient) - val state = mutableStateOf>(Async.Uninitialized) + val state = mutableStateOf>(AsyncData.Uninitialized) action.execute(A_USER_ID, state) - assertThat(state.value).isEqualTo(Async.Failure(A_THROWABLE)) + assertThat(state.value).isEqualTo(AsyncData.Failure(A_THROWABLE)) } private fun createStartDMAction( diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenterTests.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenterTests.kt index 96935ed598..e0be429790 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenterTests.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenterTests.kt @@ -25,7 +25,7 @@ import im.vector.app.features.analytics.plan.CreatedRoom import io.element.android.features.createroom.impl.CreateRoomConfig import io.element.android.features.createroom.impl.CreateRoomDataStore import io.element.android.features.createroom.impl.userlist.UserListDataStore -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.test.AN_AVATAR_URL import io.element.android.libraries.matrix.test.A_MESSAGE @@ -234,9 +234,9 @@ class ConfigureRoomPresenterTests { fakeMatrixClient.givenCreateRoomResult(createRoomResult) initialState.eventSink(ConfigureRoomEvents.CreateRoom(initialState.config)) - assertThat(awaitItem().createRoomAction).isInstanceOf(Async.Loading::class.java) + assertThat(awaitItem().createRoomAction).isInstanceOf(AsyncData.Loading::class.java) val stateAfterCreateRoom = awaitItem() - assertThat(stateAfterCreateRoom.createRoomAction).isInstanceOf(Async.Success::class.java) + assertThat(stateAfterCreateRoom.createRoomAction).isInstanceOf(AsyncData.Success::class.java) assertThat(stateAfterCreateRoom.createRoomAction.dataOrNull()).isEqualTo(createRoomResult.getOrNull()) } } @@ -272,16 +272,16 @@ class ConfigureRoomPresenterTests { val initialState = awaitItem() initialState.eventSink(ConfigureRoomEvents.CreateRoom(initialState.config)) - assertThat(awaitItem().createRoomAction).isInstanceOf(Async.Loading::class.java) + assertThat(awaitItem().createRoomAction).isInstanceOf(AsyncData.Loading::class.java) val stateAfterCreateRoom = awaitItem() - assertThat(stateAfterCreateRoom.createRoomAction).isInstanceOf(Async.Failure::class.java) + assertThat(stateAfterCreateRoom.createRoomAction).isInstanceOf(AsyncData.Failure::class.java) assertThat(fakeAnalyticsService.capturedEvents.filterIsInstance()).isEmpty() fakeMatrixClient.givenUploadMediaResult(Result.success(AN_AVATAR_URL)) stateAfterCreateRoom.eventSink(ConfigureRoomEvents.CreateRoom(initialState.config)) - assertThat(awaitItem().createRoomAction).isInstanceOf(Async.Uninitialized::class.java) - assertThat(awaitItem().createRoomAction).isInstanceOf(Async.Loading::class.java) - assertThat(awaitItem().createRoomAction).isInstanceOf(Async.Success::class.java) + assertThat(awaitItem().createRoomAction).isInstanceOf(AsyncData.Uninitialized::class.java) + assertThat(awaitItem().createRoomAction).isInstanceOf(AsyncData.Loading::class.java) + assertThat(awaitItem().createRoomAction).isInstanceOf(AsyncData.Success::class.java) } } @@ -297,22 +297,22 @@ class ConfigureRoomPresenterTests { // Create initialState.eventSink(ConfigureRoomEvents.CreateRoom(initialState.config)) - assertThat(awaitItem().createRoomAction).isInstanceOf(Async.Loading::class.java) + assertThat(awaitItem().createRoomAction).isInstanceOf(AsyncData.Loading::class.java) val stateAfterCreateRoom = awaitItem() - assertThat(stateAfterCreateRoom.createRoomAction).isInstanceOf(Async.Failure::class.java) - assertThat((stateAfterCreateRoom.createRoomAction as? Async.Failure)?.error).isEqualTo(createRoomResult.exceptionOrNull()) + assertThat(stateAfterCreateRoom.createRoomAction).isInstanceOf(AsyncData.Failure::class.java) + assertThat((stateAfterCreateRoom.createRoomAction as? AsyncData.Failure)?.error).isEqualTo(createRoomResult.exceptionOrNull()) // Retry stateAfterCreateRoom.eventSink(ConfigureRoomEvents.CreateRoom(initialState.config)) - assertThat(awaitItem().createRoomAction).isInstanceOf(Async.Uninitialized::class.java) - assertThat(awaitItem().createRoomAction).isInstanceOf(Async.Loading::class.java) + assertThat(awaitItem().createRoomAction).isInstanceOf(AsyncData.Uninitialized::class.java) + assertThat(awaitItem().createRoomAction).isInstanceOf(AsyncData.Loading::class.java) val stateAfterRetry = awaitItem() - assertThat(stateAfterRetry.createRoomAction).isInstanceOf(Async.Failure::class.java) - assertThat((stateAfterRetry.createRoomAction as? Async.Failure)?.error).isEqualTo(createRoomResult.exceptionOrNull()) + assertThat(stateAfterRetry.createRoomAction).isInstanceOf(AsyncData.Failure::class.java) + assertThat((stateAfterRetry.createRoomAction as? AsyncData.Failure)?.error).isEqualTo(createRoomResult.exceptionOrNull()) // Cancel stateAfterRetry.eventSink(ConfigureRoomEvents.CancelCreateRoom) - assertThat(awaitItem().createRoomAction).isInstanceOf(Async.Uninitialized::class.java) + assertThat(awaitItem().createRoomAction).isInstanceOf(AsyncData.Uninitialized::class.java) } } } diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenterTests.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenterTests.kt index a0fb71dd31..4446f1f3a9 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenterTests.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenterTests.kt @@ -25,7 +25,7 @@ import io.element.android.features.createroom.impl.userlist.FakeUserListPresente import io.element.android.features.createroom.impl.userlist.FakeUserListPresenterFactory import io.element.android.features.createroom.impl.userlist.UserListDataStore import io.element.android.features.createroom.test.FakeStartDMAction -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData 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.user.MatrixUser @@ -52,20 +52,20 @@ class CreateRoomRootPresenterTests { }.test { val initialState = awaitItem() - assertThat(initialState.startDmAction).isInstanceOf(Async.Uninitialized::class.java) + assertThat(initialState.startDmAction).isInstanceOf(AsyncData.Uninitialized::class.java) assertThat(initialState.applicationName).isEqualTo(aBuildMeta().applicationName) assertThat(initialState.userListState.selectedUsers).isEmpty() assertThat(initialState.userListState.isSearchActive).isFalse() assertThat(initialState.userListState.isMultiSelectionEnabled).isFalse() val matrixUser = MatrixUser(UserId("@name:domain")) - val startDMSuccessResult = Async.Success(A_ROOM_ID) - val startDMFailureResult = Async.Failure(A_THROWABLE) + val startDMSuccessResult = AsyncData.Success(A_ROOM_ID) + val startDMFailureResult = AsyncData.Failure(A_THROWABLE) // Failure startDMAction.givenExecuteResult(startDMFailureResult) initialState.eventSink(CreateRoomRootEvents.StartDM(matrixUser)) - assertThat(awaitItem().startDmAction).isInstanceOf(Async.Loading::class.java) + assertThat(awaitItem().startDmAction).isInstanceOf(AsyncData.Loading::class.java) awaitItem().also { state -> assertThat(state.startDmAction).isEqualTo(startDMFailureResult) state.eventSink(CreateRoomRootEvents.CancelStartDM) @@ -74,10 +74,10 @@ class CreateRoomRootPresenterTests { // Success startDMAction.givenExecuteResult(startDMSuccessResult) awaitItem().also { state -> - assertThat(state.startDmAction).isEqualTo(Async.Uninitialized) + assertThat(state.startDmAction).isEqualTo(AsyncData.Uninitialized) state.eventSink(CreateRoomRootEvents.StartDM(matrixUser)) } - assertThat(awaitItem().startDmAction).isInstanceOf(Async.Loading::class.java) + assertThat(awaitItem().startDmAction).isInstanceOf(AsyncData.Loading::class.java) awaitItem().also { state -> assertThat(state.startDmAction).isEqualTo(startDMSuccessResult) } diff --git a/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/test/FakeStartDMAction.kt b/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/test/FakeStartDMAction.kt index c1888dc53f..f3e17ee79a 100644 --- a/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/test/FakeStartDMAction.kt +++ b/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/test/FakeStartDMAction.kt @@ -18,7 +18,7 @@ package io.element.android.features.createroom.test import androidx.compose.runtime.MutableState import io.element.android.features.createroom.api.StartDMAction -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.test.A_ROOM_ID @@ -26,14 +26,14 @@ import kotlinx.coroutines.delay class FakeStartDMAction : StartDMAction { - private var executeResult: Async = Async.Success(A_ROOM_ID) + private var executeResult: AsyncData = AsyncData.Success(A_ROOM_ID) - fun givenExecuteResult(result: Async) { + fun givenExecuteResult(result: AsyncData) { executeResult = result } - override suspend fun execute(userId: UserId, actionState: MutableState>) { - actionState.value = Async.Loading() + override suspend fun execute(userId: UserId, actionState: MutableState>) { + actionState.value = AsyncData.Loading() delay(1) actionState.value = executeResult } diff --git a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListPresenter.kt b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListPresenter.kt index 8bc752d629..403f312a22 100644 --- a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListPresenter.kt +++ b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListPresenter.kt @@ -29,7 +29,7 @@ import im.vector.app.features.analytics.plan.JoinedRoom import io.element.android.features.invitelist.api.SeenInvitesStore import io.element.android.features.invitelist.impl.model.InviteListInviteSummary import io.element.android.features.invitelist.impl.model.InviteSender -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.designsystem.components.avatar.AvatarData @@ -77,14 +77,14 @@ class InviteListPresenter @Inject constructor( } val localCoroutineScope = rememberCoroutineScope() - val acceptedAction: MutableState> = remember { mutableStateOf(Async.Uninitialized) } - val declinedAction: MutableState> = remember { mutableStateOf(Async.Uninitialized) } + val acceptedAction: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } + val declinedAction: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } val decliningInvite: MutableState = remember { mutableStateOf(null) } fun handleEvent(event: InviteListEvents) { when (event) { is InviteListEvents.AcceptInvite -> { - acceptedAction.value = Async.Uninitialized + acceptedAction.value = AsyncData.Uninitialized localCoroutineScope.acceptInvite(event.invite.roomId, acceptedAction) } @@ -93,7 +93,7 @@ class InviteListPresenter @Inject constructor( } is InviteListEvents.ConfirmDeclineInvite -> { - declinedAction.value = Async.Uninitialized + declinedAction.value = AsyncData.Uninitialized decliningInvite.value?.let { localCoroutineScope.declineInvite(it.roomId, declinedAction) } @@ -105,11 +105,11 @@ class InviteListPresenter @Inject constructor( } is InviteListEvents.DismissAcceptError -> { - acceptedAction.value = Async.Uninitialized + acceptedAction.value = AsyncData.Uninitialized } is InviteListEvents.DismissDeclineError -> { - declinedAction.value = Async.Uninitialized + declinedAction.value = AsyncData.Uninitialized } } } @@ -137,7 +137,7 @@ class InviteListPresenter @Inject constructor( ) } - private fun CoroutineScope.acceptInvite(roomId: RoomId, acceptedAction: MutableState>) = launch { + private fun CoroutineScope.acceptInvite(roomId: RoomId, acceptedAction: MutableState>) = launch { suspend { client.getRoom(roomId)?.use { it.join().getOrThrow() @@ -148,7 +148,7 @@ class InviteListPresenter @Inject constructor( }.runCatchingUpdatingState(acceptedAction) } - private fun CoroutineScope.declineInvite(roomId: RoomId, declinedAction: MutableState>) = launch { + private fun CoroutineScope.declineInvite(roomId: RoomId, declinedAction: MutableState>) = launch { suspend { client.getRoom(roomId)?.use { it.leave().getOrThrow() diff --git a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListState.kt b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListState.kt index 43644cd6aa..b576861475 100644 --- a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListState.kt +++ b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListState.kt @@ -18,7 +18,7 @@ package io.element.android.features.invitelist.impl import androidx.compose.runtime.Immutable import io.element.android.features.invitelist.impl.model.InviteListInviteSummary -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.RoomId import kotlinx.collections.immutable.ImmutableList @@ -26,8 +26,8 @@ import kotlinx.collections.immutable.ImmutableList data class InviteListState( val inviteList: ImmutableList, val declineConfirmationDialog: InviteDeclineConfirmationDialog, - val acceptedAction: Async, - val declinedAction: Async, + val acceptedAction: AsyncData, + val declinedAction: AsyncData, val eventSink: (InviteListEvents) -> Unit ) diff --git a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListStateProvider.kt b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListStateProvider.kt index f187398689..e61bd9ff93 100644 --- a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListStateProvider.kt +++ b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListStateProvider.kt @@ -19,7 +19,7 @@ package io.element.android.features.invitelist.impl import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.invitelist.impl.model.InviteListInviteSummary import io.element.android.features.invitelist.impl.model.InviteSender -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId import kotlinx.collections.immutable.ImmutableList @@ -32,16 +32,16 @@ open class InviteListStateProvider : PreviewParameterProvider { aInviteListState().copy(inviteList = persistentListOf()), aInviteListState().copy(declineConfirmationDialog = InviteDeclineConfirmationDialog.Visible(true, "Alice")), aInviteListState().copy(declineConfirmationDialog = InviteDeclineConfirmationDialog.Visible(false, "Some Room")), - aInviteListState().copy(acceptedAction = Async.Failure(Throwable("Whoops"))), - aInviteListState().copy(declinedAction = Async.Failure(Throwable("Whoops"))), + aInviteListState().copy(acceptedAction = AsyncData.Failure(Throwable("Whoops"))), + aInviteListState().copy(declinedAction = AsyncData.Failure(Throwable("Whoops"))), ) } internal fun aInviteListState() = InviteListState( inviteList = aInviteListInviteSummaryList(), declineConfirmationDialog = InviteDeclineConfirmationDialog.Hidden, - acceptedAction = Async.Uninitialized, - declinedAction = Async.Uninitialized, + acceptedAction = AsyncData.Uninitialized, + declinedAction = AsyncData.Uninitialized, eventSink = {}, ) diff --git a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListView.kt b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListView.kt index c831024448..3a804de7bc 100644 --- a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListView.kt +++ b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListView.kt @@ -35,7 +35,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.features.invitelist.impl.components.InviteSummaryRow -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog @@ -56,7 +56,7 @@ fun InviteListView( onInviteAccepted: (RoomId) -> Unit, modifier: Modifier = Modifier, ) { - if (state.acceptedAction is Async.Success) { + if (state.acceptedAction is AsyncData.Success) { LaunchedEffect(state.acceptedAction) { onInviteAccepted(state.acceptedAction.data) } @@ -89,7 +89,7 @@ fun InviteListView( ) } - if (state.acceptedAction is Async.Failure) { + if (state.acceptedAction is AsyncData.Failure) { ErrorDialog( content = stringResource(CommonStrings.error_unknown), title = stringResource(CommonStrings.common_error), @@ -98,7 +98,7 @@ fun InviteListView( ) } - if (state.declinedAction is Async.Failure) { + if (state.declinedAction is AsyncData.Failure) { ErrorDialog( content = stringResource(CommonStrings.error_unknown), title = stringResource(CommonStrings.common_error), diff --git a/features/invitelist/impl/src/test/kotlin/io/element/android/features/invitelist/impl/InviteListPresenterTests.kt b/features/invitelist/impl/src/test/kotlin/io/element/android/features/invitelist/impl/InviteListPresenterTests.kt index 70908941a6..a3bafdb034 100644 --- a/features/invitelist/impl/src/test/kotlin/io/element/android/features/invitelist/impl/InviteListPresenterTests.kt +++ b/features/invitelist/impl/src/test/kotlin/io/element/android/features/invitelist/impl/InviteListPresenterTests.kt @@ -22,7 +22,7 @@ import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.invitelist.api.SeenInvitesStore import io.element.android.features.invitelist.test.FakeSeenInvitesStore -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.matrix.api.MatrixClient @@ -245,7 +245,7 @@ class InviteListPresenterTests { val newState = awaitItem() - assertThat(newState.declinedAction).isEqualTo(Async.Failure(ex)) + assertThat(newState.declinedAction).isEqualTo(AsyncData.Failure(ex)) } } @@ -277,7 +277,7 @@ class InviteListPresenterTests { val newState = awaitItem() - assertThat(newState.declinedAction).isEqualTo(Async.Uninitialized) + assertThat(newState.declinedAction).isEqualTo(AsyncData.Uninitialized) } } @@ -300,7 +300,7 @@ class InviteListPresenterTests { val newState = awaitItem() - assertThat(newState.acceptedAction).isEqualTo(Async.Success(A_ROOM_ID)) + assertThat(newState.acceptedAction).isEqualTo(AsyncData.Success(A_ROOM_ID)) assertThat(fakeNotificationDrawerManager.getClearMembershipNotificationForRoomCount(client.sessionId, A_ROOM_ID)).isEqualTo(1) } } @@ -323,7 +323,7 @@ class InviteListPresenterTests { val originalState = awaitItem() originalState.eventSink(InviteListEvents.AcceptInvite(originalState.inviteList[0])) - assertThat(awaitItem().acceptedAction).isEqualTo(Async.Failure(ex)) + assertThat(awaitItem().acceptedAction).isEqualTo(AsyncData.Failure(ex)) } } @@ -350,7 +350,7 @@ class InviteListPresenterTests { originalState.eventSink(InviteListEvents.DismissAcceptError) val newState = awaitItem() - assertThat(newState.acceptedAction).isEqualTo(Async.Uninitialized) + assertThat(newState.acceptedAction).isEqualTo(AsyncData.Uninitialized) } } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenter.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenter.kt index 1b5ce80085..5fe7fdddde 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenter.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenter.kt @@ -29,7 +29,7 @@ import io.element.android.features.lockscreen.impl.biometric.BiometricUnlockMana import io.element.android.features.lockscreen.impl.pin.PinCodeManager import io.element.android.features.lockscreen.impl.pin.model.PinEntry import io.element.android.features.lockscreen.impl.unlock.keypad.PinKeypadModel -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.bool.orFalse @@ -49,11 +49,11 @@ class PinUnlockPresenter @Inject constructor( @Composable override fun present(): PinUnlockState { val pinEntryState = remember { - mutableStateOf>(Async.Uninitialized) + mutableStateOf>(AsyncData.Uninitialized) } val pinEntry by pinEntryState var remainingAttempts by remember { - mutableStateOf>(Async.Uninitialized) + mutableStateOf>(AsyncData.Uninitialized) } var showWrongPinTitle by rememberSaveable { mutableStateOf(false) @@ -62,7 +62,7 @@ class PinUnlockPresenter @Inject constructor( mutableStateOf(false) } val signOutAction = remember { - mutableStateOf>(Async.Uninitialized) + mutableStateOf>(AsyncData.Uninitialized) } var biometricUnlockResult by remember { mutableStateOf(null) @@ -91,7 +91,7 @@ class PinUnlockPresenter @Inject constructor( } } val remainingAttemptsNumber = pinCodeManager.getRemainingPinCodeAttemptsNumber() - remainingAttempts = Async.Success(remainingAttemptsNumber) + remainingAttempts = AsyncData.Success(remainingAttemptsNumber) if (remainingAttemptsNumber == 0) { showSignOutPrompt = true } @@ -139,46 +139,46 @@ class PinUnlockPresenter @Inject constructor( ) } - private fun Async.isComplete(): Boolean { + private fun AsyncData.isComplete(): Boolean { return dataOrNull()?.isComplete().orFalse() } - private fun Async.toText(): String { + private fun AsyncData.toText(): String { return dataOrNull()?.toText() ?: "" } - private fun Async.clear(): Async { + private fun AsyncData.clear(): AsyncData { return when (this) { - is Async.Success -> Async.Success(data.clear()) + is AsyncData.Success -> AsyncData.Success(data.clear()) else -> this } } - private fun Async.process(pinKeypadModel: PinKeypadModel): Async { + private fun AsyncData.process(pinKeypadModel: PinKeypadModel): AsyncData { return when (this) { - is Async.Success -> { + is AsyncData.Success -> { val pinEntry = when (pinKeypadModel) { PinKeypadModel.Back -> data.deleteLast() is PinKeypadModel.Number -> data.addDigit(pinKeypadModel.number) PinKeypadModel.Empty -> data } - Async.Success(pinEntry) + AsyncData.Success(pinEntry) } else -> this } } - private fun Async.process(pinEntryAsText: String): Async { + private fun AsyncData.process(pinEntryAsText: String): AsyncData { return when (this) { - is Async.Success -> { + is AsyncData.Success -> { val pinEntry = data.fillWith(pinEntryAsText) - Async.Success(pinEntry) + AsyncData.Success(pinEntry) } else -> this } } - private fun CoroutineScope.signOut(signOutAction: MutableState>) = launch { + private fun CoroutineScope.signOut(signOutAction: MutableState>) = launch { suspend { matrixClient.logout(ignoreSdkError = true) }.runCatchingUpdatingState(signOutAction) diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockState.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockState.kt index 006234270c..ae381f7031 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockState.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockState.kt @@ -19,21 +19,21 @@ package io.element.android.features.lockscreen.impl.unlock import io.element.android.features.lockscreen.impl.biometric.BiometricUnlock import io.element.android.features.lockscreen.impl.biometric.BiometricUnlockError import io.element.android.features.lockscreen.impl.pin.model.PinEntry -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData data class PinUnlockState( - val pinEntry: Async, + val pinEntry: AsyncData, val showWrongPinTitle: Boolean, - val remainingAttempts: Async, + val remainingAttempts: AsyncData, val showSignOutPrompt: Boolean, - val signOutAction: Async, + val signOutAction: AsyncData, val showBiometricUnlock: Boolean, val isUnlocked: Boolean, val biometricUnlockResult: BiometricUnlock.AuthenticationResult?, val eventSink: (PinUnlockEvents) -> Unit ) { val isSignOutPromptCancellable = when (remainingAttempts) { - is Async.Success -> remainingAttempts.data > 0 + is AsyncData.Success -> remainingAttempts.data > 0 else -> true } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockStateProvider.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockStateProvider.kt index 02da0e0350..151c3079ee 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockStateProvider.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockStateProvider.kt @@ -19,7 +19,7 @@ package io.element.android.features.lockscreen.impl.unlock import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.lockscreen.impl.biometric.BiometricUnlock import io.element.android.features.lockscreen.impl.pin.model.PinEntry -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData open class PinUnlockStateProvider : PreviewParameterProvider { override val values: Sequence @@ -30,7 +30,7 @@ open class PinUnlockStateProvider : PreviewParameterProvider { aPinUnlockState(showSignOutPrompt = true), aPinUnlockState(showBiometricUnlock = false), aPinUnlockState(showSignOutPrompt = true, remainingAttempts = 0), - aPinUnlockState(signOutAction = Async.Loading()), + aPinUnlockState(signOutAction = AsyncData.Loading()), ) } @@ -42,11 +42,11 @@ fun aPinUnlockState( showBiometricUnlock: Boolean = true, biometricUnlockResult: BiometricUnlock.AuthenticationResult? = null, isUnlocked: Boolean = false, - signOutAction: Async = Async.Uninitialized, + signOutAction: AsyncData = AsyncData.Uninitialized, ) = PinUnlockState( - pinEntry = Async.Success(pinEntry), + pinEntry = AsyncData.Success(pinEntry), showWrongPinTitle = showWrongPinTitle, - remainingAttempts = Async.Success(remainingAttempts), + remainingAttempts = AsyncData.Success(remainingAttempts), showSignOutPrompt = showSignOutPrompt, showBiometricUnlock = showBiometricUnlock, signOutAction = signOutAction, diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockView.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockView.kt index 325a41c393..6c9fd2bb6e 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockView.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockView.kt @@ -56,7 +56,7 @@ import io.element.android.features.lockscreen.impl.components.PinEntryTextField import io.element.android.features.lockscreen.impl.pin.model.PinDigit import io.element.android.features.lockscreen.impl.pin.model.PinEntry import io.element.android.features.lockscreen.impl.unlock.keypad.PinKeypad -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.atomic.atoms.RoundedIconAtom import io.element.android.libraries.designsystem.components.ProgressDialog import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog @@ -92,7 +92,7 @@ fun PinUnlockView( onDismiss = { state.eventSink(PinUnlockEvents.ClearSignOutPrompt) }, ) } - if (state.signOutAction is Async.Loading) { + if (state.signOutAction is AsyncData.Loading) { ProgressDialog(text = stringResource(id = R.string.screen_signout_in_progress_dialog_content)) } if (state.showBiometricUnlockError) { @@ -335,7 +335,7 @@ private fun PinUnlockHeader( style = ElementTheme.typography.fontBodyMdRegular, color = subtitleColor, ) - if (!isInAppUnlock && state.pinEntry is Async.Success) { + if (!isInAppUnlock && state.pinEntry is AsyncData.Success) { Spacer(Modifier.height(24.dp)) PinDotsRow(state.pinEntry.data) } diff --git a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt index 87d673066d..1c1451f9bf 100644 --- a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt +++ b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt @@ -28,7 +28,7 @@ import io.element.android.features.lockscreen.impl.pin.PinCodeManager import io.element.android.features.lockscreen.impl.pin.model.PinEntry import io.element.android.features.lockscreen.impl.pin.model.assertText import io.element.android.features.lockscreen.impl.unlock.keypad.PinKeypadModel -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.tests.testutils.awaitLastSequentialItem import io.element.android.tests.testutils.consumeItemsUntilPredicate @@ -48,15 +48,15 @@ class PinUnlockPresenterTest { presenter.present() }.test { awaitItem().also { state -> - assertThat(state.pinEntry).isInstanceOf(Async.Uninitialized::class.java) + assertThat(state.pinEntry).isInstanceOf(AsyncData.Uninitialized::class.java) assertThat(state.showWrongPinTitle).isFalse() assertThat(state.showSignOutPrompt).isFalse() assertThat(state.isUnlocked).isFalse() - assertThat(state.signOutAction).isInstanceOf(Async.Uninitialized::class.java) - assertThat(state.remainingAttempts).isInstanceOf(Async.Uninitialized::class.java) + assertThat(state.signOutAction).isInstanceOf(AsyncData.Uninitialized::class.java) + assertThat(state.remainingAttempts).isInstanceOf(AsyncData.Uninitialized::class.java) } consumeItemsUntilPredicate { - it.pinEntry is Async.Success && it.remainingAttempts is Async.Success + it.pinEntry is AsyncData.Success && it.remainingAttempts is AsyncData.Success }.last().also { state -> state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('1'))) state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('2'))) @@ -83,7 +83,7 @@ class PinUnlockPresenterTest { presenter.present() }.test { val initialState = consumeItemsUntilPredicate { - it.pinEntry is Async.Success && it.remainingAttempts is Async.Success + it.pinEntry is AsyncData.Success && it.remainingAttempts is AsyncData.Success }.last() val numberOfAttempts = initialState.remainingAttempts.dataOrNull() ?: 0 repeat(numberOfAttempts) { @@ -107,7 +107,7 @@ class PinUnlockPresenterTest { presenter.present() }.test { consumeItemsUntilPredicate { - it.pinEntry is Async.Success && it.remainingAttempts is Async.Success + it.pinEntry is AsyncData.Success && it.remainingAttempts is AsyncData.Success }.last().also { state -> state.eventSink(PinUnlockEvents.OnForgetPin) } @@ -125,12 +125,12 @@ class PinUnlockPresenterTest { state.eventSink(PinUnlockEvents.SignOut) } consumeItemsUntilPredicate { state -> - state.signOutAction is Async.Success + state.signOutAction is AsyncData.Success } } } - private fun Async.assertText(text: String) { + private fun AsyncData.assertText(text: String) { dataOrNull()?.assertText(text) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt index 726e241253..f360afbae2 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt @@ -24,7 +24,7 @@ import androidx.compose.runtime.rememberCoroutineScope import io.element.android.features.login.impl.accountprovider.AccountProvider import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource import io.element.android.features.login.impl.error.ChangeServerError -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService @@ -41,14 +41,14 @@ class ChangeServerPresenter @Inject constructor( override fun present(): ChangeServerState { val localCoroutineScope = rememberCoroutineScope() - val changeServerAction: MutableState> = remember { - mutableStateOf(Async.Uninitialized) + val changeServerAction: MutableState> = remember { + mutableStateOf(AsyncData.Uninitialized) } fun handleEvents(event: ChangeServerEvents) { when (event) { is ChangeServerEvents.ChangeServer -> localCoroutineScope.changeServer(event.accountProvider, changeServerAction) - ChangeServerEvents.ClearError -> changeServerAction.value = Async.Uninitialized + ChangeServerEvents.ClearError -> changeServerAction.value = AsyncData.Uninitialized } } @@ -60,7 +60,7 @@ class ChangeServerPresenter @Inject constructor( private fun CoroutineScope.changeServer( data: AccountProvider, - changeServerAction: MutableState>, + changeServerAction: MutableState>, ) = launch { suspend { authenticationService.setHomeserver(data.url).map { diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerState.kt index e49fa1f2fe..c5c8ba5417 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerState.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerState.kt @@ -16,9 +16,9 @@ package io.element.android.features.login.impl.changeserver -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData data class ChangeServerState( - val changeServerAction: Async, + val changeServerAction: AsyncData, val eventSink: (ChangeServerEvents) -> Unit ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt index 90c2bff455..014c3352ce 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt @@ -17,7 +17,7 @@ package io.element.android.features.login.impl.changeserver import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData open class ChangeServerStateProvider : PreviewParameterProvider { override val values: Sequence @@ -27,6 +27,6 @@ open class ChangeServerStateProvider : PreviewParameterProvider { + is AsyncData.Failure -> { when (val error = state.changeServerAction.error) { is ChangeServerError.Error -> { ErrorDialog( @@ -60,11 +60,11 @@ fun ChangeServerView( } } } - is Async.Loading -> ProgressDialog() - is Async.Success -> LaunchedEffect(state.changeServerAction) { + is AsyncData.Loading -> ProgressDialog() + is AsyncData.Success -> LaunchedEffect(state.changeServerAction) { onDone() } - Async.Uninitialized -> Unit + AsyncData.Uninitialized -> Unit } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenter.kt index 66926b3734..74a5f58494 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenter.kt @@ -26,7 +26,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import io.element.android.features.login.api.oidc.OidcAction -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import io.element.android.libraries.matrix.api.auth.OidcDetails @@ -44,33 +44,33 @@ class OidcPresenter @AssistedInject constructor( @Composable override fun present(): OidcState { - var requestState: Async by remember { - mutableStateOf(Async.Uninitialized) + var requestState: AsyncData by remember { + mutableStateOf(AsyncData.Uninitialized) } val localCoroutineScope = rememberCoroutineScope() fun handleCancel() { - requestState = Async.Loading() + requestState = AsyncData.Loading() localCoroutineScope.launch { authenticationService.cancelOidcLogin() .fold( onSuccess = { // Then go back - requestState = Async.Success(Unit) + requestState = AsyncData.Success(Unit) }, onFailure = { - requestState = Async.Failure(it) + requestState = AsyncData.Failure(it) } ) } } fun handleSuccess(url: String) { - requestState = Async.Loading() + requestState = AsyncData.Loading() localCoroutineScope.launch { authenticationService.loginWithOidc(url) .onFailure { - requestState = Async.Failure(it) + requestState = AsyncData.Failure(it) } // On success, the node tree will be updated, there is nothing to do } @@ -87,7 +87,7 @@ class OidcPresenter @AssistedInject constructor( when (event) { OidcEvents.Cancel -> handleCancel() is OidcEvents.OidcActionEvent -> handleAction(event.oidcAction) - OidcEvents.ClearError -> requestState = Async.Uninitialized + OidcEvents.ClearError -> requestState = AsyncData.Uninitialized } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcState.kt index fc9507a89d..2571f01f0c 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcState.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcState.kt @@ -16,11 +16,11 @@ package io.element.android.features.login.impl.oidc.webview -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.auth.OidcDetails data class OidcState( val oidcDetails: OidcDetails, - val requestState: Async, + val requestState: AsyncData, val eventSink: (OidcEvents) -> Unit ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcStateProvider.kt index 80878cf8f8..f0b9dac200 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcStateProvider.kt @@ -17,20 +17,20 @@ package io.element.android.features.login.impl.oidc.webview import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.auth.OidcDetails open class OidcStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aOidcState(), - aOidcState().copy(requestState = Async.Loading()), + aOidcState().copy(requestState = AsyncData.Loading()), ) } fun aOidcState() = OidcState( oidcDetails = aOidcDetails(), - requestState = Async.Uninitialized, + requestState = AsyncData.Uninitialized, eventSink = {} ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt index 21896e4408..82c11047a3 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt @@ -32,7 +32,7 @@ import io.element.android.features.login.impl.DefaultLoginUserStory import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource import io.element.android.features.login.impl.error.ChangeServerError import io.element.android.features.login.impl.oidc.customtab.DefaultOidcActionFlow -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService @@ -61,8 +61,8 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor( val accountProvider by accountProviderDataSource.flow().collectAsState() val localCoroutineScope = rememberCoroutineScope() - val loginFlowAction: MutableState> = remember { - mutableStateOf(Async.Uninitialized) + val loginFlowAction: MutableState> = remember { + mutableStateOf(AsyncData.Uninitialized) } LaunchedEffect(Unit) { @@ -78,7 +78,7 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor( ConfirmAccountProviderEvents.Continue -> { localCoroutineScope.submit(accountProvider.url, loginFlowAction) } - ConfirmAccountProviderEvents.ClearError -> loginFlowAction.value = Async.Uninitialized + ConfirmAccountProviderEvents.ClearError -> loginFlowAction.value = AsyncData.Uninitialized } } @@ -92,7 +92,7 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor( private fun CoroutineScope.submit( homeserverUrl: String, - loginFlowAction: MutableState>, + loginFlowAction: MutableState>, ) = launch { suspend { authenticationService.setHomeserver(homeserverUrl).map { @@ -111,17 +111,17 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor( private suspend fun onOidcAction( oidcAction: OidcAction, - loginFlowAction: MutableState>, + loginFlowAction: MutableState>, ) { - loginFlowAction.value = Async.Loading() + loginFlowAction.value = AsyncData.Loading() when (oidcAction) { OidcAction.GoBack -> { authenticationService.cancelOidcLogin() .onSuccess { - loginFlowAction.value = Async.Uninitialized + loginFlowAction.value = AsyncData.Uninitialized } .onFailure { failure -> - loginFlowAction.value = Async.Failure(failure) + loginFlowAction.value = AsyncData.Failure(failure) } } is OidcAction.Success -> { @@ -130,7 +130,7 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor( defaultLoginUserStory.setLoginFlowIsDone(true) } .onFailure { failure -> - loginFlowAction.value = Async.Failure(failure) + loginFlowAction.value = AsyncData.Failure(failure) } } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderState.kt index 2fcb57af94..2074b7b5ce 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderState.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderState.kt @@ -17,17 +17,17 @@ package io.element.android.features.login.impl.screens.confirmaccountprovider import io.element.android.features.login.impl.accountprovider.AccountProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.auth.OidcDetails // Do not use default value, so no member get forgotten in the presenters. data class ConfirmAccountProviderState( val accountProvider: AccountProvider, val isAccountCreation: Boolean, - val loginFlow: Async, + val loginFlow: AsyncData, val eventSink: (ConfirmAccountProviderEvents) -> Unit ) { - val submitEnabled: Boolean get() = accountProvider.url.isNotEmpty() && (loginFlow is Async.Uninitialized || loginFlow is Async.Loading) + val submitEnabled: Boolean get() = accountProvider.url.isNotEmpty() && (loginFlow is AsyncData.Uninitialized || loginFlow is AsyncData.Loading) } sealed interface LoginFlow { diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderStateProvider.kt index d5f98f5716..3f7bf89278 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderStateProvider.kt @@ -18,7 +18,7 @@ package io.element.android.features.login.impl.screens.confirmaccountprovider import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.login.impl.accountprovider.anAccountProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData open class ConfirmAccountProviderStateProvider : PreviewParameterProvider { override val values: Sequence @@ -31,6 +31,6 @@ open class ConfirmAccountProviderStateProvider : PreviewParameterProvider { + is AsyncData.Failure -> { when (val error = state.loginFlow.error) { is ChangeServerError.Error -> { ErrorDialog( @@ -127,14 +127,14 @@ fun ConfirmAccountProviderView( } } } - is Async.Loading -> Unit // The Continue button shows the loading state - is Async.Success -> { + is AsyncData.Loading -> Unit // The Continue button shows the loading state + is AsyncData.Success -> { when (val loginFlowState = state.loginFlow.data) { is LoginFlow.OidcFlow -> onOidcDetails(loginFlowState.oidcDetails) LoginFlow.PasswordLogin -> onLoginPasswordNeeded() } } - Async.Uninitialized -> Unit + AsyncData.Uninitialized -> Unit } } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenter.kt index b2ea5fb985..9d7bfde0fa 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenter.kt @@ -26,7 +26,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import io.element.android.features.login.impl.DefaultLoginUserStory import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import io.element.android.libraries.matrix.api.core.SessionId @@ -43,8 +43,8 @@ class LoginPasswordPresenter @Inject constructor( @Composable override fun present(): LoginPasswordState { val localCoroutineScope = rememberCoroutineScope() - val loginAction: MutableState> = remember { - mutableStateOf(Async.Uninitialized) + val loginAction: MutableState> = remember { + mutableStateOf(AsyncData.Uninitialized) } val formState = rememberSaveable { @@ -63,7 +63,7 @@ class LoginPasswordPresenter @Inject constructor( LoginPasswordEvents.Submit -> { localCoroutineScope.submit(formState.value, loginAction) } - LoginPasswordEvents.ClearError -> loginAction.value = Async.Uninitialized + LoginPasswordEvents.ClearError -> loginAction.value = AsyncData.Uninitialized } } @@ -75,16 +75,16 @@ class LoginPasswordPresenter @Inject constructor( ) } - private fun CoroutineScope.submit(formState: LoginFormState, loggedInState: MutableState>) = launch { - loggedInState.value = Async.Loading() + private fun CoroutineScope.submit(formState: LoginFormState, loggedInState: MutableState>) = launch { + loggedInState.value = AsyncData.Loading() authenticationService.login(formState.login.trim(), formState.password) .onSuccess { sessionId -> // We will not navigate to the WaitList screen, so the login user story is done defaultLoginUserStory.setLoginFlowIsDone(true) - loggedInState.value = Async.Success(sessionId) + loggedInState.value = AsyncData.Success(sessionId) } .onFailure { failure -> - loggedInState.value = Async.Failure(failure) + loggedInState.value = AsyncData.Failure(failure) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordState.kt index cf4e0d8ee5..d17c44a671 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordState.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordState.kt @@ -18,18 +18,18 @@ package io.element.android.features.login.impl.screens.loginpassword import android.os.Parcelable import io.element.android.features.login.impl.accountprovider.AccountProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.SessionId import kotlinx.parcelize.Parcelize data class LoginPasswordState( val accountProvider: AccountProvider, val formState: LoginFormState, - val loginAction: Async, + val loginAction: AsyncData, val eventSink: (LoginPasswordEvents) -> Unit ) { val submitEnabled: Boolean - get() = loginAction !is Async.Failure && + get() = loginAction !is AsyncData.Failure && formState.login.isNotEmpty() && formState.password.isNotEmpty() } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordStateProvider.kt index b4f5a84691..9b501ac238 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordStateProvider.kt @@ -18,22 +18,22 @@ package io.element.android.features.login.impl.screens.loginpassword import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.login.impl.accountprovider.anAccountProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData open class LoginPasswordStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aLoginPasswordState(), // Loading - aLoginPasswordState().copy(loginAction = Async.Loading()), + aLoginPasswordState().copy(loginAction = AsyncData.Loading()), // Error - aLoginPasswordState().copy(loginAction = Async.Failure(Exception("An error occurred"))), + aLoginPasswordState().copy(loginAction = AsyncData.Failure(Exception("An error occurred"))), ) } fun aLoginPasswordState() = LoginPasswordState( accountProvider = anAccountProvider(), formState = LoginFormState.Default, - loginAction = Async.Uninitialized, + loginAction = AsyncData.Uninitialized, eventSink = {} ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt index 9a5735fe10..b49fe6cf00 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt @@ -54,7 +54,7 @@ import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.features.login.impl.R import io.element.android.features.login.impl.error.isWaitListError import io.element.android.features.login.impl.error.loginError -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.atomic.molecules.IconTitleSubtitleMolecule import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog @@ -84,7 +84,7 @@ fun LoginPasswordView( ) { val isLoading by remember(state.loginAction) { derivedStateOf { - state.loginAction is Async.Loading + state.loginAction is AsyncData.Loading } } val focusManager = LocalFocusManager.current @@ -148,7 +148,7 @@ fun LoginPasswordView( ) Spacer(modifier = Modifier.height(60.dp)) - if (state.loginAction is Async.Failure) { + if (state.loginAction is AsyncData.Failure) { when { state.loginAction.error.isWaitListError() -> { onWaitListError(state.formState) @@ -224,7 +224,7 @@ private fun LoginForm( ) var passwordVisible by remember { mutableStateOf(false) } - if (state.loginAction is Async.Loading) { + if (state.loginAction is AsyncData.Loading) { // Ensure password is hidden when user submits the form passwordVisible = false } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenter.kt index 1d8271e394..247624316d 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenter.kt @@ -27,7 +27,7 @@ import androidx.compose.runtime.setValue import io.element.android.features.login.impl.changeserver.ChangeServerPresenter import io.element.android.features.login.impl.resolver.HomeserverData import io.element.android.features.login.impl.resolver.HomeserverResolver -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay @@ -46,8 +46,8 @@ class SearchAccountProviderPresenter @Inject constructor( } val changeServerState = changeServerPresenter.present() - val data: MutableState>> = remember { - mutableStateOf(Async.Uninitialized) + val data: MutableState>> = remember { + mutableStateOf(AsyncData.Uninitialized) } LaunchedEffect(userInput) { @@ -70,16 +70,16 @@ class SearchAccountProviderPresenter @Inject constructor( ) } - private fun CoroutineScope.onUserInput(userInput: String, data: MutableState>>) = launch { - data.value = Async.Uninitialized + private fun CoroutineScope.onUserInput(userInput: String, data: MutableState>>) = launch { + data.value = AsyncData.Uninitialized // Debounce delay(300) - data.value = Async.Loading() + data.value = AsyncData.Loading() homeserverResolver.resolve(userInput).collect { - data.value = Async.Success(it) + data.value = AsyncData.Success(it) } - if (data.value !is Async.Success) { - data.value = Async.Uninitialized + if (data.value !is AsyncData.Success) { + data.value = AsyncData.Uninitialized } } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderState.kt index 15859afde1..825befa356 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderState.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderState.kt @@ -18,12 +18,12 @@ package io.element.android.features.login.impl.screens.searchaccountprovider import io.element.android.features.login.impl.changeserver.ChangeServerState import io.element.android.features.login.impl.resolver.HomeserverData -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData // Do not use default value, so no member get forgotten in the presenters. data class SearchAccountProviderState( val userInput: String, - val userInputResult: Async>, + val userInputResult: AsyncData>, val changeServerState: ChangeServerState, val eventSink: (SearchAccountProviderEvents) -> Unit ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderStateProvider.kt index 50b24b3964..2df65afee4 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderStateProvider.kt @@ -20,20 +20,20 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.appconfig.AuthenticationConfig import io.element.android.features.login.impl.changeserver.aChangeServerState import io.element.android.features.login.impl.resolver.HomeserverData -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData open class SearchAccountProviderStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aSearchAccountProviderState(), - aSearchAccountProviderState(userInputResult = Async.Success(aHomeserverDataList())), + aSearchAccountProviderState(userInputResult = AsyncData.Success(aHomeserverDataList())), // Add other state here ) } fun aSearchAccountProviderState( userInput: String = "", - userInputResult: Async> = Async.Uninitialized, + userInputResult: AsyncData> = AsyncData.Uninitialized, ) = SearchAccountProviderState( userInput = userInput, userInputResult = userInputResult, diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt index 09e8661b77..245c874ae2 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt @@ -55,7 +55,7 @@ import io.element.android.features.login.impl.accountprovider.AccountProviderVie import io.element.android.features.login.impl.changeserver.ChangeServerEvents import io.element.android.features.login.impl.changeserver.ChangeServerView import io.element.android.features.login.impl.resolver.HomeserverData -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.atomic.molecules.IconTitleSubtitleMolecule import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.components.form.textFieldState @@ -152,10 +152,10 @@ fun SearchAccountProviderView( } when (state.userInputResult) { - is Async.Failure -> { + is AsyncData.Failure -> { // Ignore errors (let the user type more chars) } - is Async.Loading -> { + is AsyncData.Loading -> { item { Box( modifier = Modifier @@ -167,7 +167,7 @@ fun SearchAccountProviderView( } } } - is Async.Success -> { + is AsyncData.Success -> { items(state.userInputResult.data) { homeserverData -> val item = homeserverData.toAccountProvider() AccountProviderView( @@ -178,7 +178,7 @@ fun SearchAccountProviderView( ) } } - Async.Uninitialized -> Unit + AsyncData.Uninitialized -> Unit } item { Spacer(Modifier.height(32.dp)) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenter.kt index 039986343b..7432111b22 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenter.kt @@ -27,7 +27,7 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import io.element.android.features.login.impl.DefaultLoginUserStory import io.element.android.features.login.impl.screens.loginpassword.LoginFormState -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService @@ -55,8 +55,8 @@ class WaitListPresenter @AssistedInject constructor( authenticationService.getHomeserverDetails().value?.url ?: "server" } - val loginAction: MutableState> = remember { - mutableStateOf(Async.Uninitialized) + val loginAction: MutableState> = remember { + mutableStateOf(AsyncData.Uninitialized) } val attemptNumber = remember { mutableIntStateOf(0) } @@ -70,7 +70,7 @@ class WaitListPresenter @AssistedInject constructor( coroutineScope.loginAttempt(formState, loginAction) } } - WaitListEvents.ClearError -> loginAction.value = Async.Uninitialized + WaitListEvents.ClearError -> loginAction.value = AsyncData.Uninitialized WaitListEvents.Continue -> defaultLoginUserStory.setLoginFlowIsDone(true) } } @@ -83,15 +83,15 @@ class WaitListPresenter @AssistedInject constructor( ) } - private fun CoroutineScope.loginAttempt(formState: LoginFormState, loggedInState: MutableState>) = launch { + private fun CoroutineScope.loginAttempt(formState: LoginFormState, loggedInState: MutableState>) = launch { Timber.w("Attempt to login...") - loggedInState.value = Async.Loading() + loggedInState.value = AsyncData.Loading() authenticationService.login(formState.login.trim(), formState.password) .onSuccess { sessionId -> - loggedInState.value = Async.Success(sessionId) + loggedInState.value = AsyncData.Success(sessionId) } .onFailure { failure -> - loggedInState.value = Async.Failure(failure) + loggedInState.value = AsyncData.Failure(failure) } } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListState.kt index f50de7e194..fc85f6637a 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListState.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListState.kt @@ -16,13 +16,13 @@ package io.element.android.features.login.impl.screens.waitlistscreen -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.SessionId // Do not use default value, so no member get forgotten in the presenters. data class WaitListState( val appName: String, val serverName: String, - val loginAction: Async, + val loginAction: AsyncData, val eventSink: (WaitListEvents) -> Unit ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListStateProvider.kt index 94a38fa406..61550a230d 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListStateProvider.kt @@ -17,17 +17,17 @@ package io.element.android.features.login.impl.screens.waitlistscreen import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.SessionId open class WaitListStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( - aWaitListState(loginAction = Async.Uninitialized), - aWaitListState(loginAction = Async.Loading()), - aWaitListState(loginAction = Async.Failure(Throwable("error"))), - aWaitListState(loginAction = Async.Failure(Throwable(message = "IO_ELEMENT_X_WAIT_LIST"))), - aWaitListState(loginAction = Async.Success(SessionId("@alice:element.io"))), + aWaitListState(loginAction = AsyncData.Uninitialized), + aWaitListState(loginAction = AsyncData.Loading()), + aWaitListState(loginAction = AsyncData.Failure(Throwable("error"))), + aWaitListState(loginAction = AsyncData.Failure(Throwable(message = "IO_ELEMENT_X_WAIT_LIST"))), + aWaitListState(loginAction = AsyncData.Success(SessionId("@alice:element.io"))), // Add other state here ) } @@ -35,7 +35,7 @@ open class WaitListStateProvider : PreviewParameterProvider { fun aWaitListState( appName: String = "Element X", serverName: String = "server.org", - loginAction: Async = Async.Uninitialized, + loginAction: AsyncData = AsyncData.Uninitialized, ) = WaitListState( appName = appName, serverName = serverName, diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListView.kt index 0e40a4827a..e56d1b5bca 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListView.kt @@ -33,7 +33,7 @@ import androidx.lifecycle.Lifecycle import io.element.android.features.login.impl.R import io.element.android.features.login.impl.error.isWaitListError import io.element.android.features.login.impl.error.loginError -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.atomic.pages.SunsetPage import io.element.android.libraries.designsystem.components.dialogs.RetryDialog import io.element.android.libraries.designsystem.preview.ElementPreview @@ -89,12 +89,12 @@ private fun WaitListContent( ) { val title = stringResource( when (state.loginAction) { - is Async.Success -> R.string.screen_waitlist_title_success + is AsyncData.Success -> R.string.screen_waitlist_title_success else -> R.string.screen_waitlist_title } ) val subtitle = when (state.loginAction) { - is Async.Success -> stringResource( + is AsyncData.Success -> stringResource( id = R.string.screen_waitlist_message_success, state.appName, ) @@ -122,7 +122,7 @@ private fun OverallContent( modifier: Modifier = Modifier, ) { Box(modifier = modifier.fillMaxSize()) { - if (state.loginAction !is Async.Success) { + if (state.loginAction !is AsyncData.Success) { CompositionLocalProvider(LocalContentColor provides Color.Black) { TextButton( text = stringResource(CommonStrings.action_cancel), @@ -130,7 +130,7 @@ private fun OverallContent( ) } } - if (state.loginAction is Async.Success) { + if (state.loginAction is AsyncData.Success) { Button( text = stringResource(id = CommonStrings.action_continue), onClick = { state.eventSink.invoke(WaitListEvents.Continue) }, diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenterTest.kt index 44c36128e2..0615b94ce6 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenterTest.kt @@ -22,7 +22,7 @@ import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.login.impl.accountprovider.AccountProvider import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.test.A_HOMESERVER import io.element.android.libraries.matrix.test.A_HOMESERVER_URL import io.element.android.libraries.matrix.test.auth.FakeAuthenticationService @@ -46,7 +46,7 @@ class ChangeServerPresenterTest { presenter.present() }.test { val initialState = awaitItem() - assertThat(initialState.changeServerAction).isEqualTo(Async.Uninitialized) + assertThat(initialState.changeServerAction).isEqualTo(AsyncData.Uninitialized) } } @@ -61,13 +61,13 @@ class ChangeServerPresenterTest { presenter.present() }.test { val initialState = awaitItem() - assertThat(initialState.changeServerAction).isEqualTo(Async.Uninitialized) + assertThat(initialState.changeServerAction).isEqualTo(AsyncData.Uninitialized) authenticationService.givenHomeserver(A_HOMESERVER) initialState.eventSink.invoke(ChangeServerEvents.ChangeServer(AccountProvider(url = A_HOMESERVER_URL))) val loadingState = awaitItem() - assertThat(loadingState.changeServerAction).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.changeServerAction).isInstanceOf(AsyncData.Loading::class.java) val successState = awaitItem() - assertThat(successState.changeServerAction).isEqualTo(Async.Success(Unit)) + assertThat(successState.changeServerAction).isEqualTo(AsyncData.Success(Unit)) } } @@ -82,16 +82,16 @@ class ChangeServerPresenterTest { presenter.present() }.test { val initialState = awaitItem() - assertThat(initialState.changeServerAction).isEqualTo(Async.Uninitialized) + assertThat(initialState.changeServerAction).isEqualTo(AsyncData.Uninitialized) initialState.eventSink.invoke(ChangeServerEvents.ChangeServer(AccountProvider(url = A_HOMESERVER_URL))) val loadingState = awaitItem() - assertThat(loadingState.changeServerAction).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.changeServerAction).isInstanceOf(AsyncData.Loading::class.java) val failureState = awaitItem() - assertThat(failureState.changeServerAction).isInstanceOf(Async.Failure::class.java) + assertThat(failureState.changeServerAction).isInstanceOf(AsyncData.Failure::class.java) // Clear error failureState.eventSink.invoke(ChangeServerEvents.ClearError) val finalState = awaitItem() - assertThat(finalState.changeServerAction).isEqualTo(Async.Uninitialized) + assertThat(finalState.changeServerAction).isEqualTo(AsyncData.Uninitialized) } } } diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenterTest.kt index 70d6da7783..2627bc384d 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenterTest.kt @@ -23,7 +23,7 @@ import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.login.api.oidc.OidcAction -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.test.A_THROWABLE import io.element.android.libraries.matrix.test.auth.A_OIDC_DATA import io.element.android.libraries.matrix.test.auth.FakeAuthenticationService @@ -49,7 +49,7 @@ class OidcPresenterTest { }.test { val initialState = awaitItem() assertThat(initialState.oidcDetails).isEqualTo(A_OIDC_DATA) - assertThat(initialState.requestState).isEqualTo(Async.Uninitialized) + assertThat(initialState.requestState).isEqualTo(AsyncData.Uninitialized) } } @@ -65,9 +65,9 @@ class OidcPresenterTest { val initialState = awaitItem() initialState.eventSink.invoke(OidcEvents.Cancel) val loadingState = awaitItem() - assertThat(loadingState.requestState).isEqualTo(Async.Loading()) + assertThat(loadingState.requestState).isEqualTo(AsyncData.Loading()) val finalState = awaitItem() - assertThat(finalState.requestState).isEqualTo(Async.Success(Unit)) + assertThat(finalState.requestState).isEqualTo(AsyncData.Success(Unit)) } } @@ -85,9 +85,9 @@ class OidcPresenterTest { val initialState = awaitItem() initialState.eventSink.invoke(OidcEvents.Cancel) val loadingState = awaitItem() - assertThat(loadingState.requestState).isEqualTo(Async.Loading()) + assertThat(loadingState.requestState).isEqualTo(AsyncData.Loading()) val finalState = awaitItem() - assertThat(finalState.requestState).isEqualTo(Async.Failure(A_THROWABLE)) + assertThat(finalState.requestState).isEqualTo(AsyncData.Failure(A_THROWABLE)) // Note: in real life I do not think this can happen, and the app should not block the user. } } @@ -104,9 +104,9 @@ class OidcPresenterTest { val initialState = awaitItem() initialState.eventSink.invoke(OidcEvents.OidcActionEvent(OidcAction.GoBack)) val loadingState = awaitItem() - assertThat(loadingState.requestState).isEqualTo(Async.Loading()) + assertThat(loadingState.requestState).isEqualTo(AsyncData.Loading()) val finalState = awaitItem() - assertThat(finalState.requestState).isEqualTo(Async.Success(Unit)) + assertThat(finalState.requestState).isEqualTo(AsyncData.Success(Unit)) } } @@ -122,7 +122,7 @@ class OidcPresenterTest { val initialState = awaitItem() initialState.eventSink.invoke(OidcEvents.OidcActionEvent(OidcAction.Success("A_URL"))) val loadingState = awaitItem() - assertThat(loadingState.requestState).isEqualTo(Async.Loading()) + assertThat(loadingState.requestState).isEqualTo(AsyncData.Loading()) // In this case, no success, the session is created and the node get destroyed. } } @@ -141,12 +141,12 @@ class OidcPresenterTest { val initialState = awaitItem() initialState.eventSink.invoke(OidcEvents.OidcActionEvent(OidcAction.Success("A_URL"))) val loadingState = awaitItem() - assertThat(loadingState.requestState).isEqualTo(Async.Loading()) + assertThat(loadingState.requestState).isEqualTo(AsyncData.Loading()) val errorState = awaitItem() - assertThat(errorState.requestState).isEqualTo(Async.Failure(A_THROWABLE)) + assertThat(errorState.requestState).isEqualTo(AsyncData.Failure(A_THROWABLE)) errorState.eventSink.invoke(OidcEvents.ClearError) val finalState = awaitItem() - assertThat(finalState.requestState).isEqualTo(Async.Uninitialized) + assertThat(finalState.requestState).isEqualTo(AsyncData.Uninitialized) } } } diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenterTest.kt index f348839c97..ad78f7b328 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenterTest.kt @@ -25,7 +25,7 @@ import io.element.android.features.login.impl.DefaultLoginUserStory import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource import io.element.android.features.login.impl.oidc.customtab.DefaultOidcActionFlow import io.element.android.features.login.impl.util.defaultAccountProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import io.element.android.libraries.matrix.test.A_HOMESERVER import io.element.android.libraries.matrix.test.A_HOMESERVER_OIDC @@ -52,7 +52,7 @@ class ConfirmAccountProviderPresenterTest { assertThat(initialState.isAccountCreation).isFalse() assertThat(initialState.submitEnabled).isTrue() assertThat(initialState.accountProvider).isEqualTo(defaultAccountProvider) - assertThat(initialState.loginFlow).isEqualTo(Async.Uninitialized) + assertThat(initialState.loginFlow).isEqualTo(AsyncData.Uninitialized) } } @@ -70,10 +70,10 @@ class ConfirmAccountProviderPresenterTest { initialState.eventSink.invoke(ConfirmAccountProviderEvents.Continue) val loadingState = awaitItem() assertThat(loadingState.submitEnabled).isTrue() - assertThat(loadingState.loginFlow).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.loginFlow).isInstanceOf(AsyncData.Loading::class.java) val successState = awaitItem() assertThat(successState.submitEnabled).isFalse() - assertThat(successState.loginFlow).isInstanceOf(Async.Success::class.java) + assertThat(successState.loginFlow).isInstanceOf(AsyncData.Success::class.java) assertThat(successState.loginFlow.dataOrNull()).isEqualTo(LoginFlow.PasswordLogin) } } @@ -92,10 +92,10 @@ class ConfirmAccountProviderPresenterTest { initialState.eventSink.invoke(ConfirmAccountProviderEvents.Continue) val loadingState = awaitItem() assertThat(loadingState.submitEnabled).isTrue() - assertThat(loadingState.loginFlow).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.loginFlow).isInstanceOf(AsyncData.Loading::class.java) val successState = awaitItem() assertThat(successState.submitEnabled).isFalse() - assertThat(successState.loginFlow).isInstanceOf(Async.Success::class.java) + assertThat(successState.loginFlow).isInstanceOf(AsyncData.Success::class.java) assertThat(successState.loginFlow.dataOrNull()).isInstanceOf(LoginFlow.OidcFlow::class.java) } } @@ -116,15 +116,15 @@ class ConfirmAccountProviderPresenterTest { initialState.eventSink.invoke(ConfirmAccountProviderEvents.Continue) val loadingState = awaitItem() assertThat(loadingState.submitEnabled).isTrue() - assertThat(loadingState.loginFlow).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.loginFlow).isInstanceOf(AsyncData.Loading::class.java) val successState = awaitItem() assertThat(successState.submitEnabled).isFalse() - assertThat(successState.loginFlow).isInstanceOf(Async.Success::class.java) + assertThat(successState.loginFlow).isInstanceOf(AsyncData.Success::class.java) assertThat(successState.loginFlow.dataOrNull()).isInstanceOf(LoginFlow.OidcFlow::class.java) authenticationService.givenOidcCancelError(A_THROWABLE) defaultOidcActionFlow.post(OidcAction.GoBack) val cancelFailureState = awaitItem() - assertThat(cancelFailureState.loginFlow).isInstanceOf(Async.Failure::class.java) + assertThat(cancelFailureState.loginFlow).isInstanceOf(AsyncData.Failure::class.java) } } @@ -144,14 +144,14 @@ class ConfirmAccountProviderPresenterTest { initialState.eventSink.invoke(ConfirmAccountProviderEvents.Continue) val loadingState = awaitItem() assertThat(loadingState.submitEnabled).isTrue() - assertThat(loadingState.loginFlow).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.loginFlow).isInstanceOf(AsyncData.Loading::class.java) val successState = awaitItem() assertThat(successState.submitEnabled).isFalse() - assertThat(successState.loginFlow).isInstanceOf(Async.Success::class.java) + assertThat(successState.loginFlow).isInstanceOf(AsyncData.Success::class.java) assertThat(successState.loginFlow.dataOrNull()).isInstanceOf(LoginFlow.OidcFlow::class.java) defaultOidcActionFlow.post(OidcAction.GoBack) val cancelFinalState = awaitItem() - assertThat(cancelFinalState.loginFlow).isInstanceOf(Async.Uninitialized::class.java) + assertThat(cancelFinalState.loginFlow).isInstanceOf(AsyncData.Uninitialized::class.java) } } @@ -171,17 +171,17 @@ class ConfirmAccountProviderPresenterTest { initialState.eventSink.invoke(ConfirmAccountProviderEvents.Continue) val loadingState = awaitItem() assertThat(loadingState.submitEnabled).isTrue() - assertThat(loadingState.loginFlow).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.loginFlow).isInstanceOf(AsyncData.Loading::class.java) val successState = awaitItem() assertThat(successState.submitEnabled).isFalse() - assertThat(successState.loginFlow).isInstanceOf(Async.Success::class.java) + assertThat(successState.loginFlow).isInstanceOf(AsyncData.Success::class.java) assertThat(successState.loginFlow.dataOrNull()).isInstanceOf(LoginFlow.OidcFlow::class.java) authenticationService.givenLoginError(A_THROWABLE) defaultOidcActionFlow.post(OidcAction.Success("aUrl")) val cancelLoadingState = awaitItem() - assertThat(cancelLoadingState.loginFlow).isInstanceOf(Async.Loading::class.java) + assertThat(cancelLoadingState.loginFlow).isInstanceOf(AsyncData.Loading::class.java) val cancelFailureState = awaitItem() - assertThat(cancelFailureState.loginFlow).isInstanceOf(Async.Failure::class.java) + assertThat(cancelFailureState.loginFlow).isInstanceOf(AsyncData.Failure::class.java) } } @@ -205,15 +205,15 @@ class ConfirmAccountProviderPresenterTest { initialState.eventSink.invoke(ConfirmAccountProviderEvents.Continue) val loadingState = awaitItem() assertThat(loadingState.submitEnabled).isTrue() - assertThat(loadingState.loginFlow).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.loginFlow).isInstanceOf(AsyncData.Loading::class.java) val successState = awaitItem() assertThat(successState.submitEnabled).isFalse() - assertThat(successState.loginFlow).isInstanceOf(Async.Success::class.java) + assertThat(successState.loginFlow).isInstanceOf(AsyncData.Success::class.java) assertThat(successState.loginFlow.dataOrNull()).isInstanceOf(LoginFlow.OidcFlow::class.java) assertThat(defaultLoginUserStory.loginFlowIsDone.value).isFalse() defaultOidcActionFlow.post(OidcAction.Success("aUrl")) val successSuccessState = awaitItem() - assertThat(successSuccessState.loginFlow).isInstanceOf(Async.Loading::class.java) + assertThat(successSuccessState.loginFlow).isInstanceOf(AsyncData.Loading::class.java) waitForPredicate { defaultLoginUserStory.loginFlowIsDone.value } } } @@ -233,7 +233,7 @@ class ConfirmAccountProviderPresenterTest { skipItems(1) // Loading val failureState = awaitItem() assertThat(failureState.submitEnabled).isFalse() - assertThat(failureState.loginFlow).isInstanceOf(Async.Failure::class.java) + assertThat(failureState.loginFlow).isInstanceOf(AsyncData.Failure::class.java) } } @@ -256,12 +256,12 @@ class ConfirmAccountProviderPresenterTest { // Check an error was returned val submittedState = awaitItem() - assertThat(submittedState.loginFlow).isInstanceOf(Async.Failure::class.java) + assertThat(submittedState.loginFlow).isInstanceOf(AsyncData.Failure::class.java) // Assert the error is then cleared submittedState.eventSink(ConfirmAccountProviderEvents.ClearError) val clearedState = awaitItem() - assertThat(clearedState.loginFlow).isEqualTo(Async.Uninitialized) + assertThat(clearedState.loginFlow).isEqualTo(AsyncData.Uninitialized) } } diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenterTest.kt index a2b0fae449..23672974ee 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenterTest.kt @@ -23,7 +23,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.login.impl.DefaultLoginUserStory import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource import io.element.android.features.login.impl.util.defaultAccountProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.test.A_HOMESERVER import io.element.android.libraries.matrix.test.A_PASSWORD @@ -57,7 +57,7 @@ class LoginPasswordPresenterTest { val initialState = awaitItem() assertThat(initialState.accountProvider).isEqualTo(defaultAccountProvider) assertThat(initialState.formState).isEqualTo(LoginFormState.Default) - assertThat(initialState.loginAction).isEqualTo(Async.Uninitialized) + assertThat(initialState.loginAction).isEqualTo(AsyncData.Uninitialized) assertThat(initialState.submitEnabled).isFalse() } } @@ -110,9 +110,9 @@ class LoginPasswordPresenterTest { val loginAndPasswordState = awaitItem() loginAndPasswordState.eventSink.invoke(LoginPasswordEvents.Submit) val submitState = awaitItem() - assertThat(submitState.loginAction).isInstanceOf(Async.Loading::class.java) + assertThat(submitState.loginAction).isInstanceOf(AsyncData.Loading::class.java) val loggedInState = awaitItem() - assertThat(loggedInState.loginAction).isEqualTo(Async.Success(A_SESSION_ID)) + assertThat(loggedInState.loginAction).isEqualTo(AsyncData.Success(A_SESSION_ID)) assertThat(loginUserStory.loginFlowIsDone.value).isTrue() } } @@ -139,9 +139,9 @@ class LoginPasswordPresenterTest { authenticationService.givenLoginError(A_THROWABLE) loginAndPasswordState.eventSink.invoke(LoginPasswordEvents.Submit) val submitState = awaitItem() - assertThat(submitState.loginAction).isInstanceOf(Async.Loading::class.java) + assertThat(submitState.loginAction).isInstanceOf(AsyncData.Loading::class.java) val loggedInState = awaitItem() - assertThat(loggedInState.loginAction).isEqualTo(Async.Failure(A_THROWABLE)) + assertThat(loggedInState.loginAction).isEqualTo(AsyncData.Failure(A_THROWABLE)) } } @@ -167,14 +167,14 @@ class LoginPasswordPresenterTest { authenticationService.givenLoginError(A_THROWABLE) loginAndPasswordState.eventSink.invoke(LoginPasswordEvents.Submit) val submitState = awaitItem() - assertThat(submitState.loginAction).isInstanceOf(Async.Loading::class.java) + assertThat(submitState.loginAction).isInstanceOf(AsyncData.Loading::class.java) val loggedInState = awaitItem() // Check an error was returned - assertThat(loggedInState.loginAction).isEqualTo(Async.Failure(A_THROWABLE)) + assertThat(loggedInState.loginAction).isEqualTo(AsyncData.Failure(A_THROWABLE)) // Assert the error is then cleared loggedInState.eventSink(LoginPasswordEvents.ClearError) val clearedState = awaitItem() - assertThat(clearedState.loginAction).isEqualTo(Async.Uninitialized) + assertThat(clearedState.loginAction).isEqualTo(AsyncData.Uninitialized) } } } diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenterTest.kt index 84bd6925db..d951902490 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenterTest.kt @@ -27,7 +27,7 @@ import io.element.android.features.login.impl.resolver.network.FakeWellknownRequ import io.element.android.features.login.impl.resolver.network.WellKnown import io.element.android.features.login.impl.resolver.network.WellKnownBaseConfig import io.element.android.features.login.impl.resolver.network.WellKnownSlidingSyncConfig -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.test.A_HOMESERVER_URL import io.element.android.libraries.matrix.test.auth.FakeAuthenticationService import io.element.android.tests.testutils.WarmUpRule @@ -57,7 +57,7 @@ class SearchAccountProviderPresenterTest { }.test { val initialState = awaitItem() assertThat(initialState.userInput).isEmpty() - assertThat(initialState.userInputResult).isEqualTo(Async.Uninitialized) + assertThat(initialState.userInputResult).isEqualTo(AsyncData.Uninitialized) } } @@ -79,9 +79,9 @@ class SearchAccountProviderPresenterTest { initialState.eventSink.invoke(SearchAccountProviderEvents.UserInput("test")) val withInputState = awaitItem() assertThat(withInputState.userInput).isEqualTo("test") - assertThat(initialState.userInputResult).isEqualTo(Async.Uninitialized) - assertThat(awaitItem().userInputResult).isInstanceOf(Async.Loading::class.java) - assertThat(awaitItem().userInputResult).isEqualTo(Async.Uninitialized) + assertThat(initialState.userInputResult).isEqualTo(AsyncData.Uninitialized) + assertThat(awaitItem().userInputResult).isInstanceOf(AsyncData.Loading::class.java) + assertThat(awaitItem().userInputResult).isEqualTo(AsyncData.Uninitialized) } } @@ -103,10 +103,10 @@ class SearchAccountProviderPresenterTest { initialState.eventSink.invoke(SearchAccountProviderEvents.UserInput("https://test.org")) val withInputState = awaitItem() assertThat(withInputState.userInput).isEqualTo("https://test.org") - assertThat(initialState.userInputResult).isEqualTo(Async.Uninitialized) - assertThat(awaitItem().userInputResult).isInstanceOf(Async.Loading::class.java) + assertThat(initialState.userInputResult).isEqualTo(AsyncData.Uninitialized) + assertThat(awaitItem().userInputResult).isInstanceOf(AsyncData.Loading::class.java) assertThat(awaitItem().userInputResult).isEqualTo( - Async.Success( + AsyncData.Success( listOf( aHomeserverData(homeserverUrl = "https://test.org", isWellknownValid = false, supportSlidingSync = false) ) @@ -138,10 +138,10 @@ class SearchAccountProviderPresenterTest { initialState.eventSink.invoke(SearchAccountProviderEvents.UserInput("test")) val withInputState = awaitItem() assertThat(withInputState.userInput).isEqualTo("test") - assertThat(initialState.userInputResult).isEqualTo(Async.Uninitialized) - assertThat(awaitItem().userInputResult).isInstanceOf(Async.Loading::class.java) + assertThat(initialState.userInputResult).isEqualTo(AsyncData.Uninitialized) + assertThat(awaitItem().userInputResult).isInstanceOf(AsyncData.Loading::class.java) assertThat(awaitItem().userInputResult).isEqualTo( - Async.Success( + AsyncData.Success( listOf( aHomeserverData(homeserverUrl = "https://test.org", isWellknownValid = true, supportSlidingSync = false) ) @@ -173,10 +173,10 @@ class SearchAccountProviderPresenterTest { initialState.eventSink.invoke(SearchAccountProviderEvents.UserInput("test")) val withInputState = awaitItem() assertThat(withInputState.userInput).isEqualTo("test") - assertThat(initialState.userInputResult).isEqualTo(Async.Uninitialized) - assertThat(awaitItem().userInputResult).isInstanceOf(Async.Loading::class.java) + assertThat(initialState.userInputResult).isEqualTo(AsyncData.Uninitialized) + assertThat(awaitItem().userInputResult).isInstanceOf(AsyncData.Loading::class.java) assertThat(awaitItem().userInputResult).isEqualTo( - Async.Success( + AsyncData.Success( listOf( aHomeserverData(homeserverUrl = "https://test.io") ) diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenterTest.kt index 590fa8efc0..9cdac92dbb 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenterTest.kt @@ -22,7 +22,7 @@ import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.login.impl.DefaultLoginUserStory import io.element.android.features.login.impl.screens.loginpassword.LoginFormState -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.test.A_HOMESERVER import io.element.android.libraries.matrix.test.A_HOMESERVER_URL @@ -58,7 +58,7 @@ class WaitListPresenterTest { val initialState = awaitItem() assertThat(initialState.appName).isEqualTo("Application Name") assertThat(initialState.serverName).isEqualTo(A_HOMESERVER_URL) - assertThat(initialState.loginAction).isEqualTo(Async.Uninitialized) + assertThat(initialState.loginAction).isEqualTo(AsyncData.Uninitialized) } } @@ -83,13 +83,13 @@ class WaitListPresenterTest { expectNoEvents() initialState.eventSink.invoke(WaitListEvents.AttemptLogin) val submitState = awaitItem() - assertThat(submitState.loginAction).isInstanceOf(Async.Loading::class.java) + assertThat(submitState.loginAction).isInstanceOf(AsyncData.Loading::class.java) val errorState = awaitItem() - assertThat(errorState.loginAction).isEqualTo(Async.Failure(A_THROWABLE)) + assertThat(errorState.loginAction).isEqualTo(AsyncData.Failure(A_THROWABLE)) // Assert the error can be cleared errorState.eventSink(WaitListEvents.ClearError) val clearedState = awaitItem() - assertThat(clearedState.loginAction).isEqualTo(Async.Uninitialized) + assertThat(clearedState.loginAction).isEqualTo(AsyncData.Uninitialized) } } @@ -113,9 +113,9 @@ class WaitListPresenterTest { expectNoEvents() initialState.eventSink.invoke(WaitListEvents.AttemptLogin) val submitState = awaitItem() - assertThat(submitState.loginAction).isInstanceOf(Async.Loading::class.java) + assertThat(submitState.loginAction).isInstanceOf(AsyncData.Loading::class.java) val successState = awaitItem() - assertThat(successState.loginAction).isEqualTo(Async.Success(A_USER_ID)) + assertThat(successState.loginAction).isEqualTo(AsyncData.Success(A_USER_ID)) assertThat(loginUserStory.loginFlowIsDone.value).isFalse() successState.eventSink.invoke(WaitListEvents.Continue) assertThat(loginUserStory.loginFlowIsDone.value).isTrue() diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt index e6a372397c..165987900c 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt @@ -25,7 +25,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState @@ -75,8 +75,8 @@ class LogoutPresenter @Inject constructor( val backupState by encryptionService.backupStateStateFlow.collectAsState() val recoveryState by encryptionService.recoveryStateStateFlow.collectAsState() - val doesBackupExistOnServerAction: MutableState> = remember { - mutableStateOf(Async.Uninitialized) + val doesBackupExistOnServerAction: MutableState> = remember { + mutableStateOf(AsyncData.Uninitialized) } LaunchedEffect(backupState) { @@ -111,7 +111,7 @@ class LogoutPresenter @Inject constructor( ) } - private fun CoroutineScope.getKeyBackupStatus(action: MutableState>) = launch { + private fun CoroutineScope.getKeyBackupStatus(action: MutableState>) = launch { suspend { encryptionService.doesBackupExistOnServer().getOrThrow() }.runCatchingUpdatingState(action) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index f8682cbd49..c02455d6d3 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -65,7 +65,7 @@ import io.element.android.features.networkmonitor.api.NetworkMonitor import io.element.android.features.networkmonitor.api.NetworkStatus import io.element.android.features.preferences.api.store.PreferencesStore import io.element.android.libraries.androidutils.clipboard.ClipboardHelper -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.meta.BuildMeta @@ -141,11 +141,11 @@ class MessagesPresenter @AssistedInject constructor( val userHasPermissionToSendMessage by room.canSendMessageAsState(type = MessageEventType.ROOM_MESSAGE, updateKey = syncUpdateFlow.value) val userHasPermissionToRedact by room.canRedactAsState(updateKey = syncUpdateFlow.value) val userHasPermissionToSendReaction by room.canSendMessageAsState(type = MessageEventType.REACTION_SENT, updateKey = syncUpdateFlow.value) - val roomName: Async by remember { - derivedStateOf { roomInfo?.name?.let { Async.Success(it) } ?: Async.Uninitialized } + val roomName: AsyncData by remember { + derivedStateOf { roomInfo?.name?.let { AsyncData.Success(it) } ?: AsyncData.Uninitialized } } - val roomAvatar: Async by remember { - derivedStateOf { roomInfo?.avatarData()?.let { Async.Success(it) } ?: Async.Uninitialized } + val roomAvatar: AsyncData by remember { + derivedStateOf { roomInfo?.avatarData()?.let { AsyncData.Success(it) } ?: AsyncData.Uninitialized } } var hasDismissedInviteDialog by rememberSaveable { @@ -162,7 +162,7 @@ class MessagesPresenter @AssistedInject constructor( } } - val inviteProgress = remember { mutableStateOf>(Async.Uninitialized) } + val inviteProgress = remember { mutableStateOf>(AsyncData.Uninitialized) } var showReinvitePrompt by remember { mutableStateOf(false) } LaunchedEffect(hasDismissedInviteDialog, composerState.hasFocus, syncUpdateFlow) { withContext(dispatchers.io) { @@ -279,8 +279,8 @@ class MessagesPresenter @AssistedInject constructor( .onFailure { Timber.e(it) } } - private fun CoroutineScope.reinviteOtherUser(inviteProgress: MutableState>) = launch(dispatchers.io) { - inviteProgress.value = Async.Loading() + private fun CoroutineScope.reinviteOtherUser(inviteProgress: MutableState>) = launch(dispatchers.io) { + inviteProgress.value = AsyncData.Loading() runCatching { room.updateMembers() @@ -296,10 +296,10 @@ class MessagesPresenter @AssistedInject constructor( }.getOrThrow() }.fold( onSuccess = { - inviteProgress.value = Async.Success(Unit) + inviteProgress.value = AsyncData.Success(Unit) }, onFailure = { - inviteProgress.value = Async.Failure(it) + inviteProgress.value = AsyncData.Failure(it) } ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt index c7ef5f320f..c196535607 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt @@ -25,7 +25,7 @@ import io.element.android.features.messages.impl.timeline.components.reactionsum import io.element.android.features.messages.impl.timeline.components.receipt.bottomsheet.ReadReceiptBottomSheetState import io.element.android.features.messages.impl.timeline.components.retrysendmenu.RetrySendMenuState import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageComposerState -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage import io.element.android.libraries.matrix.api.core.RoomId @@ -33,8 +33,8 @@ import io.element.android.libraries.matrix.api.core.RoomId @Immutable data class MessagesState( val roomId: RoomId, - val roomName: Async, - val roomAvatar: Async, + val roomName: AsyncData, + val roomAvatar: AsyncData, val userHasPermissionToSendMessage: Boolean, val userHasPermissionToRedact: Boolean, val userHasPermissionToSendReaction: Boolean, @@ -48,7 +48,7 @@ data class MessagesState( val readReceiptBottomSheetState: ReadReceiptBottomSheetState, val hasNetworkConnection: Boolean, val snackbarMessage: SnackbarMessage?, - val inviteProgress: Async, + val inviteProgress: AsyncData, val showReinvitePrompt: Boolean, val enableTextFormatting: Boolean, val enableVoiceMessages: Boolean, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt index 2984e4e087..8fc7466f95 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt @@ -29,7 +29,7 @@ import io.element.android.features.messages.impl.timeline.components.retrysendme import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent import io.element.android.features.messages.impl.voicemessages.composer.aVoiceMessageComposerState import io.element.android.features.messages.impl.voicemessages.composer.aVoiceMessagePreviewState -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.matrix.api.core.RoomId @@ -47,8 +47,8 @@ open class MessagesStateProvider : PreviewParameterProvider { aMessagesState().copy(userHasPermissionToSendMessage = false), aMessagesState().copy(showReinvitePrompt = true), aMessagesState().copy( - roomName = Async.Uninitialized, - roomAvatar = Async.Uninitialized, + roomName = AsyncData.Uninitialized, + roomAvatar = AsyncData.Uninitialized, ), aMessagesState().copy(composerState = aMessageComposerState().copy(showTextFormatting = true)), aMessagesState().copy( @@ -83,8 +83,8 @@ open class MessagesStateProvider : PreviewParameterProvider { fun aMessagesState() = MessagesState( roomId = RoomId("!id:domain"), - roomName = Async.Success("Room name"), - roomAvatar = Async.Success(AvatarData("!id:domain", "Room name", size = AvatarSize.TimelineRoom)), + roomName = AsyncData.Success("Room name"), + roomAvatar = AsyncData.Success(AvatarData("!id:domain", "Room name", size = AvatarSize.TimelineRoom)), userHasPermissionToSendMessage = true, userHasPermissionToRedact = false, userHasPermissionToSendReaction = true, @@ -117,7 +117,7 @@ fun aMessagesState() = MessagesState( ), hasNetworkConnection = true, snackbarMessage = null, - inviteProgress = Async.Uninitialized, + inviteProgress = AsyncData.Uninitialized, showReinvitePrompt = false, enableTextFormatting = true, enableVoiceMessages = true, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/forward/ForwardMessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/forward/ForwardMessagesPresenter.kt index f61f0f7b52..604b652047 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/forward/ForwardMessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/forward/ForwardMessagesPresenter.kt @@ -25,7 +25,7 @@ import androidx.compose.runtime.remember import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId @@ -48,7 +48,7 @@ class ForwardMessagesPresenter @AssistedInject constructor( fun create(eventId: String): ForwardMessagesPresenter } - private val forwardingActionState: MutableState>> = mutableStateOf(Async.Uninitialized) + private val forwardingActionState: MutableState>> = mutableStateOf(AsyncData.Uninitialized) fun onRoomSelected(roomIds: List) { matrixCoroutineScope.forwardEvent(eventId, roomIds.toPersistentList(), forwardingActionState) @@ -62,13 +62,13 @@ class ForwardMessagesPresenter @AssistedInject constructor( fun handleEvents(event: ForwardMessagesEvents) { when (event) { - ForwardMessagesEvents.ClearError -> forwardingActionState.value = Async.Uninitialized + ForwardMessagesEvents.ClearError -> forwardingActionState.value = AsyncData.Uninitialized } } return ForwardMessagesState( isForwarding = forwardingActionState.value.isLoading(), - error = (forwardingActionState.value as? Async.Failure)?.error, + error = (forwardingActionState.value as? AsyncData.Failure)?.error, forwardingSucceeded = forwardingSucceeded, eventSink = { handleEvents(it) } ) @@ -77,12 +77,12 @@ class ForwardMessagesPresenter @AssistedInject constructor( private fun CoroutineScope.forwardEvent( eventId: EventId, roomIds: ImmutableList, - isForwardMessagesState: MutableState>>, + isForwardMessagesState: MutableState>>, ) = launch { - isForwardMessagesState.value = Async.Loading() + isForwardMessagesState.value = AsyncData.Loading() room.forwardEvent(eventId, roomIds).fold( - { isForwardMessagesState.value = Async.Success(roomIds) }, - { isForwardMessagesState.value = Async.Failure(it) } + { isForwardMessagesState.value = AsyncData.Success(roomIds) }, + { isForwardMessagesState.value = AsyncData.Failure(it) } ) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt index d474e3d25f..902c82aa0c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt @@ -27,7 +27,7 @@ import androidx.compose.runtime.setValue import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runUpdatingState import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher @@ -60,14 +60,14 @@ class ReportMessagePresenter @AssistedInject constructor( val coroutineScope = rememberCoroutineScope() var reason by rememberSaveable { mutableStateOf("") } var blockUser by rememberSaveable { mutableStateOf(false) } - var result: MutableState> = remember { mutableStateOf(Async.Uninitialized) } + var result: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } fun handleEvents(event: ReportMessageEvents) { when (event) { is ReportMessageEvents.UpdateReason -> reason = event.reason ReportMessageEvents.ToggleBlockUser -> blockUser = !blockUser ReportMessageEvents.Report -> coroutineScope.report(inputs.eventId, inputs.senderId, reason, blockUser, result) - ReportMessageEvents.ClearError -> result.value = Async.Uninitialized + ReportMessageEvents.ClearError -> result.value = AsyncData.Uninitialized } } @@ -84,7 +84,7 @@ class ReportMessagePresenter @AssistedInject constructor( userId: UserId, reason: String, blockUser: Boolean, - result: MutableState>, + result: MutableState>, ) = launch { result.runUpdatingState { val userIdToBlock = userId.takeIf { blockUser } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageState.kt index 809668c88f..f1255c18a0 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageState.kt @@ -16,11 +16,11 @@ package io.element.android.features.messages.impl.report -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData data class ReportMessageState( val reason: String, val blockUser: Boolean, - val result: Async, + val result: AsyncData, val eventSink: (ReportMessageEvents) -> Unit ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageStateProvider.kt index de5e787a3d..a5847cef4a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageStateProvider.kt @@ -17,7 +17,7 @@ package io.element.android.features.messages.impl.report import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData open class ReportMessageStateProvider : PreviewParameterProvider { override val values: Sequence @@ -25,9 +25,9 @@ open class ReportMessageStateProvider : PreviewParameterProvider = Async.Uninitialized, + result: AsyncData = AsyncData.Uninitialized, ) = ReportMessageState( reason = reason, blockUser = blockUser, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt index 6642ad4b55..d393619c72 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt @@ -41,7 +41,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.features.messages.impl.R -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.async.AsyncView import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.preview.ElementPreview @@ -62,7 +62,7 @@ fun ReportMessageView( modifier: Modifier = Modifier, ) { val focusManager = LocalFocusManager.current - val isSending = state.result is Async.Loading + val isSending = state.result is AsyncData.Loading AsyncView( async = state.result, showProgressDialog = false, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/VoiceMessagePresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/VoiceMessagePresenter.kt index fa6632308a..dfe8e92a01 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/VoiceMessagePresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/VoiceMessagePresenter.kt @@ -33,7 +33,7 @@ import io.element.android.features.messages.impl.timeline.di.TimelineItemEventCo import io.element.android.features.messages.impl.timeline.di.TimelineItemPresenterFactory import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVoiceContent import io.element.android.features.messages.impl.voicemessages.VoiceMessageException -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runUpdatingState import io.element.android.libraries.di.RoomScope @@ -71,7 +71,7 @@ class VoiceMessagePresenter @AssistedInject constructor( body = content.body, ) - private val play = mutableStateOf>(Async.Uninitialized) + private val play = mutableStateOf>(AsyncData.Uninitialized) @Composable override fun present(): VoiceMessageState { @@ -91,8 +91,8 @@ class VoiceMessagePresenter @AssistedInject constructor( when { content.eventId == null -> VoiceMessageState.Button.Disabled playerState.isPlaying -> VoiceMessageState.Button.Pause - play.value is Async.Loading -> VoiceMessageState.Button.Downloading - play.value is Async.Failure -> VoiceMessageState.Button.Retry + play.value is AsyncData.Loading -> VoiceMessageState.Button.Downloading + play.value is AsyncData.Failure -> VoiceMessageState.Button.Retry else -> VoiceMessageState.Button.Play } } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt index 876884b6cf..e173279ce9 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt @@ -51,7 +51,7 @@ import io.element.android.features.networkmonitor.test.FakeNetworkMonitor import io.element.android.features.poll.test.actions.FakeEndPollAction import io.element.android.features.poll.test.actions.FakeSendPollResponseAction import io.element.android.libraries.androidutils.clipboard.FakeClipboardHelper -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.designsystem.components.avatar.AvatarData @@ -117,14 +117,14 @@ class MessagesPresenterTest { }.test { val initialState = consumeItemsUntilTimeout().last() assertThat(initialState.roomId).isEqualTo(A_ROOM_ID) - assertThat(initialState.roomName).isEqualTo(Async.Success("")) + assertThat(initialState.roomName).isEqualTo(AsyncData.Success("")) assertThat(initialState.roomAvatar) - .isEqualTo(Async.Success(AvatarData(id = A_ROOM_ID.value, name = "", url = AN_AVATAR_URL, size = AvatarSize.TimelineRoom))) + .isEqualTo(AsyncData.Success(AvatarData(id = A_ROOM_ID.value, name = "", url = AN_AVATAR_URL, size = AvatarSize.TimelineRoom))) assertThat(initialState.userHasPermissionToSendMessage).isTrue() assertThat(initialState.userHasPermissionToRedact).isFalse() assertThat(initialState.hasNetworkConnection).isTrue() assertThat(initialState.snackbarMessage).isNull() - assertThat(initialState.inviteProgress).isEqualTo(Async.Uninitialized) + assertThat(initialState.inviteProgress).isEqualTo(AsyncData.Uninitialized) assertThat(initialState.showReinvitePrompt).isFalse() } } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenterTests.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenterTests.kt index d09feaf49f..9bc85a241e 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenterTests.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenterTests.kt @@ -20,7 +20,7 @@ import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.test.AN_EVENT_ID @@ -45,7 +45,7 @@ class ReportMessagePresenterTests { val initialState = awaitItem() assertThat(initialState.reason).isEmpty() assertThat(initialState.blockUser).isFalse() - assertThat(initialState.result).isInstanceOf(Async.Uninitialized::class.java) + assertThat(initialState.result).isInstanceOf(AsyncData.Uninitialized::class.java) } } @@ -91,8 +91,8 @@ class ReportMessagePresenterTests { initialState.eventSink(ReportMessageEvents.ToggleBlockUser) skipItems(1) initialState.eventSink(ReportMessageEvents.Report) - assertThat(awaitItem().result).isInstanceOf(Async.Loading::class.java) - assertThat(awaitItem().result).isInstanceOf(Async.Success::class.java) + assertThat(awaitItem().result).isInstanceOf(AsyncData.Loading::class.java) + assertThat(awaitItem().result).isInstanceOf(AsyncData.Success::class.java) assertThat(room.reportedContentCount).isEqualTo(1) } } @@ -106,8 +106,8 @@ class ReportMessagePresenterTests { }.test { val initialState = awaitItem() initialState.eventSink(ReportMessageEvents.Report) - assertThat(awaitItem().result).isInstanceOf(Async.Loading::class.java) - assertThat(awaitItem().result).isInstanceOf(Async.Success::class.java) + assertThat(awaitItem().result).isInstanceOf(AsyncData.Loading::class.java) + assertThat(awaitItem().result).isInstanceOf(AsyncData.Success::class.java) assertThat(room.reportedContentCount).isEqualTo(1) } } @@ -123,13 +123,13 @@ class ReportMessagePresenterTests { }.test { val initialState = awaitItem() initialState.eventSink(ReportMessageEvents.Report) - assertThat(awaitItem().result).isInstanceOf(Async.Loading::class.java) + assertThat(awaitItem().result).isInstanceOf(AsyncData.Loading::class.java) val resultState = awaitItem() - assertThat(resultState.result).isInstanceOf(Async.Failure::class.java) + assertThat(resultState.result).isInstanceOf(AsyncData.Failure::class.java) assertThat(room.reportedContentCount).isEqualTo(1) resultState.eventSink(ReportMessageEvents.ClearError) - assertThat(awaitItem().result).isInstanceOf(Async.Uninitialized::class.java) + assertThat(awaitItem().result).isInstanceOf(AsyncData.Uninitialized::class.java) } } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt index df0ea43ce9..3c8ca8dc3b 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt @@ -32,7 +32,7 @@ import io.element.android.features.preferences.api.store.PreferencesStore import io.element.android.features.preferences.impl.tasks.ClearCacheUseCase import io.element.android.features.preferences.impl.tasks.ComputeCacheSizeUseCase import io.element.android.features.rageshake.api.preferences.RageshakePreferencesPresenter -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.bool.orFalse @@ -65,10 +65,10 @@ class DeveloperSettingsPresenter @Inject constructor( mutableStateMapOf() } val cacheSize = remember { - mutableStateOf>(Async.Uninitialized) + mutableStateOf>(AsyncData.Uninitialized) } val clearCacheAction = remember { - mutableStateOf>(Async.Uninitialized) + mutableStateOf>(AsyncData.Uninitialized) } val customElementCallBaseUrl by preferencesStore .getCustomElementCallBaseUrlFlow() @@ -154,13 +154,13 @@ class DeveloperSettingsPresenter @Inject constructor( } } - private fun CoroutineScope.computeCacheSize(cacheSize: MutableState>) = launch { + private fun CoroutineScope.computeCacheSize(cacheSize: MutableState>) = launch { suspend { computeCacheSizeUseCase() }.runCatchingUpdatingState(cacheSize) } - private fun CoroutineScope.clearCache(clearCacheAction: MutableState>) = launch { + private fun CoroutineScope.clearCache(clearCacheAction: MutableState>) = launch { suspend { clearCacheUseCase() }.runCatchingUpdatingState(clearCacheAction) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt index d49e94b309..9a12823686 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt @@ -17,15 +17,15 @@ package io.element.android.features.preferences.impl.developer import io.element.android.features.rageshake.api.preferences.RageshakePreferencesState -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.featureflag.ui.model.FeatureUiModel import kotlinx.collections.immutable.ImmutableList data class DeveloperSettingsState( val features: ImmutableList, - val cacheSize: Async, + val cacheSize: AsyncData, val rageshakeState: RageshakePreferencesState, - val clearCacheAction: Async, + val clearCacheAction: AsyncData, val customElementCallBaseUrlState: CustomElementCallBaseUrlState, val eventSink: (DeveloperSettingsEvents) -> Unit ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt index 719b736c09..e4643182f4 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt @@ -18,14 +18,14 @@ package io.element.android.features.preferences.impl.developer import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.rageshake.api.preferences.aRageshakePreferencesState -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.featureflag.ui.model.aFeatureUiModelList open class DeveloperSettingsStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aDeveloperSettingsState(), - aDeveloperSettingsState().copy(clearCacheAction = Async.Loading()), + aDeveloperSettingsState().copy(clearCacheAction = AsyncData.Loading()), aDeveloperSettingsState().copy( customElementCallBaseUrlState = CustomElementCallBaseUrlState( baseUrl = "https://call.element.ahoy", @@ -39,8 +39,8 @@ open class DeveloperSettingsStateProvider : PreviewParameterProvider = remember { mutableStateOf(systemNotificationsEnabledProvider.notificationsEnabled()) } - val changeNotificationSettingAction: MutableState> = remember { mutableStateOf(Async.Uninitialized) } + val changeNotificationSettingAction: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } val localCoroutineScope = rememberCoroutineScope() val appNotificationsEnabled = userPushStore @@ -87,7 +87,7 @@ class NotificationSettingsPresenter @Inject constructor( NotificationSettingsEvents.RefreshSystemNotificationsEnabled -> { systemNotificationsEnabled.value = systemNotificationsEnabledProvider.notificationsEnabled() } - NotificationSettingsEvents.ClearNotificationChangeError -> changeNotificationSettingAction.value = Async.Uninitialized + NotificationSettingsEvents.ClearNotificationChangeError -> changeNotificationSettingAction.value = AsyncData.Uninitialized } } @@ -168,19 +168,19 @@ class NotificationSettingsPresenter @Inject constructor( ) } - private fun CoroutineScope.setAtRoomNotificationsEnabled(enabled: Boolean, action: MutableState>) = launch { + private fun CoroutineScope.setAtRoomNotificationsEnabled(enabled: Boolean, action: MutableState>) = launch { suspend { notificationSettingsService.setRoomMentionEnabled(enabled).getOrThrow() }.runCatchingUpdatingState(action) } - private fun CoroutineScope.setCallNotificationsEnabled(enabled: Boolean, action: MutableState>) = launch { + private fun CoroutineScope.setCallNotificationsEnabled(enabled: Boolean, action: MutableState>) = launch { suspend { notificationSettingsService.setCallEnabled(enabled).getOrThrow() }.runCatchingUpdatingState(action) } - private fun CoroutineScope.setInviteForMeNotificationsEnabled(enabled: Boolean, action: MutableState>) = launch { + private fun CoroutineScope.setInviteForMeNotificationsEnabled(enabled: Boolean, action: MutableState>) = launch { suspend { notificationSettingsService.setInviteForMeEnabled(enabled).getOrThrow() }.runCatchingUpdatingState(action) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsState.kt index 581f0e8475..cf5f40aecc 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsState.kt @@ -17,14 +17,14 @@ package io.element.android.features.preferences.impl.notifications import androidx.compose.runtime.Immutable -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.room.RoomNotificationMode @Immutable data class NotificationSettingsState( val matrixSettings: MatrixSettings, val appSettings: AppSettings, - val changeNotificationSettingAction: Async, + val changeNotificationSettingAction: AsyncData, val eventSink: (NotificationSettingsEvents) -> Unit, ) { sealed interface MatrixSettings { diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsStateProvider.kt index f121a2fe60..a1d0e3cb0d 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsStateProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsStateProvider.kt @@ -17,20 +17,20 @@ package io.element.android.features.preferences.impl.notifications import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.room.RoomNotificationMode open class NotificationSettingsStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aNotificationSettingsState(), - aNotificationSettingsState(changeNotificationSettingAction = Async.Loading(Unit)), - aNotificationSettingsState(changeNotificationSettingAction = Async.Failure(Throwable("error"))), + aNotificationSettingsState(changeNotificationSettingAction = AsyncData.Loading(Unit)), + aNotificationSettingsState(changeNotificationSettingAction = AsyncData.Failure(Throwable("error"))), ) } fun aNotificationSettingsState( - changeNotificationSettingAction: Async = Async.Uninitialized, + changeNotificationSettingAction: AsyncData = AsyncData.Uninitialized, ) = NotificationSettingsState( matrixSettings = NotificationSettingsState.MatrixSettings.Valid( atRoomNotificationsEnabled = true, diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingPresenter.kt index 7617e68dd6..3f1edbfe28 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingPresenter.kt @@ -27,7 +27,7 @@ import androidx.compose.runtime.setValue import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.matrix.api.MatrixClient @@ -63,7 +63,7 @@ class EditDefaultNotificationSettingPresenter @AssistedInject constructor( mutableStateOf(null) } - val changeNotificationSettingAction: MutableState> = remember { mutableStateOf(Async.Uninitialized) } + val changeNotificationSettingAction: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } val roomsWithUserDefinedMode: MutableState> = remember { mutableStateOf(listOf()) @@ -82,7 +82,7 @@ class EditDefaultNotificationSettingPresenter @AssistedInject constructor( is EditDefaultNotificationSettingStateEvents.SetNotificationMode -> { localCoroutineScope.setDefaultNotificationMode(event.mode, changeNotificationSettingAction) } - EditDefaultNotificationSettingStateEvents.ClearError -> changeNotificationSettingAction.value = Async.Uninitialized + EditDefaultNotificationSettingStateEvents.ClearError -> changeNotificationSettingAction.value = AsyncData.Uninitialized } } @@ -137,7 +137,7 @@ class EditDefaultNotificationSettingPresenter @AssistedInject constructor( roomsWithUserDefinedMode.value = sortedSummaries } - private fun CoroutineScope.setDefaultNotificationMode(mode: RoomNotificationMode, action: MutableState>) = launch { + private fun CoroutineScope.setDefaultNotificationMode(mode: RoomNotificationMode, action: MutableState>) = launch { suspend { // On modern clients, we don't have different settings for encrypted and non-encrypted rooms (Legacy clients did). notificationSettingsService.setDefaultRoomNotificationMode(isEncrypted = true, mode = mode, isOneToOne = isOneToOne).getOrThrow() diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingState.kt index 7086835478..60d881fa1c 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingState.kt @@ -16,7 +16,7 @@ package io.element.android.features.preferences.impl.notifications.edit -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.room.RoomNotificationMode import io.element.android.libraries.matrix.api.roomlist.RoomSummary import kotlinx.collections.immutable.ImmutableList @@ -25,7 +25,7 @@ data class EditDefaultNotificationSettingState( val isOneToOne: Boolean, val mode: RoomNotificationMode?, val roomsWithUserDefinedMode: ImmutableList, - val changeNotificationSettingAction: Async, + val changeNotificationSettingAction: AsyncData, val displayMentionsOnlyDisclaimer: Boolean, val eventSink: (EditDefaultNotificationSettingStateEvents) -> Unit, ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingStateProvider.kt index dc11b85e6d..f049a69669 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingStateProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingStateProvider.kt @@ -17,7 +17,7 @@ package io.element.android.features.preferences.impl.notifications.edit import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.room.RoomNotificationMode import io.element.android.libraries.matrix.api.roomlist.RoomSummary @@ -29,15 +29,15 @@ open class EditDefaultNotificationSettingStateProvider: PreviewParameterProvider get() = sequenceOf( anEditDefaultNotificationSettingsState(), anEditDefaultNotificationSettingsState(isOneToOne = true), - anEditDefaultNotificationSettingsState(changeNotificationSettingAction = Async.Loading(Unit)), - anEditDefaultNotificationSettingsState(changeNotificationSettingAction = Async.Failure(Throwable("error"))), + anEditDefaultNotificationSettingsState(changeNotificationSettingAction = AsyncData.Loading(Unit)), + anEditDefaultNotificationSettingsState(changeNotificationSettingAction = AsyncData.Failure(Throwable("error"))), anEditDefaultNotificationSettingsState(displayMentionsOnlyDisclaimer = true), ) } private fun anEditDefaultNotificationSettingsState( isOneToOne: Boolean = false, - changeNotificationSettingAction: Async = Async.Uninitialized, + changeNotificationSettingAction: AsyncData = AsyncData.Uninitialized, displayMentionsOnlyDisclaimer: Boolean = false, ) = EditDefaultNotificationSettingState( isOneToOne = isOneToOne, diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt index be0a5f4cca..60498d7141 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt @@ -31,7 +31,7 @@ import androidx.core.net.toUri import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.mimetype.MimeTypes @@ -92,7 +92,7 @@ class EditUserProfilePresenter @AssistedInject constructor( } } - val saveAction: MutableState> = remember { mutableStateOf(Async.Uninitialized) } + val saveAction: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } val localCoroutineScope = rememberCoroutineScope() fun handleEvents(event: EditUserProfileEvents) { when (event) { @@ -111,7 +111,7 @@ class EditUserProfilePresenter @AssistedInject constructor( } is EditUserProfileEvents.UpdateDisplayName -> userDisplayName = event.name - EditUserProfileEvents.CancelSaveChanges -> saveAction.value = Async.Uninitialized + EditUserProfileEvents.CancelSaveChanges -> saveAction.value = AsyncData.Uninitialized } } @@ -126,7 +126,7 @@ class EditUserProfilePresenter @AssistedInject constructor( displayName = userDisplayName.orEmpty(), userAvatarUrl = userAvatarUri, avatarActions = avatarActions, - saveButtonEnabled = canSave && saveAction.value !is Async.Loading, + saveButtonEnabled = canSave && saveAction.value !is AsyncData.Loading, saveAction = saveAction.value, cameraPermissionState = cameraPermissionState, eventSink = { handleEvents(it) }, @@ -140,7 +140,7 @@ class EditUserProfilePresenter @AssistedInject constructor( // Need to call `toUri()?.toString()` to make the test pass (we mockk Uri) avatarUri?.toString()?.trim() != currentUser.avatarUrl?.toUri()?.toString()?.trim() - private fun CoroutineScope.saveChanges(name: String?, avatarUri: Uri?, currentUser: MatrixUser, action: MutableState>) = launch { + private fun CoroutineScope.saveChanges(name: String?, avatarUri: Uri?, currentUser: MatrixUser, action: MutableState>) = launch { val results = mutableListOf>() suspend { if (!name.isNullOrEmpty() && name.trim() != currentUser.displayName.orEmpty().trim()) { diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileState.kt index 9561c8609b..600c16858b 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileState.kt @@ -17,7 +17,7 @@ package io.element.android.features.preferences.impl.user.editprofile import android.net.Uri -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.ui.media.AvatarAction import io.element.android.libraries.permissions.api.PermissionsState @@ -29,7 +29,7 @@ data class EditUserProfileState( val userAvatarUrl: Uri?, val avatarActions: ImmutableList, val saveButtonEnabled: Boolean, - val saveAction: Async, + val saveAction: AsyncData, val cameraPermissionState: PermissionsState, val eventSink: (EditUserProfileEvents) -> Unit ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileStateProvider.kt index c4a8431f4f..f970e2c60d 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileStateProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileStateProvider.kt @@ -17,7 +17,7 @@ package io.element.android.features.preferences.impl.user.editprofile import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.permissions.api.aPermissionsState import kotlinx.collections.immutable.persistentListOf @@ -35,7 +35,7 @@ fun aEditUserProfileState() = EditUserProfileState( displayName = "John Doe", userAvatarUrl = null, avatarActions = persistentListOf(), - saveAction = Async.Uninitialized, + saveAction = AsyncData.Uninitialized, saveButtonEnabled = true, cameraPermissionState = aPermissionsState(showDialog = false), eventSink = {} diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt index 07705446d9..9872ed0804 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt @@ -26,7 +26,7 @@ import io.element.android.features.preferences.impl.tasks.FakeComputeCacheSizeUs import io.element.android.features.rageshake.impl.preferences.DefaultRageshakePreferencesPresenter import io.element.android.features.rageshake.test.rageshake.FakeRageShake import io.element.android.features.rageshake.test.rageshake.FakeRageshakeDataStore -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.featureflag.test.InMemoryPreferencesStore @@ -49,8 +49,8 @@ class DeveloperSettingsPresenterTest { }.test { val initialState = awaitItem() assertThat(initialState.features).isEmpty() - assertThat(initialState.clearCacheAction).isEqualTo(Async.Uninitialized) - assertThat(initialState.cacheSize).isEqualTo(Async.Uninitialized) + assertThat(initialState.clearCacheAction).isEqualTo(AsyncData.Uninitialized) + assertThat(initialState.cacheSize).isEqualTo(AsyncData.Uninitialized) assertThat(initialState.customElementCallBaseUrlState).isNotNull() assertThat(initialState.customElementCallBaseUrlState.baseUrl).isNull() val loadedState = awaitItem() @@ -105,9 +105,9 @@ class DeveloperSettingsPresenterTest { assertThat(clearCacheUseCase.executeHasBeenCalled).isFalse() initialState.eventSink(DeveloperSettingsEvents.ClearCache) val stateAfterEvent = awaitItem() - assertThat(stateAfterEvent.clearCacheAction).isInstanceOf(Async.Loading::class.java) + assertThat(stateAfterEvent.clearCacheAction).isInstanceOf(AsyncData.Loading::class.java) skipItems(1) - assertThat(awaitItem().clearCacheAction).isInstanceOf(Async.Success::class.java) + assertThat(awaitItem().clearCacheAction).isInstanceOf(AsyncData.Success::class.java) assertThat(clearCacheUseCase.executeHasBeenCalled).isTrue() cancelAndIgnoreRemainingEvents() } diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenterTest.kt index 3e32ed675f..37e95378ba 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenterTest.kt @@ -21,7 +21,7 @@ import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.test.AN_AVATAR_URL @@ -110,7 +110,7 @@ class EditUserProfilePresenterTest { AvatarAction.Remove ) assertThat(initialState.saveButtonEnabled).isFalse() - assertThat(initialState.saveAction).isInstanceOf(Async.Uninitialized::class.java) + assertThat(initialState.saveAction).isInstanceOf(AsyncData.Uninitialized::class.java) } } @@ -359,7 +359,7 @@ class EditUserProfilePresenterTest { initialState.eventSink(EditUserProfileEvents.Save) skipItems(2) assertThat(matrixClient.uploadAvatarCalled).isFalse() - assertThat(awaitItem().saveAction).isInstanceOf(Async.Failure::class.java) + assertThat(awaitItem().saveAction).isInstanceOf(AsyncData.Failure::class.java) } } @@ -406,9 +406,9 @@ class EditUserProfilePresenterTest { initialState.eventSink(EditUserProfileEvents.UpdateDisplayName("foo")) initialState.eventSink(EditUserProfileEvents.Save) skipItems(2) - assertThat(awaitItem().saveAction).isInstanceOf(Async.Failure::class.java) + assertThat(awaitItem().saveAction).isInstanceOf(AsyncData.Failure::class.java) initialState.eventSink(EditUserProfileEvents.CancelSaveChanges) - assertThat(awaitItem().saveAction).isInstanceOf(Async.Uninitialized::class.java) + assertThat(awaitItem().saveAction).isInstanceOf(AsyncData.Uninitialized::class.java) } } @@ -421,8 +421,8 @@ class EditUserProfilePresenterTest { initialState.eventSink(event) initialState.eventSink(EditUserProfileEvents.Save) skipItems(1) - assertThat(awaitItem().saveAction).isInstanceOf(Async.Loading::class.java) - assertThat(awaitItem().saveAction).isInstanceOf(Async.Failure::class.java) + assertThat(awaitItem().saveAction).isInstanceOf(AsyncData.Loading::class.java) + assertThat(awaitItem().saveAction).isInstanceOf(AsyncData.Failure::class.java) } } diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt index e90787ab5c..eac789af3e 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt @@ -30,7 +30,7 @@ import io.element.android.features.rageshake.api.reporter.BugReporter import io.element.android.features.rageshake.api.reporter.BugReporterListener import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder import io.element.android.features.rageshake.impl.logs.VectorFileLogger -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -45,27 +45,27 @@ class BugReportPresenter @Inject constructor( private class BugReporterUploadListener( private val sendingProgress: MutableFloatState, - private val sendingAction: MutableState> + private val sendingAction: MutableState> ) : BugReporterListener { override fun onUploadCancelled() { sendingProgress.floatValue = 0f - sendingAction.value = Async.Uninitialized + sendingAction.value = AsyncData.Uninitialized } override fun onUploadFailed(reason: String?) { sendingProgress.floatValue = 0f - sendingAction.value = Async.Failure(Exception(reason)) + sendingAction.value = AsyncData.Failure(Exception(reason)) } override fun onProgress(progress: Int) { sendingProgress.floatValue = progress.toFloat() / 100 - sendingAction.value = Async.Loading() + sendingAction.value = AsyncData.Loading() } override fun onUploadSucceed() { sendingProgress.floatValue = 0f - sendingAction.value = Async.Success(Unit) + sendingAction.value = AsyncData.Success(Unit) } } @@ -83,8 +83,8 @@ class BugReportPresenter @Inject constructor( val sendingProgress = remember { mutableFloatStateOf(0f) } - val sendingAction: MutableState> = remember { - mutableStateOf(Async.Uninitialized) + val sendingAction: MutableState> = remember { + mutableStateOf(AsyncData.Uninitialized) } val formState: MutableState = remember { mutableStateOf(BugReportFormState.Default) @@ -109,7 +109,7 @@ class BugReportPresenter @Inject constructor( } BugReportEvents.ClearError -> { sendingProgress.floatValue = 0f - sendingAction.value = Async.Uninitialized + sendingAction.value = AsyncData.Uninitialized } } } diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportState.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportState.kt index b8bbe62dc6..1401369cc2 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportState.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportState.kt @@ -17,7 +17,7 @@ package io.element.android.features.rageshake.impl.bugreport import android.os.Parcelable -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import kotlinx.parcelize.Parcelize data class BugReportState( @@ -25,11 +25,11 @@ data class BugReportState( val hasCrashLogs: Boolean, val screenshotUri: String?, val sendingProgress: Float, - val sending: Async, + val sending: AsyncData, val eventSink: (BugReportEvents) -> Unit ) { val submitEnabled = - formState.description.length > 10 && sending !is Async.Loading + formState.description.length > 10 && sending !is AsyncData.Loading } @Parcelize diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportStateProvider.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportStateProvider.kt index 3601c2a259..e670562637 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportStateProvider.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportStateProvider.kt @@ -17,7 +17,7 @@ package io.element.android.features.rageshake.impl.bugreport import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData open class BugReportStateProvider : PreviewParameterProvider { override val values: Sequence @@ -31,8 +31,8 @@ open class BugReportStateProvider : PreviewParameterProvider { hasCrashLogs = true, screenshotUri = "aUri" ), - aBugReportState().copy(sending = Async.Loading()), - aBugReportState().copy(sending = Async.Success(Unit)), + aBugReportState().copy(sending = AsyncData.Loading()), + aBugReportState().copy(sending = AsyncData.Success(Unit)), ) } @@ -41,6 +41,6 @@ fun aBugReportState() = BugReportState( hasCrashLogs = false, screenshotUri = null, sendingProgress = 0F, - sending = Async.Uninitialized, + sending = AsyncData.Uninitialized, eventSink = {} ) diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt index 7833c21764..2d1b7fdd6e 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt @@ -37,7 +37,7 @@ import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import coil.request.ImageRequest import io.element.android.features.rageshake.impl.R -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.async.AsyncView import io.element.android.libraries.designsystem.components.form.textFieldState import io.element.android.libraries.designsystem.components.preferences.PreferencePage @@ -67,7 +67,7 @@ fun BugReportView( title = stringResource(id = CommonStrings.common_report_a_problem), onBackPressed = onBackPressed ) { - val isFormEnabled = state.sending !is Async.Loading + val isFormEnabled = state.sending !is AsyncData.Loading var descriptionFieldState by textFieldState( stateValue = state.formState.description ) diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenterTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenterTest.kt index 3360ce3dd3..3c2607a08a 100644 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenterTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenterTest.kt @@ -24,7 +24,7 @@ import io.element.android.features.rageshake.test.crash.A_CRASH_DATA import io.element.android.features.rageshake.test.crash.FakeCrashDataStore import io.element.android.features.rageshake.test.screenshot.A_SCREENSHOT_URI import io.element.android.features.rageshake.test.screenshot.FakeScreenshotHolder -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.test.A_FAILURE_REASON import io.element.android.tests.testutils.WarmUpRule import kotlinx.coroutines.test.runTest @@ -53,7 +53,7 @@ class BugReportPresenterTest { val initialState = awaitItem() assertThat(initialState.hasCrashLogs).isFalse() assertThat(initialState.formState).isEqualTo(BugReportFormState.Default) - assertThat(initialState.sending).isEqualTo(Async.Uninitialized) + assertThat(initialState.sending).isEqualTo(AsyncData.Uninitialized) assertThat(initialState.screenshotUri).isNull() assertThat(initialState.sendingProgress).isEqualTo(0f) assertThat(initialState.submitEnabled).isFalse() @@ -174,13 +174,13 @@ class BugReportPresenterTest { initialState.eventSink.invoke(BugReportEvents.SendBugReport) skipItems(1) val progressState = awaitItem() - assertThat(progressState.sending).isEqualTo(Async.Loading(null)) + assertThat(progressState.sending).isEqualTo(AsyncData.Loading(null)) assertThat(progressState.sendingProgress).isEqualTo(0f) assertThat(progressState.submitEnabled).isFalse() assertThat(awaitItem().sendingProgress).isEqualTo(0.5f) assertThat(awaitItem().sendingProgress).isEqualTo(1f) skipItems(1) - assertThat(awaitItem().sending).isEqualTo(Async.Success(Unit)) + assertThat(awaitItem().sending).isEqualTo(AsyncData.Success(Unit)) } } @@ -199,17 +199,17 @@ class BugReportPresenterTest { initialState.eventSink.invoke(BugReportEvents.SendBugReport) skipItems(1) val progressState = awaitItem() - assertThat(progressState.sending).isEqualTo(Async.Loading(null)) + assertThat(progressState.sending).isEqualTo(AsyncData.Loading(null)) assertThat(progressState.sendingProgress).isEqualTo(0f) assertThat(awaitItem().sendingProgress).isEqualTo(0.5f) // Failure assertThat(awaitItem().sendingProgress).isEqualTo(0f) - assertThat((awaitItem().sending as Async.Failure).error.message).isEqualTo(A_FAILURE_REASON) + assertThat((awaitItem().sending as AsyncData.Failure).error.message).isEqualTo(A_FAILURE_REASON) // Reset failure initialState.eventSink.invoke(BugReportEvents.ClearError) val lastItem = awaitItem() assertThat(lastItem.sendingProgress).isEqualTo(0f) - assertThat(lastItem.sending).isInstanceOf(Async.Uninitialized::class.java) + assertThat(lastItem.sending).isInstanceOf(AsyncData.Uninitialized::class.java) } } @@ -228,12 +228,12 @@ class BugReportPresenterTest { initialState.eventSink.invoke(BugReportEvents.SendBugReport) skipItems(1) val progressState = awaitItem() - assertThat(progressState.sending).isEqualTo(Async.Loading(null)) + assertThat(progressState.sending).isEqualTo(AsyncData.Loading(null)) assertThat(progressState.sendingProgress).isEqualTo(0f) assertThat(awaitItem().sendingProgress).isEqualTo(0.5f) // Cancelled assertThat(awaitItem().sendingProgress).isEqualTo(0f) - assertThat(awaitItem().sending).isEqualTo(Async.Uninitialized) + assertThat(awaitItem().sending).isEqualTo(AsyncData.Uninitialized) } } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/blockuser/BlockUserSection.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/blockuser/BlockUserSection.kt index b99319812b..4ca3c313de 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/blockuser/BlockUserSection.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/blockuser/BlockUserSection.kt @@ -26,7 +26,7 @@ import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.features.roomdetails.impl.R import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsEvents import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsState -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.designsystem.components.dialogs.RetryDialog import io.element.android.libraries.designsystem.components.list.ListItemContent @@ -42,13 +42,13 @@ import io.element.android.libraries.ui.strings.CommonStrings internal fun BlockUserSection(state: RoomMemberDetailsState, modifier: Modifier = Modifier) { PreferenceCategory(showDivider = false, modifier = modifier) { when (state.isBlocked) { - is Async.Failure -> PreferenceBlockUser(isBlocked = state.isBlocked.prevData, isLoading = false, eventSink = state.eventSink) - is Async.Loading -> PreferenceBlockUser(isBlocked = state.isBlocked.prevData, isLoading = true, eventSink = state.eventSink) - is Async.Success -> PreferenceBlockUser(isBlocked = state.isBlocked.data, isLoading = false, eventSink = state.eventSink) - Async.Uninitialized -> PreferenceBlockUser(isBlocked = null, isLoading = true, eventSink = state.eventSink) + is AsyncData.Failure -> PreferenceBlockUser(isBlocked = state.isBlocked.prevData, isLoading = false, eventSink = state.eventSink) + is AsyncData.Loading -> PreferenceBlockUser(isBlocked = state.isBlocked.prevData, isLoading = true, eventSink = state.eventSink) + is AsyncData.Success -> PreferenceBlockUser(isBlocked = state.isBlocked.data, isLoading = false, eventSink = state.eventSink) + AsyncData.Uninitialized -> PreferenceBlockUser(isBlocked = null, isLoading = true, eventSink = state.eventSink) } } - if (state.isBlocked is Async.Failure) { + if (state.isBlocked is AsyncData.Failure) { RetryDialog( content = stringResource(CommonStrings.error_unknown), onDismiss = { state.eventSink(RoomMemberDetailsEvents.ClearBlockUserError) }, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt index 40df3791d4..f48ec727e1 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt @@ -29,7 +29,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.core.net.toUri -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.mimetype.MimeTypes @@ -116,7 +116,7 @@ class RoomDetailsEditPresenter @Inject constructor( } } - val saveAction: MutableState> = remember { mutableStateOf(Async.Uninitialized) } + val saveAction: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } val localCoroutineScope = rememberCoroutineScope() fun handleEvents(event: RoomDetailsEditEvents) { when (event) { @@ -136,7 +136,7 @@ class RoomDetailsEditPresenter @Inject constructor( is RoomDetailsEditEvents.UpdateRoomName -> roomName = event.name is RoomDetailsEditEvents.UpdateRoomTopic -> roomTopic = event.topic.takeUnless { it.isEmpty() } - RoomDetailsEditEvents.CancelSaveChanges -> saveAction.value = Async.Uninitialized + RoomDetailsEditEvents.CancelSaveChanges -> saveAction.value = AsyncData.Uninitialized } } @@ -156,7 +156,7 @@ class RoomDetailsEditPresenter @Inject constructor( ) } - private fun CoroutineScope.saveChanges(name: String, topic: String?, avatarUri: Uri?, action: MutableState>) = launch { + private fun CoroutineScope.saveChanges(name: String, topic: String?, avatarUri: Uri?, action: MutableState>) = launch { val results = mutableListOf>() suspend { if (topic.orEmpty().trim() != room.topic.orEmpty().trim()) { diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditState.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditState.kt index 9258d882fc..c7076bd67f 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditState.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditState.kt @@ -17,7 +17,7 @@ package io.element.android.features.roomdetails.impl.edit import android.net.Uri -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.ui.media.AvatarAction import io.element.android.libraries.permissions.api.PermissionsState import kotlinx.collections.immutable.ImmutableList @@ -32,7 +32,7 @@ data class RoomDetailsEditState( val canChangeAvatar: Boolean, val avatarActions: ImmutableList, val saveButtonEnabled: Boolean, - val saveAction: Async, + val saveAction: AsyncData, val cameraPermissionState: PermissionsState, val eventSink: (RoomDetailsEditEvents) -> Unit ) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditStateProvider.kt index 730acaa1c5..9d62760542 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditStateProvider.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditStateProvider.kt @@ -18,7 +18,7 @@ package io.element.android.features.roomdetails.impl.edit import android.net.Uri import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.permissions.api.aPermissionsState import kotlinx.collections.immutable.persistentListOf @@ -30,8 +30,8 @@ open class RoomDetailsEditStateProvider : PreviewParameterProvider>>(Async.Loading()) } + val roomMembers = remember { mutableStateOf>>(AsyncData.Loading()) } val selectedUsers = remember { mutableStateOf>(persistentListOf()) } val searchResults = remember { mutableStateOf>>(SearchBarResultState.NotSearching()) } var searchQuery by rememberSaveable { mutableStateOf("") } @@ -115,7 +115,7 @@ class RoomInviteMembersPresenter @Inject constructor( private suspend fun performSearch( searchResults: MutableState>>, - roomMembers: MutableState>>, + roomMembers: MutableState>>, selectedUsers: MutableState>, searchQuery: String, ) = withContext(coroutineDispatchers.io) { @@ -142,7 +142,7 @@ class RoomInviteMembersPresenter @Inject constructor( } } - private suspend fun fetchMembers(roomMembers: MutableState>>) { + private suspend fun fetchMembers(roomMembers: MutableState>>) { suspend { withContext(coroutineDispatchers.io) { roomMemberListDataSource.search("").toImmutableList() diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt index 49ae479d40..649d2d8482 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt @@ -25,7 +25,7 @@ import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.designsystem.theme.components.SearchBarResultState @@ -44,7 +44,7 @@ class RoomMemberListPresenter @Inject constructor( @Composable override fun present(): RoomMemberListState { - var roomMembers by remember { mutableStateOf>(Async.Loading()) } + var roomMembers by remember { mutableStateOf>(AsyncData.Loading()) } var searchQuery by rememberSaveable { mutableStateOf("") } var searchResults by remember { mutableStateOf>(SearchBarResultState.NotSearching()) @@ -59,7 +59,7 @@ class RoomMemberListPresenter @Inject constructor( LaunchedEffect(Unit) { withContext(coroutineDispatchers.io) { val members = roomMemberListDataSource.search("").groupBy { it.membership } - roomMembers = Async.Success( + roomMembers = AsyncData.Success( RoomMembers( invited = members.getOrDefault(RoomMembershipState.INVITE, emptyList()).toImmutableList(), joined = members.getOrDefault(RoomMembershipState.JOIN, emptyList()).toImmutableList(), diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListState.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListState.kt index f718db703b..aa2d94cc65 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListState.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListState.kt @@ -16,13 +16,13 @@ package io.element.android.features.roomdetails.impl.members -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.matrix.api.room.RoomMember import kotlinx.collections.immutable.ImmutableList data class RoomMemberListState( - val roomMembers: Async, + val roomMembers: AsyncData, val searchQuery: String, val searchResults: SearchBarResultState, val isSearchActive: Boolean, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListStateProvider.kt index 4954af8efc..a9e4037c3c 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListStateProvider.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListStateProvider.kt @@ -17,7 +17,7 @@ package io.element.android.features.roomdetails.impl.members import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.RoomMember @@ -28,14 +28,14 @@ internal class RoomMemberListStateProvider : PreviewParameterProvider get() = sequenceOf( aRoomMemberListState( - roomMembers = Async.Success( + roomMembers = AsyncData.Success( RoomMembers( invited = persistentListOf(aVictor(), aWalter()), joined = persistentListOf(anAlice(), aBob()), ) ) ), - aRoomMemberListState(roomMembers = Async.Loading()), + aRoomMemberListState(roomMembers = AsyncData.Loading()), aRoomMemberListState().copy(canInvite = true), aRoomMemberListState().copy(isSearchActive = false), aRoomMemberListState().copy(isSearchActive = true), @@ -59,7 +59,7 @@ internal class RoomMemberListStateProvider : PreviewParameterProvider = Async.Uninitialized, + roomMembers: AsyncData = AsyncData.Uninitialized, searchResults: SearchBarResultState = SearchBarResultState.NotSearching(), ) = RoomMemberListState( roomMembers = roomMembers, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt index 49de90a854..abd7d4130a 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt @@ -39,7 +39,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.features.roomdetails.impl.R -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.preview.ElementPreview @@ -103,7 +103,7 @@ fun RoomMemberListView( ) if (!state.isSearchActive) { - if (state.roomMembers is Async.Success) { + if (state.roomMembers is AsyncData.Success) { RoomMemberList( roomMembers = state.roomMembers.data, showMembersCount = true, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt index 3037136f63..73d5457f64 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt @@ -30,7 +30,7 @@ import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.anvilannotations.ContributesNode import io.element.android.features.roomdetails.impl.R import io.element.android.libraries.androidutils.system.startSharePlainTextIntent -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.architecture.inputs import io.element.android.libraries.di.RoomScope @@ -95,7 +95,7 @@ class RoomMemberDetailsNode @AssistedInject constructor( val state = presenter.present() LaunchedEffect(state.startDmActionState) { - if (state.startDmActionState is Async.Success) { + if (state.startDmActionState is AsyncData.Success) { onStartDM(state.startDmActionState.data) } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt index e82b5f0cb5..b2b64ea67e 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt @@ -29,7 +29,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.features.createroom.api.StartDMAction import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsState.ConfirmationDialog -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.matrix.api.MatrixClient @@ -56,14 +56,14 @@ class RoomMemberDetailsPresenter @AssistedInject constructor( val coroutineScope = rememberCoroutineScope() var confirmationDialog by remember { mutableStateOf(null) } val roomMember by room.getRoomMemberAsState(roomMemberId) - val startDmActionState: MutableState> = remember { mutableStateOf(Async.Uninitialized) } + val startDmActionState: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } // the room member is not really live... - val isBlocked: MutableState> = remember(roomMember) { + val isBlocked: MutableState> = remember(roomMember) { val isIgnored = roomMember?.isIgnored if (isIgnored == null) { - mutableStateOf(Async.Uninitialized) + mutableStateOf(AsyncData.Uninitialized) } else { - mutableStateOf(Async.Success(isIgnored)) + mutableStateOf(AsyncData.Success(isIgnored)) } } LaunchedEffect(Unit) { @@ -90,7 +90,7 @@ class RoomMemberDetailsPresenter @AssistedInject constructor( } RoomMemberDetailsEvents.ClearConfirmationDialog -> confirmationDialog = null RoomMemberDetailsEvents.ClearBlockUserError -> { - isBlocked.value = Async.Success(isBlocked.value.dataOrNull().orFalse()) + isBlocked.value = AsyncData.Success(isBlocked.value.dataOrNull().orFalse()) } RoomMemberDetailsEvents.StartDM -> { coroutineScope.launch { @@ -98,7 +98,7 @@ class RoomMemberDetailsPresenter @AssistedInject constructor( } } RoomMemberDetailsEvents.ClearStartDMState -> { - startDmActionState.value = Async.Uninitialized + startDmActionState.value = AsyncData.Uninitialized } } } @@ -127,30 +127,30 @@ class RoomMemberDetailsPresenter @AssistedInject constructor( ) } - private fun CoroutineScope.blockUser(userId: UserId, isBlockedState: MutableState>) = launch { - isBlockedState.value = Async.Loading(false) + private fun CoroutineScope.blockUser(userId: UserId, isBlockedState: MutableState>) = launch { + isBlockedState.value = AsyncData.Loading(false) client.ignoreUser(userId) .fold( onSuccess = { - isBlockedState.value = Async.Success(true) + isBlockedState.value = AsyncData.Success(true) room.updateMembers() }, onFailure = { - isBlockedState.value = Async.Failure(it, false) + isBlockedState.value = AsyncData.Failure(it, false) } ) } - private fun CoroutineScope.unblockUser(userId: UserId, isBlockedState: MutableState>) = launch { - isBlockedState.value = Async.Loading(true) + private fun CoroutineScope.unblockUser(userId: UserId, isBlockedState: MutableState>) = launch { + isBlockedState.value = AsyncData.Loading(true) client.unignoreUser(userId) .fold( onSuccess = { - isBlockedState.value = Async.Success(false) + isBlockedState.value = AsyncData.Success(false) room.updateMembers() }, onFailure = { - isBlockedState.value = Async.Failure(it, true) + isBlockedState.value = AsyncData.Failure(it, true) } ) } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsState.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsState.kt index ee9cfe388f..db7b926db9 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsState.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsState.kt @@ -16,15 +16,15 @@ package io.element.android.features.roomdetails.impl.members.details -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.core.RoomId data class RoomMemberDetailsState( val userId: String, val userName: String?, val avatarUrl: String?, - val isBlocked: Async, - val startDmActionState: Async, + val isBlocked: AsyncData, + val startDmActionState: AsyncData, val displayConfirmationDialog: ConfirmationDialog?, val isCurrentUser: Boolean, val eventSink: (RoomMemberDetailsEvents) -> Unit diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsStateProvider.kt index c5710986a6..b060d2de7c 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsStateProvider.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsStateProvider.kt @@ -17,18 +17,18 @@ package io.element.android.features.roomdetails.impl.members.details import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData open class RoomMemberDetailsStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aRoomMemberDetailsState(), aRoomMemberDetailsState().copy(userName = null), - aRoomMemberDetailsState().copy(isBlocked = Async.Success(true)), + aRoomMemberDetailsState().copy(isBlocked = AsyncData.Success(true)), aRoomMemberDetailsState().copy(displayConfirmationDialog = RoomMemberDetailsState.ConfirmationDialog.Block), aRoomMemberDetailsState().copy(displayConfirmationDialog = RoomMemberDetailsState.ConfirmationDialog.Unblock), - aRoomMemberDetailsState().copy(isBlocked = Async.Loading(true)), - aRoomMemberDetailsState().copy(startDmActionState = Async.Loading()), + aRoomMemberDetailsState().copy(isBlocked = AsyncData.Loading(true)), + aRoomMemberDetailsState().copy(startDmActionState = AsyncData.Loading()), // Add other states here ) } @@ -37,8 +37,8 @@ fun aRoomMemberDetailsState() = RoomMemberDetailsState( userId = "@daniel:domain.com", userName = "Daniel", avatarUrl = null, - isBlocked = Async.Success(false), - startDmActionState = Async.Uninitialized, + isBlocked = AsyncData.Success(false), + startDmActionState = AsyncData.Uninitialized, displayConfirmationDialog = null, isCurrentUser = false, eventSink = {}, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsPresenter.kt index c3994e160c..31621fb648 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsPresenter.kt @@ -28,7 +28,7 @@ import androidx.compose.runtime.setValue import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService @@ -61,11 +61,11 @@ class RoomNotificationSettingsPresenter @AssistedInject constructor( mutableStateOf(null) } val localCoroutineScope = rememberCoroutineScope() - val setNotificationSettingAction: MutableState> = remember { mutableStateOf(Async.Uninitialized) } - val restoreDefaultAction: MutableState> = remember { mutableStateOf(Async.Uninitialized) } + val setNotificationSettingAction: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } + val restoreDefaultAction: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } - val roomNotificationSettings: MutableState> = remember { - mutableStateOf(Async.Uninitialized) + val roomNotificationSettings: MutableState> = remember { + mutableStateOf(AsyncData.Uninitialized) } // We store state of which mode the user has set via the notification service before the new push settings have been updated. @@ -111,10 +111,10 @@ class RoomNotificationSettingsPresenter @AssistedInject constructor( localCoroutineScope.restoreDefaultRoomNotificationMode(restoreDefaultAction, pendingSetDefault) } RoomNotificationSettingsEvents.ClearSetNotificationError -> { - setNotificationSettingAction.value = Async.Uninitialized + setNotificationSettingAction.value = AsyncData.Uninitialized } RoomNotificationSettingsEvents.ClearRestoreDefaultError -> { - restoreDefaultAction.value = Async.Uninitialized + restoreDefaultAction.value = AsyncData.Uninitialized } } } @@ -136,7 +136,7 @@ class RoomNotificationSettingsPresenter @AssistedInject constructor( @OptIn(FlowPreview::class) private fun CoroutineScope.observeNotificationSettings( pendingModeState: MutableState, - roomNotificationSettings: MutableState> + roomNotificationSettings: MutableState> ) { notificationSettingsService.notificationSettingsChangeFlow .debounce(0.5.seconds) @@ -148,7 +148,7 @@ class RoomNotificationSettingsPresenter @AssistedInject constructor( private fun CoroutineScope.fetchNotificationSettings( pendingModeState: MutableState, - roomNotificationSettings: MutableState> + roomNotificationSettings: MutableState> ) = launch { suspend { pendingModeState.value = null @@ -169,7 +169,7 @@ class RoomNotificationSettingsPresenter @AssistedInject constructor( mode: RoomNotificationMode, pendingModeState: MutableState, pendingDefaultState: MutableState, - action: MutableState> + action: MutableState> ) = launch { suspend { pendingModeState.value = mode @@ -184,7 +184,7 @@ class RoomNotificationSettingsPresenter @AssistedInject constructor( } private fun CoroutineScope.restoreDefaultRoomNotificationMode( - action: MutableState>, + action: MutableState>, pendingDefaultState: MutableState ) = launch { suspend { diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsState.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsState.kt index 4c23c0e2ae..a009e5b4e5 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsState.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsState.kt @@ -16,19 +16,19 @@ package io.element.android.features.roomdetails.impl.notificationsettings -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.room.RoomNotificationMode import io.element.android.libraries.matrix.api.room.RoomNotificationSettings data class RoomNotificationSettingsState( val showUserDefinedSettingStyle: Boolean, val roomName: String, - val roomNotificationSettings: Async, + val roomNotificationSettings: AsyncData, val pendingRoomNotificationMode: RoomNotificationMode?, val pendingSetDefault: Boolean?, val defaultRoomNotificationMode: RoomNotificationMode?, - val setNotificationSettingAction: Async, - val restoreDefaultAction: Async, + val setNotificationSettingAction: AsyncData, + val restoreDefaultAction: AsyncData, val displayMentionsOnlyDisclaimer: Boolean, val eventSink: (RoomNotificationSettingsEvents) -> Unit ) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsStateProvider.kt index aee68383f7..5b4fac7b0d 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsStateProvider.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsStateProvider.kt @@ -17,7 +17,7 @@ package io.element.android.features.roomdetails.impl.notificationsettings import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.room.RoomNotificationMode import io.element.android.libraries.matrix.api.room.RoomNotificationSettings @@ -26,23 +26,23 @@ internal class RoomNotificationSettingsStateProvider : PreviewParameterProvider< get() = sequenceOf( aRoomNotificationSettingsState(), aRoomNotificationSettingsState(isDefault = false), - aRoomNotificationSettingsState(setNotificationSettingAction = Async.Loading(Unit)), - aRoomNotificationSettingsState(setNotificationSettingAction = Async.Failure(Throwable("error"))), - aRoomNotificationSettingsState(restoreDefaultAction = Async.Loading(Unit)), - aRoomNotificationSettingsState(restoreDefaultAction = Async.Failure(Throwable("error"))), + aRoomNotificationSettingsState(setNotificationSettingAction = AsyncData.Loading(Unit)), + aRoomNotificationSettingsState(setNotificationSettingAction = AsyncData.Failure(Throwable("error"))), + aRoomNotificationSettingsState(restoreDefaultAction = AsyncData.Loading(Unit)), + aRoomNotificationSettingsState(restoreDefaultAction = AsyncData.Failure(Throwable("error"))), aRoomNotificationSettingsState(displayMentionsOnlyDisclaimer = true) ) private fun aRoomNotificationSettingsState( isDefault: Boolean = true, - setNotificationSettingAction: Async = Async.Uninitialized, - restoreDefaultAction: Async = Async.Uninitialized, + setNotificationSettingAction: AsyncData = AsyncData.Uninitialized, + restoreDefaultAction: AsyncData = AsyncData.Uninitialized, displayMentionsOnlyDisclaimer: Boolean = false, ): RoomNotificationSettingsState { return RoomNotificationSettingsState( showUserDefinedSettingStyle = false, roomName = "Room 1", - Async.Success(RoomNotificationSettings( + AsyncData.Success(RoomNotificationSettings( mode = RoomNotificationMode.MUTE, isDefault = isDefault)), pendingRoomNotificationMode = null, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/UserDefinedRoomNotificationSettingsStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/UserDefinedRoomNotificationSettingsStateProvider.kt index a3ff7f23d7..26f201d949 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/UserDefinedRoomNotificationSettingsStateProvider.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/UserDefinedRoomNotificationSettingsStateProvider.kt @@ -17,7 +17,7 @@ package io.element.android.features.roomdetails.impl.notificationsettings import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.room.RoomNotificationMode import io.element.android.libraries.matrix.api.room.RoomNotificationSettings @@ -27,7 +27,7 @@ internal class UserDefinedRoomNotificationSettingsStateProvider : PreviewParamet RoomNotificationSettingsState( showUserDefinedSettingStyle = false, roomName = "Room 1", - Async.Success( + AsyncData.Success( RoomNotificationSettings( mode = RoomNotificationMode.MUTE, isDefault = false) @@ -35,8 +35,8 @@ internal class UserDefinedRoomNotificationSettingsStateProvider : PreviewParamet pendingRoomNotificationMode = null, pendingSetDefault = null, defaultRoomNotificationMode = RoomNotificationMode.ALL_MESSAGES, - setNotificationSettingAction = Async.Uninitialized, - restoreDefaultAction = Async.Uninitialized, + setNotificationSettingAction = AsyncData.Uninitialized, + restoreDefaultAction = AsyncData.Uninitialized, displayMentionsOnlyDisclaimer = false, eventSink = { }, ), diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/edit/RoomDetailsEditPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/edit/RoomDetailsEditPresenterTest.kt index 2c1b399da8..d6a325b51d 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/edit/RoomDetailsEditPresenterTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/edit/RoomDetailsEditPresenterTest.kt @@ -24,7 +24,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.roomdetails.aMatrixRoom import io.element.android.features.roomdetails.impl.edit.RoomDetailsEditEvents import io.element.android.features.roomdetails.impl.edit.RoomDetailsEditPresenter -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.StateEventType import io.element.android.libraries.matrix.test.AN_AVATAR_URL @@ -108,7 +108,7 @@ class RoomDetailsEditPresenterTest { AvatarAction.Remove ) assertThat(initialState.saveButtonEnabled).isFalse() - assertThat(initialState.saveAction).isInstanceOf(Async.Uninitialized::class.java) + assertThat(initialState.saveAction).isInstanceOf(AsyncData.Uninitialized::class.java) } } @@ -533,7 +533,7 @@ class RoomDetailsEditPresenterTest { assertThat(room.newAvatarData).isNull() assertThat(room.removedAvatar).isFalse() - assertThat(awaitItem().saveAction).isInstanceOf(Async.Failure::class.java) + assertThat(awaitItem().saveAction).isInstanceOf(AsyncData.Failure::class.java) } } @@ -594,10 +594,10 @@ class RoomDetailsEditPresenterTest { initialState.eventSink(RoomDetailsEditEvents.Save) skipItems(2) - assertThat(awaitItem().saveAction).isInstanceOf(Async.Failure::class.java) + assertThat(awaitItem().saveAction).isInstanceOf(AsyncData.Failure::class.java) initialState.eventSink(RoomDetailsEditEvents.CancelSaveChanges) - assertThat(awaitItem().saveAction).isInstanceOf(Async.Uninitialized::class.java) + assertThat(awaitItem().saveAction).isInstanceOf(AsyncData.Uninitialized::class.java) } } @@ -613,8 +613,8 @@ class RoomDetailsEditPresenterTest { initialState.eventSink(RoomDetailsEditEvents.Save) skipItems(1) - assertThat(awaitItem().saveAction).isInstanceOf(Async.Loading::class.java) - assertThat(awaitItem().saveAction).isInstanceOf(Async.Failure::class.java) + assertThat(awaitItem().saveAction).isInstanceOf(AsyncData.Loading::class.java) + assertThat(awaitItem().saveAction).isInstanceOf(AsyncData.Failure::class.java) } } diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/members/RoomMemberListPresenterTests.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/members/RoomMemberListPresenterTests.kt index 097919a5e1..1b5ae74765 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/members/RoomMemberListPresenterTests.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/members/RoomMemberListPresenterTests.kt @@ -26,7 +26,7 @@ import io.element.android.features.roomdetails.impl.members.RoomMemberListPresen import io.element.android.features.roomdetails.impl.members.aRoomMemberList import io.element.android.features.roomdetails.impl.members.aVictor import io.element.android.features.roomdetails.impl.members.aWalter -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.matrix.api.room.MatrixRoom @@ -53,14 +53,14 @@ class RoomMemberListPresenterTests { presenter.present() }.test { val initialState = awaitItem() - assertThat(initialState.roomMembers).isInstanceOf(Async.Loading::class.java) + assertThat(initialState.roomMembers).isInstanceOf(AsyncData.Loading::class.java) assertThat(initialState.searchQuery).isEmpty() assertThat(initialState.searchResults).isInstanceOf(SearchBarResultState.NotSearching::class.java) assertThat(initialState.isSearchActive).isFalse() val loadedState = awaitItem() - assertThat(loadedState.roomMembers).isInstanceOf(Async.Success::class.java) - assertThat((loadedState.roomMembers as Async.Success).data.invited).isEqualTo(listOf(aVictor(), aWalter())) - assertThat((loadedState.roomMembers as Async.Success).data.joined).isNotEmpty() + assertThat(loadedState.roomMembers).isInstanceOf(AsyncData.Success::class.java) + assertThat((loadedState.roomMembers as AsyncData.Success).data.invited).isEqualTo(listOf(aVictor(), aWalter())) + assertThat((loadedState.roomMembers as AsyncData.Success).data.joined).isNotEmpty() } } diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/members/details/RoomMemberDetailsPresenterTests.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/members/details/RoomMemberDetailsPresenterTests.kt index ac429e262d..f386c0e887 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/members/details/RoomMemberDetailsPresenterTests.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/members/details/RoomMemberDetailsPresenterTests.kt @@ -27,7 +27,7 @@ import io.element.android.features.roomdetails.impl.members.aRoomMember import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsEvents import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsPresenter import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsState -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.room.MatrixRoom @@ -68,7 +68,7 @@ class RoomMemberDetailsPresenterTests { assertThat(initialState.userId).isEqualTo(roomMember.userId.value) assertThat(initialState.userName).isEqualTo(roomMember.displayName) assertThat(initialState.avatarUrl).isEqualTo(roomMember.avatarUrl) - assertThat(initialState.isBlocked).isEqualTo(Async.Success(roomMember.isIgnored)) + assertThat(initialState.isBlocked).isEqualTo(AsyncData.Success(roomMember.isIgnored)) skipItems(1) val loadedState = awaitItem() assertThat(loadedState.userName).isEqualTo("A custom name") @@ -173,7 +173,7 @@ class RoomMemberDetailsPresenterTests { assertThat(errorState.isBlocked.errorOrNull()).isEqualTo(A_THROWABLE) // Clear error initialState.eventSink(RoomMemberDetailsEvents.ClearBlockUserError) - assertThat(awaitItem().isBlocked).isEqualTo(Async.Success(false)) + assertThat(awaitItem().isBlocked).isEqualTo(AsyncData.Success(false)) } } @@ -204,14 +204,14 @@ class RoomMemberDetailsPresenterTests { presenter.present() }.test { val initialState = awaitItem() - assertThat(initialState.startDmActionState).isInstanceOf(Async.Uninitialized::class.java) - val startDMSuccessResult = Async.Success(A_ROOM_ID) - val startDMFailureResult = Async.Failure(A_THROWABLE) + assertThat(initialState.startDmActionState).isInstanceOf(AsyncData.Uninitialized::class.java) + val startDMSuccessResult = AsyncData.Success(A_ROOM_ID) + val startDMFailureResult = AsyncData.Failure(A_THROWABLE) // Failure startDMAction.givenExecuteResult(startDMFailureResult) initialState.eventSink(RoomMemberDetailsEvents.StartDM) - assertThat(awaitItem().startDmActionState).isInstanceOf(Async.Loading::class.java) + assertThat(awaitItem().startDmActionState).isInstanceOf(AsyncData.Loading::class.java) awaitItem().also { state -> assertThat(state.startDmActionState).isEqualTo(startDMFailureResult) state.eventSink(RoomMemberDetailsEvents.ClearStartDMState) @@ -220,10 +220,10 @@ class RoomMemberDetailsPresenterTests { // Success startDMAction.givenExecuteResult(startDMSuccessResult) awaitItem().also { state -> - assertThat(state.startDmActionState).isEqualTo(Async.Uninitialized) + assertThat(state.startDmActionState).isEqualTo(AsyncData.Uninitialized) state.eventSink(RoomMemberDetailsEvents.StartDM) } - assertThat(awaitItem().startDmActionState).isInstanceOf(Async.Loading::class.java) + assertThat(awaitItem().startDmActionState).isInstanceOf(AsyncData.Loading::class.java) awaitItem().also { state -> assertThat(state.startDmActionState).isEqualTo(startDMSuccessResult) } diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisablePresenter.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisablePresenter.kt index 60b4691661..bb9cfb8a0a 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisablePresenter.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisablePresenter.kt @@ -25,7 +25,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import io.element.android.features.securebackup.impl.loggerTagDisable -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.meta.BuildMeta @@ -44,7 +44,7 @@ class SecureBackupDisablePresenter @Inject constructor( override fun present(): SecureBackupDisableState { val backupState by encryptionService.backupStateStateFlow.collectAsState() Timber.tag(loggerTagDisable.value).d("backupState: $backupState") - val disableAction = remember { mutableStateOf>(Async.Uninitialized) } + val disableAction = remember { mutableStateOf>(AsyncData.Uninitialized) } val coroutineScope = rememberCoroutineScope() var showDialog by remember { mutableStateOf(false) } fun handleEvents(event: SecureBackupDisableEvents) { @@ -57,7 +57,7 @@ class SecureBackupDisablePresenter @Inject constructor( } SecureBackupDisableEvents.DismissDialogs -> { showDialog = false - disableAction.value = Async.Uninitialized + disableAction.value = AsyncData.Uninitialized } } } @@ -71,7 +71,7 @@ class SecureBackupDisablePresenter @Inject constructor( ) } - private fun CoroutineScope.disableBackup(disableAction: MutableState>) = launch { + private fun CoroutineScope.disableBackup(disableAction: MutableState>) = launch { suspend { Timber.tag(loggerTagDisable.value).d("Calling encryptionService.disableRecovery()") encryptionService.disableRecovery().getOrThrow() diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableState.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableState.kt index 41e39c398e..3698752749 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableState.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableState.kt @@ -16,12 +16,12 @@ package io.element.android.features.securebackup.impl.disable -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.encryption.BackupState data class SecureBackupDisableState( val backupState: BackupState, - val disableAction: Async, + val disableAction: AsyncData, val showConfirmationDialog: Boolean, val appName: String, val eventSink: (SecureBackupDisableEvents) -> Unit diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableStateProvider.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableStateProvider.kt index 8c22e36968..44bee84d2d 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableStateProvider.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableStateProvider.kt @@ -17,7 +17,7 @@ package io.element.android.features.securebackup.impl.disable import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.encryption.BackupState open class SecureBackupDisableStateProvider : PreviewParameterProvider { @@ -25,15 +25,15 @@ open class SecureBackupDisableStateProvider : PreviewParameterProvider = Async.Uninitialized, + disableAction: AsyncData = AsyncData.Uninitialized, showConfirmationDialog: Boolean = false, ) = SecureBackupDisableState( backupState = backupState, diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableView.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableView.kt index 4f515fd841..6d972223a8 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableView.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableView.kt @@ -34,7 +34,7 @@ import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.features.securebackup.impl.R -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.atomic.pages.FlowStepPage import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog @@ -53,7 +53,7 @@ fun SecureBackupDisableView( modifier: Modifier = Modifier, ) { LaunchedEffect(state.disableAction) { - if (state.disableAction is Async.Success) { + if (state.disableAction is AsyncData.Success) { onDone() } } @@ -72,7 +72,7 @@ fun SecureBackupDisableView( onConfirm = { state.eventSink.invoke(SecureBackupDisableEvents.DisableBackup(force = true)) }, onDismiss = { state.eventSink.invoke(SecureBackupDisableEvents.DismissDialogs) }, ) - } else if (state.disableAction is Async.Failure) { + } else if (state.disableAction is AsyncData.Failure) { ErrorDialog( content = state.disableAction.error.let { it.message ?: it.toString() }, onDismiss = { state.eventSink.invoke(SecureBackupDisableEvents.DismissDialogs) }, diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnablePresenter.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnablePresenter.kt index dfceb16dea..3ce99ff353 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnablePresenter.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnablePresenter.kt @@ -22,7 +22,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import io.element.android.features.securebackup.impl.loggerTagDisable -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.matrix.api.encryption.EncryptionService @@ -37,14 +37,14 @@ class SecureBackupEnablePresenter @Inject constructor( @Composable override fun present(): SecureBackupEnableState { - val enableAction = remember { mutableStateOf>(Async.Uninitialized) } + val enableAction = remember { mutableStateOf>(AsyncData.Uninitialized) } val coroutineScope = rememberCoroutineScope() fun handleEvents(event: SecureBackupEnableEvents) { when (event) { is SecureBackupEnableEvents.EnableBackup -> coroutineScope.enableBackup(enableAction) SecureBackupEnableEvents.DismissDialog -> { - enableAction.value = Async.Uninitialized + enableAction.value = AsyncData.Uninitialized } } } @@ -55,7 +55,7 @@ class SecureBackupEnablePresenter @Inject constructor( ) } - private fun CoroutineScope.enableBackup(action: MutableState>) = launch { + private fun CoroutineScope.enableBackup(action: MutableState>) = launch { suspend { Timber.tag(loggerTagDisable.value).d("Calling encryptionService.enableBackups()") encryptionService.enableBackups().getOrThrow() diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnableState.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnableState.kt index 7c3aaf839b..bd81004f9c 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnableState.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnableState.kt @@ -16,9 +16,9 @@ package io.element.android.features.securebackup.impl.enable -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData data class SecureBackupEnableState( - val enableAction: Async, + val enableAction: AsyncData, val eventSink: (SecureBackupEnableEvents) -> Unit ) diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnableStateProvider.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnableStateProvider.kt index 494c45b5b4..1029278c05 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnableStateProvider.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnableStateProvider.kt @@ -17,20 +17,20 @@ package io.element.android.features.securebackup.impl.enable import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData open class SecureBackupEnableStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aSecureBackupEnableState(), - aSecureBackupEnableState(enableAction = Async.Loading()), - aSecureBackupEnableState(enableAction = Async.Failure(Exception("Failed to enable"))), + aSecureBackupEnableState(enableAction = AsyncData.Loading()), + aSecureBackupEnableState(enableAction = AsyncData.Failure(Exception("Failed to enable"))), // Add other states here ) } fun aSecureBackupEnableState( - enableAction: Async = Async.Uninitialized, + enableAction: AsyncData = AsyncData.Uninitialized, ) = SecureBackupEnableState( enableAction = enableAction, eventSink = {} diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnableView.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnableView.kt index d97fc735d8..37a46a1408 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnableView.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnableView.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.PreviewParameter import io.element.android.features.securebackup.impl.R -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.atomic.pages.FlowStepPage import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog import io.element.android.libraries.designsystem.preview.ElementPreview @@ -42,7 +42,7 @@ fun SecureBackupEnableView( modifier: Modifier = Modifier, ) { LaunchedEffect(state.enableAction) { - if (state.enableAction is Async.Success) { + if (state.enableAction is AsyncData.Success) { onDone() } } @@ -53,7 +53,7 @@ fun SecureBackupEnableView( iconVector = ImageVector.vectorResource(CommonDrawables.ic_key), buttons = { Buttons(state = state) } ) - if (state.enableAction is Async.Failure) { + if (state.enableAction is AsyncData.Failure) { ErrorDialog( content = state.enableAction.error.let { it.message ?: it.toString() }, onDismiss = { state.eventSink.invoke(SecureBackupEnableEvents.DismissDialog) }, diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyPresenter.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyPresenter.kt index 9207dbef79..f79176b3a9 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyPresenter.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyPresenter.kt @@ -27,7 +27,7 @@ import androidx.compose.runtime.setValue import io.element.android.features.securebackup.impl.setup.views.RecoveryKeyUserStory import io.element.android.features.securebackup.impl.setup.views.RecoveryKeyViewState import io.element.android.features.securebackup.impl.tools.RecoveryKeyTools -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.matrix.api.encryption.EncryptionService @@ -47,13 +47,13 @@ class SecureBackupEnterRecoveryKeyPresenter @Inject constructor( mutableStateOf("") } val submitAction = remember { - mutableStateOf>(Async.Uninitialized) + mutableStateOf>(AsyncData.Uninitialized) } fun handleEvents(event: SecureBackupEnterRecoveryKeyEvents) { when (event) { SecureBackupEnterRecoveryKeyEvents.ClearDialog -> { - submitAction.value = Async.Uninitialized + submitAction.value = AsyncData.Uninitialized } is SecureBackupEnterRecoveryKeyEvents.OnRecoveryKeyChange -> { val previousRecoveryKey = recoveryKey @@ -86,7 +86,7 @@ class SecureBackupEnterRecoveryKeyPresenter @Inject constructor( private fun CoroutineScope.submitRecoveryKey( recoveryKey: String, - action: MutableState> + action: MutableState> ) = launch { suspend { encryptionService.recover(recoveryKey).getOrThrow() diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyState.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyState.kt index c9a631c11c..9f00714f38 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyState.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyState.kt @@ -17,12 +17,12 @@ package io.element.android.features.securebackup.impl.enter import io.element.android.features.securebackup.impl.setup.views.RecoveryKeyViewState -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData // Do not use default value, so no member get forgotten in the presenters. data class SecureBackupEnterRecoveryKeyState( val recoveryKeyViewState: RecoveryKeyViewState, val isSubmitEnabled: Boolean, - val submitAction: Async, + val submitAction: AsyncData, val eventSink: (SecureBackupEnterRecoveryKeyEvents) -> Unit ) diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyStateProvider.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyStateProvider.kt index 375eafef73..6350eeb696 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyStateProvider.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyStateProvider.kt @@ -20,22 +20,22 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.securebackup.impl.setup.views.RecoveryKeyUserStory import io.element.android.features.securebackup.impl.setup.views.RecoveryKeyViewState import io.element.android.features.securebackup.impl.setup.views.aFormattedRecoveryKey -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData open class SecureBackupEnterRecoveryKeyStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aSecureBackupEnterRecoveryKeyState(recoveryKey = ""), aSecureBackupEnterRecoveryKeyState(), - aSecureBackupEnterRecoveryKeyState(submitAction = Async.Loading()), - aSecureBackupEnterRecoveryKeyState(submitAction = Async.Failure(Exception("A Failure"))), + aSecureBackupEnterRecoveryKeyState(submitAction = AsyncData.Loading()), + aSecureBackupEnterRecoveryKeyState(submitAction = AsyncData.Failure(Exception("A Failure"))), ) } fun aSecureBackupEnterRecoveryKeyState( recoveryKey: String = aFormattedRecoveryKey(), isSubmitEnabled: Boolean = recoveryKey.isNotEmpty(), - submitAction: Async = Async.Uninitialized, + submitAction: AsyncData = AsyncData.Uninitialized, ) = SecureBackupEnterRecoveryKeyState( recoveryKeyViewState = RecoveryKeyViewState( recoveryKeyUserStory = RecoveryKeyUserStory.Enter, diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootPresenter.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootPresenter.kt index 9036200ac9..ca60f7d32f 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootPresenter.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootPresenter.kt @@ -25,7 +25,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import io.element.android.features.securebackup.impl.loggerTagRoot -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.meta.BuildMeta @@ -55,7 +55,7 @@ class SecureBackupRootPresenter @Inject constructor( Timber.tag(loggerTagRoot.value).d("backupState: $backupState") Timber.tag(loggerTagRoot.value).d("recoveryState: $recoveryState") - val doesBackupExistOnServerAction: MutableState> = remember { mutableStateOf(Async.Uninitialized) } + val doesBackupExistOnServerAction: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } LaunchedEffect(backupState) { if (backupState == BackupState.UNKNOWN) { @@ -79,7 +79,7 @@ class SecureBackupRootPresenter @Inject constructor( ) } - private fun CoroutineScope.getKeyBackupStatus(action: MutableState>) = launch { + private fun CoroutineScope.getKeyBackupStatus(action: MutableState>) = launch { suspend { encryptionService.doesBackupExistOnServer().getOrThrow() }.runCatchingUpdatingState(action) diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootState.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootState.kt index e2c6c1154c..0d57ebbf46 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootState.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootState.kt @@ -16,14 +16,14 @@ package io.element.android.features.securebackup.impl.root -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage import io.element.android.libraries.matrix.api.encryption.BackupState import io.element.android.libraries.matrix.api.encryption.RecoveryState data class SecureBackupRootState( val backupState: BackupState, - val doesBackupExistOnServer: Async, + val doesBackupExistOnServer: AsyncData, val recoveryState: RecoveryState, val appName: String, val snackbarMessage: SnackbarMessage?, diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootStateProvider.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootStateProvider.kt index ae8b2aa63b..beb54101ff 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootStateProvider.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootStateProvider.kt @@ -17,7 +17,7 @@ package io.element.android.features.securebackup.impl.root import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage import io.element.android.libraries.matrix.api.encryption.BackupState import io.element.android.libraries.matrix.api.encryption.RecoveryState @@ -25,10 +25,10 @@ import io.element.android.libraries.matrix.api.encryption.RecoveryState open class SecureBackupRootStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( - aSecureBackupRootState(backupState = BackupState.UNKNOWN, doesBackupExistOnServer = Async.Uninitialized), - aSecureBackupRootState(backupState = BackupState.UNKNOWN, doesBackupExistOnServer = Async.Success(true)), - aSecureBackupRootState(backupState = BackupState.UNKNOWN, doesBackupExistOnServer = Async.Success(false)), - aSecureBackupRootState(backupState = BackupState.UNKNOWN, doesBackupExistOnServer = Async.Failure(Exception("An error"))), + aSecureBackupRootState(backupState = BackupState.UNKNOWN, doesBackupExistOnServer = AsyncData.Uninitialized), + aSecureBackupRootState(backupState = BackupState.UNKNOWN, doesBackupExistOnServer = AsyncData.Success(true)), + aSecureBackupRootState(backupState = BackupState.UNKNOWN, doesBackupExistOnServer = AsyncData.Success(false)), + aSecureBackupRootState(backupState = BackupState.UNKNOWN, doesBackupExistOnServer = AsyncData.Failure(Exception("An error"))), aSecureBackupRootState(backupState = BackupState.ENABLED), aSecureBackupRootState(recoveryState = RecoveryState.UNKNOWN), aSecureBackupRootState(recoveryState = RecoveryState.ENABLED), @@ -40,7 +40,7 @@ open class SecureBackupRootStateProvider : PreviewParameterProvider = Async.Uninitialized, + doesBackupExistOnServer: AsyncData = AsyncData.Uninitialized, recoveryState: RecoveryState = RecoveryState.UNKNOWN, snackbarMessage: SnackbarMessage? = null, ) = SecureBackupRootState( diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootView.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootView.kt index d4033f1297..54c37761ed 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootView.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootView.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter import io.element.android.features.securebackup.impl.R -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.async.AsyncLoading import io.element.android.libraries.designsystem.components.list.ListItemContent import io.element.android.libraries.designsystem.components.preferences.PreferenceDivider @@ -82,7 +82,7 @@ fun SecureBackupRootView( BackupState.WAITING_FOR_SYNC -> Unit BackupState.UNKNOWN -> { when (state.doesBackupExistOnServer) { - is Async.Success -> when (state.doesBackupExistOnServer.data) { + is AsyncData.Success -> when (state.doesBackupExistOnServer.data) { true -> { PreferenceText( title = stringResource(id = R.string.screen_chat_backup_key_backup_action_disable), @@ -97,8 +97,8 @@ fun SecureBackupRootView( ) } } - is Async.Loading, - Async.Uninitialized -> { + is AsyncData.Loading, + AsyncData.Uninitialized -> { ListItem(headlineContent = { Row( modifier = Modifier.fillMaxWidth(), @@ -108,7 +108,7 @@ fun SecureBackupRootView( } }) } - is Async.Failure -> { + is AsyncData.Failure -> { ListItem( headlineContent = { Text( diff --git a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisablePresenterTest.kt b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisablePresenterTest.kt index 8e42ee7efe..32847fc66c 100644 --- a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisablePresenterTest.kt +++ b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisablePresenterTest.kt @@ -20,7 +20,7 @@ import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.encryption.BackupState import io.element.android.libraries.matrix.api.encryption.EncryptionService import io.element.android.libraries.matrix.test.core.aBuildMeta @@ -42,7 +42,7 @@ class SecureBackupDisablePresenterTest { }.test { val initialState = awaitItem() assertThat(initialState.backupState).isEqualTo(BackupState.UNKNOWN) - assertThat(initialState.disableAction).isEqualTo(Async.Uninitialized) + assertThat(initialState.disableAction).isEqualTo(AsyncData.Uninitialized) assertThat(initialState.showConfirmationDialog).isFalse() assertThat(initialState.appName).isEqualTo("Element") } @@ -80,9 +80,9 @@ class SecureBackupDisablePresenterTest { skipItems(1) val loadingState = awaitItem() assertThat(loadingState.showConfirmationDialog).isFalse() - assertThat(loadingState.disableAction).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.disableAction).isInstanceOf(AsyncData.Loading::class.java) val finalState = awaitItem() - assertThat(finalState.disableAction).isEqualTo(Async.Success(Unit)) + assertThat(finalState.disableAction).isEqualTo(AsyncData.Success(Unit)) } } @@ -106,12 +106,12 @@ class SecureBackupDisablePresenterTest { skipItems(1) val loadingState = awaitItem() assertThat(loadingState.showConfirmationDialog).isFalse() - assertThat(loadingState.disableAction).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.disableAction).isInstanceOf(AsyncData.Loading::class.java) val errorState = awaitItem() - assertThat(errorState.disableAction).isInstanceOf(Async.Failure::class.java) + assertThat(errorState.disableAction).isInstanceOf(AsyncData.Failure::class.java) errorState.eventSink(SecureBackupDisableEvents.DismissDialogs) val finalState = awaitItem() - assertThat(finalState.disableAction).isEqualTo(Async.Uninitialized) + assertThat(finalState.disableAction).isEqualTo(AsyncData.Uninitialized) } } diff --git a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnablePresenterTest.kt b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnablePresenterTest.kt index 7bc051662b..39d8ebf81f 100644 --- a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnablePresenterTest.kt +++ b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/enable/SecureBackupEnablePresenterTest.kt @@ -20,7 +20,7 @@ import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.encryption.EncryptionService import io.element.android.libraries.matrix.test.AN_EXCEPTION import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService @@ -40,7 +40,7 @@ class SecureBackupEnablePresenterTest { presenter.present() }.test { val initialState = awaitItem() - assertThat(initialState.enableAction).isEqualTo(Async.Uninitialized) + assertThat(initialState.enableAction).isEqualTo(AsyncData.Uninitialized) } } @@ -53,9 +53,9 @@ class SecureBackupEnablePresenterTest { val initialState = awaitItem() initialState.eventSink(SecureBackupEnableEvents.EnableBackup) val loadingState = awaitItem() - assertThat(loadingState.enableAction).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.enableAction).isInstanceOf(AsyncData.Loading::class.java) val finalState = awaitItem() - assertThat(finalState.enableAction).isEqualTo(Async.Success(Unit)) + assertThat(finalState.enableAction).isEqualTo(AsyncData.Success(Unit)) } } @@ -70,12 +70,12 @@ class SecureBackupEnablePresenterTest { val initialState = awaitItem() initialState.eventSink(SecureBackupEnableEvents.EnableBackup) val loadingState = awaitItem() - assertThat(loadingState.enableAction).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.enableAction).isInstanceOf(AsyncData.Loading::class.java) val errorState = awaitItem() - assertThat(errorState.enableAction).isEqualTo(Async.Failure(AN_EXCEPTION)) + assertThat(errorState.enableAction).isEqualTo(AsyncData.Failure(AN_EXCEPTION)) errorState.eventSink(SecureBackupEnableEvents.DismissDialog) val finalState = awaitItem() - assertThat(finalState.enableAction).isEqualTo(Async.Uninitialized) + assertThat(finalState.enableAction).isEqualTo(AsyncData.Uninitialized) } } diff --git a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyPresenterTest.kt b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyPresenterTest.kt index 862cbbde72..50da0728c4 100644 --- a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyPresenterTest.kt +++ b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyPresenterTest.kt @@ -23,7 +23,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.securebackup.impl.setup.views.RecoveryKeyUserStory import io.element.android.features.securebackup.impl.setup.views.RecoveryKeyViewState import io.element.android.features.securebackup.impl.tools.RecoveryKeyTools -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.encryption.EncryptionService import io.element.android.libraries.matrix.test.AN_EXCEPTION import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService @@ -44,7 +44,7 @@ class SecureBackupEnterRecoveryKeyPresenterTest { }.test { val initialState = awaitItem() assertThat(initialState.isSubmitEnabled).isFalse() - assertThat(initialState.submitAction).isEqualTo(Async.Uninitialized) + assertThat(initialState.submitAction).isEqualTo(AsyncData.Uninitialized) assertThat(initialState.recoveryKeyViewState).isEqualTo( RecoveryKeyViewState( recoveryKeyUserStory = RecoveryKeyUserStory.Enter, @@ -76,22 +76,22 @@ class SecureBackupEnterRecoveryKeyPresenterTest { encryptionService.givenRecoverFailure(AN_EXCEPTION) withRecoveryKeyState.eventSink(SecureBackupEnterRecoveryKeyEvents.Submit) val loadingState = awaitItem() - assertThat(loadingState.submitAction).isEqualTo(Async.Loading()) + assertThat(loadingState.submitAction).isEqualTo(AsyncData.Loading()) assertThat(loadingState.isSubmitEnabled).isFalse() val errorState = awaitItem() - assertThat(errorState.submitAction).isEqualTo(Async.Failure(AN_EXCEPTION)) + assertThat(errorState.submitAction).isEqualTo(AsyncData.Failure(AN_EXCEPTION)) assertThat(errorState.isSubmitEnabled).isFalse() errorState.eventSink(SecureBackupEnterRecoveryKeyEvents.ClearDialog) val clearedState = awaitItem() - assertThat(clearedState.submitAction).isEqualTo(Async.Uninitialized) + assertThat(clearedState.submitAction).isEqualTo(AsyncData.Uninitialized) assertThat(clearedState.isSubmitEnabled).isTrue() encryptionService.givenRecoverFailure(null) clearedState.eventSink(SecureBackupEnterRecoveryKeyEvents.Submit) val loadingState2 = awaitItem() - assertThat(loadingState2.submitAction).isEqualTo(Async.Loading()) + assertThat(loadingState2.submitAction).isEqualTo(AsyncData.Loading()) assertThat(loadingState2.isSubmitEnabled).isFalse() val finalState = awaitItem() - assertThat(finalState.submitAction).isEqualTo(Async.Success(Unit)) + assertThat(finalState.submitAction).isEqualTo(AsyncData.Success(Unit)) assertThat(finalState.isSubmitEnabled).isFalse() } } diff --git a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootPresenterTest.kt b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootPresenterTest.kt index 6b88e20748..3baecd4381 100644 --- a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootPresenterTest.kt +++ b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootPresenterTest.kt @@ -20,7 +20,7 @@ import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.matrix.api.encryption.BackupState import io.element.android.libraries.matrix.api.encryption.EncryptionService @@ -65,15 +65,15 @@ class SecureBackupRootPresenterTest { val initialState = awaitItem() encryptionService.givenDoesBackupExistOnServerResult(Result.failure(AN_EXCEPTION)) assertThat(initialState.backupState).isEqualTo(BackupState.UNKNOWN) - assertThat(initialState.doesBackupExistOnServer).isEqualTo(Async.Uninitialized) + assertThat(initialState.doesBackupExistOnServer).isEqualTo(AsyncData.Uninitialized) val loadingState1 = awaitItem() - assertThat(loadingState1.doesBackupExistOnServer).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState1.doesBackupExistOnServer).isInstanceOf(AsyncData.Loading::class.java) val errorState = awaitItem() - assertThat(errorState.doesBackupExistOnServer).isEqualTo(Async.Failure(AN_EXCEPTION)) + assertThat(errorState.doesBackupExistOnServer).isEqualTo(AsyncData.Failure(AN_EXCEPTION)) encryptionService.givenDoesBackupExistOnServerResult(Result.success(false)) errorState.eventSink.invoke(SecureBackupRootEvents.RetryKeyBackupState) val loadingState2 = awaitItem() - assertThat(loadingState2.doesBackupExistOnServer).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState2.doesBackupExistOnServer).isInstanceOf(AsyncData.Loading::class.java) val finalState = awaitItem() assertThat(finalState.doesBackupExistOnServer.dataOrNull()).isFalse() } diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenter.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenter.kt index 89751ca604..0d04ac544d 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenter.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenter.kt @@ -24,7 +24,7 @@ import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import com.freeletics.flowredux.compose.rememberStateAndDispatch -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.verification.SessionVerificationService import io.element.android.libraries.matrix.api.verification.VerificationFlowState @@ -94,8 +94,8 @@ class VerifySelfSessionPresenter @Inject constructor( is StateMachineState.Verifying -> { val async = when (machineState) { - is StateMachineState.Verifying.Replying -> Async.Loading() - else -> Async.Uninitialized + is StateMachineState.Verifying.Replying -> AsyncData.Loading() + else -> AsyncData.Uninitialized } VerifySelfSessionState.VerificationStep.Verifying(machineState.data, async) } diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionState.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionState.kt index f3afd3b7b9..3076b1fdc7 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionState.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionState.kt @@ -18,7 +18,7 @@ package io.element.android.features.verifysession.impl import androidx.compose.runtime.Immutable import androidx.compose.runtime.Stable -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.verification.SessionVerificationData @Immutable @@ -33,7 +33,7 @@ data class VerifySelfSessionState( data object Canceled : VerificationStep data object AwaitingOtherDeviceResponse : VerificationStep data object Ready : VerificationStep - data class Verifying(val data: SessionVerificationData, val state: Async) : VerificationStep + data class Verifying(val data: SessionVerificationData, val state: AsyncData) : VerificationStep data object Completed : VerificationStep } } diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateProvider.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateProvider.kt index 9115b8b444..81f25866bd 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateProvider.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateProvider.kt @@ -17,7 +17,7 @@ package io.element.android.features.verifysession.impl import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.verification.SessionVerificationData import io.element.android.libraries.matrix.api.verification.VerificationEmoji @@ -29,10 +29,10 @@ open class VerifySelfSessionStateProvider : PreviewParameterProvider Unit) val verificationViewState = screenState.verificationFlowStep val eventSink = screenState.eventSink - val isVerifying = (verificationViewState as? FlowStep.Verifying)?.state is Async.Loading + val isVerifying = (verificationViewState as? FlowStep.Verifying)?.state is AsyncData.Loading val positiveButtonTitle = when (verificationViewState) { FlowStep.Initial -> R.string.screen_session_verification_positive_button_initial FlowStep.Canceled -> R.string.screen_session_verification_positive_button_canceled diff --git a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenterTests.kt b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenterTests.kt index c96866cb5a..2943b0aa0f 100644 --- a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenterTests.kt +++ b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenterTests.kt @@ -22,7 +22,7 @@ import app.cash.turbine.ReceiveTurbine import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.verifysession.impl.VerifySelfSessionState.VerificationStep -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.verification.SessionVerificationData import io.element.android.libraries.matrix.api.verification.VerificationEmoji import io.element.android.libraries.matrix.api.verification.VerificationFlowState @@ -173,7 +173,7 @@ class VerifySelfSessionPresenterTests { assertThat(awaitItem().verificationFlowStep).isEqualTo( VerificationStep.Verifying( SessionVerificationData.Emojis(emojis), - Async.Loading(), + AsyncData.Loading(), ) ) assertThat(awaitItem().verificationFlowStep).isEqualTo(VerificationStep.Completed) @@ -192,7 +192,7 @@ class VerifySelfSessionPresenterTests { assertThat(awaitItem().verificationFlowStep).isEqualTo( VerificationStep.Verifying( SessionVerificationData.Emojis(emptyList()), - Async.Loading(), + AsyncData.Loading(), ) ) assertThat(awaitItem().verificationFlowStep).isEqualTo(VerificationStep.Canceled) diff --git a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Async.kt b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/AsyncData.kt similarity index 88% rename from libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Async.kt rename to libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/AsyncData.kt index fb7bc2836b..de547d87e6 100644 --- a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Async.kt +++ b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/AsyncData.kt @@ -26,7 +26,7 @@ import kotlin.contracts.contract * Sealed type that allows to model an asynchronous operation. */ @Stable -sealed interface Async { +sealed interface AsyncData { /** * Represents a failed operation. @@ -38,7 +38,7 @@ sealed interface Async { data class Failure( val error: Throwable, val prevData: T? = null, - ) : Async + ) : AsyncData /** * Represents an operation that is currently ongoing. @@ -48,7 +48,7 @@ sealed interface Async { */ data class Loading( val prevData: T? = null, - ) : Async + ) : AsyncData /** * Represents a successful operation. @@ -58,12 +58,12 @@ sealed interface Async { */ data class Success( val data: T, - ) : Async + ) : AsyncData /** * Represents an uninitialized operation (i.e. yet to be run). */ - data object Uninitialized : Async + data object Uninitialized : AsyncData /** * Returns the data returned by the operation, or null otherwise. @@ -94,7 +94,7 @@ sealed interface Async { fun isUninitialized(): Boolean = this == Uninitialized } -suspend inline fun MutableState>.runCatchingUpdatingState( +suspend inline fun MutableState>.runCatchingUpdatingState( errorTransform: (Throwable) -> Throwable = { it }, block: () -> T, ): Result = runUpdatingState( @@ -108,7 +108,7 @@ suspend inline fun MutableState>.runCatchingUpdatingState( ) suspend inline fun (suspend () -> T).runCatchingUpdatingState( - state: MutableState>, + state: MutableState>, errorTransform: (Throwable) -> Throwable = { it }, ): Result = runUpdatingState( state = state, @@ -120,7 +120,7 @@ suspend inline fun (suspend () -> T).runCatchingUpdatingState( }, ) -suspend inline fun MutableState>.runUpdatingState( +suspend inline fun MutableState>.runUpdatingState( errorTransform: (Throwable) -> Throwable = { it }, resultBlock: () -> Result, ): Result = runUpdatingState( @@ -131,7 +131,7 @@ suspend inline fun MutableState>.runUpdatingState( /** * Calls the specified [Result]-returning function [resultBlock] - * encapsulating its progress and return value into an [Async] while + * encapsulating its progress and return value into an [AsyncData] while * posting its updates to the MutableState [state]. * * @param T the type of data returned by the operation. @@ -143,7 +143,7 @@ suspend inline fun MutableState>.runUpdatingState( @OptIn(ExperimentalContracts::class) @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE") suspend inline fun runUpdatingState( - state: MutableState>, + state: MutableState>, errorTransform: (Throwable) -> Throwable = { it }, resultBlock: suspend () -> Result, ): Result { @@ -151,15 +151,15 @@ suspend inline fun runUpdatingState( callsInPlace(resultBlock, InvocationKind.EXACTLY_ONCE) } val prevData = state.value.dataOrNull() - state.value = Async.Loading(prevData = prevData) + state.value = AsyncData.Loading(prevData = prevData) return resultBlock().fold( onSuccess = { - state.value = Async.Success(it) + state.value = AsyncData.Success(it) Result.success(it) }, onFailure = { val error = errorTransform(it) - state.value = Async.Failure( + state.value = AsyncData.Failure( error = error, prevData = prevData, ) diff --git a/libraries/architecture/src/test/kotlin/io/element/android/libraries/architecture/AsyncKtTest.kt b/libraries/architecture/src/test/kotlin/io/element/android/libraries/architecture/AsyncDataKtTest.kt similarity index 74% rename from libraries/architecture/src/test/kotlin/io/element/android/libraries/architecture/AsyncKtTest.kt rename to libraries/architecture/src/test/kotlin/io/element/android/libraries/architecture/AsyncDataKtTest.kt index 4b6c75a108..5069950b7a 100644 --- a/libraries/architecture/src/test/kotlin/io/element/android/libraries/architecture/AsyncKtTest.kt +++ b/libraries/architecture/src/test/kotlin/io/element/android/libraries/architecture/AsyncDataKtTest.kt @@ -22,10 +22,10 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.test.runTest import org.junit.Test -class AsyncKtTest { +class AsyncDataKtTest { @Test fun `updates state when block returns success`() = runTest { - val state = TestableMutableState>(Async.Uninitialized) + val state = TestableMutableState>(AsyncData.Uninitialized) val result = runUpdatingState(state) { delay(1) @@ -35,15 +35,15 @@ class AsyncKtTest { assertThat(result.isSuccess).isTrue() assertThat(result.getOrNull()).isEqualTo(1) - assertThat(state.popFirst()).isEqualTo(Async.Uninitialized) - assertThat(state.popFirst()).isEqualTo(Async.Loading(null)) - assertThat(state.popFirst()).isEqualTo(Async.Success(1)) + assertThat(state.popFirst()).isEqualTo(AsyncData.Uninitialized) + assertThat(state.popFirst()).isEqualTo(AsyncData.Loading(null)) + assertThat(state.popFirst()).isEqualTo(AsyncData.Success(1)) state.assertNoMoreValues() } @Test fun `updates state when block returns failure`() = runTest { - val state = TestableMutableState>(Async.Uninitialized) + val state = TestableMutableState>(AsyncData.Uninitialized) val result = runUpdatingState(state) { delay(1) @@ -53,15 +53,15 @@ class AsyncKtTest { assertThat(result.isFailure).isTrue() assertThat(result.exceptionOrNull()).isEqualTo(MyThrowable("hello")) - assertThat(state.popFirst()).isEqualTo(Async.Uninitialized) - assertThat(state.popFirst()).isEqualTo(Async.Loading(null)) - assertThat(state.popFirst()).isEqualTo(Async.Failure(MyThrowable("hello"))) + assertThat(state.popFirst()).isEqualTo(AsyncData.Uninitialized) + assertThat(state.popFirst()).isEqualTo(AsyncData.Loading(null)) + assertThat(state.popFirst()).isEqualTo(AsyncData.Failure(MyThrowable("hello"))) state.assertNoMoreValues() } @Test fun `updates state when block returns failure transforming the error`() = runTest { - val state = TestableMutableState>(Async.Uninitialized) + val state = TestableMutableState>(AsyncData.Uninitialized) val result = runUpdatingState(state, { MyThrowable(it.message + " world") }) { delay(1) @@ -71,9 +71,9 @@ class AsyncKtTest { assertThat(result.isFailure).isTrue() assertThat(result.exceptionOrNull()).isEqualTo(MyThrowable("hello world")) - assertThat(state.popFirst()).isEqualTo(Async.Uninitialized) - assertThat(state.popFirst()).isEqualTo(Async.Loading(null)) - assertThat(state.popFirst()).isEqualTo(Async.Failure(MyThrowable("hello world"))) + assertThat(state.popFirst()).isEqualTo(AsyncData.Uninitialized) + assertThat(state.popFirst()).isEqualTo(AsyncData.Loading(null)) + assertThat(state.popFirst()).isEqualTo(AsyncData.Failure(MyThrowable("hello world"))) state.assertNoMoreValues() } } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncProvider.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncProvider.kt index 028de2d57b..ae090739ce 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncProvider.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncProvider.kt @@ -17,14 +17,14 @@ package io.element.android.libraries.designsystem.components.async import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData -open class AsyncProvider : PreviewParameterProvider> { - override val values: Sequence> +open class AsyncProvider : PreviewParameterProvider> { + override val values: Sequence> get() = sequenceOf( - Async.Uninitialized, - Async.Loading(), - Async.Failure(Exception("An error occurred")), - Async.Success(Unit), + AsyncData.Uninitialized, + AsyncData.Loading(), + AsyncData.Failure(Exception("An error occurred")), + AsyncData.Success(Unit), ) } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncView.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncView.kt index d19dc08c6a..b58c1b3e2c 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncView.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncView.kt @@ -19,7 +19,7 @@ package io.element.android.libraries.designsystem.components.async import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.tooling.preview.PreviewParameter -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.ProgressDialog import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog import io.element.android.libraries.designsystem.components.dialogs.ErrorDialogDefaults @@ -36,7 +36,7 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight */ @Composable fun AsyncView( - async: Async, + async: AsyncData, onSuccess: (T) -> Unit, onErrorDismiss: () -> Unit, showProgressDialog: Boolean = true, @@ -62,7 +62,7 @@ fun AsyncView( @Composable fun AsyncView( - async: Async, + async: AsyncData, onSuccess: (T) -> Unit, onErrorDismiss: () -> Unit, progressDialog: @Composable () -> Unit = { AsyncViewDefaults.ProgressDialog() }, @@ -71,9 +71,9 @@ fun AsyncView( onRetry: (() -> Unit)? = null, ) { when (async) { - Async.Uninitialized -> Unit - is Async.Loading -> progressDialog() - is Async.Failure -> { + AsyncData.Uninitialized -> Unit + is AsyncData.Loading -> progressDialog() + is AsyncData.Failure -> { if (onRetry == null) { ErrorDialog( title = errorTitle(async.error), @@ -89,7 +89,7 @@ fun AsyncView( ) } } - is Async.Success -> { + is AsyncData.Success -> { LaunchedEffect(async) { onSuccess(async.data) } @@ -109,7 +109,7 @@ object AsyncViewDefaults { @PreviewsDayNight @Composable internal fun AsyncViewPreview( - @PreviewParameter(AsyncProvider::class) async: Async, + @PreviewParameter(AsyncProvider::class) async: AsyncData, ) = ElementPreview { AsyncView( async = async, diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerPresenter.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerPresenter.kt index 90d81a4d0c..574c6344f1 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerPresenter.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerPresenter.kt @@ -29,7 +29,7 @@ import androidx.compose.runtime.setValue import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage @@ -64,8 +64,8 @@ class MediaViewerPresenter @AssistedInject constructor( val mediaFile: MutableState = remember { mutableStateOf(null) } - val localMedia: MutableState> = remember { - mutableStateOf(Async.Uninitialized) + val localMedia: MutableState> = remember { + mutableStateOf(AsyncData.Uninitialized) } val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState() localMediaActions.Configure() @@ -79,7 +79,7 @@ class MediaViewerPresenter @AssistedInject constructor( fun handleEvents(mediaViewerEvents: MediaViewerEvents) { when (mediaViewerEvents) { MediaViewerEvents.RetryLoading -> loadMediaTrigger++ - MediaViewerEvents.ClearLoadingError -> localMedia.value = Async.Uninitialized + MediaViewerEvents.ClearLoadingError -> localMedia.value = AsyncData.Uninitialized MediaViewerEvents.SaveOnDisk -> coroutineScope.saveOnDisk(localMedia.value) MediaViewerEvents.Share -> coroutineScope.share(localMedia.value) MediaViewerEvents.OpenWith -> coroutineScope.open(localMedia.value) @@ -97,8 +97,8 @@ class MediaViewerPresenter @AssistedInject constructor( ) } - private fun CoroutineScope.downloadMedia(mediaFile: MutableState, localMedia: MutableState>) = launch { - localMedia.value = Async.Loading() + private fun CoroutineScope.downloadMedia(mediaFile: MutableState, localMedia: MutableState>) = launch { + localMedia.value = AsyncData.Loading() mediaLoader.downloadMediaFile( source = inputs.mediaSource, mimeType = inputs.mediaInfo.mimeType, @@ -114,15 +114,15 @@ class MediaViewerPresenter @AssistedInject constructor( ) } .onSuccess { - localMedia.value = Async.Success(it) + localMedia.value = AsyncData.Success(it) } .onFailure { - localMedia.value = Async.Failure(it) + localMedia.value = AsyncData.Failure(it) } } - private fun CoroutineScope.saveOnDisk(localMedia: Async) = launch { - if (localMedia is Async.Success) { + private fun CoroutineScope.saveOnDisk(localMedia: AsyncData) = launch { + if (localMedia is AsyncData.Success) { localMediaActions.saveOnDisk(localMedia.data) .onSuccess { val snackbarMessage = SnackbarMessage(CommonStrings.common_file_saved_on_disk_android) @@ -135,8 +135,8 @@ class MediaViewerPresenter @AssistedInject constructor( } else Unit } - private fun CoroutineScope.share(localMedia: Async) = launch { - if (localMedia is Async.Success) { + private fun CoroutineScope.share(localMedia: AsyncData) = launch { + if (localMedia is AsyncData.Success) { localMediaActions.share(localMedia.data) .onFailure { val snackbarMessage = SnackbarMessage(mediaActionsError(it)) @@ -145,8 +145,8 @@ class MediaViewerPresenter @AssistedInject constructor( } else Unit } - private fun CoroutineScope.open(localMedia: Async) = launch { - if (localMedia is Async.Success) { + private fun CoroutineScope.open(localMedia: AsyncData) = launch { + if (localMedia is AsyncData.Success) { localMediaActions.open(localMedia.data) .onFailure { val snackbarMessage = SnackbarMessage(mediaActionsError(it)) diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerState.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerState.kt index 4b68f4afcc..6d88cc7c06 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerState.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerState.kt @@ -16,7 +16,7 @@ package io.element.android.libraries.mediaviewer.api.viewer -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.mediaviewer.api.local.LocalMedia @@ -25,7 +25,7 @@ import io.element.android.libraries.mediaviewer.api.local.MediaInfo data class MediaViewerState( val mediaInfo: MediaInfo, val thumbnailSource: MediaSource?, - val downloadedMedia: Async, + val downloadedMedia: AsyncData, val snackbarMessage: SnackbarMessage?, val canDownload: Boolean, val canShare: Boolean, diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerStateProvider.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerStateProvider.kt index 14f792c2c6..a9d6e4fc98 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerStateProvider.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerStateProvider.kt @@ -18,7 +18,7 @@ package io.element.android.libraries.mediaviewer.api.viewer import android.net.Uri import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.mediaviewer.api.local.LocalMedia import io.element.android.libraries.mediaviewer.api.local.MediaInfo import io.element.android.libraries.mediaviewer.api.local.aFileInfo @@ -31,48 +31,48 @@ open class MediaViewerStateProvider : PreviewParameterProvider override val values: Sequence get() = sequenceOf( aMediaViewerState(), - aMediaViewerState(Async.Loading()), - aMediaViewerState(Async.Failure(IllegalStateException("error"))), + aMediaViewerState(AsyncData.Loading()), + aMediaViewerState(AsyncData.Failure(IllegalStateException("error"))), aMediaViewerState( - Async.Success( + AsyncData.Success( LocalMedia(Uri.EMPTY, anImageInfo()) ), anImageInfo(), ), aMediaViewerState( - Async.Success( + AsyncData.Success( LocalMedia(Uri.EMPTY, aVideoInfo()) ), aVideoInfo(), ), aMediaViewerState( - Async.Success( + AsyncData.Success( LocalMedia(Uri.EMPTY, aPdfInfo()) ), aPdfInfo(), ), aMediaViewerState( - Async.Loading(), + AsyncData.Loading(), aFileInfo(), ), aMediaViewerState( - Async.Success( + AsyncData.Success( LocalMedia(Uri.EMPTY, aFileInfo()) ), aFileInfo(), ), aMediaViewerState( - Async.Loading(), + AsyncData.Loading(), anAudioInfo(), ), aMediaViewerState( - Async.Success( + AsyncData.Success( LocalMedia(Uri.EMPTY, anAudioInfo()) ), anAudioInfo(), ), aMediaViewerState( - Async.Success( + AsyncData.Success( LocalMedia(Uri.EMPTY, anImageInfo()) ), anImageInfo(), @@ -83,7 +83,7 @@ open class MediaViewerStateProvider : PreviewParameterProvider } fun aMediaViewerState( - downloadedMedia: Async = Async.Uninitialized, + downloadedMedia: AsyncData = AsyncData.Uninitialized, mediaInfo: MediaInfo = anImageInfo(), canDownload: Boolean = true, canShare: Boolean = true, diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerView.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerView.kt index d7f743f7ad..1fb557c126 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerView.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/viewer/MediaViewerView.kt @@ -47,7 +47,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import coil.compose.AsyncImage -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.components.dialogs.RetryDialog @@ -93,7 +93,7 @@ fun MediaViewerView( modifier, topBar = { MediaViewerTopBar( - actionsEnabled = state.downloadedMedia is Async.Success, + actionsEnabled = state.downloadedMedia is AsyncData.Success, mimeType = state.mediaInfo.mimeType, onBackPressed = onBackPressed, canDownload = state.canDownload, @@ -121,7 +121,7 @@ fun MediaViewerView( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center ) { - if (state.downloadedMedia is Async.Failure) { + if (state.downloadedMedia is AsyncData.Failure) { ErrorView( errorMessage = stringResource(id = CommonStrings.error_unknown), onRetry = ::onRetry, @@ -144,7 +144,7 @@ fun MediaViewerView( } @Composable -private fun rememberShowProgress(downloadedMedia: Async): Boolean { +private fun rememberShowProgress(downloadedMedia: AsyncData): Boolean { var showProgress by remember { mutableStateOf(false) } diff --git a/libraries/mediaviewer/api/src/test/kotlin/io/element/android/libraries/mediaviewer/MediaViewerPresenterTest.kt b/libraries/mediaviewer/api/src/test/kotlin/io/element/android/libraries/mediaviewer/MediaViewerPresenterTest.kt index ce2b4651a5..c8589e2adb 100644 --- a/libraries/mediaviewer/api/src/test/kotlin/io/element/android/libraries/mediaviewer/MediaViewerPresenterTest.kt +++ b/libraries/mediaviewer/api/src/test/kotlin/io/element/android/libraries/mediaviewer/MediaViewerPresenterTest.kt @@ -23,7 +23,7 @@ import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.matrix.test.media.FakeMediaLoader import io.element.android.libraries.matrix.test.media.aMediaSource @@ -60,13 +60,13 @@ class MediaViewerPresenterTest { presenter.present() }.test { var state = awaitItem() - assertThat(state.downloadedMedia).isEqualTo(Async.Uninitialized) + assertThat(state.downloadedMedia).isEqualTo(AsyncData.Uninitialized) assertThat(state.mediaInfo).isEqualTo(TESTED_MEDIA_INFO) state = awaitItem() - assertThat(state.downloadedMedia).isInstanceOf(Async.Loading::class.java) + assertThat(state.downloadedMedia).isInstanceOf(AsyncData.Loading::class.java) state = awaitItem() val successData = state.downloadedMedia.dataOrNull() - assertThat(state.downloadedMedia).isInstanceOf(Async.Success::class.java) + assertThat(state.downloadedMedia).isInstanceOf(AsyncData.Success::class.java) assertThat(successData).isNotNull() } } @@ -81,15 +81,15 @@ class MediaViewerPresenterTest { presenter.present() }.test { var state = awaitItem() - assertThat(state.downloadedMedia).isEqualTo(Async.Uninitialized) + assertThat(state.downloadedMedia).isEqualTo(AsyncData.Uninitialized) state = awaitItem() - assertThat(state.downloadedMedia).isInstanceOf(Async.Loading::class.java) + assertThat(state.downloadedMedia).isInstanceOf(AsyncData.Loading::class.java) // no state changes while media is loading state.eventSink(MediaViewerEvents.OpenWith) state.eventSink(MediaViewerEvents.Share) state.eventSink(MediaViewerEvents.SaveOnDisk) state = awaitItem() - assertThat(state.downloadedMedia).isInstanceOf(Async.Success::class.java) + assertThat(state.downloadedMedia).isInstanceOf(AsyncData.Success::class.java) // Should succeed without change of state state.eventSink(MediaViewerEvents.OpenWith) // Should succeed without change of state @@ -128,21 +128,21 @@ class MediaViewerPresenterTest { }.test { mediaLoader.shouldFail = true val initialState = awaitItem() - assertThat(initialState.downloadedMedia).isEqualTo(Async.Uninitialized) + assertThat(initialState.downloadedMedia).isEqualTo(AsyncData.Uninitialized) assertThat(initialState.mediaInfo).isEqualTo(TESTED_MEDIA_INFO) val loadingState = awaitItem() - assertThat(loadingState.downloadedMedia).isInstanceOf(Async.Loading::class.java) + assertThat(loadingState.downloadedMedia).isInstanceOf(AsyncData.Loading::class.java) val failureState = awaitItem() - assertThat(failureState.downloadedMedia).isInstanceOf(Async.Failure::class.java) + assertThat(failureState.downloadedMedia).isInstanceOf(AsyncData.Failure::class.java) mediaLoader.shouldFail = false failureState.eventSink(MediaViewerEvents.RetryLoading) //There is one recomposition because of the retry mechanism skipItems(1) val retryLoadingState = awaitItem() - assertThat(retryLoadingState.downloadedMedia).isInstanceOf(Async.Loading::class.java) + assertThat(retryLoadingState.downloadedMedia).isInstanceOf(AsyncData.Loading::class.java) val successState = awaitItem() val successData = successState.downloadedMedia.dataOrNull() - assertThat(successState.downloadedMedia).isInstanceOf(Async.Success::class.java) + assertThat(successState.downloadedMedia).isInstanceOf(AsyncData.Success::class.java) assertThat(successData).isNotNull() } }