From c78bba803c0771ace846a59b72b5142198f229a0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 9 Jul 2020 17:47:41 +0200 Subject: [PATCH] Revoke ThreePid invitation (#548) --- .../members/RoomMemberListAction.kt | 4 ++- .../members/RoomMemberListFragment.kt | 17 ++++++++++++- .../members/RoomMemberListViewModel.kt | 25 ++++++++++++++++++- .../members/RoomMemberListViewState.kt | 3 ++- vector/src/main/res/values/strings.xml | 3 +++ 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListAction.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListAction.kt index 01a35b84d3..d6a63197bd 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListAction.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListAction.kt @@ -18,4 +18,6 @@ package im.vector.riotx.features.roomprofile.members import im.vector.riotx.core.platform.VectorViewModelAction -sealed class RoomMemberListAction : VectorViewModelAction +sealed class RoomMemberListAction : VectorViewModelAction { + data class RevokeThreePidInvite(val stateKey: String) : RoomMemberListAction() +} diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListFragment.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListFragment.kt index 72ec3e8462..6fe1f7ad18 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListFragment.kt @@ -20,11 +20,14 @@ import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.view.View +import androidx.appcompat.app.AlertDialog import com.airbnb.mvrx.args import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import im.vector.matrix.android.api.session.events.model.Event +import im.vector.matrix.android.api.session.events.model.toModel import im.vector.matrix.android.api.session.room.model.RoomMemberSummary +import im.vector.matrix.android.api.session.room.model.RoomThirdPartyInviteContent import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R import im.vector.riotx.core.extensions.cleanup @@ -90,7 +93,19 @@ class RoomMemberListFragment @Inject constructor( } override fun onThreePidInvites(event: Event) { - // TODO Display a bottom sheet to revoke invite if power level is high enough + // Display a dialog to revoke invite if power level is high enough + val content = event.content.toModel() ?: return + val stateKey = event.stateKey ?: return + if (withState(viewModel) { it.actionsPermissions.canRevokeThreePidInvite }) { + AlertDialog.Builder(requireActivity()) + .setTitle(R.string.three_pid_revoke_invite_dialog_title) + .setMessage(getString(R.string.three_pid_revoke_invite_dialog_content, content.displayName)) + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.revoke) { _, _ -> + viewModel.handle(RoomMemberListAction.RevokeThreePidInvite(stateKey)) + } + .show() + } } private fun renderRoomSummary(state: RoomMemberListViewState) { diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewModel.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewModel.kt index e412e41b73..23d5e61399 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewModel.kt @@ -16,11 +16,13 @@ package im.vector.riotx.features.roomprofile.members +import androidx.lifecycle.viewModelScope import com.airbnb.mvrx.FragmentViewModelContext import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.ViewModelContext import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject +import im.vector.matrix.android.api.NoOpMatrixCallback import im.vector.matrix.android.api.crypto.RoomEncryptionTrustLevel import im.vector.matrix.android.api.extensions.orFalse import im.vector.matrix.android.api.query.QueryStringValue @@ -37,12 +39,14 @@ import im.vector.matrix.rx.asObservable import im.vector.matrix.rx.mapOptional import im.vector.matrix.rx.rx import im.vector.matrix.rx.unwrap +import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.platform.EmptyViewEvents import im.vector.riotx.core.platform.VectorViewModel import im.vector.riotx.features.powerlevel.PowerLevelsObservableFactory import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.functions.BiFunction +import kotlinx.coroutines.launch import timber.log.Timber class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState: RoomMemberListViewState, @@ -125,7 +129,12 @@ class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState PowerLevelsObservableFactory(room).createObservable() .subscribe { val permissions = ActionPermissions( - canInvite = PowerLevelsHelper(it).isUserAbleToInvite(session.myUserId) + canInvite = PowerLevelsHelper(it).isUserAbleToInvite(session.myUserId), + canRevokeThreePidInvite = PowerLevelsHelper(it).isUserAllowedToSend( + userId = session.myUserId, + isState = true, + eventType = EventType.STATE_ROOM_THIRD_PARTY_INVITE + ) ) setState { copy(actionsPermissions = permissions) @@ -177,5 +186,19 @@ class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState } override fun handle(action: RoomMemberListAction) { + when (action) { + is RoomMemberListAction.RevokeThreePidInvite -> handleRevokeThreePidInvite(action) + }.exhaustive + } + + private fun handleRevokeThreePidInvite(action: RoomMemberListAction.RevokeThreePidInvite) { + viewModelScope.launch { + room.sendStateEvent( + eventType = EventType.STATE_ROOM_THIRD_PARTY_INVITE, + stateKey = action.stateKey, + body = emptyMap(), + callback = NoOpMatrixCallback() + ) + } } } diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewState.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewState.kt index 6a8738b450..55fb950a8e 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewState.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewState.kt @@ -40,7 +40,8 @@ data class RoomMemberListViewState( } data class ActionPermissions( - val canInvite: Boolean = false + val canInvite: Boolean = false, + val canRevokeThreePidInvite: Boolean = false ) typealias RoomMemberSummaries = List>> diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 62e27b51c2..15b658caeb 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -2550,4 +2550,7 @@ Not all features in Riot are implemented in RiotX yet. Main missing (and coming Retrieving your contacts… Your contact book is empty Contacts book + + Revoke invite + Revoke invite to %1$s?