Skip to content

Commit bac3040

Browse files
authored
Merge pull request #543 from Naveen3Singh/rewrite_sms
Rewrite SMS related code into the app
2 parents e91ff11 + f24c88e commit bac3040

25 files changed

+1027
-409
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.content.Intent
44
import android.net.Uri
55
import android.os.Bundle
66
import android.view.WindowManager
7+
import android.widget.Toast
78
import com.google.gson.Gson
89
import com.reddit.indicatorfastscroll.FastScrollItemIndicator
910
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
@@ -16,7 +17,7 @@ import com.simplemobiletools.smsmessenger.adapters.ContactsAdapter
1617
import com.simplemobiletools.smsmessenger.extensions.getSuggestedContacts
1718
import com.simplemobiletools.smsmessenger.extensions.getThreadId
1819
import com.simplemobiletools.smsmessenger.helpers.*
19-
import kotlinx.android.synthetic.main.activity_main.*
20+
import com.simplemobiletools.smsmessenger.messaging.isShortCodeWithLetters
2021
import kotlinx.android.synthetic.main.activity_new_conversation.*
2122
import kotlinx.android.synthetic.main.item_suggested_contact.view.*
2223
import java.net.URLDecoder
@@ -79,6 +80,11 @@ class NewConversationActivity : SimpleActivity() {
7980
new_conversation_confirm.applyColorFilter(getProperTextColor())
8081
new_conversation_confirm.setOnClickListener {
8182
val number = new_conversation_address.value
83+
if (isShortCodeWithLetters(number)) {
84+
new_conversation_address.setText("")
85+
toast(R.string.invalid_short_code, length = Toast.LENGTH_LONG)
86+
return@setOnClickListener
87+
}
8288
launchThreadActivity(number, number)
8389
}
8490

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

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,19 @@ import com.simplemobiletools.smsmessenger.R
5151
import com.simplemobiletools.smsmessenger.adapters.AttachmentsAdapter
5252
import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter
5353
import com.simplemobiletools.smsmessenger.adapters.ThreadAdapter
54+
import com.simplemobiletools.smsmessenger.dialogs.InvalidNumberDialog
5455
import com.simplemobiletools.smsmessenger.dialogs.RenameConversationDialog
5556
import com.simplemobiletools.smsmessenger.dialogs.ScheduleMessageDialog
5657
import com.simplemobiletools.smsmessenger.extensions.*
5758
import com.simplemobiletools.smsmessenger.helpers.*
59+
import com.simplemobiletools.smsmessenger.messaging.*
5860
import com.simplemobiletools.smsmessenger.models.*
5961
import com.simplemobiletools.smsmessenger.models.ThreadItem.*
6062
import kotlinx.android.synthetic.main.activity_thread.*
6163
import kotlinx.android.synthetic.main.item_selected_contact.view.*
6264
import kotlinx.android.synthetic.main.layout_attachment_picker.*
65+
import kotlinx.android.synthetic.main.layout_invalid_short_code_info.*
66+
import kotlinx.android.synthetic.main.layout_thread_send_message_holder.*
6367
import org.greenrobot.eventbus.EventBus
6468
import org.greenrobot.eventbus.Subscribe
6569
import org.greenrobot.eventbus.ThreadMode
@@ -176,6 +180,7 @@ class ThreadActivity : SimpleActivity() {
176180
}
177181

178182
thread_send_message_holder.setBackgroundColor(bottomBarColor)
183+
reply_disabled_info_holder.setBackgroundColor(bottomBarColor)
179184
updateNavigationBarColor(bottomBarColor)
180185
}
181186

