Timeline: add ContentType instead of using introspection.
This commit is contained in:
parent
b0152059ff
commit
7eddf1201a
17 changed files with 51 additions and 29 deletions
|
|
@ -75,7 +75,6 @@ import io.element.android.libraries.designsystem.theme.components.Text
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import timber.log.Timber
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun TimelineView(
|
fun TimelineView(
|
||||||
|
|
@ -115,24 +114,14 @@ fun TimelineView(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
TimelineScrollHelper(
|
TimelineScrollHelper(
|
||||||
lazyListState = lazyListState,
|
lazyListState = lazyListState,
|
||||||
timelineItems = state.timelineItems,
|
timelineItems = state.timelineItems,
|
||||||
onLoadMore = ::onReachedLoadMore
|
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
|
@Composable
|
||||||
fun TimelineItemRow(
|
fun TimelineItemRow(
|
||||||
timelineItem: TimelineItem,
|
timelineItem: TimelineItem,
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ internal class CacheInvalidator(private val itemStatesCache: MutableList<Timelin
|
||||||
ListUpdateCallback {
|
ListUpdateCallback {
|
||||||
|
|
||||||
override fun onChanged(position: Int, count: Int, payload: Any?) {
|
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 {
|
(position until position + count).forEach {
|
||||||
// Invalidate cache
|
// Invalidate cache
|
||||||
itemStatesCache[it] = null
|
itemStatesCache[it] = null
|
||||||
|
|
@ -33,13 +33,13 @@ internal class CacheInvalidator(private val itemStatesCache: MutableList<Timelin
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onMoved(fromPosition: Int, toPosition: Int) {
|
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)
|
val model = itemStatesCache.removeAt(fromPosition)
|
||||||
itemStatesCache.add(toPosition, model)
|
itemStatesCache.add(toPosition, model)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onInserted(position: Int, count: Int) {
|
override fun onInserted(position: Int, count: Int) {
|
||||||
Timber.v("onInserted(position= $position, count= $count")
|
Timber.d("onInserted(position= $position, count= $count)")
|
||||||
itemStatesCache.invalidateLast()
|
itemStatesCache.invalidateLast()
|
||||||
repeat(count) {
|
repeat(count) {
|
||||||
itemStatesCache.add(position, null)
|
itemStatesCache.add(position, null)
|
||||||
|
|
@ -47,7 +47,7 @@ internal class CacheInvalidator(private val itemStatesCache: MutableList<Timelin
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRemoved(position: Int, count: Int) {
|
override fun onRemoved(position: Int, count: Int) {
|
||||||
Timber.v("onRemoved(position= $position, count= $count")
|
Timber.d("onRemoved(position= $position, count= $count)")
|
||||||
itemStatesCache.invalidateLast()
|
itemStatesCache.invalidateLast()
|
||||||
repeat(count) {
|
repeat(count) {
|
||||||
itemStatesCache.removeAt(position)
|
itemStatesCache.removeAt(position)
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,11 @@ sealed interface TimelineItem {
|
||||||
is Virtual -> id
|
is Virtual -> id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun contentType(): String = when (this) {
|
||||||
|
is Event -> content.type
|
||||||
|
is Virtual -> model.type
|
||||||
|
}
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
data class Virtual(
|
data class Virtual(
|
||||||
val id: String,
|
val id: String,
|
||||||
|
|
|
||||||
|
|
@ -21,4 +21,6 @@ import org.jsoup.nodes.Document
|
||||||
data class TimelineItemEmoteContent(
|
data class TimelineItemEmoteContent(
|
||||||
override val body: String,
|
override val body: String,
|
||||||
override val htmlDocument: Document?
|
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(
|
data class TimelineItemEncryptedContent(
|
||||||
val data: UnableToDecryptContent.Data
|
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
|
import androidx.compose.runtime.Immutable
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
sealed interface TimelineItemEventContent
|
sealed interface TimelineItemEventContent {
|
||||||
|
val type: String
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,4 +23,6 @@ data class TimelineItemImageContent(
|
||||||
val imageMeta: MediaResolver.Meta,
|
val imageMeta: MediaResolver.Meta,
|
||||||
val blurhash: String?,
|
val blurhash: String?,
|
||||||
val aspectRatio: Float
|
val aspectRatio: Float
|
||||||
) : TimelineItemEventContent
|
) : TimelineItemEventContent{
|
||||||
|
override val type: String = "TimelineItemImageContent"
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,4 +21,6 @@ import org.jsoup.nodes.Document
|
||||||
data class TimelineItemNoticeContent(
|
data class TimelineItemNoticeContent(
|
||||||
override val body: String,
|
override val body: String,
|
||||||
override val htmlDocument: Document?
|
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
|
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(
|
data class TimelineItemTextContent(
|
||||||
override val body: String,
|
override val body: String,
|
||||||
override val htmlDocument: Document?
|
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
|
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(
|
data class TimelineItemDaySeparatorModel(
|
||||||
val formattedDate: String
|
val formattedDate: String
|
||||||
) : TimelineItemVirtualModel
|
) : TimelineItemVirtualModel {
|
||||||
|
override val type: String = "TimelineItemDaySeparatorModel"
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,4 +16,6 @@
|
||||||
|
|
||||||
package io.element.android.features.messages.impl.timeline.model.virtual
|
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
|
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
|
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
|
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
|
import androidx.compose.runtime.Immutable
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
sealed interface TimelineItemVirtualModel
|
sealed interface TimelineItemVirtualModel {
|
||||||
|
val type: String
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue