Skip to content

Commit f3ebdd3

Browse files
authored
Merge pull request #356 from pavelpoley/task/older-messages
Allow displaying older messages
2 parents ad74ada + 195a703 commit f3ebdd3

File tree

4 files changed

+56
-5
lines changed

4 files changed

+56
-5
lines changed

app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import com.simplemobiletools.commons.extensions.*
4040
import com.simplemobiletools.commons.helpers.*
4141
import com.simplemobiletools.commons.models.PhoneNumber
4242
import com.simplemobiletools.commons.models.SimpleContact
43+
import com.simplemobiletools.commons.views.MyRecyclerView
4344
import com.simplemobiletools.smsmessenger.R
4445
import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter
4546
import 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
}

app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,14 +231,14 @@ class ThreadAdapter(
231231

232232
private fun isThreadDateTime(position: Int) = messages.getOrNull(position) is ThreadDateTime
233233

234-
fun updateMessages(newMessages: ArrayList<ThreadItem>) {
234+
fun updateMessages(newMessages: ArrayList<ThreadItem>, scrollPosition: Int = newMessages.size - 1) {
235235
val latestMessages = newMessages.clone() as ArrayList<ThreadItem>
236236
val oldHashCode = messages.hashCode()
237237
val newHashCode = latestMessages.hashCode()
238238
if (newHashCode != oldHashCode) {
239239
messages = latestMessages
240240
notifyDataSetChanged()
241-
recyclerView.scrollToPosition(messages.size - 1)
241+
recyclerView.scrollToPosition(scrollPosition)
242242
}
243243
}
244244

app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ val Context.messageAttachmentsDB: MessageAttachmentsDao get() = getMessagessDB()
5656

5757
val Context.messagesDB: MessagesDao get() = getMessagessDB().MessagesDao()
5858

59-
fun Context.getMessages(threadId: Long, getImageResolutions: Boolean): ArrayList<Message> {
59+
fun Context.getMessages(threadId: Long, getImageResolutions: Boolean, dateFrom: Int = -1): ArrayList<Message> {
6060
val uri = Sms.CONTENT_URI
6161
val projection = arrayOf(
6262
Sms._ID,
@@ -70,9 +70,10 @@ fun Context.getMessages(threadId: Long, getImageResolutions: Boolean): ArrayList
7070
Sms.STATUS
7171
)
7272

73-
val selection = "${Sms.THREAD_ID} = ?"
73+
val rangeQuery = if (dateFrom == -1) "" else "AND ${Sms.DATE} < ${dateFrom.toLong() * 1000}"
74+
val selection = "${Sms.THREAD_ID} = ? $rangeQuery"
7475
val selectionArgs = arrayOf(threadId.toString())
75-
val sortOrder = "${Sms._ID} DESC LIMIT 100"
76+
val sortOrder = "${Sms.DATE} DESC LIMIT $MESSAGES_LIMIT"
7677

7778
val blockStatus = HashMap<String, Boolean>()
7879
val blockedNumbers = getBlockedNumbers()

app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ const val FILE_SIZE_600_KB = 614_400L
5454
const val FILE_SIZE_1_MB = 1_048_576L
5555
const val FILE_SIZE_2_MB = 2_097_152L
5656

57+
const val MESSAGES_LIMIT = 100
58+
5759
fun refreshMessages() {
5860
EventBus.getDefault().post(Events.RefreshMessages())
5961
}

0 commit comments

Comments
 (0)