@@ -214,7 +219,8 @@ class ThreadActivity : SimpleActivity() {
214219
findItem(R.id.conversation_details).isVisible = participants.size > 1 && conversation != null
215220
findItem(R.id.block_number).title = addLockedLabelIfNeeded(R.string.block_number)
216221
findItem(R.id.block_number).isVisible = isNougatPlus()
217-
findItem(R.id.dial_number).isVisible = participants.size == 1
222+
findItem(R.id.dial_number).isVisible = participants.size == 1 && !isSpecialNumber()
223+
findItem(R.id.manage_people).isVisible = !isSpecialNumber()
218224
findItem(R.id.mark_as_unread).isVisible = threadItems.isNotEmpty()
219225

220226
// allow saving number in cases when we dont have it stored yet and it is a casual readable number
@@ -670,6 +676,35 @@ class ThreadActivity : SimpleActivity() {
670676
} else {
671677
messages.first().participants
672678
}
679+
runOnUiThread {
680+
maybeDisableShortCodeReply()
681+
}
682+
}
683+
}
684+
685+
private fun isSpecialNumber(): Boolean {
686+
val addresses = participants.getAddresses()
687+
return addresses.any { isShortCodeWithLetters(it) }
688+
}
689+
690+
private fun maybeDisableShortCodeReply() {
691+
if (isSpecialNumber()) {
692+
thread_send_message_holder.beGone()
693+
reply_disabled_info_holder.beVisible()
694+
val textColor = getProperTextColor()
695+
reply_disabled_text.setTextColor(textColor)
696+
reply_disabled_info.apply {
697+
applyColorFilter(textColor)
698+
setOnClickListener {
699+
InvalidNumberDialog(
700+
activity = this@ThreadActivity,
701+
text = getString(R.string.invalid_short_code_desc)
702+
)
703+
}
704+
if (isOreoPlus()) {
705+
tooltipText = getString(R.string.more_info)
706+
}
707+
}
673708
}
674709
}
675710

@@ -1167,7 +1202,7 @@ class ThreadActivity : SimpleActivity() {
11671202

11681203
try {
11691204
refreshedSinceSent = false
1170-
sendMessage(text, addresses, subscriptionId, attachments)
1205+
sendMessageCompat(text, addresses, subscriptionId, attachments)
11711206
ensureBackgroundThread {
11721207
val messageIds = messages.map { it.id }
11731208
val message = getMessages(threadId, getImageResolutions = true, limit = 1).firstOrNull { it.id !in messageIds }
@@ -1347,7 +1382,7 @@ class ThreadActivity : SimpleActivity() {
13471382

13481383
private fun isMmsMessage(text: String): Boolean {
13491384
val isGroupMms = participants.size > 1 && config.sendGroupMessageMMS
1350-
val isLongMmsMessage = isLongMmsMessage(text) && config.sendLongMessageMMS
1385+
val isLongMmsMessage = isLongMmsMessage(text)
13511386
return getAttachmentSelections().isNotEmpty() || isGroupMms || isLongMmsMessage
13521387
}
13531388

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.simplemobiletools.smsmessenger.activities.SimpleActivity
2727
import com.simplemobiletools.smsmessenger.dialogs.RenameConversationDialog
2828
import com.simplemobiletools.smsmessenger.extensions.*
2929
import com.simplemobiletools.smsmessenger.helpers.refreshMessages
30+
import com.simplemobiletools.smsmessenger.messaging.isShortCodeWithLetters
3031
import com.simplemobiletools.smsmessenger.models.Conversation
3132
import kotlinx.android.synthetic.main.item_conversation.view.*
3233

@@ -57,14 +58,17 @@ class ConversationsAdapter(
5758

5859
override fun prepareActionMode(menu: Menu) {
5960
val selectedItems = getSelectedItems()
61+
val isSingleSelection = isOneItemSelected()
62+
val selectedConversation = selectedItems.firstOrNull()
63+
val isGroupConversation = selectedConversation?.isGroupConversation == true
6064

6165
menu.apply {
6266
findItem(R.id.cab_block_number).title = activity.addLockedLabelIfNeeded(R.string.block_number)
6367
findItem(R.id.cab_block_number).isVisible = isNougatPlus()
64-
findItem(R.id.cab_add_number_to_contact).isVisible = isOneItemSelected() && selectedItems.firstOrNull()?.isGroupConversation == false
65-
findItem(R.id.cab_dial_number).isVisible = isOneItemSelected() && selectedItems.firstOrNull()?.isGroupConversation == false
66-
findItem(R.id.cab_copy_number).isVisible = isOneItemSelected() && selectedItems.firstOrNull()?.isGroupConversation == false
67-
findItem(R.id.rename_conversation).isVisible = isOneItemSelected() && selectedItems.firstOrNull()?.isGroupConversation == true
68+
findItem(R.id.cab_add_number_to_contact).isVisible = isSingleSelection && !isGroupConversation
69+
findItem(R.id.cab_dial_number).isVisible = isSingleSelection && !isGroupConversation && !isShortCodeWithLetters(selectedConversation!!.phoneNumber)
70+
findItem(R.id.cab_copy_number).isVisible = isSingleSelection && !isGroupConversation
71+
findItem(R.id.rename_conversation).isVisible = isSingleSelection && isGroupConversation
6872
findItem(R.id.cab_mark_as_read).isVisible = selectedItems.any { !it.read }
6973
findItem(R.id.cab_mark_as_unread).isVisible = selectedItems.any { it.read }
7074
checkPinBtnVisibility(this)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.simplemobiletools.smsmessenger.dialogs
2+
3+
import com.simplemobiletools.commons.activities.BaseSimpleActivity
4+
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
5+
import com.simplemobiletools.commons.extensions.setupDialogStuff
6+
import com.simplemobiletools.smsmessenger.R
7+
import kotlinx.android.synthetic.main.dialog_invalid_number.view.*
8+
9+
class InvalidNumberDialog(val activity: BaseSimpleActivity, val text: String) {
10+
init {
11+
val view = activity.layoutInflater.inflate(R.layout.dialog_invalid_number, null).apply {
12+
dialog_invalid_number_desc.text = text
13+
}
14+
15+
activity.getAlertDialogBuilder()
16+
.setPositiveButton(R.string.ok) { _, _ -> { } }
17+
.apply {
18+
activity.setupDialogStuff(view, this)
19+
}
20+
}
21+
}

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

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.simplemobiletools.smsmessenger.extensions
22

33
import android.annotation.SuppressLint
4+
import android.app.Application
45
import android.content.ContentResolver
56
import android.content.ContentValues
67
import android.content.Context
@@ -18,7 +19,6 @@ import android.text.TextUtils
1819
import com.bumptech.glide.Glide
1920
import com.bumptech.glide.load.engine.DiskCacheStrategy
2021
import com.bumptech.glide.request.RequestOptions
21-
import com.klinker.android.send_message.Transaction.getAddressSeparator
2222
import com.simplemobiletools.commons.extensions.*
2323
import com.simplemobiletools.commons.helpers.*
2424
import com.simplemobiletools.commons.models.PhoneNumber
@@ -31,6 +31,9 @@ import com.simplemobiletools.smsmessenger.interfaces.AttachmentsDao
3131
import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao
3232
import com.simplemobiletools.smsmessenger.interfaces.MessageAttachmentsDao
3333
import com.simplemobiletools.smsmessenger.interfaces.MessagesDao
34+
import com.simplemobiletools.smsmessenger.messaging.MessagingUtils
35+
import com.simplemobiletools.smsmessenger.messaging.MessagingUtils.Companion.ADDRESS_SEPARATOR
36+
import com.simplemobiletools.smsmessenger.messaging.SmsSender
3437
import com.simplemobiletools.smsmessenger.models.*
3538
import me.leolin.shortcutbadger.ShortcutBadger
3639
import java.io.FileNotFoundException
@@ -49,6 +52,10 @@ val Context.messagesDB: MessagesDao get() = getMessagesDB().MessagesDao()
4952

5053
val Context.notificationHelper get() = NotificationHelper(this)
5154

55+
val Context.messagingUtils get() = MessagingUtils(this)
56+
57+
val Context.smsSender get() = SmsSender.getInstance(applicationContext as Application)
58+
5259
fun Context.getMessages(
5360
threadId: Long,
5461
getImageResolutions: Boolean,
@@ -103,7 +110,7 @@ fun Context.getMessages(
103110
val thread = cursor.getLongValue(Sms.THREAD_ID)
104111
val subscriptionId = cursor.getIntValue(Sms.SUBSCRIPTION_ID)
105112
val status = cursor.getIntValue(Sms.STATUS)
106-
val participants = senderNumber.split(getAddressSeparator()).map { number ->
113+
val participants = senderNumber.split(ADDRESS_SEPARATOR).map { number ->
107114
val phoneNumber = PhoneNumber(number, 0, "", number)
108115
val participantPhoto = getNameAndPhotoFromPhoneNumber(number)
109116
SimpleContact(0, 0, participantPhoto.name, photoUri, arrayListOf(phoneNumber), ArrayList(), ArrayList())
@@ -648,26 +655,6 @@ fun Context.markThreadMessagesUnread(threadId: Long) {
648655
}
649656
}
650657

651-
fun Context.updateMessageType(id: Long, type: Int) {
652-
val uri = Sms.CONTENT_URI
653-
val contentValues = ContentValues().apply {
654-
put(Sms.TYPE, type)
655-
}
656-
val selection = "${Sms._ID} = ?"
657-
val selectionArgs = arrayOf(id.toString())
658-
contentResolver.update(uri, contentValues, selection, selectionArgs)
659-
}
660-
661-
fun Context.updateMessageStatus(id: Long, status: Int) {
662-
val uri = Sms.CONTENT_URI
663-
val contentValues = ContentValues().apply {
664-
put(Sms.STATUS, status)
665-
}
666-
val selection = "${Sms._ID} = ?"
667-
val selectionArgs = arrayOf(id.toString())
668-
contentResolver.update(uri, contentValues, selection, selectionArgs)
669-
}
670-
671658
fun Context.updateUnreadCountBadge(conversations: List<Conversation>) {
672659
val unreadCount = conversations.count { !it.read }
673660
if (unreadCount == 0) {

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ package com.simplemobiletools.smsmessenger.helpers
22

33
import com.simplemobiletools.smsmessenger.models.Events
44
import org.greenrobot.eventbus.EventBus
5+
import org.joda.time.DateTime
6+
import org.joda.time.DateTimeZone
7+
import kotlin.math.abs
8+
import kotlin.random.Random
59

610
const val THREAD_ID = "thread_id"
711
const val THREAD_TITLE = "thread_title"
@@ -81,3 +85,10 @@ const val PICK_CONTACT_INTENT = 48
8185
fun refreshMessages() {
8286
EventBus.getDefault().post(Events.RefreshMessages())
8387
}
88+
89+
/** Not to be used with real messages persisted in the telephony db. This is for internal use only (e.g. scheduled messages, notification ids etc). */
90+
fun generateRandomId(length: Int = 9): Long {
91+
val millis = DateTime.now(DateTimeZone.UTC).millis
92+
val random = abs(Random(millis).nextLong())
93+
return random.toString().takeLast(length).toLong()
94+
}

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

Lines changed: 0 additions & 111 deletions
This file was deleted.

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.simplemobiletools.commons.helpers.isOreoPlus
2222
import com.simplemobiletools.smsmessenger.R
2323
import com.simplemobiletools.smsmessenger.activities.ThreadActivity
2424
import com.simplemobiletools.smsmessenger.extensions.config
25+
import com.simplemobiletools.smsmessenger.messaging.isShortCodeWithLetters
2526
import com.simplemobiletools.smsmessenger.receivers.DirectReplyReceiver
2627
import com.simplemobiletools.smsmessenger.receivers.MarkAsReadReceiver
2728

@@ -52,7 +53,7 @@ class NotificationHelper(private val context: Context) {
5253
PendingIntent.getBroadcast(context, notificationId, markAsReadIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE)
5354

5455
var replyAction: NotificationCompat.Action? = null
55-
if (isNougatPlus()) {
56+
if (isNougatPlus() && !isShortCodeWithLetters(address)) {
5657
val replyLabel = context.getString(R.string.reply)
5758
val remoteInput = RemoteInput.Builder(REPLY)
5859
.setLabel(replyLabel)

0 commit comments

Comments
 (0)