From 6842e1c5b63b5967e38d726fa10b328c847c162b Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 18 Sep 2022 17:40:14 +0530 Subject: [PATCH 1/5] Respect default SMS SIM setting --- .../smsmessenger/activities/ThreadActivity.kt | 46 ++++++++++++++----- .../smsmessenger/extensions/Context.kt | 11 +++++ 2 files changed, 45 insertions(+), 12 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 d8c03fcb..bad6f123 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -13,7 +13,9 @@ import android.os.Bundle import android.provider.ContactsContract import android.provider.MediaStore import android.provider.Telephony +import android.telephony.SmsManager import android.telephony.SmsMessage +import android.telephony.SubscriptionInfo import android.telephony.SubscriptionManager import android.text.TextUtils import android.util.TypedValue @@ -520,15 +522,15 @@ class ThreadActivity : SimpleActivity() { @SuppressLint("MissingPermission") private fun setupSIMSelector() { - val availableSIMs = SubscriptionManager.from(this).activeSubscriptionInfoList ?: return + val availableSIMs = subscriptionManagerCompat().activeSubscriptionInfoList ?: return if (availableSIMs.size > 1) { availableSIMs.forEachIndexed { index, subscriptionInfo -> var label = subscriptionInfo.displayName?.toString() ?: "" if (subscriptionInfo.number?.isNotEmpty() == true) { label += " (${subscriptionInfo.number})" } - val SIMCard = SIMCard(index + 1, subscriptionInfo.subscriptionId, label) - availableSIMCards.add(SIMCard) + val simCard = SIMCard(index + 1, subscriptionInfo.subscriptionId, label) + availableSIMCards.add(simCard) } val numbers = ArrayList() @@ -542,8 +544,7 @@ class ThreadActivity : SimpleActivity() { return } - currentSIMCardIndex = availableSIMs.indexOfFirstOrNull { it.subscriptionId == config.getUseSIMIdAtNumber(numbers.first()) } ?: 0 - + currentSIMCardIndex = getProperSimIndex(availableSIMs, numbers) thread_select_sim_icon.applyColorFilter(getProperTextColor()) thread_select_sim_icon.beVisible() thread_select_sim_number.beVisible() @@ -553,6 +554,10 @@ class ThreadActivity : SimpleActivity() { currentSIMCardIndex = (currentSIMCardIndex + 1) % availableSIMCards.size val currentSIMCard = availableSIMCards[currentSIMCardIndex] thread_select_sim_number.text = currentSIMCard.id.toString() + val currentSubscriptionId = currentSIMCard.subscriptionId + numbers.forEach { + config.saveUseSIMIdAtNumber(it, currentSubscriptionId) + } toast(currentSIMCard.label) } } @@ -562,6 +567,25 @@ class ThreadActivity : SimpleActivity() { } } + @SuppressLint("MissingPermission") + private fun getProperSimIndex(availableSIMs: MutableList, numbers: List): Int { + val userPreferredSimId = config.getUseSIMIdAtNumber(numbers.first()) + val userPreferredSimIdx = availableSIMs.indexOfFirstOrNull { it.subscriptionId == userPreferredSimId } + + val lastMessage = messages.lastOrNull() + val senderPreferredSimIdx = availableSIMs.indexOfFirstOrNull { it.subscriptionId == lastMessage?.subscriptionId } + + val defaultSmsSubscriptionId = SmsManager.getDefaultSmsSubscriptionId() + val systemPreferredSimIdx = if (defaultSmsSubscriptionId >= 0) { + val defaultSmsSIM = subscriptionManagerCompat().getActiveSubscriptionInfo(defaultSmsSubscriptionId) + availableSIMs.indexOfFirstOrNull { it.subscriptionId == defaultSmsSIM.subscriptionId } + } else { + null + } + + return userPreferredSimIdx ?: senderPreferredSimIdx ?: systemPreferredSimIdx ?: 0 + } + private fun blockNumber() { val numbers = ArrayList() participants.forEach { @@ -908,12 +932,9 @@ class ThreadActivity : SimpleActivity() { } val settings = getSendMessageSettings() - val SIMId = availableSIMCards.getOrNull(currentSIMCardIndex)?.subscriptionId - if (SIMId != null) { - settings.subscriptionId = SIMId - numbers.forEach { - config.saveUseSIMIdAtNumber(it, SIMId) - } + val currentSubscriptionId = availableSIMCards.getOrNull(currentSIMCardIndex)?.subscriptionId + if (currentSubscriptionId != null) { + settings.subscriptionId = currentSubscriptionId } val transaction = Transaction(this, settings) @@ -1106,7 +1127,7 @@ class ThreadActivity : SimpleActivity() { messages.filter { !it.isReceivedMessage() && it.id > lastMaxId }.forEach { latestMessage -> // subscriptionIds seem to be not filled out at sending with multiple SIM cards, so fill it manually - if ((SubscriptionManager.from(this).activeSubscriptionInfoList?.size ?: 0) > 1) { + if ((subscriptionManagerCompat().activeSubscriptionInfoList?.size ?: 0) > 1) { val SIMId = availableSIMCards.getOrNull(currentSIMCardIndex)?.subscriptionId if (SIMId != null) { updateMessageSubscriptionId(latestMessage.id, SIMId) @@ -1118,6 +1139,7 @@ class ThreadActivity : SimpleActivity() { } setupAdapter() + setupSIMSelector() } private fun updateMessageType() { 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 218b8b3b..f21f41c1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -16,12 +16,14 @@ import android.media.AudioAttributes import android.media.AudioManager import android.media.RingtoneManager import android.net.Uri +import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper import android.provider.ContactsContract.PhoneLookup import android.provider.OpenableColumns import android.provider.Telephony.* +import android.telephony.SubscriptionManager import android.text.TextUtils import androidx.core.app.NotificationCompat import androidx.core.app.RemoteInput @@ -993,3 +995,12 @@ fun Context.clearAllMessagesIfNeeded() { config.wasDbCleared = true } } + +fun Context.subscriptionManagerCompat(): SubscriptionManager { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + getSystemService(SubscriptionManager::class.java) + } else { + @Suppress("DEPRECATION") + SubscriptionManager.from(this) + } +} From b85dbf3b4b8a2dffe39483bd70565049e42f6664 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 18 Sep 2022 21:26:09 +0530 Subject: [PATCH 2/5] Prefer incoming address over user preference This is what google messages does. --- .../smsmessenger/activities/ThreadActivity.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 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 bad6f123..1d0dce0c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -573,7 +573,11 @@ class ThreadActivity : SimpleActivity() { val userPreferredSimIdx = availableSIMs.indexOfFirstOrNull { it.subscriptionId == userPreferredSimId } val lastMessage = messages.lastOrNull() - val senderPreferredSimIdx = availableSIMs.indexOfFirstOrNull { it.subscriptionId == lastMessage?.subscriptionId } + val senderPreferredSimIdx = if (lastMessage?.isReceivedMessage() == true) { + availableSIMs.indexOfFirstOrNull { it.subscriptionId == lastMessage.subscriptionId } + } else { + null + } val defaultSmsSubscriptionId = SmsManager.getDefaultSmsSubscriptionId() val systemPreferredSimIdx = if (defaultSmsSubscriptionId >= 0) { @@ -583,7 +587,7 @@ class ThreadActivity : SimpleActivity() { null } - return userPreferredSimIdx ?: senderPreferredSimIdx ?: systemPreferredSimIdx ?: 0 + return senderPreferredSimIdx ?: userPreferredSimIdx ?: systemPreferredSimIdx ?: 0 } private fun blockNumber() { From f4575401f59db32e8739261bf5bed5a5be088580 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 18 Sep 2022 22:54:51 +0530 Subject: [PATCH 3/5] Use the existing extension for api version check --- .../com/simplemobiletools/smsmessenger/extensions/Context.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 f21f41c1..ddde568f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -16,7 +16,6 @@ import android.media.AudioAttributes import android.media.AudioManager import android.media.RingtoneManager import android.net.Uri -import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper @@ -997,7 +996,7 @@ fun Context.clearAllMessagesIfNeeded() { } fun Context.subscriptionManagerCompat(): SubscriptionManager { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return if (isMarshmallowPlus()) { getSystemService(SubscriptionManager::class.java) } else { @Suppress("DEPRECATION") From a4bd3364c68e785603743d86337c73c97a63c778 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 18 Sep 2022 22:57:28 +0530 Subject: [PATCH 4/5] Use `subscriptionManagerCompat()` everywhere --- .../simplemobiletools/smsmessenger/activities/ThreadActivity.kt | 2 +- .../simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt | 2 +- .../smsmessenger/receivers/DirectReplyReceiver.kt | 2 +- 3 files changed, 3 insertions(+), 3 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 1d0dce0c..1b2ca739 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -709,7 +709,7 @@ class ThreadActivity : SimpleActivity() { val subscriptionIdToSimId = HashMap() subscriptionIdToSimId[-1] = "?" - SubscriptionManager.from(this).activeSubscriptionInfoList?.forEachIndexed { index, subscriptionInfo -> + subscriptionManagerCompat().activeSubscriptionInfoList?.forEachIndexed { index, subscriptionInfo -> subscriptionIdToSimId[subscriptionInfo.subscriptionId] = "${index + 1}" } 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 935336eb..75eb264d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -53,7 +53,7 @@ class ThreadAdapter( private var fontSize = activity.getTextSize() @SuppressLint("MissingPermission") - private val hasMultipleSIMCards = (SubscriptionManager.from(activity).activeSubscriptionInfoList?.size ?: 0) > 1 + private val hasMultipleSIMCards = (activity.subscriptionManagerCompat().activeSubscriptionInfoList?.size ?: 0) > 1 init { setupDragListener(true) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/DirectReplyReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/DirectReplyReceiver.kt index 3814d0a3..caac5115 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/DirectReplyReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/DirectReplyReceiver.kt @@ -26,7 +26,7 @@ class DirectReplyReceiver : BroadcastReceiver() { val settings = context.getSendMessageSettings() if (address != null) { - val availableSIMs = SubscriptionManager.from(context).activeSubscriptionInfoList + val availableSIMs = context.subscriptionManagerCompat().activeSubscriptionInfoList if ((availableSIMs?.size ?: 0) > 1) { val currentSIMCardIndex = context.config.getUseSIMIdAtNumber(address) val wantedId = availableSIMs.getOrNull(currentSIMCardIndex) From 52e18200b8810225630bff388c4f47717769e52f Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 19 Sep 2022 04:31:49 +0530 Subject: [PATCH 5/5] Revert "Prefer incoming address over user preference" Cases emerge that require additional book keeping to make sure proper sim is selected. --- .../smsmessenger/activities/ThreadActivity.kt | 3 +-- 1 file changed, 1 insertion(+), 2 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 1b2ca739..59c66ebd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -16,7 +16,6 @@ import android.provider.Telephony import android.telephony.SmsManager import android.telephony.SmsMessage import android.telephony.SubscriptionInfo -import android.telephony.SubscriptionManager import android.text.TextUtils import android.util.TypedValue import android.view.Gravity @@ -587,7 +586,7 @@ class ThreadActivity : SimpleActivity() { null } - return senderPreferredSimIdx ?: userPreferredSimIdx ?: systemPreferredSimIdx ?: 0 + return userPreferredSimIdx ?: senderPreferredSimIdx ?: systemPreferredSimIdx ?: 0 } private fun blockNumber() {