diff --git a/vector/src/main/java/im/vector/riotx/core/platform/VectorBaseFragment.kt b/vector/src/main/java/im/vector/riotx/core/platform/VectorBaseFragment.kt index 7b9916b9ad..357fb0c5bc 100644 --- a/vector/src/main/java/im/vector/riotx/core/platform/VectorBaseFragment.kt +++ b/vector/src/main/java/im/vector/riotx/core/platform/VectorBaseFragment.kt @@ -46,6 +46,7 @@ import im.vector.riotx.core.di.HasScreenInjector import im.vector.riotx.core.di.ScreenComponent import im.vector.riotx.core.error.ErrorFormatter import im.vector.riotx.features.navigation.Navigator +import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable import timber.log.Timber @@ -234,6 +235,21 @@ abstract class VectorBaseFragment : BaseMvRxFragment(), HasScreenInjector { return this } + /* ========================================================================================== + * ViewEvents + * ========================================================================================== */ + + protected fun VectorViewModel<*, *, T>.observeViewEvents(observer: (T) -> Unit) { + viewEvents + .observe() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + dismissLoadingDialog() + observer(it) + } + .disposeOnDestroyView() + } + /* ========================================================================================== * MENU MANAGEMENT * ========================================================================================== */ diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt index 69b3314d64..3f8dcc04ff 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt @@ -307,15 +307,11 @@ class RoomDetailFragment @Inject constructor( displayRoomDetailActionResult(it) } - roomDetailViewModel.viewEvents - .observe() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - when (it) { - is RoomDetailViewEvents.Failure -> showErrorInSnackbar(it.throwable) - }.exhaustive - } - .disposeOnDestroyView() + roomDetailViewModel.observeViewEvents { + when (it) { + is RoomDetailViewEvents.Failure -> showErrorInSnackbar(it.throwable) + }.exhaustive + } } override fun onActivityCreated(savedInstanceState: Bundle?) { diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt index 8d55b2e710..5a32f4b8b3 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt @@ -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.notifications.NotificationDrawerManager import im.vector.riotx.features.share.SharedData -import io.reactivex.android.schedulers.AndroidSchedulers import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.fragment_room_list.* import javax.inject.Inject @@ -103,18 +102,13 @@ class RoomListFragment @Inject constructor( setupRecyclerView() sharedActionViewModel = activityViewModelProvider.get(RoomListQuickActionsSharedActionViewModel::class.java) roomListViewModel.subscribe { renderState(it) } - roomListViewModel.viewEvents - .observe() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - dismissLoadingDialog() - when (it) { - is RoomListViewEvents.Loading -> showLoading(it.message) - is RoomListViewEvents.Failure -> showFailure(it.throwable) - is RoomListViewEvents.SelectRoom -> openSelectedRoom(it) - }.exhaustive - } - .disposeOnDestroyView() + roomListViewModel.observeViewEvents { + when (it) { + is RoomListViewEvents.Loading -> showLoading(it.message) + is RoomListViewEvents.Failure -> showFailure(it.throwable) + is RoomListViewEvents.SelectRoom -> openSelectedRoom(it) + }.exhaustive + } createChatFabMenu.listener = this diff --git a/vector/src/main/java/im/vector/riotx/features/login/AbstractLoginFragment.kt b/vector/src/main/java/im/vector/riotx/features/login/AbstractLoginFragment.kt index b243ea771f..83263d05a2 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/AbstractLoginFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/AbstractLoginFragment.kt @@ -27,9 +27,9 @@ import com.airbnb.mvrx.withState import im.vector.matrix.android.api.failure.Failure import im.vector.matrix.android.api.failure.MatrixError 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.VectorBaseFragment -import io.reactivex.android.schedulers.AndroidSchedulers import javax.net.ssl.HttpsURLConnection /** @@ -59,13 +59,9 @@ abstract class AbstractLoginFragment : VectorBaseFragment(), OnBackPressed { loginSharedActionViewModel = activityViewModelProvider.get(LoginSharedActionViewModel::class.java) - loginViewModel.viewEvents - .observe() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - handleLoginViewEvents(it) - } - .disposeOnDestroyView() + loginViewModel.observeViewEvents { + handleLoginViewEvents(it) + } } private fun handleLoginViewEvents(loginViewEvents: LoginViewEvents) { @@ -74,7 +70,7 @@ abstract class AbstractLoginFragment : VectorBaseFragment(), OnBackPressed { else -> // This is handled by the Activity Unit - } + }.exhaustive } override fun showFailure(throwable: Throwable) { diff --git a/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileFragment.kt b/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileFragment.kt index 8be57fa774..3d1455042c 100644 --- a/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileFragment.kt @@ -37,7 +37,6 @@ import im.vector.riotx.core.extensions.setTextOrHide import im.vector.riotx.core.platform.StateView import im.vector.riotx.core.platform.VectorBaseFragment import im.vector.riotx.features.home.AvatarRenderer -import io.reactivex.android.schedulers.AndroidSchedulers import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.fragment_matrix_profile.* import kotlinx.android.synthetic.main.view_stub_room_member_profile_header.* @@ -80,18 +79,13 @@ class RoomMemberProfileFragment @Inject constructor( appBarStateChangeListener = MatrixItemAppBarStateChangeListener(headerView, listOf(matrixProfileToolbarAvatarImageView, matrixProfileToolbarTitleView)) matrixProfileAppBarLayout.addOnOffsetChangedListener(appBarStateChangeListener) - viewModel.viewEvents - .observe() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - dismissLoadingDialog() - when (it) { - is RoomMemberProfileViewEvents.Loading -> showLoading(it.message) - is RoomMemberProfileViewEvents.Failure -> showFailure(it.throwable) - is RoomMemberProfileViewEvents.OnIgnoreActionSuccess -> Unit - }.exhaustive - } - .disposeOnDestroyView() + viewModel.observeViewEvents { + when (it) { + is RoomMemberProfileViewEvents.Loading -> showLoading(it.message) + is RoomMemberProfileViewEvents.Failure -> showFailure(it.throwable) + is RoomMemberProfileViewEvents.OnIgnoreActionSuccess -> Unit + }.exhaustive + } } override fun onDestroyView() { diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileFragment.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileFragment.kt index 4e43f03e2e..4e86738271 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileFragment.kt @@ -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.RoomListQuickActionsSharedAction import im.vector.riotx.features.home.room.list.actions.RoomListQuickActionsSharedActionViewModel -import io.reactivex.android.schedulers.AndroidSchedulers import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.fragment_matrix_profile.* import kotlinx.android.synthetic.main.view_stub_room_profile_header.* @@ -79,18 +78,13 @@ class RoomProfileFragment @Inject constructor( appBarStateChangeListener = MatrixItemAppBarStateChangeListener(headerView, listOf(matrixProfileToolbarAvatarImageView, matrixProfileToolbarTitleView)) matrixProfileAppBarLayout.addOnOffsetChangedListener(appBarStateChangeListener) - roomProfileViewModel.viewEvents - .observe() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - dismissLoadingDialog() - when (it) { - is RoomProfileViewEvents.Loading -> showLoading(it.message) - is RoomProfileViewEvents.Failure -> showFailure(it.throwable) - is RoomProfileViewEvents.OnLeaveRoomSuccess -> onLeaveRoom() - }.exhaustive - } - .disposeOnDestroyView() + roomProfileViewModel.observeViewEvents { + when (it) { + is RoomProfileViewEvents.Loading -> showLoading(it.message) + is RoomProfileViewEvents.Failure -> showFailure(it.throwable) + is RoomProfileViewEvents.OnLeaveRoomSuccess -> onLeaveRoom() + }.exhaustive + } roomListQuickActionsSharedActionViewModel .observe() .subscribe { handleQuickActions(it) } diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsFragment.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsFragment.kt index dbc9893308..d2e06f30e7 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsFragment.kt @@ -31,7 +31,6 @@ import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.platform.VectorBaseFragment import im.vector.riotx.features.home.AvatarRenderer 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.merge_overlay_waiting_view.* 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.isVisible = true - viewModel.viewEvents - .observe() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - dismissLoadingDialog() - when (it) { - is RoomSettingsViewEvents.Failure -> showFailure(it.throwable) - }.exhaustive - } - .disposeOnDestroyView() + viewModel.observeViewEvents { + when (it) { + is RoomSettingsViewEvents.Failure -> showFailure(it.throwable) + }.exhaustive + } } override fun onDestroyView() { diff --git a/vector/src/main/java/im/vector/riotx/features/settings/devices/VectorSettingsDevicesFragment.kt b/vector/src/main/java/im/vector/riotx/features/settings/devices/VectorSettingsDevicesFragment.kt index 49c423f0ac..f24fb2f542 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/devices/VectorSettingsDevicesFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/devices/VectorSettingsDevicesFragment.kt @@ -36,7 +36,6 @@ import im.vector.riotx.core.extensions.observeEvent import im.vector.riotx.core.platform.VectorBaseActivity import im.vector.riotx.core.platform.VectorBaseFragment 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.merge_overlay_waiting_view.* import javax.inject.Inject @@ -63,17 +62,12 @@ class VectorSettingsDevicesFragment @Inject constructor( waiting_view_status_text.isVisible = true devicesController.callback = this recyclerView.configureWith(devicesController, showDivider = true) - viewModel.viewEvents - .observe() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - dismissLoadingDialog() - when (it) { - is DevicesViewEvents.Loading -> showLoading(it.message) - is DevicesViewEvents.Failure -> showFailure(it.throwable) - }.exhaustive - } - .disposeOnDestroyView() + viewModel.observeViewEvents { + when (it) { + is DevicesViewEvents.Loading -> showLoading(it.message) + is DevicesViewEvents.Failure -> showFailure(it.throwable) + }.exhaustive + } viewModel.requestPasswordLiveData.observeEvent(this) { maybeShowDeleteDeviceWithPasswordDialog() } diff --git a/vector/src/main/java/im/vector/riotx/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt b/vector/src/main/java/im/vector/riotx/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt index 5d12600b5c..c211d14edc 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt @@ -30,7 +30,6 @@ import im.vector.riotx.core.extensions.configureWith import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.platform.VectorBaseActivity 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.merge_overlay_waiting_view.* import javax.inject.Inject @@ -51,17 +50,12 @@ class VectorSettingsIgnoredUsersFragment @Inject constructor( waiting_view_status_text.isVisible = true ignoredUsersController.callback = this recyclerView.configureWith(ignoredUsersController) - viewModel.viewEvents - .observe() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - dismissLoadingDialog() - when (it) { - is IgnoredUsersViewEvents.Loading -> showLoading(it.message) - is IgnoredUsersViewEvents.Failure -> showFailure(it.throwable) - }.exhaustive - } - .disposeOnDestroyView() + viewModel.observeViewEvents { + when (it) { + is IgnoredUsersViewEvents.Loading -> showLoading(it.message) + is IgnoredUsersViewEvents.Failure -> showFailure(it.throwable) + }.exhaustive + } } override fun onDestroyView() {