Disable replying to non-numeric short codes

Also, break down large thread layout file
This commit is contained in:
Naveen 2023-01-06 18:30:19 +05:30
parent 7665415b87
commit f0c3333a72
7 changed files with 340 additions and 212 deletions

View file

@ -51,19 +51,19 @@ import com.simplemobiletools.smsmessenger.R
import com.simplemobiletools.smsmessenger.adapters.AttachmentsAdapter
import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter
import com.simplemobiletools.smsmessenger.adapters.ThreadAdapter
import com.simplemobiletools.smsmessenger.dialogs.InvalidNumberDialog
import com.simplemobiletools.smsmessenger.dialogs.RenameConversationDialog
import com.simplemobiletools.smsmessenger.dialogs.ScheduleMessageDialog
import com.simplemobiletools.smsmessenger.extensions.*
import com.simplemobiletools.smsmessenger.helpers.*
import com.simplemobiletools.smsmessenger.messaging.cancelScheduleSendPendingIntent
import com.simplemobiletools.smsmessenger.messaging.isLongMmsMessage
import com.simplemobiletools.smsmessenger.messaging.scheduleMessage
import com.simplemobiletools.smsmessenger.messaging.sendMessageCompat
import com.simplemobiletools.smsmessenger.messaging.*
import com.simplemobiletools.smsmessenger.models.*
import com.simplemobiletools.smsmessenger.models.ThreadItem.*
import kotlinx.android.synthetic.main.activity_thread.*
import kotlinx.android.synthetic.main.item_selected_contact.view.*
import kotlinx.android.synthetic.main.layout_attachment_picker.*
import kotlinx.android.synthetic.main.layout_invalid_short_code_info.*
import kotlinx.android.synthetic.main.layout_thread_send_message_holder.*
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
@ -180,6 +180,7 @@ class ThreadActivity : SimpleActivity() {
}
thread_send_message_holder.setBackgroundColor(bottomBarColor)
reply_disabled_info_holder.setBackgroundColor(bottomBarColor)
updateNavigationBarColor(bottomBarColor)
}
@ -218,7 +219,8 @@ class ThreadActivity : SimpleActivity() {
findItem(R.id.conversation_details).isVisible = participants.size > 1 && conversation != null
findItem(R.id.block_number).title = addLockedLabelIfNeeded(R.string.block_number)
findItem(R.id.block_number).isVisible = isNougatPlus()
findItem(R.id.dial_number).isVisible = participants.size == 1
findItem(R.id.dial_number).isVisible = participants.size == 1 && !isSpecialNumber()
findItem(R.id.manage_people).isVisible = !isSpecialNumber()
findItem(R.id.mark_as_unread).isVisible = threadItems.isNotEmpty()
// allow saving number in cases when we dont have it stored yet and it is a casual readable number
@ -674,6 +676,33 @@ class ThreadActivity : SimpleActivity() {
} else {
messages.first().participants
}
maybeDisableShortCodeReply()
}
}
private fun isSpecialNumber(): Boolean {
val addresses = participants.getAddresses()
return addresses.any { isShortCodeWithLetters(it) }
}
private fun maybeDisableShortCodeReply() {
if (isSpecialNumber()) {
thread_send_message_holder.beGone()
reply_disabled_info_holder.beVisible()
val textColor = getProperTextColor()
reply_disabled_text.setTextColor(textColor)
reply_disabled_info.apply {
applyColorFilter(textColor)
setOnClickListener {
InvalidNumberDialog(
activity = this@ThreadActivity,
text = getString(R.string.invalid_short_code_desc)
)
}
if (isOreoPlus()) {
tooltipText = getString(R.string.more_info)
}
}
}
}

View file

@ -0,0 +1,21 @@
package com.simplemobiletools.smsmessenger.dialogs
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.smsmessenger.R
import kotlinx.android.synthetic.main.dialog_invalid_number.view.*
class InvalidNumberDialog(val activity: BaseSimpleActivity, val text: String) {
init {
val view = activity.layoutInflater.inflate(R.layout.dialog_invalid_number, null).apply {
dialog_invalid_number_desc.text = text
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { _, _ -> { } }
.apply {
activity.setupDialogStuff(view, this)
}
}
}

View file

@ -59,3 +59,16 @@ fun Context.sendMessageCompat(text: String, addresses: List<String>, subId: Int?
}
}
/**
* Check if a given "address" is a short code.
* There's not much info available on these special numbers, even the wikipedia page (https://en.wikipedia.org/wiki/Short_code)
* contains outdated information regarding max number of digits. The exact parameters for short codes can vary by country and by carrier.
*
* This function returns true if the [address] length is less than or equal to [maxLength] and contains at least one letter.
*/
fun isShortCodeWithLetters(address: String, maxLength: Int = 10): Boolean {
if (address.length > maxLength) {
return false
}
return address.any { it.isLetter() }
}