From 514263ae122a67a5ce7d6078a8d816db7eac3320 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 18 Nov 2020 14:51:10 +0100 Subject: [PATCH] Room creation Fragment: no more "Retry" action, loading and error displayed in a dialog --- .../session/room/failure/CreateRoomFailure.kt | 8 ++-- .../session/room/create/CreateRoomTask.kt | 6 +-- .../createroom/CreateRoomController.kt | 37 +++---------------- .../createroom/CreateRoomFragment.kt | 27 ++++++++++---- .../createroom/CreateRoomViewEvents.kt | 1 + .../createroom/CreateRoomViewModel.kt | 2 + .../main/res/layout/fragment_create_room.xml | 2 + vector/src/main/res/values/strings.xml | 1 + 8 files changed, 40 insertions(+), 44 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/failure/CreateRoomFailure.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/failure/CreateRoomFailure.kt index 88ab5e36c6..b4e2dc645c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/failure/CreateRoomFailure.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/failure/CreateRoomFailure.kt @@ -22,7 +22,9 @@ import org.matrix.android.sdk.api.failure.MatrixError sealed class CreateRoomFailure : Failure.FeatureFailure() { object CreatedWithTimeout : CreateRoomFailure() data class CreatedWithFederationFailure(val matrixError: MatrixError) : CreateRoomFailure() - object RoomAliasEmpty: CreateRoomFailure() - object RoomAliasNotAvailable: CreateRoomFailure() - object RoomAliasInvalid: CreateRoomFailure() + sealed class RoomAliasError : CreateRoomFailure() { + object AliasEmpty : RoomAliasError() + object AliasNotAvailable : RoomAliasError() + object AliasInvalid : RoomAliasError() + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomTask.kt index 8bf1f077b1..0fe9b0ba68 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomTask.kt @@ -66,7 +66,7 @@ internal class DefaultCreateRoomTask @Inject constructor( if (params.preset == CreateRoomPreset.PRESET_PUBLIC_CHAT) { if (params.roomAliasName.isNullOrEmpty()) { - throw CreateRoomFailure.RoomAliasEmpty + throw CreateRoomFailure.RoomAliasError.AliasEmpty } // Check alias availability val fullAlias = "#" + params.roomAliasName + ":" + userId.substringAfter(":") @@ -85,7 +85,7 @@ internal class DefaultCreateRoomTask @Inject constructor( } ?.let { // Alias already exists: error case - throw CreateRoomFailure.RoomAliasNotAvailable + throw CreateRoomFailure.RoomAliasError.AliasNotAvailable } } @@ -104,7 +104,7 @@ internal class DefaultCreateRoomTask @Inject constructor( } else if (throwable.httpCode == 400 && throwable.error.code == MatrixError.M_UNKNOWN && throwable.error.message == "Invalid characters in room alias") { - throw CreateRoomFailure.RoomAliasInvalid + throw CreateRoomFailure.RoomAliasError.AliasInvalid } } throw throwable diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomController.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomController.kt index 3f86d1adca..7acc2d1490 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomController.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomController.kt @@ -44,32 +44,8 @@ class CreateRoomController @Inject constructor(private val stringProvider: Strin var index = 0 override fun buildModels(viewState: CreateRoomViewState) { - when (val asyncCreateRoom = viewState.asyncCreateRoomRequest) { - is Success -> { - // Nothing to display, the screen will be closed - } - is Loading -> { - // display the form - buildForm(viewState, false) - loadingItem { - id("loading") - } - } - is Uninitialized -> { - // display the form - buildForm(viewState, true) - } - is Fail -> { - // display the form - buildForm(viewState, true) - // TODO BMA DO NOT COMMIT Update this - errorWithRetryItem { - id("error") - text(errorFormatter.toHumanReadable(asyncCreateRoom.error)) - listener { listener?.retry() } - } - } - } + // display the form + buildForm(viewState, viewState.asyncCreateRoomRequest !is Loading) } private fun buildForm(viewState: CreateRoomViewState, enableFormElement: Boolean) { @@ -133,10 +109,10 @@ class CreateRoomController @Inject constructor(private val stringProvider: Strin homeServer(":" + viewState.homeServerName) errorMessage( when ((viewState.asyncCreateRoomRequest as? Fail)?.error) { - is CreateRoomFailure.RoomAliasEmpty -> R.string.create_room_alias_empty - is CreateRoomFailure.RoomAliasNotAvailable -> R.string.create_room_alias_already_in_use - is CreateRoomFailure.RoomAliasInvalid -> R.string.create_room_alias_invalid - else -> null + is CreateRoomFailure.RoomAliasError.AliasEmpty -> R.string.create_room_alias_empty + is CreateRoomFailure.RoomAliasError.AliasNotAvailable -> R.string.create_room_alias_already_in_use + is CreateRoomFailure.RoomAliasError.AliasInvalid -> R.string.create_room_alias_invalid + else -> null } ?.let { stringProvider.getString(it) } ) @@ -195,7 +171,6 @@ class CreateRoomController @Inject constructor(private val stringProvider: Strin fun setIsPublic(isPublic: Boolean) fun setAliasLocalPart(aliasLocalPart: String) fun setIsEncrypted(isEncrypted: Boolean) - fun retry() fun toggleShowAdvanced() fun setDisableFederation(disableFederation: Boolean) fun submit() diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomFragment.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomFragment.kt index a20bc7dbf5..fb90752764 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomFragment.kt @@ -21,6 +21,8 @@ import android.os.Bundle import android.os.Parcelable import android.view.View import androidx.appcompat.app.AlertDialog +import androidx.core.view.isVisible +import com.airbnb.mvrx.Loading import com.airbnb.mvrx.Success import com.airbnb.mvrx.args import com.airbnb.mvrx.fragmentViewModel @@ -37,7 +39,8 @@ import im.vector.app.features.roomdirectory.RoomDirectorySharedAction import im.vector.app.features.roomdirectory.RoomDirectorySharedActionViewModel import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.fragment_create_room.* -import timber.log.Timber +import kotlinx.android.synthetic.main.merge_overlay_waiting_view.* +import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure import javax.inject.Inject @Parcelize @@ -66,17 +69,31 @@ class CreateRoomFragment @Inject constructor( super.onViewCreated(view, savedInstanceState) vectorBaseActivity.setSupportActionBar(createRoomToolbar) sharedActionViewModel = activityViewModelProvider.get(RoomDirectorySharedActionViewModel::class.java) + setupWaitingView() setupRecyclerView() createRoomClose.debouncedClicks { sharedActionViewModel.post(RoomDirectorySharedAction.Back) } viewModel.observeViewEvents { when (it) { - CreateRoomViewEvents.Quit -> vectorBaseActivity.onBackPressed() + CreateRoomViewEvents.Quit -> vectorBaseActivity.onBackPressed() + is CreateRoomViewEvents.Failure -> showFailure(it.throwable) }.exhaustive } } + override fun showFailure(throwable: Throwable) { + // Note: RoomAliasError are displayed directly in the form + if (throwable !is CreateRoomFailure.RoomAliasError) { + super.showFailure(throwable) + } + } + + private fun setupWaitingView() { + waiting_view_status_text.isVisible = true + waiting_view_status_text.setText(R.string.create_room_in_progress) + } + override fun onDestroyView() { createRoomForm.cleanup() createRoomController.listener = null @@ -132,11 +149,6 @@ class CreateRoomFragment @Inject constructor( viewModel.handle(CreateRoomAction.Create) } - override fun retry() { - Timber.v("Retry") - viewModel.handle(CreateRoomAction.Create) - } - override fun onBackPressed(toolbarButton: Boolean): Boolean { return withState(viewModel) { return@withState if (!it.isEmpty()) { @@ -157,6 +169,7 @@ class CreateRoomFragment @Inject constructor( override fun invalidate() = withState(viewModel) { state -> val async = state.asyncCreateRoomRequest + waiting_view.isVisible = async is Loading if (async is Success) { // Navigate to freshly created room navigator.openRoom(requireActivity(), async()) diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewEvents.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewEvents.kt index 4ff4ee4bdf..af745ce5ff 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewEvents.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewEvents.kt @@ -22,5 +22,6 @@ import im.vector.app.core.platform.VectorViewEvents * Transient events for room creation screen */ sealed class CreateRoomViewEvents : VectorViewEvents { + data class Failure(val throwable: Throwable) : CreateRoomViewEvents() object Quit : CreateRoomViewEvents() } diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt index e25298b0f1..4cffbf68dd 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt @@ -36,6 +36,7 @@ import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.raw.RawService import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams import org.matrix.android.sdk.api.session.room.model.create.CreateRoomPreset @@ -221,6 +222,7 @@ class CreateRoomViewModel @AssistedInject constructor(@Assisted initialState: Cr setState { copy(asyncCreateRoomRequest = Fail(failure)) } + _viewEvents.post(CreateRoomViewEvents.Failure(failure)) } }) } diff --git a/vector/src/main/res/layout/fragment_create_room.xml b/vector/src/main/res/layout/fragment_create_room.xml index 0fe5caa968..3abcafc94d 100644 --- a/vector/src/main/res/layout/fragment_create_room.xml +++ b/vector/src/main/res/layout/fragment_create_room.xml @@ -67,5 +67,7 @@ + + diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index ee8c3f7da8..f00e51710d 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -2104,6 +2104,7 @@ This address is already in use Please provide a room address Some characters are not allowed + Creating room… Your email domain is not authorized to register on this server