From 256a6e43221fc96dedd1863b67446ee212ff9267 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Feb 2020 17:34:26 +0100 Subject: [PATCH] Convert to ViewEvents -> RoomDetailViewModel --- .../home/room/detail/RoomDetailFragment.kt | 143 +++++++++--------- .../home/room/detail/RoomDetailViewEvents.kt | 3 + .../home/room/detail/RoomDetailViewModel.kt | 27 ++-- 3 files changed, 82 insertions(+), 91 deletions(-) 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 0d6dd292e9..7ec6f184ff 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,14 +307,12 @@ class RoomDetailFragment @Inject constructor( syncStateView.render(syncState) } - roomDetailViewModel.requestLiveData.observeEvent(this) { - displayRoomDetailActionResult(it) - } - roomDetailViewModel.observeViewEvents { when (it) { is RoomDetailViewEvents.Failure -> showErrorInSnackbar(it.throwable) is RoomDetailViewEvents.OnNewTimelineEvents -> scrollOnNewMessageCallback.addNewTimelineEventIds(it.eventIds) + is RoomDetailViewEvents.ActionSuccess -> displayRoomDetailActionSuccess(it) + is RoomDetailViewEvents.ActionFailure -> displayRoomDetailActionFailure(it) }.exhaustive } } @@ -793,84 +791,81 @@ class RoomDetailFragment @Inject constructor( .show() } - private fun displayRoomDetailActionResult(result: Async) { - when (result) { - is Fail -> { - AlertDialog.Builder(requireActivity()) - .setTitle(R.string.dialog_title_error) - .setMessage(errorFormatter.toHumanReadable(result.error)) - .setPositiveButton(R.string.ok, null) - .show() - } - is Success -> { - when (val data = result.invoke()) { - is RoomDetailAction.ReportContent -> { - when { - data.spam -> { - AlertDialog.Builder(requireActivity()) - .setTitle(R.string.content_reported_as_spam_title) - .setMessage(R.string.content_reported_as_spam_content) - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.block_user) { _, _ -> - roomDetailViewModel.handle(RoomDetailAction.IgnoreUser(data.senderId)) - } - .show() - .withColoredButton(DialogInterface.BUTTON_NEGATIVE) - } - data.inappropriate -> { - AlertDialog.Builder(requireActivity()) - .setTitle(R.string.content_reported_as_inappropriate_title) - .setMessage(R.string.content_reported_as_inappropriate_content) - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.block_user) { _, _ -> - roomDetailViewModel.handle(RoomDetailAction.IgnoreUser(data.senderId)) - } - .show() - .withColoredButton(DialogInterface.BUTTON_NEGATIVE) - } - else -> { - AlertDialog.Builder(requireActivity()) - .setTitle(R.string.content_reported_title) - .setMessage(R.string.content_reported_content) - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.block_user) { _, _ -> - roomDetailViewModel.handle(RoomDetailAction.IgnoreUser(data.senderId)) - } - .show() - .withColoredButton(DialogInterface.BUTTON_NEGATIVE) - } - } + private fun displayRoomDetailActionFailure(result: RoomDetailViewEvents.ActionFailure) { + AlertDialog.Builder(requireActivity()) + .setTitle(R.string.dialog_title_error) + .setMessage(errorFormatter.toHumanReadable(result.throwable)) + .setPositiveButton(R.string.ok, null) + .show() + } + + private fun displayRoomDetailActionSuccess(result: RoomDetailViewEvents.ActionSuccess) { + when (val data = result.action) { + is RoomDetailAction.ReportContent -> { + when { + data.spam -> { + AlertDialog.Builder(requireActivity()) + .setTitle(R.string.content_reported_as_spam_title) + .setMessage(R.string.content_reported_as_spam_content) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.block_user) { _, _ -> + roomDetailViewModel.handle(RoomDetailAction.IgnoreUser(data.senderId)) + } + .show() + .withColoredButton(DialogInterface.BUTTON_NEGATIVE) } - is RoomDetailAction.RequestVerification -> { - Timber.v("## SAS RequestVerification action") - VerificationBottomSheet.withArgs( - roomDetailArgs.roomId, - data.userId - ).show(parentFragmentManager, "REQ") + data.inappropriate -> { + AlertDialog.Builder(requireActivity()) + .setTitle(R.string.content_reported_as_inappropriate_title) + .setMessage(R.string.content_reported_as_inappropriate_content) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.block_user) { _, _ -> + roomDetailViewModel.handle(RoomDetailAction.IgnoreUser(data.senderId)) + } + .show() + .withColoredButton(DialogInterface.BUTTON_NEGATIVE) } - is RoomDetailAction.AcceptVerificationRequest -> { - Timber.v("## SAS AcceptVerificationRequest action") - VerificationBottomSheet.withArgs( - roomDetailArgs.roomId, - data.otherUserId, - data.transactionId - ).show(parentFragmentManager, "REQ") - } - is RoomDetailAction.ResumeVerification -> { - val otherUserId = data.otherUserId ?: return - VerificationBottomSheet().apply { - arguments = Bundle().apply { - putParcelable(MvRx.KEY_ARG, VerificationBottomSheet.VerificationArgs( - otherUserId, data.transactionId, roomId = roomDetailArgs.roomId)) - } - }.show(parentFragmentManager, "REQ") + else -> { + AlertDialog.Builder(requireActivity()) + .setTitle(R.string.content_reported_title) + .setMessage(R.string.content_reported_content) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.block_user) { _, _ -> + roomDetailViewModel.handle(RoomDetailAction.IgnoreUser(data.senderId)) + } + .show() + .withColoredButton(DialogInterface.BUTTON_NEGATIVE) } } } + is RoomDetailAction.RequestVerification -> { + Timber.v("## SAS RequestVerification action") + VerificationBottomSheet.withArgs( + roomDetailArgs.roomId, + data.userId + ).show(parentFragmentManager, "REQ") + } + is RoomDetailAction.AcceptVerificationRequest -> { + Timber.v("## SAS AcceptVerificationRequest action") + VerificationBottomSheet.withArgs( + roomDetailArgs.roomId, + data.otherUserId, + data.transactionId + ).show(parentFragmentManager, "REQ") + } + is RoomDetailAction.ResumeVerification -> { + val otherUserId = data.otherUserId ?: return + VerificationBottomSheet().apply { + arguments = Bundle().apply { + putParcelable(MvRx.KEY_ARG, VerificationBottomSheet.VerificationArgs( + otherUserId, data.transactionId, roomId = roomDetailArgs.roomId)) + } + }.show(parentFragmentManager, "REQ") + } } } -// TimelineEventController.Callback ************************************************************ + // TimelineEventController.Callback ************************************************************ override fun onUrlClicked(url: String): Boolean { permalinkHandler diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewEvents.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewEvents.kt index 6470e0c338..13e77d1974 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewEvents.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewEvents.kt @@ -24,4 +24,7 @@ import im.vector.riotx.core.platform.VectorViewEvents sealed class RoomDetailViewEvents : VectorViewEvents { data class Failure(val throwable: Throwable) : RoomDetailViewEvents() data class OnNewTimelineEvents(val eventIds: List) : RoomDetailViewEvents() + + data class ActionSuccess(val action: RoomDetailAction) : RoomDetailViewEvents() + data class ActionFailure(val action: RoomDetailAction, val throwable: Throwable) : RoomDetailViewEvents() } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt index 2bee55bce3..fda6e44771 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt @@ -20,8 +20,6 @@ import android.net.Uri import androidx.annotation.IdRes import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData -import com.airbnb.mvrx.Async -import com.airbnb.mvrx.Fail import com.airbnb.mvrx.FragmentViewModelContext import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.Success @@ -32,6 +30,7 @@ import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.MatrixPatterns +import im.vector.matrix.android.api.NoOpMatrixCallback import im.vector.matrix.android.api.query.QueryStringValue import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.events.model.EventType @@ -66,12 +65,11 @@ import im.vector.riotx.core.platform.VectorViewModel import im.vector.riotx.core.resources.StringProvider import im.vector.riotx.core.resources.UserPreferencesProvider import im.vector.riotx.core.utils.LiveEvent -import im.vector.matrix.android.api.NoOpMatrixCallback import im.vector.riotx.core.utils.subscribeLogError import im.vector.riotx.features.command.CommandParser import im.vector.riotx.features.command.ParsedCommand -import im.vector.riotx.features.home.room.detail.composer.rainbow.RainbowGenerator import im.vector.riotx.features.crypto.verification.supportedVerificationMethods +import im.vector.riotx.features.home.room.detail.composer.rainbow.RainbowGenerator import im.vector.riotx.features.home.room.detail.timeline.helper.TimelineDisplayableEvents import im.vector.riotx.features.home.room.typing.TypingHelper import im.vector.riotx.features.settings.VectorPreferences @@ -116,11 +114,6 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro var timeline = room.createTimeline(eventId, timelineSettings) private set - // Can be used for several actions, for a one shot result - private val _requestLiveData = MutableLiveData>>() - val requestLiveData: LiveData>> - get() = _requestLiveData - // Slot to keep a pending action during permission request var pendingAction: RoomDetailAction? = null // Slot to keep a pending uri during permission request @@ -821,11 +814,11 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro private fun handleReportContent(action: RoomDetailAction.ReportContent) { room.reportContent(action.eventId, -100, action.reason, object : MatrixCallback { override fun onSuccess(data: Unit) { - _requestLiveData.postValue(LiveEvent(Success(action))) + _viewEvents.post(RoomDetailViewEvents.ActionSuccess(action)) } override fun onFailure(failure: Throwable) { - _requestLiveData.postValue(LiveEvent(Fail(failure))) + _viewEvents.post(RoomDetailViewEvents.ActionFailure(action, failure)) } }) } @@ -837,11 +830,11 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro session.ignoreUserIds(listOf(action.userId), object : MatrixCallback { override fun onSuccess(data: Unit) { - _requestLiveData.postValue(LiveEvent(Success(action))) + _viewEvents.post(RoomDetailViewEvents.ActionSuccess(action)) } override fun onFailure(failure: Throwable) { - _requestLiveData.postValue(LiveEvent(Fail(failure))) + _viewEvents.post(RoomDetailViewEvents.ActionFailure(action, failure)) } }) } @@ -853,7 +846,7 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro action.otherUserId, room.roomId, action.transactionId)) { - _requestLiveData.postValue(LiveEvent(Success(action))) + _viewEvents.post(RoomDetailViewEvents.ActionSuccess(action)) } else { // TODO } @@ -869,7 +862,7 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro private fun handleRequestVerification(action: RoomDetailAction.RequestVerification) { if (action.userId == session.myUserId) return - _requestLiveData.postValue(LiveEvent(Success(action))) + _viewEvents.post(RoomDetailViewEvents.ActionSuccess(action)) } private fun handleResumeRequestVerification(action: RoomDetailAction.ResumeVerification) { @@ -877,9 +870,9 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro session.getVerificationService().getExistingVerificationRequestInRoom(room.roomId, action.transactionId)?.let { if (it.handledByOtherSession) return if (!it.isFinished) { - _requestLiveData.postValue(LiveEvent(Success(action.copy( + _viewEvents.post(RoomDetailViewEvents.ActionSuccess(action.copy( otherUserId = it.otherUserId - )))) + ))) } } }