Timeline: add ContentType instead of using introspection.
This commit is contained in:
@@ -75,7 +75,6 @@ import io.element.android.libraries.designsystem.theme.components.Text
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.launch
|
||||
import timber.log.Timber
|
||||
|
||||
@Composable
|
||||
fun TimelineView(
|
||||
@@ -115,24 +114,14 @@ fun TimelineView(
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
TimelineScrollHelper(
|
||||
lazyListState = lazyListState,
|
||||
timelineItems = state.timelineItems,
|
||||
onLoadMore = ::onReachedLoadMore
|
||||
)
|
||||
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
private fun TimelineItem.contentType() = when (this) {
|
||||
is TimelineItem.Event -> content.javaClass.simpleName
|
||||
is TimelineItem.Virtual -> model.javaClass.simpleName
|
||||
}.also {
|
||||
Timber.v("ContentType = $it")
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun TimelineItemRow(
|
||||
timelineItem: TimelineItem,
|
||||
|
||||
@@ -25,7 +25,7 @@ internal class CacheInvalidator(private val itemStatesCache: MutableList<Timelin
|
||||
ListUpdateCallback {
|
||||
|
||||
override fun onChanged(position: Int, count: Int, payload: Any?) {
|
||||
Timber.v("onChanged(position= $position, count= $count")
|
||||
Timber.d("onChanged(position= $position, count= $count)")
|
||||
(position until position + count).forEach {
|
||||
// Invalidate cache
|
||||
itemStatesCache[it] = null
|
||||
@@ -33,13 +33,13 @@ internal class CacheInvalidator(private val itemStatesCache: MutableList<Timelin
|
||||
}
|
||||
|
||||
override fun onMoved(fromPosition: Int, toPosition: Int) {
|
||||
Timber.v("onMoved(fromPosition= $fromPosition, toPosition= $toPosition")
|
||||
Timber.d("onMoved(fromPosition= $fromPosition, toPosition= $toPosition)")
|
||||
val model = itemStatesCache.removeAt(fromPosition)
|
||||
itemStatesCache.add(toPosition, model)
|
||||
}
|
||||
|
||||
override fun onInserted(position: Int, count: Int) {
|
||||
Timber.v("onInserted(position= $position, count= $count")
|
||||
Timber.d("onInserted(position= $position, count= $count)")
|
||||
itemStatesCache.invalidateLast()
|
||||
repeat(count) {
|
||||
itemStatesCache.add(position, null)
|
||||
@@ -47,7 +47,7 @@ internal class CacheInvalidator(private val itemStatesCache: MutableList<Timelin
|
||||
}
|
||||
|
||||
override fun onRemoved(position: Int, count: Int) {
|
||||
Timber.v("onRemoved(position= $position, count= $count")
|
||||
Timber.d("onRemoved(position= $position, count= $count)")
|
||||
itemStatesCache.invalidateLast()
|
||||
repeat(count) {
|
||||
itemStatesCache.removeAt(position)
|
||||
|
||||
@@ -31,6 +31,11 @@ sealed interface TimelineItem {
|
||||
is Virtual -> id
|
||||
}
|
||||
|
||||
fun contentType(): String = when (this) {
|
||||
is Event -> content.type
|
||||
is Virtual -> model.type
|
||||
}
|
||||
|
||||
@Immutable
|
||||
data class Virtual(
|
||||
val id: String,
|
||||
|
||||
@@ -21,4 +21,6 @@ import org.jsoup.nodes.Document
|
||||
data class TimelineItemEmoteContent(
|
||||
override val body: String,
|
||||
override val htmlDocument: Document?
|
||||
) : TimelineItemTextBasedContent
|
||||
) : TimelineItemTextBasedContent {
|
||||
override val type: String = "TimelineItemEmoteContent"
|
||||
}
|
||||
|
||||
@@ -20,4 +20,6 @@ import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecry
|
||||
|
||||
data class TimelineItemEncryptedContent(
|
||||
val data: UnableToDecryptContent.Data
|
||||
) : TimelineItemEventContent
|
||||
) : TimelineItemEventContent {
|
||||
override val type: String = "TimelineItemEncryptedContent"
|
||||
}
|
||||
|
||||
@@ -19,4 +19,6 @@ package io.element.android.features.messages.impl.timeline.model.event
|
||||
import androidx.compose.runtime.Immutable
|
||||
|
||||
@Immutable
|
||||
sealed interface TimelineItemEventContent
|
||||
sealed interface TimelineItemEventContent {
|
||||
val type: String
|
||||
}
|
||||
|
||||
@@ -23,4 +23,6 @@ data class TimelineItemImageContent(
|
||||
val imageMeta: MediaResolver.Meta,
|
||||
val blurhash: String?,
|
||||
val aspectRatio: Float
|
||||
) : TimelineItemEventContent
|
||||
) : TimelineItemEventContent{
|
||||
override val type: String = "TimelineItemImageContent"
|
||||
}
|
||||
|
||||
@@ -21,4 +21,6 @@ import org.jsoup.nodes.Document
|
||||
data class TimelineItemNoticeContent(
|
||||
override val body: String,
|
||||
override val htmlDocument: Document?
|
||||
) : TimelineItemTextBasedContent
|
||||
) : TimelineItemTextBasedContent {
|
||||
override val type: String = "TimelineItemNoticeContent"
|
||||
}
|
||||
|
||||
@@ -16,4 +16,6 @@
|
||||
|
||||
package io.element.android.features.messages.impl.timeline.model.event
|
||||
|
||||
object TimelineItemRedactedContent : TimelineItemEventContent
|
||||
object TimelineItemRedactedContent : TimelineItemEventContent{
|
||||
override val type: String = "TimelineItemRedactedContent"
|
||||
}
|
||||
|
||||
@@ -21,4 +21,6 @@ import org.jsoup.nodes.Document
|
||||
data class TimelineItemTextContent(
|
||||
override val body: String,
|
||||
override val htmlDocument: Document?
|
||||
) : TimelineItemTextBasedContent
|
||||
) : TimelineItemTextBasedContent{
|
||||
override val type: String = "TimelineItemTextContent"
|
||||
}
|
||||
|
||||
@@ -16,4 +16,6 @@
|
||||
|
||||
package io.element.android.features.messages.impl.timeline.model.event
|
||||
|
||||
object TimelineItemUnknownContent : TimelineItemEventContent
|
||||
object TimelineItemUnknownContent : TimelineItemEventContent {
|
||||
override val type: String = "TimelineItemUnknownContent"
|
||||
}
|
||||
|
||||
@@ -18,4 +18,6 @@ package io.element.android.features.messages.impl.timeline.model.virtual
|
||||
|
||||
data class TimelineItemDaySeparatorModel(
|
||||
val formattedDate: String
|
||||
) : TimelineItemVirtualModel
|
||||
) : TimelineItemVirtualModel {
|
||||
override val type: String = "TimelineItemDaySeparatorModel"
|
||||
}
|
||||
|
||||
@@ -16,4 +16,6 @@
|
||||
|
||||
package io.element.android.features.messages.impl.timeline.model.virtual
|
||||
|
||||
object TimelineItemLoadingModel : TimelineItemVirtualModel
|
||||
object TimelineItemLoadingModel : TimelineItemVirtualModel {
|
||||
override val type: String = "TimelineItemLoadingModel"
|
||||
}
|
||||
|
||||
@@ -16,4 +16,6 @@
|
||||
|
||||
package io.element.android.features.messages.impl.timeline.model.virtual
|
||||
|
||||
object TimelineItemReadMarkerModel : TimelineItemVirtualModel
|
||||
object TimelineItemReadMarkerModel : TimelineItemVirtualModel {
|
||||
override val type: String = "TimelineItemReadMarkerModel"
|
||||
}
|
||||
|
||||
@@ -16,4 +16,6 @@
|
||||
|
||||
package io.element.android.features.messages.impl.timeline.model.virtual
|
||||
|
||||
object TimelineItemTimelineStartModel : TimelineItemVirtualModel
|
||||
object TimelineItemTimelineStartModel : TimelineItemVirtualModel {
|
||||
override val type: String = "TimelineItemTimelineStartModel"
|
||||
}
|
||||
|
||||
@@ -16,4 +16,6 @@
|
||||
|
||||
package io.element.android.features.messages.impl.timeline.model.virtual
|
||||
|
||||
object TimelineItemUnknownVirtualModel : TimelineItemVirtualModel
|
||||
object TimelineItemUnknownVirtualModel : TimelineItemVirtualModel {
|
||||
override val type: String = "TimelineItemUnknownVirtualModel"
|
||||
}
|
||||
|
||||
@@ -19,4 +19,6 @@ package io.element.android.features.messages.impl.timeline.model.virtual
|
||||
import androidx.compose.runtime.Immutable
|
||||
|
||||
@Immutable
|
||||
sealed interface TimelineItemVirtualModel
|
||||
sealed interface TimelineItemVirtualModel {
|
||||
val type: String
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user