Create facility extension to observe ViewEvents

This commit is contained in:
Benoit Marty 2020-01-21 15:00:20 +01:00
parent e81c804ed6
commit da3e547d82
9 changed files with 64 additions and 92 deletions

View file

@ -46,6 +46,7 @@ import im.vector.riotx.core.di.HasScreenInjector
import im.vector.riotx.core.di.ScreenComponent import im.vector.riotx.core.di.ScreenComponent
import im.vector.riotx.core.error.ErrorFormatter import im.vector.riotx.core.error.ErrorFormatter
import im.vector.riotx.features.navigation.Navigator import im.vector.riotx.features.navigation.Navigator
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import timber.log.Timber import timber.log.Timber
@ -234,6 +235,21 @@ abstract class VectorBaseFragment : BaseMvRxFragment(), HasScreenInjector {
return this return this
} }
/* ==========================================================================================
* ViewEvents
* ========================================================================================== */
protected fun <T : VectorViewEvents> VectorViewModel<*, *, T>.observeViewEvents(observer: (T) -> Unit) {
viewEvents
.observe()
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
dismissLoadingDialog()
observer(it)
}
.disposeOnDestroyView()
}
/* ========================================================================================== /* ==========================================================================================
* MENU MANAGEMENT * MENU MANAGEMENT
* ========================================================================================== */ * ========================================================================================== */

View file

