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