1
0
mirror of https://github.com/vector-im/riotX-android synced 2025-10-05 15:52:47 +02:00

misc : clean up after PR review

This commit is contained in:
ganfra
2025-08-04 18:19:25 +02:00
parent fe0b54e898
commit a239f5fb08
24 changed files with 81 additions and 115 deletions

View File

@@ -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.RoomMemberSummary
import org.matrix.android.sdk.api.session.room.model.RoomSummary 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.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.send.UserDraft
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.api.util.Optional
@@ -95,6 +96,10 @@ class FlowRoom(private val room: Room) {
} }
} }
fun liveRoomPowerLevels(): Flow<RoomPowerLevels> {
return room.stateService().getRoomPowerLevelsLive().asFlow()
}
fun liveReadMarker(): Flow<Optional<String>> { fun liveReadMarker(): Flow<Optional<String>> {
return room.readService().getReadMarkerLive().asFlow() return room.readService().getReadMarkerLive().asFlow()
} }

View File

@@ -17,12 +17,7 @@
package org.matrix.android.sdk.api.session.room package org.matrix.android.sdk.api.session.room
import org.matrix.android.sdk.api.query.QueryStateEventValue 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.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.powerlevels.RoomPowerLevels
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent 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. * Get the current RoomPowerLevels of the room.
*/ */
fun Room.getRoomPowerLevels(): RoomPowerLevels { fun Room.getRoomPowerLevels(): RoomPowerLevels {
val powerLevelsContent = getStateEvent(EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.IsEmpty)?.content?.toModel<PowerLevelsContent>() return stateService().getRoomPowerLevels()
val roomCreateContent = getStateEvent(EventType.STATE_ROOM_CREATE, QueryStringValue.IsEmpty)?.getRoomCreateContentWithSender()
return RoomPowerLevels(
powerLevelsContent,
roomCreateContent
)
} }

View File

@@ -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.RoomHistoryVisibility
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules 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.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.JsonDict
import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.api.util.Optional
@@ -106,4 +107,6 @@ interface StateService {
suspend fun setJoinRulePublic() suspend fun setJoinRulePublic()
suspend fun setJoinRuleInviteOnly() suspend fun setJoinRuleInviteOnly()
suspend fun setJoinRuleRestricted(allowList: List<String>) suspend fun setJoinRuleRestricted(allowList: List<String>)
fun getRoomPowerLevels(): RoomPowerLevels
fun getRoomPowerLevelsLive(): LiveData<RoomPowerLevels>
} }

View File