@ -307,15 +307,11 @@ class RoomDetailFragment @Inject constructor(
displayRoomDetailActionResult(it) displayRoomDetailActionResult(it)
} }
roomDetailViewModel.viewEvents roomDetailViewModel.observeViewEvents {
.observe() when (it) {
.observeOn(AndroidSchedulers.mainThread()) is RoomDetailViewEvents.Failure -> showErrorInSnackbar(it.throwable)
.subscribe { }.exhaustive
when (it) { }
is RoomDetailViewEvents.Failure -> showErrorInSnackbar(it.throwable)
}.exhaustive
}
.disposeOnDestroyView()
} }
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {

View file

@ -51,7 +51,6 @@ import im.vector.riotx.features.home.room.list.actions.RoomListQuickActionsShare
import im.vector.riotx.features.home.room.list.widget.FabMenuView import im.vector.riotx.features.home.room.list.widget.FabMenuView
import im.vector.riotx.features.notifications.NotificationDrawerManager import im.vector.riotx.features.notifications.NotificationDrawerManager
import im.vector.riotx.features.share.SharedData import im.vector.riotx.features.share.SharedData
import io.reactivex.android.schedulers.AndroidSchedulers
import kotlinx.android.parcel.Parcelize import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.fragment_room_list.* import kotlinx.android.synthetic.main.fragment_room_list.*
import javax.inject.Inject import javax.inject.Inject
@ -103,18 +102,13 @@ class RoomListFragment @Inject constructor(
setupRecyclerView() setupRecyclerView()
sharedActionViewModel = activityViewModelProvider.get(RoomListQuickActionsSharedActionViewModel::class.java) sharedActionViewModel = activityViewModelProvider.get(RoomListQuickActionsSharedActionViewModel::class.java)
roomListViewModel.subscribe { renderState(it) } roomListViewModel.subscribe { renderState(it) }
roomListViewModel.viewEvents roomListViewModel.observeViewEvents {
.observe() when (it) {
.observeOn(AndroidSchedulers.mainThread()) is RoomListViewEvents.Loading -> showLoading(it.message)
.subscribe { is RoomListViewEvents.Failure -> showFailure(it.throwable)
dismissLoadingDialog() is RoomListViewEvents.SelectRoom -> openSelectedRoom(it)
when (it) { }.exhaustive
is RoomListViewEvents.Loading -> showLoading(it.message) }
is RoomListViewEvents.Failure -> showFailure(it.throwable)
is RoomListViewEvents.SelectRoom -> openSelectedRoom(it)
}.exhaustive
}
.disposeOnDestroyView()
createChatFabMenu.listener = this createChatFabMenu.listener = this

View file

@ -27,9 +27,9 @@ import com.airbnb.mvrx.withState
import im.vector.matrix.android.api.failure.Failure import im.vector.matrix.android.api.failure.Failure
import im.vector.matrix.android.api.failure.MatrixError import im.vector.matrix.android.api.failure.MatrixError
import im.vector.riotx.R import im.vector.riotx.R
import im.vector.riotx.core.extensions.exhaustive
import im.vector.riotx.core.platform.OnBackPressed import im.vector.riotx.core.platform.OnBackPressed
import im.vector.riotx.core.platform.VectorBaseFragment import im.vector.riotx.core.platform.VectorBaseFragment
import io.reactivex.android.schedulers.AndroidSchedulers
import javax.net.ssl.HttpsURLConnection import javax.net.ssl.HttpsURLConnection
/** /**
@ -59,13 +59,9 @@ abstract class AbstractLoginFragment : VectorBaseFragment(), OnBackPressed {
loginSharedActionViewModel = activityViewModelProvider.get(LoginSharedActionViewModel::class.java) loginSharedActionViewModel = activityViewModelProvider.get(LoginSharedActionViewModel::class.java)
loginViewModel.viewEvents loginViewModel.observeViewEvents {
.observe() handleLoginViewEvents(it)
.observeOn(AndroidSchedulers.mainThread()) }
.subscribe {
handleLoginViewEvents(it)
}
.disposeOnDestroyView()
} }
private fun handleLoginViewEvents(loginViewEvents: LoginViewEvents) { private fun handleLoginViewEvents(loginViewEvents: LoginViewEvents) {
@ -74,7 +70,7 @@ abstract class AbstractLoginFragment : VectorBaseFragment(), OnBackPressed {
else -> else ->
// This is handled by the Activity // This is handled by the Activity
Unit Unit
} }.exhaustive
} }
override fun showFailure(throwable: Throwable) { override fun showFailure(throwable: Throwable) {

View file

@ -37,7 +37,6 @@ import im.vector.riotx.core.extensions.setTextOrHide
import im.vector.riotx.core.platform.StateView import im.vector.riotx.core.platform.StateView
import im.vector.riotx.core.platform.VectorBaseFragment import im.vector.riotx.core.platform.VectorBaseFragment
import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.AvatarRenderer
import io.reactivex.android.schedulers.AndroidSchedulers
import kotlinx.android.parcel.Parcelize import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.fragment_matrix_profile.* import kotlinx.android.synthetic.main.fragment_matrix_profile.*
import kotlinx.android.synthetic.main.view_stub_room_member_profile_header.* import kotlinx.android.synthetic.main.view_stub_room_member_profile_header.*
@ -80,18 +79,13 @@ class RoomMemberProfileFragment @Inject constructor(
appBarStateChangeListener = MatrixItemAppBarStateChangeListener(headerView, listOf(matrixProfileToolbarAvatarImageView, appBarStateChangeListener = MatrixItemAppBarStateChangeListener(headerView, listOf(matrixProfileToolbarAvatarImageView,
matrixProfileToolbarTitleView)) matrixProfileToolbarTitleView))
matrixProfileAppBarLayout.addOnOffsetChangedListener(appBarStateChangeListener) matrixProfileAppBarLayout.addOnOffsetChangedListener(appBarStateChangeListener)
viewModel.viewEvents viewModel.observeViewEvents {
.observe() when (it) {
.observeOn(AndroidSchedulers.mainThread()) is RoomMemberProfileViewEvents.Loading -> showLoading(it.message)
.subscribe { is RoomMemberProfileViewEvents.Failure -> showFailure(it.throwable)
dismissLoadingDialog() is RoomMemberProfileViewEvents.OnIgnoreActionSuccess -> Unit
when (it) { }.exhaustive
is RoomMemberProfileViewEvents.Loading -> showLoading(it.message) }
is RoomMemberProfileViewEvents.Failure -> showFailure(it.throwable)
is RoomMemberProfileViewEvents.OnIgnoreActionSuccess -> Unit
}.exhaustive
}
.disposeOnDestroyView()
} }
override fun onDestroyView() { override fun onDestroyView() {

View file

@ -39,7 +39,6 @@ import im.vector.riotx.features.home.room.list.actions.RoomListActionsArgs
import im.vector.riotx.features.home.room.list.actions.RoomListQuickActionsBottomSheet import im.vector.riotx.features.home.room.list.actions.RoomListQuickActionsBottomSheet
import im.vector.riotx.features.home.room.list.actions.RoomListQuickActionsSharedAction import im.vector.riotx.features.home.room.list.actions.RoomListQuickActionsSharedAction
import im.vector.riotx.features.home.room.list.actions.RoomListQuickActionsSharedActionViewModel import im.vector.riotx.features.home.room.list.actions.RoomListQuickActionsSharedActionViewModel
import io.reactivex.android.schedulers.AndroidSchedulers
import kotlinx.android.parcel.Parcelize import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.fragment_matrix_profile.* import kotlinx.android.synthetic.main.fragment_matrix_profile.*
import kotlinx.android.synthetic.main.view_stub_room_profile_header.* import kotlinx.android.synthetic.main.view_stub_room_profile_header.*
@ -79,18 +78,13 @@ class RoomProfileFragment @Inject constructor(
appBarStateChangeListener = MatrixItemAppBarStateChangeListener(headerView, listOf(matrixProfileToolbarAvatarImageView, appBarStateChangeListener = MatrixItemAppBarStateChangeListener(headerView, listOf(matrixProfileToolbarAvatarImageView,
matrixProfileToolbarTitleView)) matrixProfileToolbarTitleView))
matrixProfileAppBarLayout.addOnOffsetChangedListener(appBarStateChangeListener) matrixProfileAppBarLayout.addOnOffsetChangedListener(appBarStateChangeListener)
roomProfileViewModel.viewEvents roomProfileViewModel.observeViewEvents {
.observe() when (it) {
.observeOn(AndroidSchedulers.mainThread()) is RoomProfileViewEvents.Loading -> showLoading(it.message)
.subscribe { is RoomProfileViewEvents.Failure -> showFailure(it.throwable)
dismissLoadingDialog() is RoomProfileViewEvents.OnLeaveRoomSuccess -> onLeaveRoom()
when (it) { }.exhaustive
is RoomProfileViewEvents.Loading -> showLoading(it.message) }
is RoomProfileViewEvents.Failure -> showFailure(it.throwable)
is RoomProfileViewEvents.OnLeaveRoomSuccess -> onLeaveRoom()
}.exhaustive
}
.disposeOnDestroyView()
roomListQuickActionsSharedActionViewModel roomListQuickActionsSharedActionViewModel
.observe() .observe()
.subscribe { handleQuickActions(it) } .subscribe { handleQuickActions(it) }

View file

@ -31,7 +31,6 @@ import im.vector.riotx.core.extensions.exhaustive
import im.vector.riotx.core.platform.VectorBaseFragment import im.vector.riotx.core.platform.VectorBaseFragment
import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.AvatarRenderer
import im.vector.riotx.features.roomprofile.RoomProfileArgs import im.vector.riotx.features.roomprofile.RoomProfileArgs
import io.reactivex.android.schedulers.AndroidSchedulers
import kotlinx.android.synthetic.main.fragment_room_setting_generic.* import kotlinx.android.synthetic.main.fragment_room_setting_generic.*
import kotlinx.android.synthetic.main.merge_overlay_waiting_view.* import kotlinx.android.synthetic.main.merge_overlay_waiting_view.*
import javax.inject.Inject import javax.inject.Inject
@ -55,16 +54,11 @@ class RoomSettingsFragment @Inject constructor(
waiting_view_status_text.setText(R.string.please_wait) waiting_view_status_text.setText(R.string.please_wait)
waiting_view_status_text.isVisible = true waiting_view_status_text.isVisible = true
viewModel.viewEvents viewModel.observeViewEvents {
.observe() when (it) {
.observeOn(AndroidSchedulers.mainThread()) is RoomSettingsViewEvents.Failure -> showFailure(it.throwable)
.subscribe { }.exhaustive
dismissLoadingDialog() }
when (it) {
is RoomSettingsViewEvents.Failure -> showFailure(it.throwable)
}.exhaustive
}
.disposeOnDestroyView()
} }
override fun onDestroyView() { override fun onDestroyView() {

View file

@ -36,7 +36,6 @@ import im.vector.riotx.core.extensions.observeEvent
import im.vector.riotx.core.platform.VectorBaseActivity import im.vector.riotx.core.platform.VectorBaseActivity
import im.vector.riotx.core.platform.VectorBaseFragment import im.vector.riotx.core.platform.VectorBaseFragment
import im.vector.riotx.core.utils.toast import im.vector.riotx.core.utils.toast
import io.reactivex.android.schedulers.AndroidSchedulers
import kotlinx.android.synthetic.main.fragment_generic_recycler.* import kotlinx.android.synthetic.main.fragment_generic_recycler.*
import kotlinx.android.synthetic.main.merge_overlay_waiting_view.* import kotlinx.android.synthetic.main.merge_overlay_waiting_view.*
import javax.inject.Inject import javax.inject.Inject
@ -63,17 +62,12 @@ class VectorSettingsDevicesFragment @Inject constructor(
waiting_view_status_text.isVisible = true waiting_view_status_text.isVisible = true
devicesController.callback = this devicesController.callback = this
recyclerView.configureWith(devicesController, showDivider = true) recyclerView.configureWith(devicesController, showDivider = true)
viewModel.viewEvents viewModel.observeViewEvents {
.observe() when (it) {
.observeOn(AndroidSchedulers.mainThread()) is DevicesViewEvents.Loading -> showLoading(it.message)
.subscribe { is DevicesViewEvents.Failure -> showFailure(it.throwable)
dismissLoadingDialog() }.exhaustive
when (it) { }
is DevicesViewEvents.Loading -> showLoading(it.message)
is DevicesViewEvents.Failure -> showFailure(it.throwable)
}.exhaustive
}
.disposeOnDestroyView()
viewModel.requestPasswordLiveData.observeEvent(this) { viewModel.requestPasswordLiveData.observeEvent(this) {
maybeShowDeleteDeviceWithPasswordDialog() maybeShowDeleteDeviceWithPasswordDialog()
} }

View file

@ -30,7 +30,6 @@ import im.vector.riotx.core.extensions.configureWith
import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.extensions.exhaustive
import im.vector.riotx.core.platform.VectorBaseActivity import im.vector.riotx.core.platform.VectorBaseActivity
import im.vector.riotx.core.platform.VectorBaseFragment import im.vector.riotx.core.platform.VectorBaseFragment
import io.reactivex.android.schedulers.AndroidSchedulers
import kotlinx.android.synthetic.main.fragment_generic_recycler.* import kotlinx.android.synthetic.main.fragment_generic_recycler.*
import kotlinx.android.synthetic.main.merge_overlay_waiting_view.* import kotlinx.android.synthetic.main.merge_overlay_waiting_view.*
import javax.inject.Inject import javax.inject.Inject
@ -51,17 +50,12 @@ class VectorSettingsIgnoredUsersFragment @Inject constructor(
waiting_view_status_text.isVisible = true waiting_view_status_text.isVisible = true
ignoredUsersController.callback = this ignoredUsersController.callback = this
recyclerView.configureWith(ignoredUsersController) recyclerView.configureWith(ignoredUsersController)
viewModel.viewEvents viewModel.observeViewEvents {
.observe() when (it) {
.observeOn(AndroidSchedulers.mainThread()) is IgnoredUsersViewEvents.Loading -> showLoading(it.message)
.subscribe { is IgnoredUsersViewEvents.Failure -> showFailure(it.throwable)
dismissLoadingDialog() }.exhaustive
when (it) { }
is IgnoredUsersViewEvents.Loading -> showLoading(it.message)
is IgnoredUsersViewEvents.Failure -> showFailure(it.throwable)
}.exhaustive
}
.disposeOnDestroyView()
} }
override fun onDestroyView() { override fun onDestroyView() {