diff --git a/matrix-sdk-android-flow/src/main/java/org/matrix/android/sdk/flow/FlowRoom.kt b/matrix-sdk-android-flow/src/main/java/org/matrix/android/sdk/flow/FlowRoom.kt index 94f09e0bf5..88dd677cb8 100644 --- a/matrix-sdk-android-flow/src/main/java/org/matrix/android/sdk/flow/FlowRoom.kt +++ b/matrix-sdk-android-flow/src/main/java/org/matrix/android/sdk/flow/FlowRoom.kt @@ -30,6 +30,7 @@ import org.matrix.android.sdk.api.session.room.model.ReadReceipt import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState +import org.matrix.android.sdk.api.session.room.powerlevels.RoomPowerLevels import org.matrix.android.sdk.api.session.room.send.UserDraft import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.util.Optional @@ -95,6 +96,10 @@ class FlowRoom(private val room: Room) { } } + fun liveRoomPowerLevels(): Flow { + return room.stateService().getRoomPowerLevelsLive().asFlow() + } + fun liveReadMarker(): Flow> { return room.readService().getReadMarkerLive().asFlow() } 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..6da0f8df52 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 @@ -17,12 +17,7 @@ package org.matrix.android.sdk.api.session.room 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 -import org.matrix.android.sdk.api.session.events.model.EventType -import org.matrix.android.sdk.api.session.events.model.toModel -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 @@ -45,10 +40,5 @@ fun Room.getStateEvent(eventType: String, stateKey: QueryStateEventValue): Event * Get the current RoomPowerLevels of the room. */ fun Room.getRoomPowerLevels(): RoomPowerLevels { - val powerLevelsContent = getStateEvent(EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.IsEmpty)?.content?.toModel() - val roomCreateContent = getStateEvent(EventType.STATE_ROOM_CREATE, QueryStringValue.IsEmpty)?.getRoomCreateContentWithSender() - return RoomPowerLevels( - powerLevelsContent, - roomCreateContent - ) + return stateService().getRoomPowerLevels() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt index 6ca63c2c49..6e01d7edfa 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt @@ -24,6 +24,7 @@ import org.matrix.android.sdk.api.session.room.model.GuestAccess import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility import org.matrix.android.sdk.api.session.room.model.RoomJoinRules import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesAllowEntry +import org.matrix.android.sdk.api.session.room.powerlevels.RoomPowerLevels import org.matrix.android.sdk.api.util.JsonDict import org.matrix.android.sdk.api.util.Optional @@ -106,4 +107,6 @@ interface StateService { suspend fun setJoinRulePublic() suspend fun setJoinRuleInviteOnly() suspend fun setJoinRuleRestricted(allowList: List) + fun getRoomPowerLevels(): RoomPowerLevels + fun getRoomPowerLevelsLive(): LiveData } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/DefaultConditionResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/DefaultConditionResolver.kt index 3bc12eecb1..3a7a43c8ca 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/DefaultConditionResolver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/DefaultConditionResolver.kt @@ -24,13 +24,11 @@ import org.matrix.android.sdk.api.session.pushrules.SenderNotificationPermission import org.matrix.android.sdk.api.session.room.getRoomPowerLevels import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.session.room.RoomGetter -import org.matrix.android.sdk.internal.session.room.state.StateEventDataSource import javax.inject.Inject internal class DefaultConditionResolver @Inject constructor( private val roomGetter: RoomGetter, @UserId private val userId: String, - private val stateEventDataSource: StateEventDataSource, ) : ConditionResolver { override fun resolveEventMatchCondition( diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/powerlevels/RoomPowerLevels.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/powerlevels/RoomPowerLevels.kt index bbdbc4c123..9243672f1a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/powerlevels/RoomPowerLevels.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/powerlevels/RoomPowerLevels.kt @@ -17,17 +17,53 @@ package org.matrix.android.sdk.internal.session.room.powerlevels +import androidx.lifecycle.LiveData +import androidx.lifecycle.MediatorLiveData import org.matrix.android.sdk.api.query.QueryStringValue +import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel 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.util.Optional import org.matrix.android.sdk.internal.session.room.state.StateEventDataSource internal fun StateEventDataSource.getRoomPowerLevels(roomId: String): RoomPowerLevels { - val powerLevelsContent = getStateEvent(roomId, EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.IsEmpty) - ?.content?.toModel() - val roomCreateContent = getStateEvent(roomId, EventType.STATE_ROOM_CREATE, QueryStringValue.IsEmpty)?.getRoomCreateContentWithSender() + val powerLevelsEvent = getStateEvent(roomId, EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.IsEmpty) + val roomCreateEvent = getStateEvent(roomId, EventType.STATE_ROOM_CREATE, QueryStringValue.IsEmpty) + return createRoomPowerLevels(powerLevelsEvent = powerLevelsEvent, roomCreateEvent = roomCreateEvent) +} + +internal fun StateEventDataSource.getRoomPowerLevelsLive(roomId: String): LiveData { + val powerLevelsEventLive = getStateEventLive(roomId, EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.IsEmpty) + val roomCreateEventLive = getStateEventLive(roomId, EventType.STATE_ROOM_CREATE, QueryStringValue.IsEmpty) + val resultLiveData = MediatorLiveData() + + fun emitIfReady(powerLevelEvent: Optional?, roomCreateEvent: Optional?) { + if (powerLevelEvent != null && roomCreateEvent != null) { + val roomPowerLevels = createRoomPowerLevels(powerLevelEvent.get(), roomCreateEvent.get()) + resultLiveData.postValue(roomPowerLevels) + } + } + resultLiveData.apply { + var powerLevelEvent: Optional? = null + var roomCreateEvent: Optional? = null + + addSource(powerLevelsEventLive) { + powerLevelEvent = it + emitIfReady(powerLevelEvent, roomCreateEvent) + } + addSource(roomCreateEventLive) { + roomCreateEvent = it + emitIfReady(powerLevelEvent, roomCreateEvent) + } + } + return resultLiveData +} + +private fun createRoomPowerLevels(powerLevelsEvent: Event?, roomCreateEvent: Event?): RoomPowerLevels { + val powerLevelsContent = powerLevelsEvent?.content?.toModel() + val roomCreateContent = roomCreateEvent?.getRoomCreateContentWithSender() return RoomPowerLevels(powerLevelsContent, roomCreateContent) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt index ad47b82428..b939490ae3 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt @@ -31,11 +31,14 @@ import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility import org.matrix.android.sdk.api.session.room.model.RoomJoinRules import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesAllowEntry import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesContent +import org.matrix.android.sdk.api.session.room.powerlevels.RoomPowerLevels import org.matrix.android.sdk.api.session.room.state.StateService import org.matrix.android.sdk.api.util.JsonDict import org.matrix.android.sdk.api.util.MimeTypes import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.internal.session.content.FileUploader +import org.matrix.android.sdk.internal.session.room.powerlevels.getRoomPowerLevels +import org.matrix.android.sdk.internal.session.room.powerlevels.getRoomPowerLevelsLive internal class DefaultStateService @AssistedInject constructor( @Assisted private val roomId: String, @@ -65,6 +68,14 @@ internal class DefaultStateService @AssistedInject constructor( return stateEventDataSource.getStateEventsLive(roomId, eventTypes, stateKey) } + override fun getRoomPowerLevels(): RoomPowerLevels { + return stateEventDataSource.getRoomPowerLevels(roomId) + } + + override fun getRoomPowerLevelsLive(): LiveData { + return stateEventDataSource.getRoomPowerLevelsLive(roomId) + } + override suspend fun sendStateEvent( eventType: String, stateKey: String, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/version/DefaultRoomVersionService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/version/DefaultRoomVersionService.kt index fd99bb7158..0fec0e4c17 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/version/DefaultRoomVersionService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/version/DefaultRoomVersionService.kt @@ -23,12 +23,10 @@ import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.homeserver.RoomVersionStatus -import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent import org.matrix.android.sdk.api.session.room.model.create.RoomCreateContent -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.version.RoomVersionService import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource +import org.matrix.android.sdk.internal.session.room.powerlevels.getRoomPowerLevels import org.matrix.android.sdk.internal.session.room.state.StateEventDataSource internal class DefaultRoomVersionService @AssistedInject constructor( @@ -72,16 +70,7 @@ internal class DefaultRoomVersionService @AssistedInject constructor( } override fun userMayUpgradeRoom(userId: String): Boolean { - val powerLevelsContent = stateEventDataSource.getStateEvent(roomId, EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.IsEmpty) - ?.content?.toModel() - - val roomCreateContent = stateEventDataSource.getStateEvent(roomId, EventType.STATE_ROOM_CREATE, QueryStringValue.IsEmpty) - ?.getRoomCreateContentWithSender() - - val roomPowerLevels = RoomPowerLevels( - powerLevelsContent = powerLevelsContent, - roomCreateContent = roomCreateContent - ) + val roomPowerLevels = stateEventDataSource.getRoomPowerLevels(roomId) return roomPowerLevels.isUserAllowedToSend(userId, true, EventType.STATE_ROOM_TOMBSTONE) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt index 72b72990e8..f92a062546 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt @@ -54,7 +54,6 @@ import im.vector.app.features.home.room.typing.TypingHelper import im.vector.app.features.location.live.StopLiveLocationShareUseCase import im.vector.app.features.location.live.tracking.LocationSharingServiceConnection import im.vector.app.features.notifications.NotificationDrawerManager -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import im.vector.app.features.raw.wellknown.CryptoConfig import im.vector.app.features.raw.wellknown.getOutboundSessionKeySharingStrategyOrDefault import im.vector.app.features.raw.wellknown.withElementWellKnown @@ -302,7 +301,7 @@ class TimelineViewModel @AssistedInject constructor( private fun observePowerLevel() { if (room == null) return - PowerLevelsFlowFactory(room).createFlow() + room.flow().liveRoomPowerLevels() .onEach { powerLevels -> val canInvite = powerLevels.isUserAbleToInvite(session.myUserId) val isAllowedToManageWidgets = session.widgetService().hasPermissionsToHandleWidgets(room.roomId) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt index 00bc1890e7..4e645f93ae 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt @@ -30,7 +30,6 @@ import im.vector.app.features.home.room.detail.ChatEffect import im.vector.app.features.home.room.detail.composer.rainbow.RainbowGenerator import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView import im.vector.app.features.home.room.detail.toMessageType -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import im.vector.app.features.session.coroutineScope import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.voice.VoiceFailure @@ -179,7 +178,7 @@ class MessageComposerViewModel @AssistedInject constructor( private fun observePowerLevelAndEncryption(room: Room) { combine( - PowerLevelsFlowFactory(room).createFlow(), + room.flow().liveRoomPowerLevels(), room.flow().liveRoomSummary().unwrap() ) { pl, sum -> val canSendMessage = pl.isUserAllowedToSend(session.myUserId, false, EventType.MESSAGE) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt index 36f63f0b20..2280a26842 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt @@ -23,7 +23,6 @@ import im.vector.app.features.home.room.detail.timeline.format.NoticeEventFormat import im.vector.app.features.html.EventHtmlRenderer import im.vector.app.features.html.PillsPostProcessor import im.vector.app.features.html.VectorHtmlCompressor -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import im.vector.app.features.reactions.data.EmojiDataSource import im.vector.app.features.settings.VectorPreferences import im.vector.lib.strings.CommonStrings @@ -115,7 +114,7 @@ class MessageActionsViewModel @AssistedInject constructor( if (room == null) { return } - PowerLevelsFlowFactory(room).createFlow() + room.flow().liveRoomPowerLevels() .onEach { roomPowerLevels -> val canReact = roomPowerLevels.isUserAllowedToSend(session.myUserId, false, EventType.REACTION) val canRedact = roomPowerLevels.isUserAbleToRedact(session.myUserId) diff --git a/vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt b/vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt index c000c2423a..9c8dd1dc8e 100644 --- a/vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt @@ -19,7 +19,6 @@ import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.utils.PermissionChecker import im.vector.app.features.home.room.detail.timeline.helper.LocationPinProvider import im.vector.app.features.location.domain.usecase.CompareLocationsUseCase -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import im.vector.app.features.settings.VectorPreferences import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.distinctUntilChanged @@ -35,6 +34,7 @@ import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.getRoom import org.matrix.android.sdk.api.session.getUserOrDefault import org.matrix.android.sdk.api.util.toMatrixItem +import org.matrix.android.sdk.flow.flow import timber.log.Timber /** @@ -72,7 +72,7 @@ class LocationSharingViewModel @AssistedInject constructor( } private fun observePowerLevelsForLiveLocationSharing() { - PowerLevelsFlowFactory(room).createFlow() + room.flow().liveRoomPowerLevels() .distinctUntilChanged() .setOnEach { roomPowerLevels -> val canShareLiveLocation = EventType.STATE_ROOM_BEACON_INFO.values diff --git a/vector/src/main/java/im/vector/app/features/powerlevel/PowerLevelsFlowFactory.kt b/vector/src/main/java/im/vector/app/features/powerlevel/PowerLevelsFlowFactory.kt deleted file mode 100644 index fbbfac98dc..0000000000 --- a/vector/src/main/java/im/vector/app/features/powerlevel/PowerLevelsFlowFactory.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2020-2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package im.vector.app.features.powerlevel - -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.flowOn -import org.matrix.android.sdk.api.query.QueryStringValue -import org.matrix.android.sdk.api.session.events.model.EventType -import org.matrix.android.sdk.api.session.events.model.toModel -import org.matrix.android.sdk.api.session.room.Room -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.flow.flow -import org.matrix.android.sdk.flow.mapOptional - -class PowerLevelsFlowFactory(private val room: Room) { - - fun createFlow(): Flow { - val flowRoom = room.flow() - val powerLevelsFlow = flowRoom - .liveStateEvent(EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.IsEmpty) - .mapOptional { it.content.toModel() } - .flowOn(Dispatchers.Default) - - val roomCreateFlow = flowRoom - .liveStateEvent(EventType.STATE_ROOM_CREATE, QueryStringValue.IsEmpty) - .mapOptional { event -> - event.getRoomCreateContentWithSender() - } - .flowOn(Dispatchers.Default) - - return combine(powerLevelsFlow, roomCreateFlow) { powerLevelsContent, roomCreateContent -> - RoomPowerLevels( - powerLevelsContent = powerLevelsContent.getOrNull(), - roomCreateContent = roomCreateContent.getOrNull() - ) - } - } -} 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 6ac6449820..5330c3c4be 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 @@ -22,7 +22,7 @@ fun Role.isOwner() = this == Role.Creator || this == Role.SuperAdmin fun Room.membersByRoleFlow(): Flow>> { val roomMembersFlow = flow().liveRoomMembers(roomMemberQueryParams()) - val roomPowerLevelsFlow = PowerLevelsFlowFactory(this).createFlow() + val roomPowerLevelsFlow = flow().liveRoomPowerLevels() return combine(roomMembersFlow, roomPowerLevelsFlow) { roomMembers, roomPowerLevels -> roomMembers.groupBy { roomPowerLevels.getSuggestedRole(it.userId) } }.distinctUntilChanged() diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt index 14e286fd1d..47d4cf423e 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt @@ -23,7 +23,6 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.features.createdirect.DirectRoomHelper import im.vector.app.features.displayname.getBestName import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import im.vector.lib.strings.CommonStrings import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine @@ -361,7 +360,7 @@ class RoomMemberProfileViewModel @AssistedInject constructor( private fun observeRoomSummaryAndPowerLevels(room: Room) { val roomSummaryLive = room.flow().liveRoomSummary().unwrap() - val powerLevelsFlow = PowerLevelsFlowFactory(room).createFlow() + val powerLevelsFlow = room.flow().liveRoomPowerLevels() powerLevelsFlow .onEach { roomPowerLevels -> val permissions = ActionPermissions( diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewModel.kt index e2e70ee8b4..eae4d47de6 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewModel.kt @@ -19,7 +19,6 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.analytics.plan.Interaction import im.vector.app.features.home.ShortcutCreator -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import im.vector.app.features.powerlevel.isLastAdminFlow import im.vector.app.features.session.coroutineScope import im.vector.lib.strings.CommonStrings @@ -121,7 +120,7 @@ class RoomProfileViewModel @AssistedInject constructor( } private fun observePowerLevels() { - val powerLevelsContentLive = PowerLevelsFlowFactory(room).createFlow() + val powerLevelsContentLive = room.flow().liveRoomPowerLevels() powerLevelsContentLive .onEach { roomPowerLevels -> val canUpdateRoomState = roomPowerLevels.isUserAllowedToSend(session.myUserId, true, EventType.STATE_ROOM_ENCRYPTION) @@ -163,8 +162,7 @@ class RoomProfileViewModel @AssistedInject constructor( } private fun observePermissions() { - PowerLevelsFlowFactory(room) - .createFlow() + room.flow().liveRoomPowerLevels() .setOnEach { roomPowerLevels -> val permissions = RoomProfileViewState.ActionPermissions( canEnableEncryption = roomPowerLevels.isUserAllowedToSend(session.myUserId, true, EventType.STATE_ROOM_ENCRYPTION) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt index a2bd121cf9..2c1a112620 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt @@ -18,7 +18,6 @@ import dagger.assisted.AssistedInject import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch @@ -124,8 +123,7 @@ class RoomAliasViewModel @AssistedInject constructor( } private fun observePowerLevel() { - PowerLevelsFlowFactory(room) - .createFlow() + room.flow().liveRoomPowerLevels() .onEach { roomPowerLevels -> val permissions = RoomAliasViewState.ActionPermissions( canChangeCanonicalAlias = roomPowerLevels.isUserAllowedToSend( diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/banned/RoomBannedMemberListViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/banned/RoomBannedMemberListViewModel.kt index 6c0bbcb0e5..4d373dfaa8 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/banned/RoomBannedMemberListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/banned/RoomBannedMemberListViewModel.kt @@ -15,7 +15,6 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.resources.StringProvider -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import im.vector.lib.strings.CommonStrings import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -61,7 +60,7 @@ class RoomBannedMemberListViewModel @AssistedInject constructor( ) } - val powerLevelsFlow = PowerLevelsFlowFactory(room).createFlow() + val powerLevelsFlow = room.flow().liveRoomPowerLevels() powerLevelsFlow .setOnEach { roomPowerLevels -> copy(canUserBan = roomPowerLevels.isUserAbleToBan(session.myUserId)) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/members/RoomMemberListViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/members/RoomMemberListViewModel.kt index 2974e10649..65e02f63d4 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/members/RoomMemberListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/members/RoomMemberListViewModel.kt @@ -16,7 +16,6 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged @@ -72,7 +71,7 @@ class RoomMemberListViewModel @AssistedInject constructor( memberships = Membership.activeMemberships() } - val powerLevelsFlow = PowerLevelsFlowFactory(room).createFlow() + val powerLevelsFlow = room.flow().liveRoomPowerLevels() combine( roomFlow.liveRoomMembers(roomMemberQueryParams), powerLevelsFlow, @@ -137,7 +136,7 @@ class RoomMemberListViewModel @AssistedInject constructor( } private fun observePowerLevel() { - PowerLevelsFlowFactory(room).createFlow() + room.flow().liveRoomPowerLevels() .onEach { roomPowerLevels -> val permissions = ActionPermissions( canInvite = roomPowerLevels.isUserAbleToInvite(session.myUserId), diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewModel.kt index 3757a1ddd0..7f88ae88c7 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewModel.kt @@ -16,7 +16,6 @@ import dagger.assisted.AssistedInject import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch @@ -59,8 +58,7 @@ class RoomPermissionsViewModel @AssistedInject constructor( } private fun observePowerLevel() { - PowerLevelsFlowFactory(room) - .createFlow() + room.flow().liveRoomPowerLevels() .onEach { roomPowerLevels -> val permissions = RoomPermissionsViewState.ActionPermissions( canChangePowerLevels = roomPowerLevels.isUserAllowedToSend( diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsViewModel.kt index 188068afb4..c603927d77 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsViewModel.kt @@ -15,7 +15,6 @@ import dagger.assisted.AssistedInject import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import im.vector.app.features.settings.VectorPreferences import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.mapNotNull @@ -114,7 +113,7 @@ class RoomSettingsViewModel @AssistedInject constructor( ) } - val powerLevelsFlow = PowerLevelsFlowFactory(room).createFlow() + val powerLevelsFlow = room.flow().liveRoomPowerLevels() powerLevelsFlow .onEach { roomPowerLevels -> val permissions = RoomSettingsViewState.ActionPermissions( diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceMenuViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceMenuViewModel.kt index c8ac7af8b8..6744548872 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceMenuViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceMenuViewModel.kt @@ -20,7 +20,6 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import im.vector.app.features.session.coroutineScope import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -71,8 +70,7 @@ class SpaceMenuViewModel @AssistedInject constructor( } }.launchIn(viewModelScope) - PowerLevelsFlowFactory(room) - .createFlow() + room.flow().liveRoomPowerLevels() .onEach { roomPowerLevels -> val canInvite = roomPowerLevels.isUserAbleToInvite(session.myUserId) diff --git a/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryViewModel.kt index 3627dd5469..ed73ace342 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryViewModel.kt @@ -21,7 +21,6 @@ import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.analytics.extensions.toAnalyticsJoinedRoom import im.vector.app.features.analytics.plan.JoinedRoom -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map @@ -95,7 +94,7 @@ class SpaceDirectoryViewModel @AssistedInject constructor( private fun observePermissions() { val room = session.getRoom(initialState.spaceId) ?: return - val powerLevelsFlow = PowerLevelsFlowFactory(room).createFlow() + val powerLevelsFlow = room.flow().liveRoomPowerLevels() powerLevelsFlow .onEach { roomPowerLevels -> diff --git a/vector/src/main/java/im/vector/app/features/spaces/share/ShareSpaceViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/share/ShareSpaceViewModel.kt index b4d58f61a0..88c3348ed7 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/share/ShareSpaceViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/share/ShareSpaceViewModel.kt @@ -16,13 +16,13 @@ import dagger.assisted.AssistedInject import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.getRoom import org.matrix.android.sdk.api.session.getRoomSummary +import org.matrix.android.sdk.flow.flow class ShareSpaceViewModel @AssistedInject constructor( @Assisted private val initialState: ShareSpaceViewState, @@ -49,8 +49,7 @@ class ShareSpaceViewModel @AssistedInject constructor( private fun observePowerLevel() { val room = session.getRoom(initialState.spaceId) ?: return - PowerLevelsFlowFactory(room) - .createFlow() + room.flow().liveRoomPowerLevels() .onEach { roomPowerLevels -> setState { copy( diff --git a/vector/src/main/java/im/vector/app/features/widgets/WidgetViewModel.kt b/vector/src/main/java/im/vector/app/features/widgets/WidgetViewModel.kt index f1df2cff2a..1c4c19b4f5 100644 --- a/vector/src/main/java/im/vector/app/features/widgets/WidgetViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/widgets/WidgetViewModel.kt @@ -19,7 +19,6 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.resources.StringProvider -import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import im.vector.app.features.widgets.permissions.WidgetPermissionsHelper import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map @@ -97,8 +96,7 @@ class WidgetViewModel @AssistedInject constructor( if (room == null) { return } - PowerLevelsFlowFactory(room) - .createFlow() + room.flow().liveRoomPowerLevels() .map { roomPowerLevels -> roomPowerLevels.isUserAllowedToSend(session.myUserId, true, null) }