mirror of
https://github.com/SimpleMobileTools/Simple-SMS-Messenger.git
synced 2025-02-09 00:08:40 +01:00
fix #21, allow replying directly from the top notification
This commit is contained in:
parent
33f7bafbca
commit
f4da76a010
@ -163,6 +163,15 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</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
|
<activity-alias
|
||||||
android:name=".activities.SplashActivity.Red"
|
android:name=".activities.SplashActivity.Red"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
|
@ -17,17 +17,17 @@ import android.provider.ContactsContract.PhoneLookup
|
|||||||
import android.provider.Telephony.*
|
import android.provider.Telephony.*
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
|
import androidx.core.app.RemoteInput
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.commons.helpers.*
|
import com.simplemobiletools.commons.helpers.*
|
||||||
import com.simplemobiletools.commons.models.SimpleContact
|
import com.simplemobiletools.commons.models.SimpleContact
|
||||||
import com.simplemobiletools.smsmessenger.R
|
import com.simplemobiletools.smsmessenger.R
|
||||||
import com.simplemobiletools.smsmessenger.activities.ThreadActivity
|
import com.simplemobiletools.smsmessenger.activities.ThreadActivity
|
||||||
import com.simplemobiletools.smsmessenger.databases.MessagesDatabase
|
import com.simplemobiletools.smsmessenger.databases.MessagesDatabase
|
||||||
import com.simplemobiletools.smsmessenger.helpers.Config
|
import com.simplemobiletools.smsmessenger.helpers.*
|
||||||
import com.simplemobiletools.smsmessenger.helpers.MARK_AS_READ
|
|
||||||
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
|
|
||||||
import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao
|
import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao
|
||||||
import com.simplemobiletools.smsmessenger.models.*
|
import com.simplemobiletools.smsmessenger.models.*
|
||||||
|
import com.simplemobiletools.smsmessenger.receivers.DirectReplyReceiver
|
||||||
import com.simplemobiletools.smsmessenger.receivers.MarkAsReadReceiver
|
import com.simplemobiletools.smsmessenger.receivers.MarkAsReadReceiver
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
@ -552,7 +552,6 @@ fun Context.getThreadId(addresses: Set<String>): Long {
|
|||||||
fun Context.showReceivedMessageNotification(address: String, body: String, threadID: Int, bitmap: Bitmap?) {
|
fun Context.showReceivedMessageNotification(address: String, body: String, threadID: Int, bitmap: Bitmap?) {
|
||||||
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||||
val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
|
val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
|
||||||
val channelId = "simple_sms_messenger"
|
|
||||||
if (isOreoPlus()) {
|
if (isOreoPlus()) {
|
||||||
val audioAttributes = AudioAttributes.Builder()
|
val audioAttributes = AudioAttributes.Builder()
|
||||||
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
|
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
|
||||||
@ -562,7 +561,7 @@ fun Context.showReceivedMessageNotification(address: String, body: String, threa
|
|||||||
|
|
||||||
val name = getString(R.string.channel_received_sms)
|
val name = getString(R.string.channel_received_sms)
|
||||||
val importance = NotificationManager.IMPORTANCE_HIGH
|
val importance = NotificationManager.IMPORTANCE_HIGH
|
||||||
NotificationChannel(channelId, name, importance).apply {
|
NotificationChannel(NOTIFICATION_CHANNEL, name, importance).apply {
|
||||||
setBypassDnd(false)
|
setBypassDnd(false)
|
||||||
enableLights(true)
|
enableLights(true)
|
||||||
setSound(soundUri, audioAttributes)
|
setSound(soundUri, audioAttributes)
|
||||||
@ -583,12 +582,32 @@ fun Context.showReceivedMessageNotification(address: String, body: String, threa
|
|||||||
action = MARK_AS_READ
|
action = MARK_AS_READ
|
||||||
putExtra(THREAD_ID, threadID)
|
putExtra(THREAD_ID, threadID)
|
||||||
}
|
}
|
||||||
|
|
||||||
val markAsReadPendingIntent = PendingIntent.getBroadcast(this, 0, markAsReadIntent, PendingIntent.FLAG_CANCEL_CURRENT)
|
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 largeIcon = bitmap ?: SimpleContactsHelper(this).getContactLetterIcon(sender)
|
||||||
val builder = NotificationCompat.Builder(this, channelId)
|
val builder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL)
|
||||||
.setContentTitle(sender)
|
.setContentTitle(sender)
|
||||||
.setContentText(body)
|
.setContentText(body)
|
||||||
|
.setColor(config.primaryColor)
|
||||||
.setSmallIcon(R.drawable.ic_messenger)
|
.setSmallIcon(R.drawable.ic_messenger)
|
||||||
.setLargeIcon(largeIcon)
|
.setLargeIcon(largeIcon)
|
||||||
.setStyle(NotificationCompat.BigTextStyle().setSummaryText(summaryText).bigText(body))
|
.setStyle(NotificationCompat.BigTextStyle().setSummaryText(summaryText).bigText(body))
|
||||||
@ -599,7 +618,11 @@ fun Context.showReceivedMessageNotification(address: String, body: String, threa
|
|||||||
.setAutoCancel(true)
|
.setAutoCancel(true)
|
||||||
.setSound(soundUri, AudioManager.STREAM_NOTIFICATION)
|
.setSound(soundUri, AudioManager.STREAM_NOTIFICATION)
|
||||||
.addAction(R.drawable.ic_check_vector, getString(R.string.mark_as_read), markAsReadPendingIntent)
|
.addAction(R.drawable.ic_check_vector, getString(R.string.mark_as_read), markAsReadPendingIntent)
|
||||||
.setChannelId(channelId)
|
.setChannelId(NOTIFICATION_CHANNEL)
|
||||||
|
|
||||||
|
if (replyAction != null) {
|
||||||
|
builder.addAction(replyAction)
|
||||||
|
}
|
||||||
|
|
||||||
notificationManager.notify(threadID, builder.build())
|
notificationManager.notify(threadID, builder.build())
|
||||||
}
|
}
|
||||||
|
@ -10,9 +10,11 @@ const val THREAD_NUMBER = "thread_number"
|
|||||||
const val THREAD_ATTACHMENT_URI = "thread_attachment_uri"
|
const val THREAD_ATTACHMENT_URI = "thread_attachment_uri"
|
||||||
const val THREAD_ATTACHMENT_URIS = "thread_attachment_uris"
|
const val THREAD_ATTACHMENT_URIS = "thread_attachment_uris"
|
||||||
const val USE_SIM_ID_PREFIX = "use_sim_id_"
|
const val USE_SIM_ID_PREFIX = "use_sim_id_"
|
||||||
|
const val NOTIFICATION_CHANNEL = "simple_sms_messenger"
|
||||||
|
|
||||||
private const val PATH = "com.simplemobiletools.smsmessenger.action."
|
private const val PATH = "com.simplemobiletools.smsmessenger.action."
|
||||||
const val MARK_AS_READ = PATH + "mark_as_read"
|
const val MARK_AS_READ = PATH + "mark_as_read"
|
||||||
|
const val REPLY = PATH + "reply"
|
||||||
|
|
||||||
// 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
|
||||||
|
@ -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())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user