2018-10-17 16:21:09 +00:00
|
|
|
package im.vector.matrix.android.internal.session.room
|
|
|
|
|
2018-10-18 16:38:11 +00:00
|
|
|
import android.arch.lifecycle.LiveData
|
2018-10-29 13:57:36 +00:00
|
|
|
import android.arch.lifecycle.Transformations
|
2018-10-18 16:38:11 +00:00
|
|
|
import android.arch.paging.PagedList
|
|
|
|
import com.zhuinden.monarchy.Monarchy
|
2018-10-25 14:55:41 +00:00
|
|
|
import im.vector.matrix.android.api.MatrixCallback
|
2018-10-22 17:36:29 +00:00
|
|
|
import im.vector.matrix.android.api.session.events.model.EnrichedEvent
|
2018-10-17 16:21:09 +00:00
|
|
|
import im.vector.matrix.android.api.session.room.Room
|
2018-10-25 15:25:58 +00:00
|
|
|
import im.vector.matrix.android.api.session.room.TimelineHolder
|
2018-10-25 14:55:41 +00:00
|
|
|
import im.vector.matrix.android.api.session.room.model.Membership
|
2018-10-23 16:25:28 +00:00
|
|
|
import im.vector.matrix.android.api.session.room.model.MyMembership
|
2018-10-29 13:57:36 +00:00
|
|
|
import im.vector.matrix.android.api.session.room.model.RoomSummary
|
2018-10-25 14:55:41 +00:00
|
|
|
import im.vector.matrix.android.api.util.Cancelable
|
2018-10-29 13:57:36 +00:00
|
|
|
import im.vector.matrix.android.internal.database.mapper.asDomain
|
2018-10-25 14:55:41 +00:00
|
|
|
import im.vector.matrix.android.internal.database.model.RoomEntity
|
2018-10-23 16:25:28 +00:00
|
|
|
import im.vector.matrix.android.internal.database.model.RoomSummaryEntity
|
2018-10-30 17:22:29 +00:00
|
|
|
import im.vector.matrix.android.internal.database.model.RoomSummaryEntityFields
|
2018-10-18 16:38:11 +00:00
|
|
|
import im.vector.matrix.android.internal.database.query.where
|
2018-10-25 14:55:41 +00:00
|
|
|
import im.vector.matrix.android.internal.session.room.members.LoadRoomMembersRequest
|
|
|
|
import im.vector.matrix.android.internal.session.sync.SyncTokenStore
|
2018-10-25 15:25:58 +00:00
|
|
|
import org.koin.core.parameter.parametersOf
|
2018-10-18 16:38:11 +00:00
|
|
|
import org.koin.standalone.KoinComponent
|
|
|
|
import org.koin.standalone.inject
|
2018-10-17 16:21:09 +00:00
|
|
|
|
|
|
|
data class DefaultRoom(
|
2018-10-23 16:25:28 +00:00
|
|
|
override val roomId: String,
|
|
|
|
override val myMembership: MyMembership
|
2018-10-18 16:38:11 +00:00
|
|
|
) : Room, KoinComponent {
|
|
|
|
|
2018-10-29 13:57:36 +00:00
|
|
|
|
2018-10-25 14:55:41 +00:00
|
|
|
private val loadRoomMembersRequest by inject<LoadRoomMembersRequest>()
|
|
|
|
private val syncTokenStore by inject<SyncTokenStore>()
|
2018-10-18 16:38:11 +00:00
|
|
|
private val monarchy by inject<Monarchy>()
|
2018-10-25 15:25:58 +00:00
|
|
|
private val timelineHolder by inject<TimelineHolder>(parameters = { parametersOf(roomId) })
|
2018-10-22 17:36:29 +00:00
|
|
|
|
2018-10-29 13:57:36 +00:00
|
|
|
override val roomSummary: LiveData<RoomSummary> by lazy {
|
|
|
|
val liveData = monarchy
|
|
|
|
.findAllMappedWithChanges(
|
2018-10-30 17:22:29 +00:00
|
|
|
{ realm -> RoomSummaryEntity.where(realm, roomId).isNotEmpty(RoomSummaryEntityFields.DISPLAY_NAME) },
|
2018-10-29 13:57:36 +00:00
|
|
|
{ from -> from.asDomain() })
|
|
|
|
|
|
|
|
Transformations.map(liveData) {
|
|
|
|
it.first()
|
|
|
|
}
|
2018-10-18 16:38:11 +00:00
|
|
|
}
|
|
|
|
|
2018-10-29 13:57:36 +00:00
|
|
|
override fun liveTimeline(): LiveData<PagedList<EnrichedEvent>> {
|
|
|
|
return timelineHolder.liveTimeline()
|
2018-10-23 16:25:28 +00:00
|
|
|
}
|
|
|
|
|
2018-10-25 14:55:41 +00:00
|
|
|
override fun loadRoomMembersIfNeeded(): Cancelable {
|
|
|
|
return if (areAllMembersLoaded()) {
|
|
|
|
object : Cancelable {}
|
|
|
|
} else {
|
|
|
|
val token = syncTokenStore.getLastToken()
|
|
|
|
loadRoomMembersRequest.execute(roomId, token, Membership.LEAVE, object : MatrixCallback<Boolean> {})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun areAllMembersLoaded(): Boolean {
|
|
|
|
return monarchy
|
|
|
|
.fetchAllCopiedSync { RoomEntity.where(it, roomId) }
|
|
|
|
.firstOrNull()
|
|
|
|
?.areAllMembersLoaded ?: false
|
|
|
|
}
|
|
|
|
|
2018-10-23 16:25:28 +00:00
|
|
|
|
2018-10-18 16:38:11 +00:00
|
|
|
}
|