mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2024-11-27 12:00:03 +03:00
Merging timeline: start branching it
This commit is contained in:
parent
63bbc89ed8
commit
736a8a13d9
3 changed files with 70 additions and 3 deletions
|
@ -32,6 +32,14 @@ class CallUserMapper(private val session: Session, private val protocolsChecker:
|
||||||
return virtualRoomEvent?.content?.toModel<RoomVirtualContent>()?.nativeRoomId
|
return virtualRoomEvent?.content?.toModel<RoomVirtualContent>()?.nativeRoomId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun virtualRoomForNativeRoom(roomId: String): String? {
|
||||||
|
val virtualRoomEvents = session.accountDataService().getRoomAccountDataEvents(setOf(RoomAccountDataTypes.EVENT_TYPE_VIRTUAL_ROOM))
|
||||||
|
return virtualRoomEvents.firstOrNull {
|
||||||
|
val virtualRoomContent = it.content.toModel<RoomVirtualContent>()
|
||||||
|
virtualRoomContent?.nativeRoomId == roomId
|
||||||
|
}?.roomId
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun getOrCreateVirtualRoomForRoom(roomId: String, opponentUserId: String): String? {
|
suspend fun getOrCreateVirtualRoomForRoom(roomId: String, opponentUserId: String): String? {
|
||||||
protocolsChecker.awaitCheckProtocols()
|
protocolsChecker.awaitCheckProtocols()
|
||||||
if (!protocolsChecker.supportVirtualRooms) return null
|
if (!protocolsChecker.supportVirtualRooms) return null
|
||||||
|
|
|
@ -49,6 +49,7 @@ import im.vector.app.features.crypto.keysrequest.OutboundSessionKeySharingStrate
|
||||||
import im.vector.app.features.crypto.verification.SupportedVerificationMethodsProvider
|
import im.vector.app.features.crypto.verification.SupportedVerificationMethodsProvider
|
||||||
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.sticker.StickerPickerActionHandler
|
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.RoomSummariesHolder
|
import im.vector.app.features.home.room.detail.timeline.helper.RoomSummariesHolder
|
||||||
import im.vector.app.features.home.room.detail.timeline.helper.TimelineSettingsFactory
|
import im.vector.app.features.home.room.detail.timeline.helper.TimelineSettingsFactory
|
||||||
import im.vector.app.features.home.room.detail.timeline.url.PreviewUrlRetriever
|
import im.vector.app.features.home.room.detail.timeline.url.PreviewUrlRetriever
|
||||||
|
@ -119,7 +120,7 @@ class RoomDetailViewModel @AssistedInject constructor(
|
||||||
private val chatEffectManager: ChatEffectManager,
|
private val chatEffectManager: ChatEffectManager,
|
||||||
private val directRoomHelper: DirectRoomHelper,
|
private val directRoomHelper: DirectRoomHelper,
|
||||||
private val jitsiService: JitsiService,
|
private val jitsiService: JitsiService,
|
||||||
timelineSettingsFactory: TimelineSettingsFactory
|
private val timelineFactory: TimelineFactory,
|
||||||
) : VectorViewModel<RoomDetailViewState, RoomDetailAction, RoomDetailViewEvents>(initialState),
|
) : VectorViewModel<RoomDetailViewState, RoomDetailAction, RoomDetailViewEvents>(initialState),
|
||||||
Timeline.Listener, ChatEffectManager.Delegate, CallProtocolsChecker.Listener {
|
Timeline.Listener, ChatEffectManager.Delegate, CallProtocolsChecker.Listener {
|
||||||
|
|
||||||
|
@ -127,9 +128,8 @@ class RoomDetailViewModel @AssistedInject constructor(
|
||||||
private val eventId = initialState.eventId
|
private val eventId = initialState.eventId
|
||||||
private val invisibleEventsObservable = BehaviorRelay.create<RoomDetailAction.TimelineEventTurnsInvisible>()
|
private val invisibleEventsObservable = BehaviorRelay.create<RoomDetailAction.TimelineEventTurnsInvisible>()
|
||||||
private val visibleEventsObservable = BehaviorRelay.create<RoomDetailAction.TimelineEventTurnsVisible>()
|
private val visibleEventsObservable = BehaviorRelay.create<RoomDetailAction.TimelineEventTurnsVisible>()
|
||||||
private val timelineSettings = timelineSettingsFactory.create()
|
|
||||||
private var timelineEvents = PublishRelay.create<List<TimelineEvent>>()
|
private var timelineEvents = PublishRelay.create<List<TimelineEvent>>()
|
||||||
val timeline = room.createTimeline(eventId, timelineSettings)
|
val timeline = timelineFactory.createTimeline(viewModelScope, room, eventId)
|
||||||
|
|
||||||
// Same lifecycle than the ViewModel (survive to screen rotation)
|
// Same lifecycle than the ViewModel (survive to screen rotation)
|
||||||
val previewUrlRetriever = PreviewUrlRetriever(session, viewModelScope)
|
val previewUrlRetriever = PreviewUrlRetriever(session, viewModelScope)
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.app.features.home.room.detail.timeline.factory
|
||||||
|
|
||||||
|
import im.vector.app.features.call.vectorCallService
|
||||||
|
import im.vector.app.features.home.room.detail.timeline.helper.TimelineSettingsFactory
|
||||||
|
import im.vector.app.features.home.room.detail.timeline.merged.MergedTimelines
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import org.matrix.android.sdk.api.session.Session
|
||||||
|
import org.matrix.android.sdk.api.session.events.model.EventType
|
||||||
|
import org.matrix.android.sdk.api.session.room.Room
|
||||||
|
import org.matrix.android.sdk.api.session.room.timeline.Timeline
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
private val secondaryTimelineAllowedTypes = listOf(
|
||||||
|
EventType.CALL_HANGUP,
|
||||||
|
EventType.CALL_INVITE,
|
||||||
|
EventType.CALL_REJECT,
|
||||||
|
EventType.CALL_ANSWER
|
||||||
|
)
|
||||||
|
|
||||||
|
class TimelineFactory @Inject constructor(private val session: Session, private val timelineSettingsFactory: TimelineSettingsFactory) {
|
||||||
|
|
||||||
|
fun createTimeline(coroutineScope: CoroutineScope, room: Room, eventId: String?): Timeline {
|
||||||
|
val settings = timelineSettingsFactory.create()
|
||||||
|
if (!session.vectorCallService.protocolChecker.supportVirtualRooms) {
|
||||||
|
return room.createTimeline(eventId, settings)
|
||||||
|
}
|
||||||
|
val virtualRoomId = session.vectorCallService.userMapper.virtualRoomForNativeRoom(room.roomId)
|
||||||
|
return if (virtualRoomId == null) {
|
||||||
|
room.createTimeline(eventId, settings)
|
||||||
|
} else {
|
||||||
|
val virtualRoom = session.getRoom(virtualRoomId)!!
|
||||||
|
MergedTimelines(
|
||||||
|
coroutineScope,
|
||||||
|
room.createTimeline(eventId, settings),
|
||||||
|
secondaryTimelineParams = MergedTimelines.SecondaryTimelineParams(
|
||||||
|
virtualRoom.createTimeline(null, settings),
|
||||||
|
shouldFilterTypes = true,
|
||||||
|
allowedTypes = secondaryTimelineAllowedTypes
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue