diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml
index 02fef53306..f1922645ac 100644
--- a/library/ui-strings/src/main/res/values/strings.xml
+++ b/library/ui-strings/src/main/res/values/strings.xml
@@ -686,6 +686,7 @@
Leave room
Are you sure you want to leave the room?
This room is not public. You will not be able to rejoin without an invite.
+ You\'re the only admin of this room. Leaving it will mean no one has control over it.
Direct Messages
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomExtensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomExtensions.kt
index 29638857bc..f9c04ac34e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomExtensions.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomExtensions.kt
@@ -16,6 +16,7 @@
package org.matrix.android.sdk.api.session.room
+import kotlinx.coroutines.flow.Flow
import org.matrix.android.sdk.api.query.QueryStateEventValue
import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.events.model.Event
@@ -25,6 +26,8 @@ import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent
import org.matrix.android.sdk.api.session.room.model.create.getRoomCreateContentWithSender
import org.matrix.android.sdk.api.session.room.powerlevels.RoomPowerLevels
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
+import org.matrix.android.sdk.api.session.user.model.User
+import org.matrix.android.sdk.internal.di.UserId
/**
* Get a TimelineEvent using the TimelineService of a Room.
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
index 1e04880382..51b413058e 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
@@ -25,7 +25,6 @@ import com.airbnb.epoxy.OnModelBuildFinishedListener
import com.airbnb.mvrx.args
import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState
-import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dagger.hilt.android.AndroidEntryPoint
import im.vector.app.R
import im.vector.app.core.epoxy.LayoutManagerStateRestorer
@@ -45,6 +44,7 @@ import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedA
import im.vector.app.features.home.room.list.widget.NotifsFabMenuView
import im.vector.app.features.matrixto.OriginOfMatrixTo
import im.vector.app.features.notifications.NotificationDrawerManager
+import im.vector.app.features.room.LeaveRoomPrompt
import im.vector.lib.strings.CommonStrings
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.launchIn
@@ -422,7 +422,7 @@ class RoomListFragment :
}
}
- private fun handleQuickActions(quickAction: RoomListQuickActionsSharedAction) {
+ private suspend fun handleQuickActions(quickAction: RoomListQuickActionsSharedAction) {
when (quickAction) {
is RoomListQuickActionsSharedAction.NotificationsAllNoisy -> {
roomListViewModel.handle(RoomListAction.ChangeRoomNotificationState(quickAction.roomId, RoomNotificationState.ALL_MESSAGES_NOISY))
@@ -451,26 +451,11 @@ class RoomListFragment :
}
}
- private fun promptLeaveRoom(roomId: String) {
- val isPublicRoom = roomListViewModel.isPublicRoom(roomId)
- val message = buildString {
- append(getString(CommonStrings.room_participants_leave_prompt_msg))
- if (!isPublicRoom) {
- append("\n\n")
- append(getString(CommonStrings.room_participants_leave_private_warning))
- }
+ private suspend fun promptLeaveRoom(roomId: String) {
+ val warning = roomListViewModel.getLeaveRoomWarning(roomId)
+ LeaveRoomPrompt.show(requireContext(), warning) {
+ roomListViewModel.handle(RoomListAction.LeaveRoom(roomId))
}
- MaterialAlertDialogBuilder(
- requireContext(),
- if (isPublicRoom) 0 else im.vector.lib.ui.styles.R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive
- )
- .setTitle(CommonStrings.room_participants_leave_prompt_title)
- .setMessage(message)
- .setPositiveButton(CommonStrings.action_leave) { _, _ ->
- roomListViewModel.handle(RoomListAction.LeaveRoom(roomId))
- }
- .setNegativeButton(CommonStrings.action_cancel, null)
- .show()
}
override fun invalidate() = withState(roomListViewModel) { state ->
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt
index 907c4cca72..d5821fab81 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt
@@ -26,6 +26,8 @@ import im.vector.app.features.analytics.extensions.toAnalyticsJoinedRoom
import im.vector.app.features.analytics.plan.JoinedRoom
import im.vector.app.features.displayname.getBestName
import im.vector.app.features.invite.AutoAcceptInvites
+import im.vector.app.features.room.LeaveRoomPrompt
+import im.vector.app.features.room.getLeaveRoomWarning
import im.vector.app.features.settings.VectorPreferences
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.distinctUntilChanged
@@ -41,7 +43,6 @@ import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
import org.matrix.android.sdk.api.session.room.model.localecho.RoomLocalEcho
import org.matrix.android.sdk.api.session.room.model.tag.RoomTag
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
-import org.matrix.android.sdk.api.session.room.state.isPublic
import org.matrix.android.sdk.api.util.toMatrixItem
import org.matrix.android.sdk.flow.flow
import timber.log.Timber
@@ -150,10 +151,11 @@ class RoomListViewModel @AssistedInject constructor(
}
}
- fun isPublicRoom(roomId: String): Boolean {
- return session.getRoom(roomId)?.stateService()?.isPublic().orFalse()
+ suspend fun getLeaveRoomWarning(roomId: String): LeaveRoomPrompt.Warning {
+ return session.getLeaveRoomWarning(roomId)
}
+
// PRIVATE METHODS *****************************************************************************
private fun handleSelectRoom(action: RoomListAction.SelectRoom) = withState {
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt
index 02d702685a..a6421f19a0 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt
@@ -18,7 +18,6 @@ import androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode
import androidx.recyclerview.widget.LinearLayoutManager
import com.airbnb.epoxy.OnModelBuildFinishedListener
import com.airbnb.mvrx.fragmentViewModel
-import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dagger.hilt.android.AndroidEntryPoint
import im.vector.app.core.epoxy.LayoutManagerStateRestorer
import im.vector.app.core.extensions.cleanup
@@ -36,7 +35,7 @@ import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedA
import im.vector.app.features.home.room.list.home.header.HomeRoomFilter
import im.vector.app.features.home.room.list.home.header.HomeRoomsHeadersController
import im.vector.app.features.home.room.list.home.invites.InvitesActivity
-import im.vector.lib.strings.CommonStrings
+import im.vector.app.features.room.LeaveRoomPrompt
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.matrix.android.sdk.api.session.room.model.RoomSummary
@@ -103,7 +102,7 @@ class HomeRoomListFragment :
}
}
- private fun handleQuickActions(quickAction: RoomListQuickActionsSharedAction) {
+ private suspend fun handleQuickActions(quickAction: RoomListQuickActionsSharedAction) {
when (quickAction) {
is RoomListQuickActionsSharedAction.NotificationsAllNoisy -> {
roomListViewModel.handle(HomeRoomListAction.ChangeRoomNotificationState(quickAction.roomId, RoomNotificationState.ALL_MESSAGES_NOISY))
@@ -185,26 +184,11 @@ class HomeRoomListFragment :
concatAdapter.addAdapter(roomsAdapter)
}
- private fun promptLeaveRoom(roomId: String) {
- val isPublicRoom = roomListViewModel.isPublicRoom(roomId)
- val message = buildString {
- append(getString(CommonStrings.room_participants_leave_prompt_msg))
- if (!isPublicRoom) {
- append("\n\n")
- append(getString(CommonStrings.room_participants_leave_private_warning))
- }
+ private suspend fun promptLeaveRoom(roomId: String) {
+ val warning = roomListViewModel.getLeaveRoomWarning(roomId)
+ LeaveRoomPrompt.show(requireContext(), warning) {
+ roomListViewModel.handle(HomeRoomListAction.LeaveRoom(roomId))
}
- MaterialAlertDialogBuilder(
- requireContext(),
- if (isPublicRoom) 0 else im.vector.lib.ui.styles.R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive
- )
- .setTitle(CommonStrings.room_participants_leave_prompt_title)
- .setMessage(message)
- .setPositiveButton(CommonStrings.action_leave) { _, _ ->
- roomListViewModel.handle(HomeRoomListAction.LeaveRoom(roomId))
- }
- .setNegativeButton(CommonStrings.action_cancel, null)
- .show()
}
private fun onInvitesCounterClicked() {
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt
index d232dab3fb..2b367d75e9 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt
@@ -26,6 +26,8 @@ import im.vector.app.features.analytics.extensions.toTrackingValue
import im.vector.app.features.analytics.plan.UserProperties
import im.vector.app.features.displayname.getBestName
import im.vector.app.features.home.room.list.home.header.HomeRoomFilter
+import im.vector.app.features.room.LeaveRoomPrompt
+import im.vector.app.features.room.getLeaveRoomWarning
import im.vector.lib.strings.CommonStrings
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
@@ -331,8 +333,8 @@ class HomeRoomListViewModel @AssistedInject constructor(
filteredPagedRoomSummariesLive.queryParams = getFilteredQueryParams(newFilter, filteredPagedRoomSummariesLive.queryParams)
}
- fun isPublicRoom(roomId: String): Boolean {
- return session.getRoom(roomId)?.stateService()?.isPublic().orFalse()
+ suspend fun getLeaveRoomWarning(roomId: String): LeaveRoomPrompt.Warning {
+ return session.getLeaveRoomWarning(roomId)
}
private fun handleSelectRoom(action: HomeRoomListAction.SelectRoom) = withState {
diff --git a/vector/src/main/java/im/vector/app/features/powerlevel/Role.kt b/vector/src/main/java/im/vector/app/features/powerlevel/Role.kt
index d61bbef768..6ac6449820 100644
--- a/vector/src/main/java/im/vector/app/features/powerlevel/Role.kt
+++ b/vector/src/main/java/im/vector/app/features/powerlevel/Role.kt
@@ -7,6 +7,37 @@
package im.vector.app.features.powerlevel
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
+import org.matrix.android.sdk.api.session.room.Room
+import org.matrix.android.sdk.api.session.room.members.roomMemberQueryParams
+import org.matrix.android.sdk.api.session.room.model.Membership
+import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
import org.matrix.android.sdk.api.session.room.powerlevels.Role
+import org.matrix.android.sdk.flow.flow
fun Role.isOwner() = this == Role.Creator || this == Role.SuperAdmin
+
+fun Room.membersByRoleFlow(): Flow