diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailActions.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailActions.kt index eec9eef5dc..25b526fb8a 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailActions.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailActions.kt @@ -50,7 +50,7 @@ sealed class RoomDetailActions { data class ResendMessage(val eventId: String) : RoomDetailActions() data class RemoveFailedEcho(val eventId: String) : RoomDetailActions() - data class ReportContent(val eventId: String, val reason: String) : RoomDetailActions() + data class ReportContent(val eventId: String, val reason: String, val spam: Boolean = false, val inappropriate: Boolean = false) : RoomDetailActions() object ClearSendQueue : RoomDetailActions() object ResendAll : RoomDetailActions() 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 d26dba44e1..1a6023f37d 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 @@ -268,6 +268,10 @@ class RoomDetailFragment : roomDetailViewModel.selectSubscribe(RoomDetailViewState::syncState) { syncState -> syncStateView.render(syncState) } + + roomDetailViewModel.requestLiveData.observeEvent(this) { + displayRoomDetailActionResult(it) + } } override fun onDestroy() { @@ -777,6 +781,51 @@ class RoomDetailFragment : .show() } + private fun displayRoomDetailActionResult(result: Async) { + when (result) { + is Fail -> { + AlertDialog.Builder(activity!!) + .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 RoomDetailActions.ReportContent -> { + when { + data.spam -> { + AlertDialog.Builder(activity!!) + .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) { _, _ -> vectorBaseActivity.notImplemented("block user") } + .show() + } + data.inappropriate -> { + AlertDialog.Builder(activity!!) + .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) { _, _ -> vectorBaseActivity.notImplemented("block user") } + .show() + } + else -> { + AlertDialog.Builder(activity!!) + .setTitle(R.string.content_reported_title) + .setMessage(R.string.content_reported_content) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.block_user) { _, _ -> vectorBaseActivity.notImplemented("block user") } + .show() + } + } + } + } + } + } + } + + // TimelineEventController.Callback ************************************************************ override fun onUrlClicked(url: String): Boolean { @@ -1064,10 +1113,10 @@ class RoomDetailFragment : roomDetailViewModel.process(RoomDetailActions.RemoveFailedEcho(action.eventId)) } is SimpleAction.ReportContentSpam -> { - roomDetailViewModel.process(RoomDetailActions.ReportContent(action.eventId, "This message is spam")) + roomDetailViewModel.process(RoomDetailActions.ReportContent(action.eventId, "This message is spam", spam = true)) } is SimpleAction.ReportContentInappropriate -> { - roomDetailViewModel.process(RoomDetailActions.ReportContent(action.eventId, "This message is inappropriate")) + roomDetailViewModel.process(RoomDetailActions.ReportContent(action.eventId, "This message is inappropriate", inappropriate = true)) } // TODO Custom else -> { 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 ee60a89bc1..0774e48d27 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 @@ -94,6 +94,11 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro private var timeline = room.createTimeline(eventId, timelineSettings) + // 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: RoomDetailActions? = null @@ -707,27 +712,13 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro } private fun handleReportContent(action: RoomDetailActions.ReportContent) { - setState { - copy( - reportContentRequest = Loading() - ) - } - room.reportContent(action.eventId, -100, action.reason, object : MatrixCallback { override fun onSuccess(data: Unit) { - setState { - copy( - reportContentRequest = Success(Unit) - ) - } + _requestLiveData.postValue(LiveEvent(Success(action))) } override fun onFailure(failure: Throwable) { - setState { - copy( - reportContentRequest = Fail(failure) - ) - } + _requestLiveData.postValue(LiveEvent(Fail(failure))) } }) } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewState.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewState.kt index ba20b9ed3f..03110858a1 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewState.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewState.kt @@ -52,8 +52,7 @@ data class RoomDetailViewState( val tombstoneEvent: Event? = null, val tombstoneEventHandling: Async = Uninitialized, val syncState: SyncState = SyncState.IDLE, - val highlightedEventId: String? = null, - val reportContentRequest: Async = Uninitialized + val highlightedEventId: String? = null ) : MvRxState { constructor(args: RoomDetailArgs) : this(roomId = args.roomId, eventId = args.eventId) diff --git a/vector/src/main/res/values/strings_riotX.xml b/vector/src/main/res/values/strings_riotX.xml index 6a2bcef5a7..30fae49f13 100644 --- a/vector/src/main/res/values/strings_riotX.xml +++ b/vector/src/main/res/values/strings_riotX.xml @@ -41,4 +41,15 @@ "It's spam" "It's inappropriate" "Custom report" + "Report this content" + "Reason for reporting this content" + "REPORT" + "BLOCK USER" + + "Content reported" + "This content was reported.\n\nIf you don't want to see any more content from this user, you can block him to hide his messages" + "Reported as spam" + "This content was reported as spam.\n\nIf you don't want to see any more content from this user, you can block him to hide his messages" + "Reported as inappropriate" + "This content was reported as inappropriate.\n\nIf you don't want to see any more content from this user, you can block him to hide his messages"