From 4b241a00a3c41d8126d8c52cc3dadea0aaa70c77 Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Thu, 9 Sep 2021 12:35:39 +0200 Subject: [PATCH] Refactor power-level based display name color updates Use similar mechanism as recently added for isDirect changes. Change-Id: Ida304ae2cc2fbe85cc4b47cb32d6c343cd5e2bd6 --- .../im/vector/app/core/di/VectorComponent.kt | 3 -- .../home/room/detail/RoomDetailViewModel.kt | 7 ++--- .../home/room/detail/RoomDetailViewState.kt | 2 ++ .../timeline/TimelineEventController.kt | 19 ++++++++++-- .../helper/MatrixItemColorProvider.kt | 6 ++-- .../helper/MessageInformationDataFactory.kt | 7 +---- .../timeline/helper/PowerLevelsHolder.kt | 29 ------------------- 7 files changed, 25 insertions(+), 48 deletions(-) delete mode 100644 vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/PowerLevelsHolder.kt diff --git a/vector/src/main/java/im/vector/app/core/di/VectorComponent.kt b/vector/src/main/java/im/vector/app/core/di/VectorComponent.kt index b438d77812..68b212c830 100644 --- a/vector/src/main/java/im/vector/app/core/di/VectorComponent.kt +++ b/vector/src/main/java/im/vector/app/core/di/VectorComponent.kt @@ -40,7 +40,6 @@ import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.CurrentSpaceSuggestedRoomListDataSource import im.vector.app.features.home.room.detail.RoomDetailPendingActionStore import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider -import im.vector.app.features.home.room.detail.timeline.helper.PowerLevelsHolder import im.vector.app.features.html.EventHtmlRenderer import im.vector.app.features.html.VectorHtmlCompressor import im.vector.app.features.invite.AutoAcceptInvites @@ -168,8 +167,6 @@ interface VectorComponent { fun jitsiActiveConferenceHolder(): JitsiActiveConferenceHolder - fun powerLevelsHolder(): PowerLevelsHolder - @Component.Factory interface Factory { fun create(@BindsInstance context: Context): VectorComponent diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index 96ffba356f..acbc9cf334 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -52,7 +52,6 @@ import im.vector.app.features.home.room.detail.composer.VoiceMessageHelper import im.vector.app.features.home.room.detail.composer.rainbow.RainbowGenerator import im.vector.app.features.home.room.detail.sticker.StickerPickerActionHandler import im.vector.app.features.home.room.detail.timeline.factory.TimelineFactory -import im.vector.app.features.home.room.detail.timeline.helper.PowerLevelsHolder import im.vector.app.features.home.room.detail.timeline.url.PreviewUrlRetriever import im.vector.app.features.home.room.typing.TypingHelper import im.vector.app.features.powerlevel.PowerLevelsObservableFactory @@ -118,7 +117,6 @@ class RoomDetailViewModel @AssistedInject constructor( private val session: Session, private val supportedVerificationMethodsProvider: SupportedVerificationMethodsProvider, private val stickerPickerActionHandler: StickerPickerActionHandler, - private val powerLevelsHolder: PowerLevelsHolder, private val typingHelper: TypingHelper, private val callManager: WebRtcCallManager, private val chatEffectManager: ChatEffectManager, @@ -175,7 +173,6 @@ class RoomDetailViewModel @AssistedInject constructor( } init { - powerLevelsHolder.clear(room.roomId) timeline.start() timeline.addListener(this) observeRoomSummary() @@ -231,7 +228,6 @@ class RoomDetailViewModel @AssistedInject constructor( PowerLevelsObservableFactory(room).createObservable() .subscribe { val powerLevelsHelper = PowerLevelsHelper(it) - powerLevelsHolder.set(room.roomId, powerLevelsHelper) val canSendMessage = powerLevelsHelper.isUserAllowedToSend(session.myUserId, false, EventType.MESSAGE) val canInvite = powerLevelsHelper.isUserAbleToInvite(session.myUserId) val isAllowedToManageWidgets = session.widgetService().hasPermissionsToHandleWidgets(room.roomId) @@ -241,7 +237,8 @@ class RoomDetailViewModel @AssistedInject constructor( canSendMessage = canSendMessage, canInvite = canInvite, isAllowedToManageWidgets = isAllowedToManageWidgets, - isAllowedToStartWebRTCCall = isAllowedToStartWebRTCCall + isAllowedToStartWebRTCCall = isAllowedToStartWebRTCCall, + powerLevelsHelper = powerLevelsHelper ) } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt index 1c75429d11..d0995fe776 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt @@ -24,6 +24,7 @@ import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState 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.powerlevels.PowerLevelsHelper import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.sync.SyncState import org.matrix.android.sdk.api.session.widgets.model.Widget @@ -71,6 +72,7 @@ data class RoomDetailViewState( val myRoomMember: Async = Uninitialized, val asyncInviter: Async = Uninitialized, val asyncRoomSummary: Async = Uninitialized, + val powerLevelsHelper: PowerLevelsHelper? = null, val activeRoomWidgets: Async> = Uninitialized, val typingMessage: String? = null, val sendMode: SendMode = SendMode.REGULAR("", false), diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt index e347a1325b..2875599f36 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt @@ -43,6 +43,7 @@ import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventsGro import im.vector.app.features.home.room.detail.timeline.helper.ContentDownloadStateTrackerBinder import im.vector.app.features.home.room.detail.timeline.helper.ContentUploadStateTrackerBinder import im.vector.app.features.home.room.detail.timeline.helper.InvalidateTimelineEventDiffUtilCallback +import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider import im.vector.app.features.home.room.detail.timeline.helper.TimelineControllerInterceptorHelper import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventDiffUtilCallback import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventVisibilityHelper @@ -69,6 +70,7 @@ import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.room.model.message.MessageAudioContent import org.matrix.android.sdk.api.session.room.model.message.MessageImageInfoContent import org.matrix.android.sdk.api.session.room.model.message.MessageVideoContent +import org.matrix.android.sdk.api.session.room.powerlevels.PowerLevelsHelper import org.matrix.android.sdk.api.session.room.timeline.Timeline import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import javax.inject.Inject @@ -94,14 +96,16 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec val unreadState: UnreadState = UnreadState.Unknown, val highlightedEventId: String? = null, val jitsiState: JitsiState = JitsiState(), - val roomSummary: RoomSummary? = null + val roomSummary: RoomSummary? = null, + val powerLevelsHelper: PowerLevelsHelper? = null ) { constructor(state: RoomDetailViewState) : this( unreadState = state.unreadState, highlightedEventId = state.highlightedEventId, jitsiState = state.jitsiState, - roomSummary = state.asyncRoomSummary() + roomSummary = state.asyncRoomSummary(), + powerLevelsHelper = state.powerLevelsHelper, ) } @@ -247,12 +251,23 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec fun update(viewState: RoomDetailViewState) = synchronized(modelCache) { val newPartialState = PartialState(viewState) + // Full list rebuild if isDirect changed to apply new layout if (partialState.roomSummary?.isDirect != newPartialState.roomSummary?.isDirect) { partialState = newPartialState invalidateFullTimeline() // This already called requestModelBuild return } + // Full list rebuild if power levels changed and username colors depend on power levels + if (partialState.powerLevelsHelper != newPartialState.powerLevelsHelper) { + val coloringMode = vectorPreferences.userColorMode(newPartialState.roomSummary?.isDirect ?: false, newPartialState.roomSummary?.isPublic ?: false) + if (coloringMode == MatrixItemColorProvider.USER_COLORING_FROM_PL) { + partialState = newPartialState + invalidateFullTimeline() + // This already called requestModelBuild + return + } + } if (partialState.highlightedEventId != newPartialState.highlightedEventId) { // Clear cache to force a refresh for (i in 0 until modelCache.size) { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MatrixItemColorProvider.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MatrixItemColorProvider.kt index 046efe24d6..98e3889587 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MatrixItemColorProvider.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MatrixItemColorProvider.kt @@ -99,9 +99,9 @@ class MatrixItemColorProvider @Inject constructor( } // Same values as in R.array.user_color_mode_values - private const val USER_COLORING_UNIFORM = "uniform" - private const val USER_COLORING_FROM_ID = "from-id" - private const val USER_COLORING_FROM_PL = "from-pl" + public const val USER_COLORING_UNIFORM = "uniform" + public const val USER_COLORING_FROM_ID = "from-id" + public const val USER_COLORING_FROM_PL = "from-pl" const val USER_COLORING_DEFAULT = USER_COLORING_UNIFORM } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt index ae15348aab..78183efab4 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt @@ -55,7 +55,6 @@ import javax.inject.Inject * This class compute if data of an event (such has avatar, display name, ...) should be displayed, depending on the previous event in the timeline */ class MessageInformationDataFactory @Inject constructor(private val session: Session, - private val powerLevelsHolder: PowerLevelsHolder, private val dateFormatter: VectorDateFormatter, private val context: Context, private val visibilityHelper: TimelineEventVisibilityHelper, @@ -126,11 +125,7 @@ class MessageInformationDataFactory @Inject constructor(private val session: Ses } // Sender power level - /* - val powerLevelsHelper = session.getRoom(event.roomId)?.getStateEvent(EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.NoCondition)?.content.toModel()?.let { PowerLevelsHelper(it) } - val senderPowerLevel = powerLevelsHelper?.getUserPowerLevelValue(event.senderInfo.userId) - */ - val senderPowerLevel = powerLevelsHolder.get(event.roomId)?.getUserPowerLevelValue(event.senderInfo.userId) + val senderPowerLevel = params.partialState.powerLevelsHelper?.getUserPowerLevelValue(event.senderInfo.userId) return MessageInformationData( eventId = eventId, diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/PowerLevelsHolder.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/PowerLevelsHolder.kt deleted file mode 100644 index eb259a2538..0000000000 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/PowerLevelsHolder.kt +++ /dev/null @@ -1,29 +0,0 @@ -package im.vector.app.features.home.room.detail.timeline.helper - -import org.matrix.android.sdk.api.session.room.powerlevels.PowerLevelsHelper -import javax.inject.Inject -import javax.inject.Singleton - -/* - You can use this to share user power level helpers within the app. - You should probably use this only in the context of the timeline. - */ -@Singleton -class PowerLevelsHolder @Inject constructor() { - - private var roomHelpers = HashMap() - - fun set(roomId: String, powerLevelsHelper: PowerLevelsHelper) { - roomHelpers[roomId] = powerLevelsHelper - } - - fun get(roomId: String) = roomHelpers[roomId] - - fun clear() { - roomHelpers.clear() - } - - fun clear(roomId: String) { - roomHelpers.remove(roomId) - } -}