From 89224744e51ea4fee198f7922d755f9a6ba27eb3 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 23 Nov 2022 17:00:16 +0100 Subject: [PATCH 1/3] Optimize lazy column --- .../x/features/messages/MessagesScreen.kt | 22 +++++++++++++++++-- .../x/features/roomlist/RoomListScreen.kt | 9 +++++++- 2 files changed, 28 insertions(+), 3 deletions(-) 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 eaef076c63..f354dce2b6 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..fa9ef08a23 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,11 @@ fun RoomListContent( .nestedScroll(nestedScrollConnection), state = lazyListState, ) { - items(roomSummaries) { room -> + items( + items = roomSummaries, + contentType = { room -> room.contentType() }, + key = { room -> room.key() }, + ) { room -> RoomSummaryRow(room = room, onClick = ::onRoomClicked) } } @@ -134,6 +138,9 @@ fun RoomListContent( } } +private fun RoomListRoomSummary.key() = id +private fun RoomListRoomSummary.contentType() = isPlaceholder + private fun LazyListState.isScrolled(): Boolean { return firstVisibleItemIndex > 0 || firstVisibleItemScrollOffset > 0 } From 1e4cacb35ba630eb1406b724a59f2ccca3285d25 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 23 Nov 2022 17:30:44 +0100 Subject: [PATCH 2/3] Add small list of links. --- docs/usefulLinks.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 docs/usefulLinks.md 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 From c15b625d94d333f927d1a1d1e2d6ef593c61d1fc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 23 Nov 2022 17:33:06 +0100 Subject: [PATCH 3/3] Do not use key to ensure that the list scroll if a room appears at the top --- .../io/element/android/x/features/roomlist/RoomListScreen.kt | 2 -- 1 file changed, 2 deletions(-) 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 fa9ef08a23..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 @@ -125,7 +125,6 @@ fun RoomListContent( items( items = roomSummaries, contentType = { room -> room.contentType() }, - key = { room -> room.key() }, ) { room -> RoomSummaryRow(room = room, onClick = ::onRoomClicked) } @@ -138,7 +137,6 @@ fun RoomListContent( } } -private fun RoomListRoomSummary.key() = id private fun RoomListRoomSummary.contentType() = isPlaceholder private fun LazyListState.isScrolled(): Boolean {