couple more threading improvements here and there
This commit is contained in:
parent
8b37aab610
commit
156620c917
10 changed files with 64 additions and 132 deletions
|
|
@ -19,8 +19,7 @@ import com.simplemobiletools.smsmessenger.adapters.MessagesAdapter
|
||||||
import com.simplemobiletools.smsmessenger.extensions.config
|
import com.simplemobiletools.smsmessenger.extensions.config
|
||||||
import com.simplemobiletools.smsmessenger.extensions.getMessages
|
import com.simplemobiletools.smsmessenger.extensions.getMessages
|
||||||
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
|
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
|
||||||
import com.simplemobiletools.smsmessenger.helpers.THREAD_NAME
|
import com.simplemobiletools.smsmessenger.helpers.THREAD_TITLE
|
||||||
import com.simplemobiletools.smsmessenger.helpers.THREAD_NUMBER
|
|
||||||
import com.simplemobiletools.smsmessenger.models.Events
|
import com.simplemobiletools.smsmessenger.models.Events
|
||||||
import com.simplemobiletools.smsmessenger.models.Message
|
import com.simplemobiletools.smsmessenger.models.Message
|
||||||
import kotlinx.android.synthetic.main.activity_main.*
|
import kotlinx.android.synthetic.main.activity_main.*
|
||||||
|
|
@ -140,8 +139,7 @@ class MainActivity : SimpleActivity() {
|
||||||
MessagesAdapter(this, messages, messages_list, messages_fastscroller) {
|
MessagesAdapter(this, messages, messages_list, messages_fastscroller) {
|
||||||
Intent(this, ThreadActivity::class.java).apply {
|
Intent(this, ThreadActivity::class.java).apply {
|
||||||
putExtra(THREAD_ID, (it as Message).thread)
|
putExtra(THREAD_ID, (it as Message).thread)
|
||||||
putExtra(THREAD_NAME, it.participants.first().name)
|
putExtra(THREAD_TITLE, it.getThreadTitle())
|
||||||
putExtra(THREAD_NUMBER, it.participants.first().phoneNumber)
|
|
||||||
startActivity(this)
|
startActivity(this)
|
||||||
}
|
}
|
||||||
}.apply {
|
}.apply {
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,7 @@ import com.simplemobiletools.smsmessenger.extensions.config
|
||||||
import com.simplemobiletools.smsmessenger.extensions.getAvailableContacts
|
import com.simplemobiletools.smsmessenger.extensions.getAvailableContacts
|
||||||
import com.simplemobiletools.smsmessenger.extensions.getThreadId
|
import com.simplemobiletools.smsmessenger.extensions.getThreadId
|
||||||
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
|
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
|
||||||
import com.simplemobiletools.smsmessenger.helpers.THREAD_NAME
|
import com.simplemobiletools.smsmessenger.helpers.THREAD_TITLE
|
||||||
import com.simplemobiletools.smsmessenger.helpers.THREAD_NUMBER
|
|
||||||
import com.simplemobiletools.smsmessenger.models.Contact
|
import com.simplemobiletools.smsmessenger.models.Contact
|
||||||
import kotlinx.android.synthetic.main.activity_new_message.*
|
import kotlinx.android.synthetic.main.activity_new_message.*
|
||||||
|
|
||||||
|
|
@ -76,8 +75,7 @@ class NewMessageActivity : SimpleActivity() {
|
||||||
private fun launchThreadActivity(phoneNumber: String, name: String) {
|
private fun launchThreadActivity(phoneNumber: String, name: String) {
|
||||||
Intent(this, ThreadActivity::class.java).apply {
|
Intent(this, ThreadActivity::class.java).apply {
|
||||||
putExtra(THREAD_ID, getThreadId(phoneNumber).toInt())
|
putExtra(THREAD_ID, getThreadId(phoneNumber).toInt())
|
||||||
putExtra(THREAD_NAME, name)
|
putExtra(THREAD_TITLE, name)
|
||||||
putExtra(THREAD_NUMBER, phoneNumber)
|
|
||||||
startActivity(this)
|
startActivity(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.inputmethod.EditorInfo
|
import android.view.inputmethod.EditorInfo
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import android.widget.LinearLayout.LayoutParams
|
||||||
import android.widget.RelativeLayout
|
import android.widget.RelativeLayout
|
||||||
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
|
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
|
|
@ -32,11 +33,11 @@ import org.greenrobot.eventbus.ThreadMode
|
||||||
class ThreadActivity : SimpleActivity() {
|
class ThreadActivity : SimpleActivity() {
|
||||||
private val MIN_DATE_TIME_DIFF_SECS = 300
|
private val MIN_DATE_TIME_DIFF_SECS = 300
|
||||||
|
|
||||||
private var targetNumber = ""
|
|
||||||
private var threadId = 0
|
private var threadId = 0
|
||||||
private var threadItems = ArrayList<ThreadItem>()
|
private var threadItems = ArrayList<ThreadItem>()
|
||||||
private var bus: EventBus? = null
|
private var bus: EventBus? = null
|
||||||
private var selectedContacts = ArrayList<Contact>()
|
private var participants = ArrayList<Contact>()
|
||||||
|
private var messages = ArrayList<Message>()
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
@ -50,28 +51,21 @@ class ThreadActivity : SimpleActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
threadId = intent.getIntExtra(THREAD_ID, 0)
|
threadId = intent.getIntExtra(THREAD_ID, 0)
|
||||||
var thread = getThreadInfo(threadId)
|
intent.getStringExtra(THREAD_TITLE)?.let {
|
||||||
if (thread == null) {
|
supportActionBar?.title = it
|
||||||
if (extras.containsKey(THREAD_NUMBER)) {
|
|
||||||
val threadTitle = extras.getString(THREAD_NAME) ?: getString(R.string.app_launcher_name)
|
|
||||||
targetNumber = extras.getString(THREAD_NUMBER)!!
|
|
||||||
thread = MessagingThread(threadId, threadTitle, targetNumber)
|
|
||||||
} else {
|
|
||||||
toast(R.string.unknown_error_occurred)
|
|
||||||
finish()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
title = thread.title
|
|
||||||
targetNumber = thread.address
|
|
||||||
bus = EventBus.getDefault()
|
bus = EventBus.getDefault()
|
||||||
bus!!.register(this)
|
bus!!.register(this)
|
||||||
val contact = Contact(0, thread.title, "", targetNumber, false)
|
|
||||||
selectedContacts.add(contact)
|
|
||||||
|
|
||||||
ensureBackgroundThread {
|
ensureBackgroundThread {
|
||||||
|
messages = getMessages(threadId)
|
||||||
|
participants = messages.first().participants
|
||||||
setupAdapter()
|
setupAdapter()
|
||||||
|
|
||||||
|
runOnUiThread {
|
||||||
|
supportActionBar?.title = messages.first().getThreadTitle()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
setupButtons()
|
setupButtons()
|
||||||
}
|
}
|
||||||
|
|
@ -101,8 +95,7 @@ class ThreadActivity : SimpleActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupAdapter() {
|
private fun setupAdapter() {
|
||||||
val threadId = intent.getIntExtra(THREAD_ID, 0)
|
threadItems = getThreadItems()
|
||||||
threadItems = getThreadItems(threadId)
|
|
||||||
invalidateOptionsMenu()
|
invalidateOptionsMenu()
|
||||||
|
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
|
|
@ -115,7 +108,7 @@ class ThreadActivity : SimpleActivity() {
|
||||||
val adapter = AutoCompleteTextViewAdapter(this, it)
|
val adapter = AutoCompleteTextViewAdapter(this, it)
|
||||||
new_message_to.setAdapter(adapter)
|
new_message_to.setAdapter(adapter)
|
||||||
new_message_to.imeOptions = EditorInfo.IME_ACTION_NEXT
|
new_message_to.imeOptions = EditorInfo.IME_ACTION_NEXT
|
||||||
new_message_to.setOnItemClickListener { parent, view, position, id ->
|
new_message_to.setOnItemClickListener { _, _, position, _ ->
|
||||||
val currContacts = (new_message_to.adapter as AutoCompleteTextViewAdapter).resultList
|
val currContacts = (new_message_to.adapter as AutoCompleteTextViewAdapter).resultList
|
||||||
val selectedContact = currContacts[position]
|
val selectedContact = currContacts[position]
|
||||||
addSelectedContact(selectedContact)
|
addSelectedContact(selectedContact)
|
||||||
|
|
@ -135,14 +128,16 @@ class ThreadActivity : SimpleActivity() {
|
||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
}
|
}
|
||||||
|
|
||||||
|
participants.forEach {
|
||||||
val intent = Intent(this, SmsSentReceiver::class.java).apply {
|
val intent = Intent(this, SmsSentReceiver::class.java).apply {
|
||||||
putExtra(MESSAGE_BODY, msg)
|
putExtra(MESSAGE_BODY, msg)
|
||||||
putExtra(MESSAGE_ADDRESS, targetNumber)
|
putExtra(MESSAGE_ADDRESS, it.phoneNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
val pendingIntent = PendingIntent.getBroadcast(this, threadId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
val pendingIntent = PendingIntent.getBroadcast(this, threadId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||||
val smsManager = SmsManager.getDefault()
|
val smsManager = SmsManager.getDefault()
|
||||||
smsManager.sendTextMessage(targetNumber, null, msg, pendingIntent, null)
|
smsManager.sendTextMessage(it.phoneNumber, null, msg, pendingIntent, null)
|
||||||
|
}
|
||||||
thread_type_message.setText("")
|
thread_type_message.setText("")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -156,7 +151,7 @@ class ThreadActivity : SimpleActivity() {
|
||||||
hideKeyboard()
|
hideKeyboard()
|
||||||
thread_add_contacts.beGone()
|
thread_add_contacts.beGone()
|
||||||
|
|
||||||
val numbers = selectedContacts.map { it.phoneNumber }.toSet()
|
val numbers = participants.map { it.phoneNumber }.toSet()
|
||||||
val threadId = getThreadId(numbers).toInt()
|
val threadId = getThreadId(numbers).toInt()
|
||||||
Intent(this, ThreadActivity::class.java).apply {
|
Intent(this, ThreadActivity::class.java).apply {
|
||||||
putExtra(THREAD_ID, threadId)
|
putExtra(THREAD_ID, threadId)
|
||||||
|
|
@ -168,7 +163,7 @@ class ThreadActivity : SimpleActivity() {
|
||||||
|
|
||||||
private fun blockNumber() {
|
private fun blockNumber() {
|
||||||
val baseString = R.string.block_confirmation
|
val baseString = R.string.block_confirmation
|
||||||
val numbers = selectedContacts.map { it.phoneNumber }.toTypedArray()
|
val numbers = participants.map { it.phoneNumber }.toTypedArray()
|
||||||
val numbersString = TextUtils.join(", ", numbers)
|
val numbersString = TextUtils.join(", ", numbers)
|
||||||
val question = String.format(resources.getString(baseString), numbersString)
|
val question = String.format(resources.getString(baseString), numbersString)
|
||||||
|
|
||||||
|
|
@ -205,12 +200,12 @@ class ThreadActivity : SimpleActivity() {
|
||||||
|
|
||||||
private fun showSelectedContacts() {
|
private fun showSelectedContacts() {
|
||||||
val views = ArrayList<View>()
|
val views = ArrayList<View>()
|
||||||
selectedContacts.forEach {
|
participants.forEach {
|
||||||
val contact = it
|
val contact = it
|
||||||
layoutInflater.inflate(R.layout.item_selected_contact, null).apply {
|
layoutInflater.inflate(R.layout.item_selected_contact, null).apply {
|
||||||
selected_contact_name.text = contact.name
|
selected_contact_name.text = contact.name
|
||||||
selected_contact_remove.setOnClickListener {
|
selected_contact_remove.setOnClickListener {
|
||||||
if (contact.id != selectedContacts.first().id) {
|
if (contact.id != participants.first().id) {
|
||||||
removeSelectedContact(contact.id)
|
removeSelectedContact(contact.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -222,16 +217,15 @@ class ThreadActivity : SimpleActivity() {
|
||||||
|
|
||||||
private fun addSelectedContact(contact: Contact) {
|
private fun addSelectedContact(contact: Contact) {
|
||||||
new_message_to.setText("")
|
new_message_to.setText("")
|
||||||
if (selectedContacts.map { it.id }.contains(contact.id)) {
|
if (participants.map { it.id }.contains(contact.id)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
selectedContacts.add(contact)
|
participants.add(contact)
|
||||||
showSelectedContacts()
|
showSelectedContacts()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getThreadItems(threadID: Int): ArrayList<ThreadItem> {
|
private fun getThreadItems(): ArrayList<ThreadItem> {
|
||||||
val messages = getMessages(threadID)
|
|
||||||
messages.sortBy { it.date }
|
messages.sortBy { it.date }
|
||||||
|
|
||||||
val items = ArrayList<ThreadItem>()
|
val items = ArrayList<ThreadItem>()
|
||||||
|
|
@ -267,8 +261,7 @@ class ThreadActivity : SimpleActivity() {
|
||||||
private fun showSelectedContact(views: ArrayList<View>) {
|
private fun showSelectedContact(views: ArrayList<View>) {
|
||||||
selected_contacts.removeAllViews()
|
selected_contacts.removeAllViews()
|
||||||
var newLinearLayout = LinearLayout(this)
|
var newLinearLayout = LinearLayout(this)
|
||||||
newLinearLayout.layoutParams =
|
newLinearLayout.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
|
||||||
LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)
|
|
||||||
newLinearLayout.orientation = LinearLayout.HORIZONTAL
|
newLinearLayout.orientation = LinearLayout.HORIZONTAL
|
||||||
|
|
||||||
val sideMargin = (selected_contacts.layoutParams as RelativeLayout.LayoutParams).leftMargin
|
val sideMargin = (selected_contacts.layoutParams as RelativeLayout.LayoutParams).leftMargin
|
||||||
|
|
@ -277,14 +270,15 @@ class ThreadActivity : SimpleActivity() {
|
||||||
val firstRowWidth = parentWidth - resources.getDimension(R.dimen.normal_icon_size).toInt() + sideMargin / 2
|
val firstRowWidth = parentWidth - resources.getDimension(R.dimen.normal_icon_size).toInt() + sideMargin / 2
|
||||||
var widthSoFar = 0
|
var widthSoFar = 0
|
||||||
var isFirstRow = true
|
var isFirstRow = true
|
||||||
|
|
||||||
for (i in views.indices) {
|
for (i in views.indices) {
|
||||||
val LL = LinearLayout(this)
|
val LL = LinearLayout(this)
|
||||||
LL.orientation = LinearLayout.HORIZONTAL
|
LL.orientation = LinearLayout.HORIZONTAL
|
||||||
LL.gravity = Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM
|
LL.gravity = Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM
|
||||||
LL.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
|
LL.layoutParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
|
||||||
views[i].measure(0, 0)
|
views[i].measure(0, 0)
|
||||||
|
|
||||||
var params = LinearLayout.LayoutParams(views[i].measuredWidth, LinearLayout.LayoutParams.WRAP_CONTENT)
|
var params = LayoutParams(views[i].measuredWidth, LayoutParams.WRAP_CONTENT)
|
||||||
params.setMargins(0, 0, mediumMargin, 0)
|
params.setMargins(0, 0, mediumMargin, 0)
|
||||||
LL.addView(views[i], params)
|
LL.addView(views[i], params)
|
||||||
LL.measure(0, 0)
|
LL.measure(0, 0)
|
||||||
|
|
@ -295,16 +289,15 @@ class ThreadActivity : SimpleActivity() {
|
||||||
isFirstRow = false
|
isFirstRow = false
|
||||||
selected_contacts.addView(newLinearLayout)
|
selected_contacts.addView(newLinearLayout)
|
||||||
newLinearLayout = LinearLayout(this)
|
newLinearLayout = LinearLayout(this)
|
||||||
newLinearLayout.layoutParams =
|
newLinearLayout.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
|
||||||
LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)
|
|
||||||
newLinearLayout.orientation = LinearLayout.HORIZONTAL
|
newLinearLayout.orientation = LinearLayout.HORIZONTAL
|
||||||
params = LinearLayout.LayoutParams(LL.measuredWidth, LL.measuredHeight)
|
params = LayoutParams(LL.measuredWidth, LL.measuredHeight)
|
||||||
params.topMargin = mediumMargin
|
params.topMargin = mediumMargin
|
||||||
newLinearLayout.addView(LL, params)
|
newLinearLayout.addView(LL, params)
|
||||||
widthSoFar = LL.measuredWidth
|
widthSoFar = LL.measuredWidth
|
||||||
} else {
|
} else {
|
||||||
if (!isFirstRow) {
|
if (!isFirstRow) {
|
||||||
(LL.layoutParams as LinearLayout.LayoutParams).topMargin = mediumMargin
|
(LL.layoutParams as LayoutParams).topMargin = mediumMargin
|
||||||
}
|
}
|
||||||
newLinearLayout.addView(LL)
|
newLinearLayout.addView(LL)
|
||||||
}
|
}
|
||||||
|
|
@ -313,12 +306,13 @@ class ThreadActivity : SimpleActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun removeSelectedContact(id: Int) {
|
private fun removeSelectedContact(id: Int) {
|
||||||
selectedContacts = selectedContacts.filter { it.id != id }.toMutableList() as ArrayList<Contact>
|
participants = participants.filter { it.id != id }.toMutableList() as ArrayList<Contact>
|
||||||
showSelectedContacts()
|
showSelectedContacts()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
@Subscribe(threadMode = ThreadMode.ASYNC)
|
||||||
fun refreshMessages(event: Events.RefreshMessages) {
|
fun refreshMessages(event: Events.RefreshMessages) {
|
||||||
|
messages = getMessages(threadId)
|
||||||
setupAdapter()
|
setupAdapter()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import android.provider.ContactsContract.CommonDataKinds
|
||||||
import android.provider.ContactsContract.CommonDataKinds.Organization
|
import android.provider.ContactsContract.CommonDataKinds.Organization
|
||||||
import android.provider.ContactsContract.CommonDataKinds.StructuredName
|
import android.provider.ContactsContract.CommonDataKinds.StructuredName
|
||||||
import android.provider.ContactsContract.PhoneLookup
|
import android.provider.ContactsContract.PhoneLookup
|
||||||
import android.provider.Telephony
|
|
||||||
import android.provider.Telephony.*
|
import android.provider.Telephony.*
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
|
|
@ -23,7 +22,6 @@ import com.simplemobiletools.smsmessenger.helpers.Config
|
||||||
import com.simplemobiletools.smsmessenger.models.Contact
|
import com.simplemobiletools.smsmessenger.models.Contact
|
||||||
import com.simplemobiletools.smsmessenger.models.MMS
|
import com.simplemobiletools.smsmessenger.models.MMS
|
||||||
import com.simplemobiletools.smsmessenger.models.Message
|
import com.simplemobiletools.smsmessenger.models.Message
|
||||||
import com.simplemobiletools.smsmessenger.models.MessagingThread
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
|
|
@ -78,6 +76,7 @@ fun Context.getMessages(threadId: Int? = null): ArrayList<Message> {
|
||||||
return messages
|
return messages
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// as soon as a message contains multiple recipients it count as an MMS instead of SMS
|
||||||
fun Context.getMMS(threadId: Int? = null): ArrayList<Message> {
|
fun Context.getMMS(threadId: Int? = null): ArrayList<Message> {
|
||||||
val uri = Mms.CONTENT_URI
|
val uri = Mms.CONTENT_URI
|
||||||
val projection = arrayOf(
|
val projection = arrayOf(
|
||||||
|
|
@ -107,11 +106,9 @@ fun Context.getMMS(threadId: Int? = null): ArrayList<Message> {
|
||||||
val date = cursor.getLongValue(Mms.DATE).toInt()
|
val date = cursor.getLongValue(Mms.DATE).toInt()
|
||||||
val read = cursor.getIntValue(Mms.READ) == 1
|
val read = cursor.getIntValue(Mms.READ) == 1
|
||||||
val thread = cursor.getIntValue(Mms.THREAD_ID)
|
val thread = cursor.getIntValue(Mms.THREAD_ID)
|
||||||
val senderName = getThreadRecipients(thread)
|
val participants = getThreadParticipants(thread)
|
||||||
val senderNumber = senderName
|
|
||||||
val mms = getMmsContent(id)
|
val mms = getMmsContent(id)
|
||||||
val participant = Contact(0, senderName, "", senderNumber, false)
|
val message = Message(id, mms?.text ?: "", type, participants, date, read, thread)
|
||||||
val message = Message(id, mms?.text ?: "", type, arrayListOf(participant), date, read, thread)
|
|
||||||
messages.add(message)
|
messages.add(message)
|
||||||
}
|
}
|
||||||
return messages
|
return messages
|
||||||
|
|
@ -148,32 +145,34 @@ fun Context.getMmsContent(id: Int): MMS? {
|
||||||
return mms
|
return mms
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Context.getThreadRecipients(threadId: Int): String {
|
fun Context.getThreadParticipants(threadId: Int): ArrayList<Contact> {
|
||||||
val uri = Uri.parse("${MmsSms.CONTENT_CONVERSATIONS_URI}?simple=true")
|
val uri = Uri.parse("${MmsSms.CONTENT_CONVERSATIONS_URI}?simple=true")
|
||||||
val projection = arrayOf(
|
val projection = arrayOf(
|
||||||
ThreadsColumns.RECIPIENT_IDS
|
ThreadsColumns.RECIPIENT_IDS
|
||||||
)
|
)
|
||||||
val selection = "${Mms._ID} = ?"
|
val selection = "${Mms._ID} = ?"
|
||||||
val selectionArgs = arrayOf(threadId.toString())
|
val selectionArgs = arrayOf(threadId.toString())
|
||||||
|
val participants = ArrayList<Contact>()
|
||||||
try {
|
try {
|
||||||
val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null)
|
val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null)
|
||||||
cursor?.use {
|
cursor?.use {
|
||||||
if (cursor.moveToFirst()) {
|
if (cursor.moveToFirst()) {
|
||||||
val address = cursor.getStringValue(ThreadsColumns.RECIPIENT_IDS)
|
val address = cursor.getStringValue(ThreadsColumns.RECIPIENT_IDS)
|
||||||
var recipient = ""
|
|
||||||
address.split(" ").filter { it.areDigitsOnly() }.forEach {
|
address.split(" ").filter { it.areDigitsOnly() }.forEach {
|
||||||
recipient += "${getNameFromAddressId(it.toInt())}, "
|
val phoneNumber = getPhoneNumberFromAddressId(it.toInt())
|
||||||
|
val name = getNameFromPhoneNumber(phoneNumber)
|
||||||
|
val contact = Contact(0, name, "", phoneNumber, false)
|
||||||
|
participants.add(contact)
|
||||||
}
|
}
|
||||||
return recipient.removeSuffix(", ")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
showErrorToast(e)
|
showErrorToast(e)
|
||||||
}
|
}
|
||||||
return ""
|
return participants
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Context.getNameFromAddressId(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(
|
||||||
Mms.Addr.ADDRESS
|
Mms.Addr.ADDRESS
|
||||||
|
|
@ -184,8 +183,7 @@ fun Context.getNameFromAddressId(canonicalAddressId: Int): String {
|
||||||
val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null)
|
val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null)
|
||||||
cursor?.use {
|
cursor?.use {
|
||||||
if (cursor.moveToFirst()) {
|
if (cursor.moveToFirst()) {
|
||||||
val phoneNumber = cursor.getStringValue(Mms.Addr.ADDRESS)
|
return cursor.getStringValue(Mms.Addr.ADDRESS)
|
||||||
return getNameFromPhoneNumber(phoneNumber)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
|
@ -206,40 +204,6 @@ private fun Context.getMmsImage(uri: Uri, id: String): Bitmap? {
|
||||||
return bitmap
|
return bitmap
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Context.getThreadInfo(id: Int): MessagingThread? {
|
|
||||||
val uri = Sms.CONTENT_URI
|
|
||||||
val projection = arrayOf(
|
|
||||||
Sms._ID,
|
|
||||||
Sms.ADDRESS,
|
|
||||||
Sms.PERSON
|
|
||||||
)
|
|
||||||
val selection = "${Sms.THREAD_ID} = ?"
|
|
||||||
val selectionArgs = arrayOf(id.toString())
|
|
||||||
try {
|
|
||||||
val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null)
|
|
||||||
cursor?.use {
|
|
||||||
if (cursor.moveToFirst()) {
|
|
||||||
val person = cursor.getIntValue(Sms.PERSON)
|
|
||||||
val address = cursor.getStringValue(Sms.ADDRESS)
|
|
||||||
var title = address
|
|
||||||
|
|
||||||
if (title != null && person != 0) {
|
|
||||||
title = getPersonsName(person) ?: title
|
|
||||||
} else if (title.areDigitsOnly()) {
|
|
||||||
val contactId = getContactIdFromPhoneNumber(title)
|
|
||||||
if (contactId != null) {
|
|
||||||
title = getPersonsName(contactId) ?: title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return MessagingThread(id, title, address)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Context.getPersonsName(id: Int): String? {
|
fun Context.getPersonsName(id: Int): String? {
|
||||||
val uri = ContactsContract.Data.CONTENT_URI
|
val uri = ContactsContract.Data.CONTENT_URI
|
||||||
val projection = arrayOf(
|
val projection = arrayOf(
|
||||||
|
|
@ -328,27 +292,6 @@ fun Context.getAvailableContacts(callback: (ArrayList<Contact>) -> Unit) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Context.getContactIdFromPhoneNumber(number: String): Int? {
|
|
||||||
val uri = CommonDataKinds.Phone.CONTENT_URI
|
|
||||||
val projection = arrayOf(
|
|
||||||
ContactsContract.Data.CONTACT_ID
|
|
||||||
)
|
|
||||||
|
|
||||||
val selection = "${CommonDataKinds.Phone.NUMBER} = ? OR ${CommonDataKinds.Phone.NORMALIZED_NUMBER} = ?"
|
|
||||||
val selectionArgs = arrayOf(number, number)
|
|
||||||
try {
|
|
||||||
val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null)
|
|
||||||
cursor.use {
|
|
||||||
if (cursor?.moveToFirst() == true) {
|
|
||||||
return cursor.getIntValue(ContactsContract.Data.CONTACT_ID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
showErrorToast(e)
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Context.getNameFromPhoneNumber(number: String): String {
|
fun Context.getNameFromPhoneNumber(number: String): String {
|
||||||
if (!hasPermission(PERMISSION_READ_CONTACTS)) {
|
if (!hasPermission(PERMISSION_READ_CONTACTS)) {
|
||||||
return number
|
return number
|
||||||
|
|
@ -488,7 +431,7 @@ fun Context.markSMSRead(id: Int) {
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
fun Context.getThreadId(address: String): Long {
|
fun Context.getThreadId(address: String): Long {
|
||||||
return if (isMarshmallowPlus()) {
|
return if (isMarshmallowPlus()) {
|
||||||
Telephony.Threads.getOrCreateThreadId(this, address)
|
Threads.getOrCreateThreadId(this, address)
|
||||||
} else {
|
} else {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
@ -497,7 +440,7 @@ fun Context.getThreadId(address: String): Long {
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
fun Context.getThreadId(addresses: Set<String>): Long {
|
fun Context.getThreadId(addresses: Set<String>): Long {
|
||||||
return if (isMarshmallowPlus()) {
|
return if (isMarshmallowPlus()) {
|
||||||
Telephony.Threads.getOrCreateThreadId(this, addresses)
|
Threads.getOrCreateThreadId(this, addresses)
|
||||||
} else {
|
} else {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,7 @@ import com.simplemobiletools.smsmessenger.models.Events
|
||||||
import org.greenrobot.eventbus.EventBus
|
import org.greenrobot.eventbus.EventBus
|
||||||
|
|
||||||
const val THREAD_ID = "thread_id"
|
const val THREAD_ID = "thread_id"
|
||||||
const val THREAD_NAME = "thread_name"
|
const val THREAD_TITLE = "thread_title"
|
||||||
const val THREAD_NUMBER = "thread_number"
|
|
||||||
|
|
||||||
// view types for the thread list view
|
// view types for the thread list view
|
||||||
const val THREAD_DATE_TIME = 1
|
const val THREAD_DATE_TIME = 1
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,12 @@
|
||||||
package com.simplemobiletools.smsmessenger.models
|
package com.simplemobiletools.smsmessenger.models
|
||||||
|
|
||||||
import android.provider.Telephony
|
import android.provider.Telephony
|
||||||
|
import android.text.TextUtils
|
||||||
|
|
||||||
data class Message(
|
data class Message(
|
||||||
val id: Int, val body: String, val type: Int, val participants: ArrayList<Contact>, val date: Int, val read: Boolean, val thread: Int
|
val id: Int, val body: String, val type: Int, val participants: ArrayList<Contact>, val date: Int, val read: Boolean, val thread: Int
|
||||||
) : ThreadItem() {
|
) : ThreadItem() {
|
||||||
fun isReceivedMessage() = type == Telephony.Sms.MESSAGE_TYPE_INBOX
|
fun isReceivedMessage() = type == Telephony.Sms.MESSAGE_TYPE_INBOX
|
||||||
|
|
||||||
|
fun getThreadTitle() = TextUtils.join(", ", participants.map { it.name }.toTypedArray())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
package com.simplemobiletools.smsmessenger.models
|
|
||||||
|
|
||||||
data class MessagingThread(val id: Int, val title: String, val address: String)
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
android:layout_toStartOf="@+id/new_message_confirm"
|
android:layout_toStartOf="@+id/new_message_confirm"
|
||||||
android:background="@android:color/transparent"
|
android:background="@android:color/transparent"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:hint="@string/select_contact_or_number"
|
android:hint="@string/add_contact_or_number"
|
||||||
android:inputType="textCapWords"
|
android:inputType="textCapWords"
|
||||||
android:textSize="@dimen/big_text_size" />
|
android:textSize="@dimen/big_text_size" />
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@
|
||||||
android:background="@android:color/transparent"
|
android:background="@android:color/transparent"
|
||||||
android:completionThreshold="2"
|
android:completionThreshold="2"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:hint="@string/select_contact_or_number"
|
android:hint="@string/add_contact_or_number"
|
||||||
android:inputType="textCapWords"
|
android:inputType="textCapWords"
|
||||||
android:textSize="@dimen/big_text_size" />
|
android:textSize="@dimen/big_text_size" />
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
<!-- New message -->
|
<!-- New message -->
|
||||||
<string name="create_new_message">Create new message</string>
|
<string name="create_new_message">Create new message</string>
|
||||||
<string name="select_contact_or_number">Select Contact or Number…</string>
|
<string name="add_contact_or_number">Add Contact or Number…</string>
|
||||||
|
|
||||||
<!-- Notifications -->
|
<!-- Notifications -->
|
||||||
<string name="channel_received_sms">Received SMS</string>
|
<string name="channel_received_sms">Received SMS</string>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue