Properly handle Loading state: button were still active... Also finish the work on the controller

This commit is contained in:
Benoit Marty 2020-05-18 14:41:39 +02:00
parent ecf3fee709
commit f4108ae0eb
7 changed files with 54 additions and 60 deletions

View File

@ -52,6 +52,7 @@ class ReviewTermsActivity : SimpleFragmentActivity() {
reviewTermsViewModel.observeViewEvents {
when (it) {
is ReviewTermsViewEvents.Loading -> Unit
is ReviewTermsViewEvents.Failure -> {
AlertDialog.Builder(this)
.setMessage(errorFormatter.toHumanReadable(it.throwable))

View File

@ -58,8 +58,8 @@ class ReviewTermsFragment @Inject constructor(
reviewTermsViewModel.observeViewEvents {
when (it) {
is ReviewTermsViewEvents.Loading -> showLoading(it.message)
is ReviewTermsViewEvents.Failure -> {
reviewTermsWaitOverlay.isVisible = false
// Dialog is displayed by the Activity
}
ReviewTermsViewEvents.Success -> {
@ -83,29 +83,22 @@ class ReviewTermsFragment @Inject constructor(
}
override fun invalidate() = withState(reviewTermsViewModel) { state ->
termsController.setData(state)
when (state.termsList) {
is Loading -> {
reviewTermsBottomBar.isVisible = false
reviewTermsWaitOverlay.isVisible = true
}
is Success -> {
updateState(state.termsList.invoke())
reviewTermsWaitOverlay.isVisible = false
reviewTermsBottomBar.isVisible = true
reviewTermsAccept.isEnabled = state.termsList.invoke().all { it.accepted }
}
else -> {
reviewTermsWaitOverlay.isVisible = false
}
}
if (!reviewTermsWaitOverlay.isVisible) {
reviewTermsWaitOverlay.isVisible = state.acceptingTerms is Loading
else -> Unit
}
}
private fun updateState(terms: List<Term>) {
termsController.setData(terms)
override fun retry() {
reviewTermsViewModel.handle(ReviewTermsAction.LoadTerms(getString(R.string.resources_language)))
}
override fun setChecked(term: Term, isChecked: Boolean) {

View File

@ -19,6 +19,7 @@ package im.vector.riotx.features.terms
import im.vector.riotx.core.platform.VectorViewEvents
sealed class ReviewTermsViewEvents : VectorViewEvents {
data class Loading(val message: CharSequence? = null) : ReviewTermsViewEvents()
data class Failure(val throwable: Throwable, val finish: Boolean) : ReviewTermsViewEvents()
object Success : ReviewTermsViewEvents()
}

View File

@ -88,11 +88,7 @@ class ReviewTermsViewModel @AssistedInject constructor(
return@withState
}
setState {
copy(
acceptingTerms = Loading()
)
}
_viewEvents.post(ReviewTermsViewEvents.Loading())
val agreedUrls = acceptedTerms.map { it.url }
@ -110,11 +106,6 @@ class ReviewTermsViewModel @AssistedInject constructor(
_viewEvents.post(ReviewTermsViewEvents.Success)
} catch (failure: Throwable) {
Timber.e(failure, "Failed to agree to terms")
setState {
copy(
acceptingTerms = Uninitialized
)
}
_viewEvents.post(ReviewTermsViewEvents.Failure(failure, false))
}
}

View File

@ -21,6 +21,5 @@ import com.airbnb.mvrx.MvRxState
import com.airbnb.mvrx.Uninitialized
data class ReviewTermsViewState(
val termsList: Async<List<Term>> = Uninitialized,
val acceptingTerms: Async<Unit> = Uninitialized
val termsList: Async<List<Term>> = Uninitialized
) : MvRxState

View File

@ -17,39 +17,65 @@ package im.vector.riotx.features.terms
import android.view.View
import com.airbnb.epoxy.TypedEpoxyController
import com.airbnb.mvrx.Fail
import com.airbnb.mvrx.Incomplete
import com.airbnb.mvrx.Success
import im.vector.riotx.R
import im.vector.riotx.core.epoxy.errorWithRetryItem
import im.vector.riotx.core.epoxy.loadingItem
import im.vector.riotx.core.error.ErrorFormatter
import im.vector.riotx.features.discovery.settingsSectionTitleItem
import javax.inject.Inject
class TermsController @Inject constructor() : TypedEpoxyController<List<Term>>() {
class TermsController @Inject constructor(
private val errorFormatter: ErrorFormatter
) : TypedEpoxyController<ReviewTermsViewState>() {
var description: String? = null
var listener: Listener? = null
override fun buildModels(data: List<Term>?) {
data?.let {
settingsSectionTitleItem {
id("header")
titleResId(R.string.widget_integration_review_terms)
}
it.forEach { term ->
termItem {
id(term.url)
name(term.name)
description(description)
checked(term.accepted)
override fun buildModels(data: ReviewTermsViewState?) {
data ?: return
clickListener(View.OnClickListener { listener?.review(term) })
checkChangeListener { _, isChecked ->
listener?.setChecked(term, isChecked)
}
when (data.termsList) {
is Incomplete -> {
loadingItem {
id("loading")
}
}
is Fail -> {
errorWithRetryItem {
id("errorRetry")
text(errorFormatter.toHumanReadable(data.termsList.error))
listener { listener?.retry() }
}
}
is Success -> buildTerms(data.termsList.invoke())
}
}
private fun buildTerms(termsList: List<Term>) {
settingsSectionTitleItem {
id("header")
titleResId(R.string.widget_integration_review_terms)
}
termsList.forEach { term ->
termItem {
id(term.url)
name(term.name)
description(description)
checked(term.accepted)
clickListener(View.OnClickListener { listener?.review(term) })
checkChangeListener { _, isChecked ->
listener?.setChecked(term, isChecked)
}
}
}
// TODO error mgmt
}
interface Listener {
fun retry()
fun setChecked(term: Term, isChecked: Boolean)
fun review(term: Term)
}

View File

@ -43,21 +43,4 @@
</LinearLayout>
<FrameLayout
android:id="@+id/reviewTermsWaitOverlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true"
android:visibility="gone"
tools:visibility="visible">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="visible" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>