From 74966b1425a7b5b25c8b3249f16bbb85c5baf831 Mon Sep 17 00:00:00 2001 From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com> Date: Fri, 19 Aug 2022 22:02:28 +0300 Subject: [PATCH] Two fixes, better performance too (#951) - on orientation change scroll position in chat wasn't preserved - the app had been making multiple same queries to a database when tried to preload more messages --- .../chat/simplex/app/views/chat/ChatView.kt | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chat/ChatView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chat/ChatView.kt index 5006305731..98926ad61a 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/chat/ChatView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/chat/ChatView.kt @@ -429,8 +429,14 @@ fun BoxWithConstraintsScope.ChatItemsList( // Don't autoscroll next time until it will be needed shouldAutoScroll = false } + var prevSearchEmptiness by rememberSaveable { mutableStateOf(searchValue.value.isEmpty()) } // Scroll to bottom when search value changes from something to nothing and back LaunchedEffect(searchValue.value.isEmpty()) { + // They are equal when orientation was changed, don't need to scroll. + // LaunchedEffect unaware of this event since it uses remember, not rememberSaveable + if (prevSearchEmptiness == searchValue.value.isEmpty()) return@LaunchedEffect + prevSearchEmptiness = searchValue.value.isEmpty() + if (listState.firstVisibleItemIndex != 0) { scope.launch { listState.scrollToItem(0) } } @@ -632,20 +638,16 @@ fun PreloadItems( items: List<*>, onLoadMore: (chat: Chat) -> Unit, ) { - val loadMore = remember { - derivedStateOf { - val layoutInfo = listState.layoutInfo - val totalItemsNumber = layoutInfo.totalItemsCount - val lastVisibleItemIndex = (layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0) + 1 - if (lastVisibleItemIndex > (totalItemsNumber - remaining)) - totalItemsNumber - else - 0 - } - } - - LaunchedEffect(loadMore, chat, items) { - snapshotFlow { loadMore.value } + LaunchedEffect(listState, chat, items) { + snapshotFlow { listState.layoutInfo } + .map { + val totalItemsNumber = it.totalItemsCount + val lastVisibleItemIndex = (it.visibleItemsInfo.lastOrNull()?.index ?: 0) + 1 + if (lastVisibleItemIndex > (totalItemsNumber - remaining)) + totalItemsNumber + else + 0 + } .distinctUntilChanged() .filter { it > 0 } .collect {