@@ -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.api.session.room.getRoomPowerLevels
import org.matrix.android.sdk.internal.di.UserId 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.RoomGetter
import org.matrix.android.sdk.internal.session.room.state.StateEventDataSource
import javax.inject.Inject import javax.inject.Inject
internal class DefaultConditionResolver @Inject constructor( internal class DefaultConditionResolver @Inject constructor(
private val roomGetter: RoomGetter, private val roomGetter: RoomGetter,
@UserId private val userId: String, @UserId private val userId: String,
private val stateEventDataSource: StateEventDataSource,
) : ConditionResolver { ) : ConditionResolver {
override fun resolveEventMatchCondition( override fun resolveEventMatchCondition(

View File

@@ -17,17 +17,53 @@
package org.matrix.android.sdk.internal.session.room.powerlevels 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.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.EventType
import org.matrix.android.sdk.api.session.events.model.toModel 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.PowerLevelsContent
import org.matrix.android.sdk.api.session.room.model.create.getRoomCreateContentWithSender 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.powerlevels.RoomPowerLevels
import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.internal.session.room.state.StateEventDataSource import org.matrix.android.sdk.internal.session.room.state.StateEventDataSource
internal fun StateEventDataSource.getRoomPowerLevels(roomId: String): RoomPowerLevels { internal fun StateEventDataSource.getRoomPowerLevels(roomId: String): RoomPowerLevels {
val powerLevelsContent = getStateEvent(roomId, EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.IsEmpty) val powerLevelsEvent = getStateEvent(roomId, EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.IsEmpty)
?.content?.toModel<PowerLevelsContent>() val roomCreateEvent = getStateEvent(roomId, EventType.STATE_ROOM_CREATE, QueryStringValue.IsEmpty)
val roomCreateContent = getStateEvent(roomId, EventType.STATE_ROOM_CREATE, QueryStringValue.IsEmpty)?.getRoomCreateContentWithSender() return createRoomPowerLevels(powerLevelsEvent = powerLevelsEvent, roomCreateEvent = roomCreateEvent)
}
internal fun StateEventDataSource.getRoomPowerLevelsLive(roomId: String): LiveData<RoomPowerLevels> {
val powerLevelsEventLive = getStateEventLive(roomId, EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.IsEmpty)
val roomCreateEventLive = getStateEventLive(roomId, EventType.STATE_ROOM_CREATE, QueryStringValue.IsEmpty)
val resultLiveData = MediatorLiveData<RoomPowerLevels>()
fun emitIfReady(powerLevelEvent: Optional<Event>?, roomCreateEvent: Optional<Event>?) {
if (powerLevelEvent != null && roomCreateEvent != null) {
val roomPowerLevels = createRoomPowerLevels(powerLevelEvent.get(), roomCreateEvent.get())
resultLiveData.postValue(roomPowerLevels)
}
}
resultLiveData.apply {
var powerLevelEvent: Optional<Event>? = null
var roomCreateEvent: Optional<Event>? = 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<PowerLevelsContent>()
val roomCreateContent = roomCreateEvent?.getRoomCreateContentWithSender()
return RoomPowerLevels(powerLevelsContent, roomCreateContent) return RoomPowerLevels(powerLevelsContent, roomCreateContent)
} }

View File

@@ -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.RoomJoinRules
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesAllowEntry 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.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.session.room.state.StateService
import org.matrix.android.sdk.api.util.JsonDict import org.matrix.android.sdk.api.util.JsonDict
import org.matrix.android.sdk.api.util.MimeTypes import org.matrix.android.sdk.api.util.MimeTypes
import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.internal.session.content.FileUploader 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( internal class DefaultStateService @AssistedInject constructor(
@Assisted private val roomId: String, @Assisted private val roomId: String,
@@ -65,6 +68,14 @@ internal class DefaultStateService @AssistedInject constructor(
return stateEventDataSource.getStateEventsLive(roomId, eventTypes, stateKey) return stateEventDataSource.getStateEventsLive(roomId, eventTypes, stateKey)
} }
override fun getRoomPowerLevels(): RoomPowerLevels {
return stateEventDataSource.getRoomPowerLevels(roomId)
}
override fun getRoomPowerLevelsLive(): LiveData<RoomPowerLevels> {
return stateEventDataSource.getRoomPowerLevelsLive(roomId)
}
override suspend fun sendStateEvent( override suspend fun sendStateEvent(
eventType: String, eventType: String,
stateKey: String, stateKey: String,

View File

@@ -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.EventType
import org.matrix.android.sdk.api.session.events.model.toModel 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.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.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.api.session.room.version.RoomVersionService
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource 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 import org.matrix.android.sdk.internal.session.room.state.StateEventDataSource
internal class DefaultRoomVersionService @AssistedInject constructor( internal class DefaultRoomVersionService @AssistedInject constructor(
@@ -72,16 +70,7 @@ internal class DefaultRoomVersionService @AssistedInject constructor(
} }
override fun userMayUpgradeRoom(userId: String): Boolean { override fun userMayUpgradeRoom(userId: String): Boolean {
val powerLevelsContent = stateEventDataSource.getStateEvent(roomId, EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.IsEmpty) val roomPowerLevels = stateEventDataSource.getRoomPowerLevels(roomId)
?.content?.toModel<PowerLevelsContent>()
val roomCreateContent = stateEventDataSource.getStateEvent(roomId, EventType.STATE_ROOM_CREATE, QueryStringValue.IsEmpty)
?.getRoomCreateContentWithSender()
val roomPowerLevels = RoomPowerLevels(
powerLevelsContent = powerLevelsContent,
roomCreateContent = roomCreateContent
)
return roomPowerLevels.isUserAllowedToSend(userId, true, EventType.STATE_ROOM_TOMBSTONE) return roomPowerLevels.isUserAllowedToSend(userId, true, EventType.STATE_ROOM_TOMBSTONE)
} }

View File

@@ -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.StopLiveLocationShareUseCase
import im.vector.app.features.location.live.tracking.LocationSharingServiceConnection import im.vector.app.features.location.live.tracking.LocationSharingServiceConnection
import im.vector.app.features.notifications.NotificationDrawerManager 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.CryptoConfig
import im.vector.app.features.raw.wellknown.getOutboundSessionKeySharingStrategyOrDefault import im.vector.app.features.raw.wellknown.getOutboundSessionKeySharingStrategyOrDefault
import im.vector.app.features.raw.wellknown.withElementWellKnown import im.vector.app.features.raw.wellknown.withElementWellKnown
@@ -302,7 +301,7 @@ class TimelineViewModel @AssistedInject constructor(
private fun observePowerLevel() { private fun observePowerLevel() {
if (room == null) return if (room == null) return
PowerLevelsFlowFactory(room).createFlow() room.flow().liveRoomPowerLevels()
.onEach { powerLevels -> .onEach { powerLevels ->
val canInvite = powerLevels.isUserAbleToInvite(session.myUserId) val canInvite = powerLevels.isUserAbleToInvite(session.myUserId)
val isAllowedToManageWidgets = session.widgetService().hasPermissionsToHandleWidgets(room.roomId) val isAllowedToManageWidgets = session.widgetService().hasPermissionsToHandleWidgets(room.roomId)

View File

@@ -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.rainbow.RainbowGenerator
import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView 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.home.room.detail.toMessageType
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
import im.vector.app.features.session.coroutineScope import im.vector.app.features.session.coroutineScope
import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorPreferences
import im.vector.app.features.voice.VoiceFailure import im.vector.app.features.voice.VoiceFailure
@@ -179,7 +178,7 @@ class MessageComposerViewModel @AssistedInject constructor(
private fun observePowerLevelAndEncryption(room: Room) { private fun observePowerLevelAndEncryption(room: Room) {
combine( combine(
PowerLevelsFlowFactory(room).createFlow(), room.flow().liveRoomPowerLevels(),
room.flow().liveRoomSummary().unwrap() room.flow().liveRoomSummary().unwrap()
) { pl, sum -> ) { pl, sum ->
val canSendMessage = pl.isUserAllowedToSend(session.myUserId, false, EventType.MESSAGE) val canSendMessage = pl.isUserAllowedToSend(session.myUserId, false, EventType.MESSAGE)

View File

@@ -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.EventHtmlRenderer
import im.vector.app.features.html.PillsPostProcessor import im.vector.app.features.html.PillsPostProcessor
import im.vector.app.features.html.VectorHtmlCompressor 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.reactions.data.EmojiDataSource
import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorPreferences
import im.vector.lib.strings.CommonStrings import im.vector.lib.strings.CommonStrings
@@ -115,7 +114,7 @@ class MessageActionsViewModel @AssistedInject constructor(
if (room == null) { if (room == null) {
return return
} }
PowerLevelsFlowFactory(room).createFlow() room.flow().liveRoomPowerLevels()
.onEach { roomPowerLevels -> .onEach { roomPowerLevels ->
val canReact = roomPowerLevels.isUserAllowedToSend(session.myUserId, false, EventType.REACTION) val canReact = roomPowerLevels.isUserAllowedToSend(session.myUserId, false, EventType.REACTION)
val canRedact = roomPowerLevels.isUserAbleToRedact(session.myUserId) val canRedact = roomPowerLevels.isUserAbleToRedact(session.myUserId)

View File

@@ -19,7 +19,6 @@ import im.vector.app.core.platform.VectorViewModel
import im.vector.app.core.utils.PermissionChecker import im.vector.app.core.utils.PermissionChecker
import im.vector.app.features.home.room.detail.timeline.helper.LocationPinProvider 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.location.domain.usecase.CompareLocationsUseCase
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorPreferences
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.distinctUntilChanged 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.getRoom
import org.matrix.android.sdk.api.session.getUserOrDefault import org.matrix.android.sdk.api.session.getUserOrDefault
import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.api.util.toMatrixItem
import org.matrix.android.sdk.flow.flow
import timber.log.Timber import timber.log.Timber
/** /**
@@ -72,7 +72,7 @@ class LocationSharingViewModel @AssistedInject constructor(
} }
private fun observePowerLevelsForLiveLocationSharing() { private fun observePowerLevelsForLiveLocationSharing() {
PowerLevelsFlowFactory(room).createFlow() room.flow().liveRoomPowerLevels()
.distinctUntilChanged() .distinctUntilChanged()
.setOnEach { roomPowerLevels -> .setOnEach { roomPowerLevels ->
val canShareLiveLocation = EventType.STATE_ROOM_BEACON_INFO.values val canShareLiveLocation = EventType.STATE_ROOM_BEACON_INFO.values

View File

@@ -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<RoomPowerLevels> {
val flowRoom = room.flow()
val powerLevelsFlow = flowRoom
.liveStateEvent(EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.IsEmpty)
.mapOptional { it.content.toModel<PowerLevelsContent>() }
.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()
)
}
}
}

View File

@@ -22,7 +22,7 @@ fun Role.isOwner() = this == Role.Creator || this == Role.SuperAdmin
fun Room.membersByRoleFlow(): Flow<Map<Role, List<RoomMemberSummary>>> { fun Room.membersByRoleFlow(): Flow<Map<Role, List<RoomMemberSummary>>> {
val roomMembersFlow = flow().liveRoomMembers(roomMemberQueryParams()) val roomMembersFlow = flow().liveRoomMembers(roomMemberQueryParams())
val roomPowerLevelsFlow = PowerLevelsFlowFactory(this).createFlow() val roomPowerLevelsFlow = flow().liveRoomPowerLevels()
return combine(roomMembersFlow, roomPowerLevelsFlow) { roomMembers, roomPowerLevels -> return combine(roomMembersFlow, roomPowerLevelsFlow) { roomMembers, roomPowerLevels ->
roomMembers.groupBy { roomPowerLevels.getSuggestedRole(it.userId) } roomMembers.groupBy { roomPowerLevels.getSuggestedRole(it.userId) }
}.distinctUntilChanged() }.distinctUntilChanged()

View File

@@ -23,7 +23,6 @@ import im.vector.app.core.resources.StringProvider
import im.vector.app.features.createdirect.DirectRoomHelper import im.vector.app.features.createdirect.DirectRoomHelper
import im.vector.app.features.displayname.getBestName import im.vector.app.features.displayname.getBestName
import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider 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 im.vector.lib.strings.CommonStrings
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
@@ -361,7 +360,7 @@ class RoomMemberProfileViewModel @AssistedInject constructor(
private fun observeRoomSummaryAndPowerLevels(room: Room) { private fun observeRoomSummaryAndPowerLevels(room: Room) {
val roomSummaryLive = room.flow().liveRoomSummary().unwrap() val roomSummaryLive = room.flow().liveRoomSummary().unwrap()
val powerLevelsFlow = PowerLevelsFlowFactory(room).createFlow() val powerLevelsFlow = room.flow().liveRoomPowerLevels()
powerLevelsFlow powerLevelsFlow
.onEach { roomPowerLevels -> .onEach { roomPowerLevels ->
val permissions = ActionPermissions( val permissions = ActionPermissions(

View File

@@ -19,7 +19,6 @@ import im.vector.app.core.resources.StringProvider
import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.analytics.AnalyticsTracker
import im.vector.app.features.analytics.plan.Interaction import im.vector.app.features.analytics.plan.Interaction
import im.vector.app.features.home.ShortcutCreator 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.powerlevel.isLastAdminFlow
import im.vector.app.features.session.coroutineScope import im.vector.app.features.session.coroutineScope
import im.vector.lib.strings.CommonStrings import im.vector.lib.strings.CommonStrings
@@ -121,7 +120,7 @@ class RoomProfileViewModel @AssistedInject constructor(
} }
private fun observePowerLevels() { private fun observePowerLevels() {
val powerLevelsContentLive = PowerLevelsFlowFactory(room).createFlow() val powerLevelsContentLive = room.flow().liveRoomPowerLevels()
powerLevelsContentLive powerLevelsContentLive
.onEach { roomPowerLevels -> .onEach { roomPowerLevels ->
val canUpdateRoomState = roomPowerLevels.isUserAllowedToSend(session.myUserId, true, EventType.STATE_ROOM_ENCRYPTION) val canUpdateRoomState = roomPowerLevels.isUserAllowedToSend(session.myUserId, true, EventType.STATE_ROOM_ENCRYPTION)
@@ -163,8 +162,7 @@ class RoomProfileViewModel @AssistedInject constructor(
} }
private fun observePermissions() { private fun observePermissions() {
PowerLevelsFlowFactory(room) room.flow().liveRoomPowerLevels()
.createFlow()
.setOnEach { roomPowerLevels -> .setOnEach { roomPowerLevels ->
val permissions = RoomProfileViewState.ActionPermissions( val permissions = RoomProfileViewState.ActionPermissions(
canEnableEncryption = roomPowerLevels.isUserAllowedToSend(session.myUserId, true, EventType.STATE_ROOM_ENCRYPTION) canEnableEncryption = roomPowerLevels.isUserAllowedToSend(session.myUserId, true, EventType.STATE_ROOM_ENCRYPTION)

View File

@@ -18,7 +18,6 @@ import dagger.assisted.AssistedInject
import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -124,8 +123,7 @@ class RoomAliasViewModel @AssistedInject constructor(
} }
private fun observePowerLevel() { private fun observePowerLevel() {
PowerLevelsFlowFactory(room) room.flow().liveRoomPowerLevels()
.createFlow()
.onEach { roomPowerLevels -> .onEach { roomPowerLevels ->
val permissions = RoomAliasViewState.ActionPermissions( val permissions = RoomAliasViewState.ActionPermissions(
canChangeCanonicalAlias = roomPowerLevels.isUserAllowedToSend( canChangeCanonicalAlias = roomPowerLevels.isUserAllowedToSend(

View File

@@ -15,7 +15,6 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.core.resources.StringProvider import im.vector.app.core.resources.StringProvider
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
import im.vector.lib.strings.CommonStrings import im.vector.lib.strings.CommonStrings
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -61,7 +60,7 @@ class RoomBannedMemberListViewModel @AssistedInject constructor(
) )
} }
val powerLevelsFlow = PowerLevelsFlowFactory(room).createFlow() val powerLevelsFlow = room.flow().liveRoomPowerLevels()
powerLevelsFlow powerLevelsFlow
.setOnEach { roomPowerLevels -> .setOnEach { roomPowerLevels ->
copy(canUserBan = roomPowerLevels.isUserAbleToBan(session.myUserId)) copy(canUserBan = roomPowerLevels.isUserAbleToBan(session.myUserId))

View File

@@ -16,7 +16,6 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.EmptyViewEvents
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
@@ -72,7 +71,7 @@ class RoomMemberListViewModel @AssistedInject constructor(
memberships = Membership.activeMemberships() memberships = Membership.activeMemberships()
} }
val powerLevelsFlow = PowerLevelsFlowFactory(room).createFlow() val powerLevelsFlow = room.flow().liveRoomPowerLevels()
combine( combine(
roomFlow.liveRoomMembers(roomMemberQueryParams), roomFlow.liveRoomMembers(roomMemberQueryParams),
powerLevelsFlow, powerLevelsFlow,
@@ -137,7 +136,7 @@ class RoomMemberListViewModel @AssistedInject constructor(
} }
private fun observePowerLevel() { private fun observePowerLevel() {
PowerLevelsFlowFactory(room).createFlow() room.flow().liveRoomPowerLevels()
.onEach { roomPowerLevels -> .onEach { roomPowerLevels ->
val permissions = ActionPermissions( val permissions = ActionPermissions(
canInvite = roomPowerLevels.isUserAbleToInvite(session.myUserId), canInvite = roomPowerLevels.isUserAbleToInvite(session.myUserId),

View File

@@ -16,7 +16,6 @@ import dagger.assisted.AssistedInject
import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -59,8 +58,7 @@ class RoomPermissionsViewModel @AssistedInject constructor(
} }
private fun observePowerLevel() { private fun observePowerLevel() {
PowerLevelsFlowFactory(room) room.flow().liveRoomPowerLevels()
.createFlow()
.onEach { roomPowerLevels -> .onEach { roomPowerLevels ->
val permissions = RoomPermissionsViewState.ActionPermissions( val permissions = RoomPermissionsViewState.ActionPermissions(
canChangePowerLevels = roomPowerLevels.isUserAllowedToSend( canChangePowerLevels = roomPowerLevels.isUserAllowedToSend(

View File

@@ -15,7 +15,6 @@ import dagger.assisted.AssistedInject
import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorPreferences
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.mapNotNull
@@ -114,7 +113,7 @@ class RoomSettingsViewModel @AssistedInject constructor(
) )
} }
val powerLevelsFlow = PowerLevelsFlowFactory(room).createFlow() val powerLevelsFlow = room.flow().liveRoomPowerLevels()
powerLevelsFlow powerLevelsFlow
.onEach { roomPowerLevels -> .onEach { roomPowerLevels ->
val permissions = RoomSettingsViewState.ActionPermissions( val permissions = RoomSettingsViewState.ActionPermissions(

View File

@@ -20,7 +20,6 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.EmptyViewEvents
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
import im.vector.app.features.session.coroutineScope import im.vector.app.features.session.coroutineScope
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
@@ -71,8 +70,7 @@ class SpaceMenuViewModel @AssistedInject constructor(
} }
}.launchIn(viewModelScope) }.launchIn(viewModelScope)
PowerLevelsFlowFactory(room) room.flow().liveRoomPowerLevels()
.createFlow()
.onEach { roomPowerLevels -> .onEach { roomPowerLevels ->
val canInvite = roomPowerLevels.isUserAbleToInvite(session.myUserId) val canInvite = roomPowerLevels.isUserAbleToInvite(session.myUserId)

View File

@@ -21,7 +21,6 @@ import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.analytics.AnalyticsTracker
import im.vector.app.features.analytics.extensions.toAnalyticsJoinedRoom import im.vector.app.features.analytics.extensions.toAnalyticsJoinedRoom
import im.vector.app.features.analytics.plan.JoinedRoom import im.vector.app.features.analytics.plan.JoinedRoom
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
@@ -95,7 +94,7 @@ class SpaceDirectoryViewModel @AssistedInject constructor(
private fun observePermissions() { private fun observePermissions() {
val room = session.getRoom(initialState.spaceId) ?: return val room = session.getRoom(initialState.spaceId) ?: return
val powerLevelsFlow = PowerLevelsFlowFactory(room).createFlow() val powerLevelsFlow = room.flow().liveRoomPowerLevels()
powerLevelsFlow powerLevelsFlow
.onEach { roomPowerLevels -> .onEach { roomPowerLevels ->

View File

@@ -16,13 +16,13 @@ import dagger.assisted.AssistedInject
import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.getRoom import org.matrix.android.sdk.api.session.getRoom
import org.matrix.android.sdk.api.session.getRoomSummary import org.matrix.android.sdk.api.session.getRoomSummary
import org.matrix.android.sdk.flow.flow
class ShareSpaceViewModel @AssistedInject constructor( class ShareSpaceViewModel @AssistedInject constructor(
@Assisted private val initialState: ShareSpaceViewState, @Assisted private val initialState: ShareSpaceViewState,
@@ -49,8 +49,7 @@ class ShareSpaceViewModel @AssistedInject constructor(
private fun observePowerLevel() { private fun observePowerLevel() {
val room = session.getRoom(initialState.spaceId) ?: return val room = session.getRoom(initialState.spaceId) ?: return
PowerLevelsFlowFactory(room) room.flow().liveRoomPowerLevels()
.createFlow()
.onEach { roomPowerLevels -> .onEach { roomPowerLevels ->
setState { setState {
copy( copy(

View File

@@ -19,7 +19,6 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.core.resources.StringProvider import im.vector.app.core.resources.StringProvider
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
import im.vector.app.features.widgets.permissions.WidgetPermissionsHelper import im.vector.app.features.widgets.permissions.WidgetPermissionsHelper
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
@@ -97,8 +96,7 @@ class WidgetViewModel @AssistedInject constructor(
if (room == null) { if (room == null) {
return return
} }
PowerLevelsFlowFactory(room) room.flow().liveRoomPowerLevels()
.createFlow()
.map { roomPowerLevels -> .map { roomPowerLevels ->
roomPowerLevels.isUserAllowedToSend(session.myUserId, true, null) roomPowerLevels.isUserAllowedToSend(session.myUserId, true, null)
} }