From e9c32e7487c6d82842c8e7683bc66ea7131eeca8 Mon Sep 17 00:00:00 2001 From: Pavel Poley Date: Wed, 1 Jun 2022 17:45:09 +0300 Subject: [PATCH 1/5] allow displaying older messages --- .../smsmessenger/activities/ThreadActivity.kt | 45 +++++++++++++++++++ .../smsmessenger/adapters/ThreadAdapter.kt | 4 +- .../smsmessenger/extensions/Context.kt | 7 +-- .../smsmessenger/helpers/Constants.kt | 2 + 4 files changed, 53 insertions(+), 5 deletions(-) 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 8dd7fc19..4bc5e631 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -40,6 +40,8 @@ import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.PhoneNumber import com.simplemobiletools.commons.models.SimpleContact +import com.simplemobiletools.commons.views.MyLinearLayoutManager +import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter import com.simplemobiletools.smsmessenger.adapters.ThreadAdapter @@ -75,6 +77,9 @@ class ThreadActivity : SimpleActivity() { private var attachmentSelections = mutableMapOf() private val imageCompressor by lazy { ImageCompressor(this) } private var lastAttachmentUri: String? = null + private var loadingOlderMessages = false + private var allMessagesFetched = false + private var nextMessageId = -1L override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -320,6 +325,14 @@ class ThreadActivity : SimpleActivity() { }.apply { thread_messages_list.adapter = this } + + thread_messages_list.endlessScrollListener = object : MyRecyclerView.EndlessScrollListener { + override fun updateBottom() {} + + override fun updateTop() { + fetchNextMessages() + } + } } else { (currAdapter as ThreadAdapter).updateMessages(threadItems) } @@ -351,6 +364,38 @@ class ThreadActivity : SimpleActivity() { } } + private fun fetchNextMessages() { + if (messages.isEmpty() || allMessagesFetched || loadingOlderMessages) return + + toast("fetchNextMessages") + + val messageId = messages.first().date.toLong()*1000 /*- 1*/ + if (nextMessageId == messageId /*|| messageId < 1*/) { + allMessagesFetched = true + return + } + + nextMessageId = messageId + loadingOlderMessages = true + + ensureBackgroundThread { + val olderMessages = getMessages(threadId, true, nextMessageId) + messages.addAll(0, olderMessages) + + allMessagesFetched = olderMessages.size < MESSAGES_LIMIT || olderMessages.size == 0 + + val lastPosition = (thread_messages_list.layoutManager as MyLinearLayoutManager).findLastVisibleItemPosition() + val adapter = thread_messages_list.adapter as ThreadAdapter + val topItemAtRefresh = adapter.messages[lastPosition] + + runOnUiThread { + loadingOlderMessages = false + val itemAtRefreshIndex = messages.indexOfFirst { it == topItemAtRefresh } + adapter.updateMessages(getThreadItems(), itemAtRefreshIndex) + } + } + } + private fun setupButtons() { updateTextColors(thread_holder) val textColor = getProperTextColor() 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 232d43c8..486a8eea 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -231,14 +231,14 @@ class ThreadAdapter( private fun isThreadDateTime(position: Int) = messages.getOrNull(position) is ThreadDateTime - fun updateMessages(newMessages: ArrayList) { + fun updateMessages(newMessages: ArrayList, scrollPosition: Int = messages.size - 1) { val latestMessages = newMessages.clone() as ArrayList val oldHashCode = messages.hashCode() val newHashCode = latestMessages.hashCode() if (newHashCode != oldHashCode) { messages = latestMessages notifyDataSetChanged() - recyclerView.scrollToPosition(messages.size - 1) + recyclerView.scrollToPosition(scrollPosition) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index 67d0c5db..d3eca1d3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -56,7 +56,7 @@ val Context.messageAttachmentsDB: MessageAttachmentsDao get() = getMessagessDB() val Context.messagesDB: MessagesDao get() = getMessagessDB().MessagesDao() -fun Context.getMessages(threadId: Long, getImageResolutions: Boolean): ArrayList { +fun Context.getMessages(threadId: Long, getImageResolutions: Boolean, index: Long = -1): ArrayList { val uri = Sms.CONTENT_URI val projection = arrayOf( Sms._ID, @@ -70,9 +70,10 @@ fun Context.getMessages(threadId: Long, getImageResolutions: Boolean): ArrayList Sms.STATUS ) - val selection = "${Sms.THREAD_ID} = ?" + val rangeQuery = if (index == -1L) "" else "AND ${Sms.DATE} <= $index" + val selection = "${Sms.THREAD_ID} = ? $rangeQuery" val selectionArgs = arrayOf(threadId.toString()) - val sortOrder = "${Sms._ID} DESC LIMIT 100" + val sortOrder = "${Sms._ID} DESC LIMIT $MESSAGES_LIMIT" val blockStatus = HashMap() val blockedNumbers = getBlockedNumbers() diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt index 6e46f4c9..2e5a2646 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt @@ -54,6 +54,8 @@ const val FILE_SIZE_600_KB = 614_400L const val FILE_SIZE_1_MB = 1_048_576L const val FILE_SIZE_2_MB = 2_097_152L +const val MESSAGES_LIMIT = 10 + fun refreshMessages() { EventBus.getDefault().post(Events.RefreshMessages()) } From c8dbfb4090887ef81c0ff39e4ddf4eb1f622be73 Mon Sep 17 00:00:00 2001 From: Pavel Poley Date: Thu, 2 Jun 2022 13:01:03 +0300 Subject: [PATCH 2/5] allow displaying older messages --- .../smsmessenger/activities/ThreadActivity.kt | 12 ++++++------ .../smsmessenger/extensions/Context.kt | 6 +++--- .../smsmessenger/helpers/Constants.kt | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) 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 4bc5e631..b4e4ac65 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -79,7 +79,7 @@ class ThreadActivity : SimpleActivity() { private var lastAttachmentUri: String? = null private var loadingOlderMessages = false private var allMessagesFetched = false - private var nextMessageId = -1L + private var oldestMessageDate = -1 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -367,19 +367,19 @@ class ThreadActivity : SimpleActivity() { private fun fetchNextMessages() { if (messages.isEmpty() || allMessagesFetched || loadingOlderMessages) return - toast("fetchNextMessages") + //toast("fetchNextMessages") - val messageId = messages.first().date.toLong()*1000 /*- 1*/ - if (nextMessageId == messageId /*|| messageId < 1*/) { + val date = messages.first().date + if (oldestMessageDate == date) { allMessagesFetched = true return } - nextMessageId = messageId + oldestMessageDate = date loadingOlderMessages = true ensureBackgroundThread { - val olderMessages = getMessages(threadId, true, nextMessageId) + val olderMessages = getMessages(threadId, true, oldestMessageDate) messages.addAll(0, olderMessages) allMessagesFetched = olderMessages.size < MESSAGES_LIMIT || olderMessages.size == 0 diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index d3eca1d3..6e4da2a4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -56,7 +56,7 @@ val Context.messageAttachmentsDB: MessageAttachmentsDao get() = getMessagessDB() val Context.messagesDB: MessagesDao get() = getMessagessDB().MessagesDao() -fun Context.getMessages(threadId: Long, getImageResolutions: Boolean, index: Long = -1): ArrayList { +fun Context.getMessages(threadId: Long, getImageResolutions: Boolean, dateFrom: Int = -1): ArrayList { val uri = Sms.CONTENT_URI val projection = arrayOf( Sms._ID, @@ -70,10 +70,10 @@ fun Context.getMessages(threadId: Long, getImageResolutions: Boolean, index: Lon Sms.STATUS ) - val rangeQuery = if (index == -1L) "" else "AND ${Sms.DATE} <= $index" + val rangeQuery = if (dateFrom == -1) "" else "AND ${Sms.DATE} < ${dateFrom.toLong() * 1000}" val selection = "${Sms.THREAD_ID} = ? $rangeQuery" val selectionArgs = arrayOf(threadId.toString()) - val sortOrder = "${Sms._ID} DESC LIMIT $MESSAGES_LIMIT" + val sortOrder = "${Sms.DATE} DESC LIMIT $MESSAGES_LIMIT" val blockStatus = HashMap() val blockedNumbers = getBlockedNumbers() diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt index 2e5a2646..0cdf98fc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt @@ -54,7 +54,7 @@ const val FILE_SIZE_600_KB = 614_400L const val FILE_SIZE_1_MB = 1_048_576L const val FILE_SIZE_2_MB = 2_097_152L -const val MESSAGES_LIMIT = 10 +const val MESSAGES_LIMIT = 15 fun refreshMessages() { EventBus.getDefault().post(Events.RefreshMessages()) From ec157ba19e2577f931ac2497d48d9c9c0b5922ac Mon Sep 17 00:00:00 2001 From: Pavel Poley Date: Thu, 2 Jun 2022 15:12:48 +0300 Subject: [PATCH 3/5] allow displaying older messages --- .../smsmessenger/activities/ThreadActivity.kt | 7 ++++--- .../simplemobiletools/smsmessenger/helpers/Constants.kt | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) 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 3c49c642..0c4a3a52 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -367,20 +367,21 @@ class ThreadActivity : SimpleActivity() { private fun fetchNextMessages() { if (messages.isEmpty() || allMessagesFetched || loadingOlderMessages) return - //toast("fetchNextMessages") - val date = messages.first().date if (oldestMessageDate == date) { allMessagesFetched = true return } + toast("fetchNextMessages") + oldestMessageDate = date loadingOlderMessages = true ensureBackgroundThread { val olderMessages = getMessages(threadId, true, oldestMessageDate) messages.addAll(0, olderMessages) + threadItems = getThreadItems() allMessagesFetched = olderMessages.size < MESSAGES_LIMIT || olderMessages.size == 0 @@ -391,7 +392,7 @@ class ThreadActivity : SimpleActivity() { runOnUiThread { loadingOlderMessages = false val itemAtRefreshIndex = messages.indexOfFirst { it == topItemAtRefresh } - adapter.updateMessages(getThreadItems(), itemAtRefreshIndex) + adapter.updateMessages(threadItems, itemAtRefreshIndex) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt index 0cdf98fc..a4a38499 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt @@ -54,7 +54,7 @@ const val FILE_SIZE_600_KB = 614_400L const val FILE_SIZE_1_MB = 1_048_576L const val FILE_SIZE_2_MB = 2_097_152L -const val MESSAGES_LIMIT = 15 +const val MESSAGES_LIMIT = 100 fun refreshMessages() { EventBus.getDefault().post(Events.RefreshMessages()) From f3ef5dfd67ba32e1062cbfb0c2f90bea470f8219 Mon Sep 17 00:00:00 2001 From: Pavel Poley Date: Thu, 2 Jun 2022 16:34:04 +0300 Subject: [PATCH 4/5] allow displaying older messages --- .../smsmessenger/activities/ThreadActivity.kt | 24 +++++++++---------- .../smsmessenger/adapters/ThreadAdapter.kt | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) 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 0c4a3a52..d1be773a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -40,7 +40,6 @@ import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.PhoneNumber import com.simplemobiletools.commons.models.SimpleContact -import com.simplemobiletools.commons.views.MyLinearLayoutManager import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter @@ -367,32 +366,30 @@ class ThreadActivity : SimpleActivity() { private fun fetchNextMessages() { if (messages.isEmpty() || allMessagesFetched || loadingOlderMessages) return - val date = messages.first().date - if (oldestMessageDate == date) { + val dateOfFirstItem = messages.first().date + if (oldestMessageDate == dateOfFirstItem) { allMessagesFetched = true return } - toast("fetchNextMessages") - - oldestMessageDate = date + oldestMessageDate = dateOfFirstItem loadingOlderMessages = true ensureBackgroundThread { + val firstItem = messages.first() val olderMessages = getMessages(threadId, true, oldestMessageDate) + messages.addAll(0, olderMessages) threadItems = getThreadItems() allMessagesFetched = olderMessages.size < MESSAGES_LIMIT || olderMessages.size == 0 - val lastPosition = (thread_messages_list.layoutManager as MyLinearLayoutManager).findLastVisibleItemPosition() - val adapter = thread_messages_list.adapter as ThreadAdapter - val topItemAtRefresh = adapter.messages[lastPosition] - runOnUiThread { loadingOlderMessages = false - val itemAtRefreshIndex = messages.indexOfFirst { it == topItemAtRefresh } - adapter.updateMessages(threadItems, itemAtRefreshIndex) + val itemAtRefreshIndex = threadItems.indexOfFirst { it == firstItem } + (thread_messages_list.adapter as ThreadAdapter).apply { + updateMessages(threadItems, itemAtRefreshIndex) + } } } } @@ -1031,6 +1028,9 @@ class ThreadActivity : SimpleActivity() { @Subscribe(threadMode = ThreadMode.ASYNC) fun refreshMessages(event: Events.RefreshMessages) { refreshedSinceSent = true + allMessagesFetched = false + oldestMessageDate = -1 + if (isActivityVisible) { notificationManager.cancel(threadId.hashCode()) } 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 486a8eea..75c31e54 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -231,7 +231,7 @@ class ThreadAdapter( private fun isThreadDateTime(position: Int) = messages.getOrNull(position) is ThreadDateTime - fun updateMessages(newMessages: ArrayList, scrollPosition: Int = messages.size - 1) { + fun updateMessages(newMessages: ArrayList, scrollPosition: Int = newMessages.size - 1) { val latestMessages = newMessages.clone() as ArrayList val oldHashCode = messages.hashCode() val newHashCode = latestMessages.hashCode() From 195a7033cef68e6ddc8318fe3cb2121934ab6308 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Thu, 2 Jun 2022 22:47:31 +0200 Subject: [PATCH 5/5] Update ThreadActivity.kt --- .../smsmessenger/activities/ThreadActivity.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 d1be773a..9c43960f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -364,7 +364,9 @@ class ThreadActivity : SimpleActivity() { } private fun fetchNextMessages() { - if (messages.isEmpty() || allMessagesFetched || loadingOlderMessages) return + if (messages.isEmpty() || allMessagesFetched || loadingOlderMessages) { + return + } val dateOfFirstItem = messages.first().date if (oldestMessageDate == dateOfFirstItem) {