diff --git a/docs/usefulLinks.md b/docs/usefulLinks.md new file mode 100644 index 0000000000..533184e21f --- /dev/null +++ b/docs/usefulLinks.md @@ -0,0 +1,6 @@ + +### Jetpack Compose + +https://developer.android.com/jetpack/compose/mental-model + +https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-api-guidelines.md#api-guidelines-for-jetpack-compose \ No newline at end of file diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt index 57e0970b0e..a027bd14fe 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt @@ -10,7 +10,7 @@ import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.ExperimentalMaterialApi @@ -230,7 +230,11 @@ fun TimelineItems( verticalArrangement = Arrangement.Bottom, reverseLayout = true ) { - itemsIndexed(timelineItems) { index, timelineItem -> + items( + items = timelineItems, + contentType = { timelineItem -> timelineItem.contentType() }, + key = { timelineItem -> timelineItem.key() }, + ) { timelineItem -> TimelineItemRow( timelineItem = timelineItem, onClick = onClick, @@ -245,6 +249,20 @@ fun TimelineItems( } } +private fun MessagesTimelineItemState.key(): String { + return when (this) { + is MessagesTimelineItemState.MessageEvent -> id + is MessagesTimelineItemState.Virtual -> id + } +} + +private fun MessagesTimelineItemState.contentType(): Int { + return when (this) { + is MessagesTimelineItemState.MessageEvent -> 0 + is MessagesTimelineItemState.Virtual -> 1 + } +} + @Composable fun TimelineItemRow( diff --git a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListScreen.kt b/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListScreen.kt index 3880339503..85fd887373 100644 --- a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListScreen.kt +++ b/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListScreen.kt @@ -122,7 +122,10 @@ fun RoomListContent( .nestedScroll(nestedScrollConnection), state = lazyListState, ) { - items(roomSummaries) { room -> + items( + items = roomSummaries, + contentType = { room -> room.contentType() }, + ) { room -> RoomSummaryRow(room = room, onClick = ::onRoomClicked) } } @@ -134,6 +137,8 @@ fun RoomListContent( } } +private fun RoomListRoomSummary.contentType() = isPlaceholder + private fun LazyListState.isScrolled(): Boolean { return firstVisibleItemIndex > 0 || firstVisibleItemScrollOffset > 0 }