@@ -40,6 +40,7 @@ import com.simplemobiletools.commons.extensions.*
4040import com.simplemobiletools.commons.helpers.*
4141import com.simplemobiletools.commons.models.PhoneNumber
4242import com.simplemobiletools.commons.models.SimpleContact
43+ import com.simplemobiletools.commons.views.MyRecyclerView
4344import com.simplemobiletools.smsmessenger.R
4445import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter
4546import com.simplemobiletools.smsmessenger.adapters.ThreadAdapter
@@ -75,6 +76,9 @@ class ThreadActivity : SimpleActivity() {
7576 private var attachmentSelections = mutableMapOf<String , AttachmentSelection >()
7677 private val imageCompressor by lazy { ImageCompressor (this ) }
7778 private var lastAttachmentUri: String? = null
79+ private var loadingOlderMessages = false
80+ private var allMessagesFetched = false
81+ private var oldestMessageDate = - 1
7882
7983 override fun onCreate (savedInstanceState : Bundle ? ) {
8084 super .onCreate(savedInstanceState)
@@ -320,6 +324,14 @@ class ThreadActivity : SimpleActivity() {
320324 }.apply {
321325 thread_messages_list.adapter = this
322326 }
327+
328+ thread_messages_list.endlessScrollListener = object : MyRecyclerView .EndlessScrollListener {
329+ override fun updateBottom () {}
330+
331+ override fun updateTop () {
332+ fetchNextMessages()
333+ }
334+ }
323335 } else {
324336 (currAdapter as ThreadAdapter ).updateMessages(threadItems)
325337 }
@@ -351,6 +363,39 @@ class ThreadActivity : SimpleActivity() {
351363 }
352364 }
353365
366+ private fun fetchNextMessages () {
367+ if (messages.isEmpty() || allMessagesFetched || loadingOlderMessages) {
368+ return
369+ }
370+
371+ val dateOfFirstItem = messages.first().date
372+ if (oldestMessageDate == dateOfFirstItem) {
373+ allMessagesFetched = true
374+ return
375+ }
376+
377+ oldestMessageDate = dateOfFirstItem
378+ loadingOlderMessages = true
379+
380+ ensureBackgroundThread {
381+ val firstItem = messages.first()
382+ val olderMessages = getMessages(threadId, true , oldestMessageDate)
383+
384+ messages.addAll(0 , olderMessages)
385+ threadItems = getThreadItems()
386+
387+ allMessagesFetched = olderMessages.size < MESSAGES_LIMIT || olderMessages.size == 0
388+
389+ runOnUiThread {
390+ loadingOlderMessages = false
391+ val itemAtRefreshIndex = threadItems.indexOfFirst { it == firstItem }
392+ (thread_messages_list.adapter as ThreadAdapter ).apply {
393+ updateMessages(threadItems, itemAtRefreshIndex)
394+ }
395+ }
396+ }
397+ }
398+
354399 private fun setupButtons () {
355400 updateTextColors(thread_holder)
356401 val textColor = getProperTextColor()
@@ -985,6 +1030,9 @@ class ThreadActivity : SimpleActivity() {
9851030 @Subscribe(threadMode = ThreadMode .ASYNC )
9861031 fun refreshMessages (event : Events .RefreshMessages ) {
9871032 refreshedSinceSent = true
1033+ allMessagesFetched = false
1034+ oldestMessageDate = - 1
1035+
9881036 if (isActivityVisible) {
9891037 notificationManager.cancel(threadId.hashCode())
9901038 }
0 commit comments