mirror of
https://github.com/SimpleMobileTools/Simple-SMS-Messenger.git
synced 2025-06-05 21:49:22 +02:00
create a Conversations model, separate it from Messages
This commit is contained in:
@@ -37,10 +37,7 @@ import com.simplemobiletools.smsmessenger.activities.ThreadActivity
|
|||||||
import com.simplemobiletools.smsmessenger.helpers.Config
|
import com.simplemobiletools.smsmessenger.helpers.Config
|
||||||
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
|
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
|
||||||
import com.simplemobiletools.smsmessenger.helpers.letterBackgroundColors
|
import com.simplemobiletools.smsmessenger.helpers.letterBackgroundColors
|
||||||
import com.simplemobiletools.smsmessenger.models.Contact
|
import com.simplemobiletools.smsmessenger.models.*
|
||||||
import com.simplemobiletools.smsmessenger.models.Message
|
|
||||||
import com.simplemobiletools.smsmessenger.models.MessageAttachment
|
|
||||||
import com.simplemobiletools.smsmessenger.models.NamePhoto
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
@@ -147,6 +144,37 @@ fun Context.getMMS(threadId: Int? = null, sortOrder: String? = null): ArrayList<
|
|||||||
return messages
|
return messages
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Context.getConversations(): ArrayList<Conversation> {
|
||||||
|
val uri = Uri.parse("${Threads.CONTENT_URI}?simple=true")
|
||||||
|
val projection = arrayOf(
|
||||||
|
Threads._ID,
|
||||||
|
Threads.SNIPPET,
|
||||||
|
Threads.DATE,
|
||||||
|
Threads.READ,
|
||||||
|
Threads.RECIPIENT_IDS
|
||||||
|
)
|
||||||
|
|
||||||
|
val conversations = ArrayList<Conversation>()
|
||||||
|
queryCursor(uri, projection, null, null, showErrors = true) { cursor ->
|
||||||
|
val id = cursor.getIntValue(Threads._ID)
|
||||||
|
val snippet = cursor.getStringValue(Threads.SNIPPET) ?: ""
|
||||||
|
var date = cursor.getLongValue(Threads.DATE)
|
||||||
|
if (date.toString().length > 10) {
|
||||||
|
date /= 1000
|
||||||
|
}
|
||||||
|
|
||||||
|
val read = cursor.getIntValue(Threads.READ) == 1
|
||||||
|
val rawIds = cursor.getStringValue(Threads.RECIPIENT_IDS)
|
||||||
|
val recipientIds = rawIds.split(" ").filter { it.areDigitsOnly() }.map { it.toInt() }.toMutableList()
|
||||||
|
val phoneNumbers = getThreadPhoneNumbers(recipientIds)
|
||||||
|
val names = getThreadContactNames(phoneNumbers)
|
||||||
|
val title = TextUtils.join(", ", names.toTypedArray())
|
||||||
|
val conversation = Conversation(id, snippet, date.toInt(), read, title)
|
||||||
|
conversations.add(conversation)
|
||||||
|
}
|
||||||
|
return conversations
|
||||||
|
}
|
||||||
|
|
||||||
// based on https://stackoverflow.com/a/6446831/1967672
|
// based on https://stackoverflow.com/a/6446831/1967672
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
fun Context.getMmsAttachment(id: Int): MessageAttachment? {
|
fun Context.getMmsAttachment(id: Int): MessageAttachment? {
|
||||||
@@ -219,6 +247,22 @@ fun Context.getThreadParticipants(threadId: Int, contactsMap: HashMap<Int, Conta
|
|||||||
return participants
|
return participants
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Context.getThreadPhoneNumbers(recipientIds: List<Int>): ArrayList<String> {
|
||||||
|
val numbers = ArrayList<String>()
|
||||||
|
recipientIds.forEach {
|
||||||
|
numbers.add(getPhoneNumberFromAddressId(it))
|
||||||
|
}
|
||||||
|
return numbers
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Context.getThreadContactNames(phoneNumbers: List<String>): ArrayList<String> {
|
||||||
|
val names = ArrayList<String>()
|
||||||
|
phoneNumbers.forEach {
|
||||||
|
names.add(getNameFromPhoneNumber(it))
|
||||||
|
}
|
||||||
|
return names
|
||||||
|
}
|
||||||
|
|
||||||
fun Context.getPhoneNumberFromAddressId(canonicalAddressId: Int): String {
|
fun Context.getPhoneNumberFromAddressId(canonicalAddressId: Int): String {
|
||||||
val uri = Uri.withAppendedPath(MmsSms.CONTENT_URI, "canonical-addresses")
|
val uri = Uri.withAppendedPath(MmsSms.CONTENT_URI, "canonical-addresses")
|
||||||
val projection = arrayOf(
|
val projection = arrayOf(
|
||||||
@@ -295,6 +339,27 @@ fun Context.getNameAndPhotoFromPhoneNumber(number: String): NamePhoto? {
|
|||||||
return NamePhoto(number, null)
|
return NamePhoto(number, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun Context.getNameFromPhoneNumber(number: String): String {
|
||||||
|
val uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number))
|
||||||
|
val projection = arrayOf(
|
||||||
|
PhoneLookup.DISPLAY_NAME
|
||||||
|
)
|
||||||
|
|
||||||
|
try {
|
||||||
|
val cursor = contentResolver.query(uri, projection, null, null, null)
|
||||||
|
cursor.use {
|
||||||
|
if (cursor?.moveToFirst() == true) {
|
||||||
|
return cursor.getStringValue(PhoneLookup.DISPLAY_NAME)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
showErrorToast(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
return number
|
||||||
|
}
|
||||||
|
|
||||||
fun Context.getContactNames(): List<Contact> {
|
fun Context.getContactNames(): List<Contact> {
|
||||||
val contacts = ArrayList<Contact>()
|
val contacts = ArrayList<Contact>()
|
||||||
val uri = ContactsContract.Data.CONTENT_URI
|
val uri = ContactsContract.Data.CONTENT_URI
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
package com.simplemobiletools.smsmessenger.models
|
||||||
|
|
||||||
|
data class Conversation(val id: Int, val snippet: String, val date: Int, val read: Boolean, val title: String)
|
Reference in New Issue
Block a user