From 2d6ff0bc301be2f667c2d458d8dbffa552000c60 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 15 Jan 2023 08:42:15 +0530 Subject: [PATCH] Fix scroll-up glitch when new message arrives --- .../smsmessenger/activities/ThreadActivity.kt | 10 +++++++--- .../smsmessenger/adapters/ThreadAdapter.kt | 2 +- app/src/main/res/drawable/ic_arrow_down_vector.xml | 3 +++ 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable/ic_arrow_down_vector.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index dfc044ee..8bfd93bc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -36,6 +36,8 @@ import androidx.annotation.StringRes import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.res.ResourcesCompat import androidx.core.view.* +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.simplemobiletools.commons.dialogs.ConfirmationDialog @@ -394,8 +396,10 @@ class ThreadActivity : SimpleActivity() { runOnUiThread { refreshMenuItems() getOrCreateThreadAdapter().apply { - val scrollPosition = if (currentList.lastOrNull() != threadItems.lastOrNull()) { - threadItems.lastIndex + val lastPosition = itemCount - 1 + val lastVisiblePosition = (thread_messages_list.layoutManager as LinearLayoutManager).findLastVisibleItemPosition() + val scrollPosition = if (currentList.lastOrNull() != threadItems.lastOrNull() && lastPosition - lastVisiblePosition <= 2) { + lastPosition } else { -1 } @@ -1235,7 +1239,7 @@ class ThreadActivity : SimpleActivity() { val newItems = getThreadItems() runOnUiThread { - getOrCreateThreadAdapter().updateMessages(newItems) + getOrCreateThreadAdapter().updateMessages(newItems, newItems.lastIndex) if (!refreshedSinceSent) { refreshMessages() } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt index 4d2ccf76..8e942bfb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -227,7 +227,7 @@ class ThreadAdapter( private fun isThreadDateTime(position: Int) = currentList.getOrNull(position) is ThreadDateTime - fun updateMessages(newMessages: ArrayList, scrollPosition: Int = newMessages.lastIndex) { + fun updateMessages(newMessages: ArrayList, scrollPosition: Int = -1) { val latestMessages = newMessages.toMutableList() submitList(latestMessages) { if (scrollPosition != -1) { diff --git a/app/src/main/res/drawable/ic_arrow_down_vector.xml b/app/src/main/res/drawable/ic_arrow_down_vector.xml new file mode 100644 index 00000000..eefe3292 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_down_vector.xml @@ -0,0 +1,3 @@ + + +