Merge pull request #4 from SimpleMobileTools/master

upd
This commit is contained in:
solokot
2020-06-21 16:02:01 +03:00
committed by GitHub
30 changed files with 370 additions and 118 deletions

View File

@@ -1,6 +1,15 @@
Changelog
==========
Version 5.3.0 *(2020-06-18)*
----------------------------
* Allow changing the text size
* Allow replying to incoming messages directly from the notification on Android 7+
* Make emails and urls clickable at messages
* Allow marking conversations as Unread
* Many other UX, stability and translation improvements
Version 5.2.0 *(2020-05-30)*
----------------------------

View File

@@ -17,8 +17,8 @@ android {
applicationId "com.simplemobiletools.smsmessenger"
minSdkVersion 22
targetSdkVersion 29
versionCode 9
versionName "5.2.0"
versionCode 10
versionName "5.3.0"
setProperty("archivesBaseName", "sms-messenger")
}
@@ -57,7 +57,7 @@ android {
}
dependencies {
implementation 'com.simplemobiletools:commons:5.28.25'
implementation 'com.simplemobiletools:commons:5.29.7'
implementation 'org.greenrobot:eventbus:3.2.0'
implementation 'com.klinkerapps:android-smsmms:5.2.6'
implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a'

View File

@@ -163,6 +163,15 @@
</intent-filter>
</receiver>
<receiver
android:name=".receivers.DirectReplyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.simplemobiletools.smsmessenger.action.reply" />
</intent-filter>
</receiver>
<activity-alias
android:name=".activities.SplashActivity.Red"
android:enabled="false"

View File

@@ -35,6 +35,7 @@ class MainActivity : SimpleActivity() {
private val MAKE_DEFAULT_APP_REQUEST = 1
private var storedTextColor = 0
private var storedFontSize = 0
private var bus: EventBus? = null
@SuppressLint("InlinedApi")
@@ -77,6 +78,10 @@ class MainActivity : SimpleActivity() {
(conversations_list.adapter as? ConversationsAdapter)?.updateTextColor(config.textColor)
}
if (storedFontSize != config.fontSize) {
(conversations_list.adapter as? ConversationsAdapter)?.updateFontSize()
}
updateTextColors(main_coordinator)
no_conversations_placeholder_2.setTextColor(getAdjustedPrimaryColor())
no_conversations_placeholder_2.underlineText()
@@ -120,6 +125,7 @@ class MainActivity : SimpleActivity() {
private fun storeStateVariables() {
storedTextColor = config.textColor
storedFontSize = config.fontSize
}
// while SEND_SMS and READ_SMS permissions are mandatory, READ_CONTACTS is optional. If we don't have it, we just won't be able to show the contact name in some cases

View File

@@ -7,8 +7,10 @@ import android.os.Bundle
import android.view.Menu
import com.simplemobiletools.commons.activities.ManageBlockedNumbersActivity
import com.simplemobiletools.commons.dialogs.ChangeDateTimeFormatDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.isNougatPlus
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.smsmessenger.R
import com.simplemobiletools.smsmessenger.extensions.config
import com.simplemobiletools.smsmessenger.helpers.refreshMessages
@@ -31,6 +33,7 @@ class SettingsActivity : SimpleActivity() {
setupUseEnglish()
setupManageBlockedNumbers()
setupChangeDateTimeFormat()
setupFontSize()
updateTextColors(settings_scrollview)
if (blockedNumbersAtPause != -1 && blockedNumbersAtPause != getBlockedNumbers().hashCode()) {
@@ -87,4 +90,20 @@ class SettingsActivity : SimpleActivity() {
}
}
}
private fun setupFontSize() {
settings_font_size.text = getFontSizeText()
settings_font_size_holder.setOnClickListener {
val items = arrayListOf(
RadioItem(FONT_SIZE_SMALL, getString(R.string.small)),
RadioItem(FONT_SIZE_MEDIUM, getString(R.string.medium)),
RadioItem(FONT_SIZE_LARGE, getString(R.string.large)),
RadioItem(FONT_SIZE_EXTRA_LARGE, getString(R.string.extra_large)))
RadioGroupDialog(this@SettingsActivity, items, config.fontSize) {
config.fontSize = it as Int
settings_font_size.text = getFontSizeText()
}
}
}
}

View File

@@ -199,6 +199,7 @@ class ThreadActivity : SimpleActivity() {
R.id.block_number -> blockNumber()
R.id.delete -> askConfirmDelete()
R.id.manage_people -> managePeople()
R.id.mark_as_unread -> markAsUnread()
else -> return super.onOptionsItemSelected(item)
}
return true
@@ -392,8 +393,24 @@ class ThreadActivity : SimpleActivity() {
showSelectedContacts()
}
private fun markAsUnread() {
ensureBackgroundThread {
conversationsDB.markUnread(threadId.toLong())
markThreadMessagesUnread(threadId)
runOnUiThread {
finish()
bus?.post(Events.RefreshMessages())
}
}
}
@SuppressLint("MissingPermission")
private fun getThreadItems(): ArrayList<ThreadItem> {
val items = ArrayList<ThreadItem>()
if (isFinishing) {
return items
}
messages.sortBy { it.date }
val subscriptionIdToSimId = HashMap<Int, String>()
@@ -402,7 +419,6 @@ class ThreadActivity : SimpleActivity() {
subscriptionIdToSimId[subscriptionInfo.subscriptionId] = "${index + 1}"
}
val items = ArrayList<ThreadItem>()
var prevDateTime = 0
var hadUnreadItems = false
messages.forEach {
@@ -597,6 +613,7 @@ class ThreadActivity : SimpleActivity() {
@Subscribe(threadMode = ThreadMode.ASYNC)
fun refreshMessages(event: Events.RefreshMessages) {
notificationManager.cancel(threadId)
messages = getMessages(threadId)
setupAdapter()
}

View File

@@ -1,5 +1,6 @@
package com.simplemobiletools.smsmessenger.adapters
import android.util.TypedValue
import android.view.Menu
import android.view.View
import android.view.ViewGroup
@@ -7,6 +8,7 @@ import android.widget.ImageView
import android.widget.TextView
import com.bumptech.glide.Glide
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.getTextSize
import com.simplemobiletools.commons.helpers.SimpleContactsHelper
import com.simplemobiletools.commons.models.SimpleContact
import com.simplemobiletools.commons.views.FastScroller
@@ -17,6 +19,7 @@ import java.util.*
class ContactsAdapter(activity: SimpleActivity, var contacts: ArrayList<SimpleContact>, recyclerView: MyRecyclerView, fastScroller: FastScroller?,
itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
private var fontSize = activity.getTextSize()
override fun getActionMenuId() = 0
@@ -57,11 +60,17 @@ class ContactsAdapter(activity: SimpleActivity, var contacts: ArrayList<SimpleCo
private fun setupView(view: View, contact: SimpleContact) {
view.apply {
findViewById<TextView>(R.id.item_contact_name).text = contact.name
findViewById<TextView>(R.id.item_contact_name).setTextColor(textColor)
findViewById<TextView>(R.id.item_contact_name).apply {
text = contact.name
setTextColor(textColor)
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 1.2f)
}
findViewById<TextView>(R.id.item_contact_number).text = contact.phoneNumber
findViewById<TextView>(R.id.item_contact_number).setTextColor(textColor)
findViewById<TextView>(R.id.item_contact_number).apply {
text = contact.phoneNumber
setTextColor(textColor)
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
}
SimpleContactsHelper(context).loadContactImage(contact.photoUri, findViewById(R.id.item_contact_image), contact.name)
}

View File

@@ -3,6 +3,7 @@ package com.simplemobiletools.smsmessenger.adapters
import android.content.Intent
import android.graphics.Typeface
import android.text.TextUtils
import android.util.TypedValue
import android.view.Menu
import android.view.View
import android.view.ViewGroup
@@ -10,9 +11,7 @@ import android.widget.TextView
import com.bumptech.glide.Glide
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.extensions.addBlockedNumber
import com.simplemobiletools.commons.extensions.formatDateOrTime
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.KEY_PHONE
import com.simplemobiletools.commons.helpers.SimpleContactsHelper
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
@@ -28,6 +27,7 @@ import kotlinx.android.synthetic.main.item_conversation.view.*
class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayList<Conversation>, recyclerView: MyRecyclerView, fastScroller: FastScroller,
itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
private var fontSize = activity.getTextSize()
init {
setupDragListener(true)
@@ -133,6 +133,7 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis
val positions = getSelectedItemPositions()
conversationsToRemove.forEach {
activity.deleteConversation(it.thread_id)
activity.notificationManager.cancel(it.thread_id)
}
conversations.removeAll(conversationsToRemove)
@@ -173,6 +174,11 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis
}
}
fun updateFontSize() {
fontSize = activity.getTextSize()
notifyDataSetChanged()
}
fun updateConversations(newConversations: ArrayList<Conversation>) {
val oldHashCode = conversations.hashCode()
val newHashCode = newConversations.hashCode()
@@ -186,9 +192,20 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis
view.apply {
conversation_frame.isSelected = selectedKeys.contains(conversation.thread_id)
conversation_address.text = conversation.title
conversation_body_short.text = conversation.snippet
conversation_date.text = conversation.date.formatDateOrTime(context, true)
conversation_address.apply {
text = conversation.title
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 1.2f)
}
conversation_body_short.apply {
text = conversation.snippet
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.9f)
}
conversation_date.apply {
text = conversation.date.formatDateOrTime(context, true)
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.8f)
}
if (conversation.read) {
conversation_address.setTypeface(null, Typeface.NORMAL)

View File

@@ -5,6 +5,7 @@ import android.content.Intent
import android.graphics.drawable.Drawable
import android.net.Uri
import android.telephony.SubscriptionManager
import android.util.TypedValue
import android.view.Menu
import android.view.View
import android.view.ViewGroup
@@ -42,8 +43,8 @@ import kotlinx.android.synthetic.main.item_thread_date_time.view.*
class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList<ThreadItem>, recyclerView: MyRecyclerView, fastScroller: FastScroller,
itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
private val roundedCornersRadius = resources.getDimension(R.dimen.normal_margin).toInt()
private var fontSize = activity.getTextSize()
@SuppressLint("MissingPermission")
private val hasMultipleSIMCards = SubscriptionManager.from(activity).activeSubscriptionInfoList?.size ?: 0 > 1
@@ -181,18 +182,25 @@ class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList<ThreadItem
private fun setupView(view: View, message: Message) {
view.apply {
thread_message_holder.isSelected = selectedKeys.contains(message.id)
thread_message_body.text = message.body
thread_message_body.apply {
text = message.body
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
}
thread_message_body.beVisibleIf(message.body.isNotEmpty())
if (message.isReceivedMessage()) {
thread_message_sender_photo.beVisible()
thread_message_body.setTextColor(textColor)
thread_message_body.setLinkTextColor(context.getAdjustedPrimaryColor())
SimpleContactsHelper(context).loadContactImage(message.senderPhotoUri, thread_message_sender_photo, message.senderName)
} else {
thread_message_sender_photo?.beGone()
val background = context.getAdjustedPrimaryColor()
thread_message_body.background.applyColorFilter(background.adjustAlpha(0.8f))
thread_message_body.setTextColor(background.getContrastColor())
val contrastColor = background.getContrastColor()
thread_message_body.setTextColor(contrastColor)
thread_message_body.setLinkTextColor(contrastColor)
}
thread_mesage_attachments_holder.removeAllViews()
@@ -286,7 +294,10 @@ class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList<ThreadItem
private fun setupDateTime(view: View, dateTime: ThreadDateTime) {
view.apply {
thread_date_time.text = dateTime.date.formatDateOrTime(context, false)
thread_date_time.apply {
text = dateTime.date.formatDateOrTime(context, false)
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
}
thread_date_time.setTextColor(textColor)
thread_sim_icon.beVisibleIf(hasMultipleSIMCards)

View File

@@ -17,6 +17,7 @@ import android.provider.ContactsContract.PhoneLookup
import android.provider.Telephony.*
import android.text.TextUtils
import androidx.core.app.NotificationCompat
import androidx.core.app.RemoteInput
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.SimpleContact
@@ -26,6 +27,7 @@ import com.simplemobiletools.smsmessenger.databases.MessagesDatabase
import com.simplemobiletools.smsmessenger.helpers.*
import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao
import com.simplemobiletools.smsmessenger.models.*
import com.simplemobiletools.smsmessenger.receivers.DirectReplyReceiver
import com.simplemobiletools.smsmessenger.receivers.MarkAsReadReceiver
import java.util.*
import kotlin.collections.ArrayList
@@ -227,7 +229,6 @@ fun Context.getConversations(threadId: Long? = null): ArrayList<Conversation> {
val isGroupConversation = phoneNumbers.size > 1
val read = cursor.getIntValue(Threads.READ) == 1
val conversation = Conversation(null, id, snippet, date.toInt(), read, title, photoUri, isGroupConversation, phoneNumbers.first())
conversations.add(conversation)
}
@@ -497,29 +498,60 @@ fun Context.markMessageRead(id: Int, isMMS: Boolean) {
contentResolver.update(uri, contentValues, selection, selectionArgs)
}
fun Context.markThreadMessagesRead(threadId: Int) {
arrayOf(Sms.CONTENT_URI, Mms.CONTENT_URI).forEach { uri ->
val contentValues = ContentValues().apply {
put(Sms.READ, 1)
put(Sms.SEEN, 1)
}
val selection = "${Sms.THREAD_ID} = ?"
val selectionArgs = arrayOf(threadId.toString())
contentResolver.update(uri, contentValues, selection, selectionArgs)
}
}
fun Context.markThreadMessagesUnread(threadId: Int) {
arrayOf(Sms.CONTENT_URI, Mms.CONTENT_URI).forEach { uri ->
val contentValues = ContentValues().apply {
put(Sms.READ, 0)
put(Sms.SEEN, 0)
}
val selection = "${Sms.THREAD_ID} = ?"
val selectionArgs = arrayOf(threadId.toString())
contentResolver.update(uri, contentValues, selection, selectionArgs)
}
}
@SuppressLint("NewApi")
fun Context.getThreadId(address: String): Long {
return if (isMarshmallowPlus()) {
Threads.getOrCreateThreadId(this, address)
try {
Threads.getOrCreateThreadId(this, address)
} catch (e: Exception) {
0L
}
} else {
0
0L
}
}
@SuppressLint("NewApi")
fun Context.getThreadId(addresses: Set<String>): Long {
return if (isMarshmallowPlus()) {
Threads.getOrCreateThreadId(this, addresses)
try {
Threads.getOrCreateThreadId(this, addresses)
} catch (e: Exception) {
0L
}
} else {
0
0L
}
}
@SuppressLint("NewApi")
fun Context.showReceivedMessageNotification(address: String, body: String, threadID: Int, bitmap: Bitmap?, messageId: Int, isMMS: Boolean) {
fun Context.showReceivedMessageNotification(address: String, body: String, threadID: Int, bitmap: Bitmap?) {
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val channelId = "simple_sms_messenger"
if (isOreoPlus()) {
val audioAttributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
@@ -529,7 +561,7 @@ fun Context.showReceivedMessageNotification(address: String, body: String, threa
val name = getString(R.string.channel_received_sms)
val importance = NotificationManager.IMPORTANCE_HIGH
NotificationChannel(channelId, name, importance).apply {
NotificationChannel(NOTIFICATION_CHANNEL, name, importance).apply {
setBypassDnd(false)
enableLights(true)
setSound(soundUri, audioAttributes)
@@ -548,16 +580,34 @@ fun Context.showReceivedMessageNotification(address: String, body: String, threa
val markAsReadIntent = Intent(this, MarkAsReadReceiver::class.java).apply {
action = MARK_AS_READ
putExtra(MESSAGE_ID, messageId)
putExtra(MESSAGE_IS_MMS, isMMS)
putExtra(THREAD_ID, threadID)
}
val markAsReadPendingIntent = PendingIntent.getBroadcast(this, 0, markAsReadIntent, PendingIntent.FLAG_CANCEL_CURRENT)
var replyAction: NotificationCompat.Action? = null
if (isNougatPlus()) {
val replyLabel = getString(R.string.reply)
val remoteInput = RemoteInput.Builder(REPLY)
.setLabel(replyLabel)
.build()
val replyIntent = Intent(this, DirectReplyReceiver::class.java).apply {
putExtra(THREAD_ID, threadID)
putExtra(THREAD_NUMBER, address)
}
val replyPendingIntent = PendingIntent.getBroadcast(applicationContext, threadID, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT)
replyAction = NotificationCompat.Action.Builder(R.drawable.ic_send_vector, replyLabel, replyPendingIntent)
.addRemoteInput(remoteInput)
.build()
}
val largeIcon = bitmap ?: SimpleContactsHelper(this).getContactLetterIcon(sender)
val builder = NotificationCompat.Builder(this, channelId)
val builder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL)
.setContentTitle(sender)
.setContentText(body)
.setColor(config.primaryColor)
.setSmallIcon(R.drawable.ic_messenger)
.setLargeIcon(largeIcon)
.setStyle(NotificationCompat.BigTextStyle().setSummaryText(summaryText).bigText(body))
@@ -568,7 +618,11 @@ fun Context.showReceivedMessageNotification(address: String, body: String, threa
.setAutoCancel(true)
.setSound(soundUri, AudioManager.STREAM_NOTIFICATION)
.addAction(R.drawable.ic_check_vector, getString(R.string.mark_as_read), markAsReadPendingIntent)
.setChannelId(channelId)
.setChannelId(NOTIFICATION_CHANNEL)
notificationManager.notify(messageId, builder.build())
if (replyAction != null) {
builder.addAction(replyAction)
}
notificationManager.notify(threadID, builder.build())
}

View File

@@ -10,11 +10,11 @@ const val THREAD_NUMBER = "thread_number"
const val THREAD_ATTACHMENT_URI = "thread_attachment_uri"
const val THREAD_ATTACHMENT_URIS = "thread_attachment_uris"
const val USE_SIM_ID_PREFIX = "use_sim_id_"
const val NOTIFICATION_CHANNEL = "simple_sms_messenger"
private const val PATH = "com.simplemobiletools.smsmessenger.action."
const val MARK_AS_READ = PATH + "mark_as_read"
const val MESSAGE_ID = "message_id"
const val MESSAGE_IS_MMS = "message_is_mms"
const val REPLY = PATH + "reply"
// view types for the thread list view
const val THREAD_DATE_TIME = 1

View File

@@ -17,6 +17,9 @@ interface ConversationsDao {
@Query("UPDATE conversations SET read = 1 WHERE thread_id = :threadId")
fun markRead(threadId: Long)
@Query("UPDATE conversations SET read = 0 WHERE thread_id = :threadId")
fun markUnread(threadId: Long)
@Query("DELETE FROM conversations WHERE id = :id")
fun delete(id: Long)

View File

@@ -0,0 +1,51 @@
package com.simplemobiletools.smsmessenger.receivers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import androidx.core.app.NotificationCompat
import androidx.core.app.RemoteInput
import com.klinker.android.send_message.Settings
import com.klinker.android.send_message.Transaction
import com.simplemobiletools.commons.extensions.notificationManager
import com.simplemobiletools.commons.extensions.showErrorToast
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.smsmessenger.R
import com.simplemobiletools.smsmessenger.extensions.conversationsDB
import com.simplemobiletools.smsmessenger.extensions.markThreadMessagesRead
import com.simplemobiletools.smsmessenger.helpers.NOTIFICATION_CHANNEL
import com.simplemobiletools.smsmessenger.helpers.REPLY
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
import com.simplemobiletools.smsmessenger.helpers.THREAD_NUMBER
class DirectReplyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val address = intent.getStringExtra(THREAD_NUMBER)
val threadId = intent.getIntExtra(THREAD_ID, 0)
val msg = RemoteInput.getResultsFromIntent(intent).getCharSequence(REPLY).toString()
val settings = Settings()
settings.useSystemSending = true
val transaction = Transaction(context, settings)
val message = com.klinker.android.send_message.Message(msg, address)
try {
transaction.sendNewMessage(message, threadId.toLong())
} catch (e: Exception) {
context.showErrorToast(e)
}
val repliedNotification = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL)
.setSmallIcon(R.drawable.ic_messenger)
.setContentText(msg)
.build()
context.notificationManager.notify(threadId, repliedNotification)
ensureBackgroundThread {
context.markThreadMessagesRead(threadId)
context.conversationsDB.markRead(threadId.toLong())
}
}
}

View File

@@ -6,23 +6,18 @@ import android.content.Intent
import com.simplemobiletools.commons.extensions.notificationManager
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.smsmessenger.extensions.conversationsDB
import com.simplemobiletools.smsmessenger.extensions.markMessageRead
import com.simplemobiletools.smsmessenger.extensions.markThreadMessagesRead
import com.simplemobiletools.smsmessenger.helpers.MARK_AS_READ
import com.simplemobiletools.smsmessenger.helpers.MESSAGE_ID
import com.simplemobiletools.smsmessenger.helpers.MESSAGE_IS_MMS
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
class MarkAsReadReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
MARK_AS_READ -> {
val messageId = intent.getIntExtra(MESSAGE_ID, 0)
context.notificationManager.cancel(messageId)
val threadId = intent.getIntExtra(THREAD_ID, 0)
context.notificationManager.cancel(threadId)
ensureBackgroundThread {
val isMMS = intent.getBooleanExtra(MESSAGE_IS_MMS, false)
context.markMessageRead(messageId, isMMS)
val threadId = intent.getIntExtra(THREAD_ID, 0)
context.markThreadMessagesRead(threadId)
context.conversationsDB.markRead(threadId.toLong())
}
}

View File

@@ -33,7 +33,7 @@ class MmsReceiver : com.klinker.android.send_message.MmsReceivedReceiver() {
null
}
context.showReceivedMessageNotification(address, mms.body, mms.thread, glideBitmap, mms.id, true)
context.showReceivedMessageNotification(address, mms.body, mms.thread, glideBitmap)
val conversation = context.getConversations(mms.thread.toLong()).firstOrNull() ?: return@ensureBackgroundThread
context.conversationsDB.insertOrUpdate(conversation)
}

View File

@@ -30,8 +30,8 @@ class SmsReceiver : BroadcastReceiver() {
}
if (!context.isNumberBlocked(address)) {
val messageId = context.insertNewSMS(address, subject, body, date, read, threadId, type, subscriptionId)
context.showReceivedMessageNotification(address, body, threadId.toInt(), null, messageId, false)
context.insertNewSMS(address, subject, body, date, read, threadId, type, subscriptionId)
context.showReceivedMessageNotification(address, body, threadId.toInt(), null)
refreshMessages()
ensureBackgroundThread {

View File

@@ -117,5 +117,37 @@
app:switchPadding="@dimen/medium_margin" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_font_size_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_font_size_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/settings_font_size"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/font_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_font_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginEnd="@dimen/medium_margin"
android:background="@null"
android:clickable="false" />
</RelativeLayout>
</LinearLayout>
</ScrollView>

View File

@@ -53,6 +53,7 @@
android:layout_height="wrap_content"
android:layout_below="@+id/thread_mesage_attachments_holder"
android:layout_toEndOf="@+id/thread_message_sender_photo"
android:autoLink="email|web"
android:background="@drawable/item_received_background"
android:padding="@dimen/normal_margin"
android:textSize="@dimen/normal_text_size"

View File

@@ -43,6 +43,7 @@
android:layout_height="wrap_content"
android:layout_below="@+id/thread_mesage_attachments_holder"
android:layout_alignParentEnd="true"
android:autoLink="email|web"
android:background="@drawable/item_sent_background"
android:padding="@dimen/normal_margin"
android:textSize="@dimen/normal_text_size"

View File

@@ -16,4 +16,8 @@
android:icon="@drawable/ic_block_vector"
android:title="@string/block_number"
app:showAsAction="never" />
<item
android:id="@+id/mark_as_unread"
android:title="@string/mark_as_unread"
app:showAsAction="never" />
</menu>

View File

@@ -7,6 +7,7 @@
<string name="attachment">Anhang</string>
<string name="no_conversations_found">keine gespeicherten Chats gefunden</string>
<string name="start_conversation">einen neuen Chat beginnen</string>
<string name="reply">Reply</string>
<!-- New conversation -->
<string name="new_conversation">neuer Chat</string>

View File

@@ -7,6 +7,7 @@
<string name="attachment">Συνημμένο</string>
<string name="no_conversations_found">Δεν βρέθηκαν αποθηκευμένες συνομιλίες</string>
<string name="start_conversation">Έναρξη συνομιλίας</string>
<string name="reply">Reply</string>
<!-- New conversation -->
<string name="new_conversation">Νέα συνομιλία</string>

View File

@@ -7,6 +7,7 @@
<string name="attachment">Archivo adjunto</string>
<string name="no_conversations_found">No se han encontrado conversaciones</string>
<string name="start_conversation">Inicia una conversación</string>
<string name="reply">Reply</string>
<!-- New conversation -->
<string name="new_conversation">Nueva conversación</string>

View File

@@ -7,6 +7,7 @@
<string name="attachment">Priedas</string>
<string name="no_conversations_found">Nebuvo rasta išsaugotų pokalbių</string>
<string name="start_conversation">Pradėtipokalbį</string>
<string name="reply">Reply</string>
<!-- New conversation -->
<string name="new_conversation">Naujas pokalbis</string>

View File

@@ -7,6 +7,7 @@
<string name="attachment">Bijlage</string>
<string name="no_conversations_found">Geen opgeslagen berichten gevonden</string>
<string name="start_conversation">Een gesprek starten</string>
<string name="reply">Beantwoorden</string>
<!-- New conversation -->
<string name="new_conversation">Nieuw gesprek</string>

View File

@@ -7,8 +7,9 @@
<string name="attachment">Anexo</string>
<string name="no_conversations_found">Não foram encontradas conversas</string>
<string name="start_conversation">Iniciar uma conversa</string>
<string name="reply">Reply</string>
<!-- New message -->
<!-- New conversation -->
<string name="new_conversation">Nova conversa</string>
<string name="add_contact_or_number">Adicionar contacto ou número…</string>
<string name="suggestions">Sugestões</string>

View File

@@ -7,6 +7,7 @@
<string name="attachment">Вложение</string>
<string name="no_conversations_found">Нет сохранённых переписок</string>
<string name="start_conversation">Начать переписку</string>
<string name="reply">Reply</string>
<!-- New conversation -->
<string name="new_conversation">Новая переписка</string>

View File

@@ -7,6 +7,7 @@
<string name="attachment">Príloha</string>
<string name="no_conversations_found">Nenašli sa žiadne uložené konverzácie</string>
<string name="start_conversation">Začať konverzáciu</string>
<string name="reply">Odpovedať</string>
<!-- New conversation -->
<string name="new_conversation">Nová konverzácia</string>

View File

@@ -7,6 +7,7 @@
<string name="attachment">Attachment</string>
<string name="no_conversations_found">No stored conversations have been found</string>
<string name="start_conversation">Start a conversation</string>
<string name="reply">Reply</string>
<!-- New conversation -->
<string name="new_conversation">New conversation</string>

View File

@@ -0,0 +1,5 @@
* Allow changing the text size
* Allow replying to incoming messages directly from the notification on Android 7+
* Make emails and urls clickable at messages
* Allow marking conversations as Unread
* Many other UX, stability and translation improvements