mirror of
https://github.com/SimpleMobileTools/Simple-SMS-Messenger.git
synced 2025-06-05 21:49:22 +02:00
move the received message notification handling in Context extension
This commit is contained in:
@ -1,8 +1,19 @@
|
|||||||
package com.simplemobiletools.smsmessenger.extensions
|
package com.simplemobiletools.smsmessenger.extensions
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.Notification
|
||||||
|
import android.app.NotificationChannel
|
||||||
|
import android.app.NotificationManager
|
||||||
|
import android.app.PendingIntent
|
||||||
import android.content.ContentValues
|
import android.content.ContentValues
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.graphics.Canvas
|
||||||
|
import android.graphics.Paint
|
||||||
|
import android.media.AudioAttributes
|
||||||
|
import android.media.AudioManager
|
||||||
|
import android.media.RingtoneManager
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.provider.ContactsContract
|
import android.provider.ContactsContract
|
||||||
import android.provider.ContactsContract.CommonDataKinds
|
import android.provider.ContactsContract.CommonDataKinds
|
||||||
@ -11,12 +22,14 @@ import android.provider.ContactsContract.CommonDataKinds.StructuredName
|
|||||||
import android.provider.ContactsContract.PhoneLookup
|
import android.provider.ContactsContract.PhoneLookup
|
||||||
import android.provider.Telephony.*
|
import android.provider.Telephony.*
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.core.app.NotificationCompat
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
|
import com.simplemobiletools.commons.helpers.*
|
||||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
import com.simplemobiletools.smsmessenger.R
|
||||||
import com.simplemobiletools.commons.helpers.isMarshmallowPlus
|
import com.simplemobiletools.smsmessenger.activities.ThreadActivity
|
||||||
import com.simplemobiletools.commons.helpers.isQPlus
|
|
||||||
import com.simplemobiletools.smsmessenger.helpers.Config
|
import com.simplemobiletools.smsmessenger.helpers.Config
|
||||||
|
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
|
||||||
import com.simplemobiletools.smsmessenger.models.Contact
|
import com.simplemobiletools.smsmessenger.models.Contact
|
||||||
import com.simplemobiletools.smsmessenger.models.Message
|
import com.simplemobiletools.smsmessenger.models.Message
|
||||||
import com.simplemobiletools.smsmessenger.models.MessageAttachment
|
import com.simplemobiletools.smsmessenger.models.MessageAttachment
|
||||||
@ -409,3 +422,81 @@ fun Context.isNumberBlocked(number: String): Boolean {
|
|||||||
val numberToCompare = number.trimToComparableNumber()
|
val numberToCompare = number.trimToComparableNumber()
|
||||||
return blockedNumbers.map { it.numberToCompare }.contains(numberToCompare)
|
return blockedNumbers.map { it.numberToCompare }.contains(numberToCompare)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("NewApi")
|
||||||
|
fun Context.showReceivedMessageNotification(address: String, body: String, threadID: Int) {
|
||||||
|
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)
|
||||||
|
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
|
||||||
|
.setLegacyStreamType(AudioManager.STREAM_NOTIFICATION)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val name = getString(R.string.channel_received_sms)
|
||||||
|
val importance = NotificationManager.IMPORTANCE_HIGH
|
||||||
|
NotificationChannel(channelId, name, importance).apply {
|
||||||
|
setBypassDnd(false)
|
||||||
|
enableLights(true)
|
||||||
|
setSound(soundUri, audioAttributes)
|
||||||
|
enableVibration(true)
|
||||||
|
notificationManager.createNotificationChannel(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val intent = Intent(this, ThreadActivity::class.java).apply {
|
||||||
|
putExtra(THREAD_ID, threadID)
|
||||||
|
}
|
||||||
|
|
||||||
|
val pendingIntent = PendingIntent.getActivity(this, threadID, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||||
|
val summaryText = getString(R.string.new_message)
|
||||||
|
val sender = getNameFromPhoneNumber(address)
|
||||||
|
|
||||||
|
val firstLetter = sender.toCharArray().getOrNull(0)?.toString() ?: "S"
|
||||||
|
val builder = NotificationCompat.Builder(this, channelId)
|
||||||
|
.setContentTitle(sender)
|
||||||
|
.setContentText(body)
|
||||||
|
.setSmallIcon(R.drawable.ic_messenger)
|
||||||
|
.setLargeIcon(getNotificationLetterIcon(firstLetter))
|
||||||
|
.setStyle(NotificationCompat.BigTextStyle().setSummaryText(summaryText).bigText(body))
|
||||||
|
.setContentIntent(pendingIntent)
|
||||||
|
.setPriority(NotificationCompat.PRIORITY_MAX)
|
||||||
|
.setDefaults(Notification.DEFAULT_LIGHTS)
|
||||||
|
.setCategory(Notification.CATEGORY_MESSAGE)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setSound(soundUri, AudioManager.STREAM_NOTIFICATION)
|
||||||
|
.setChannelId(channelId)
|
||||||
|
|
||||||
|
notificationManager.notify(threadID, builder.build())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Context.getNotificationLetterIcon(letter: String): Bitmap {
|
||||||
|
val size = resources.getDimension(R.dimen.notification_large_icon_size).toInt()
|
||||||
|
val bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
|
||||||
|
val canvas = Canvas(bitmap)
|
||||||
|
val view = TextView(this)
|
||||||
|
view.layout(0, 0, size, size)
|
||||||
|
|
||||||
|
val circlePaint = Paint().apply {
|
||||||
|
color = getAdjustedPrimaryColor()
|
||||||
|
isAntiAlias = true
|
||||||
|
}
|
||||||
|
|
||||||
|
val wantedTextSize = size / 2f
|
||||||
|
val textPaint = Paint().apply {
|
||||||
|
color = circlePaint.color.getContrastColor()
|
||||||
|
isAntiAlias = true
|
||||||
|
textAlign = Paint.Align.CENTER
|
||||||
|
textSize = wantedTextSize
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas.drawCircle(size / 2f, size / 2f, size / 2f, circlePaint)
|
||||||
|
|
||||||
|
val xPos = canvas.width / 2f
|
||||||
|
val yPos = canvas.height / 2 - (textPaint.descent() + textPaint.ascent()) / 2
|
||||||
|
canvas.drawText(letter, xPos, yPos, textPaint)
|
||||||
|
view.draw(canvas)
|
||||||
|
return bitmap
|
||||||
|
}
|
||||||
|
@ -1,31 +1,12 @@
|
|||||||
package com.simplemobiletools.smsmessenger.receivers
|
package com.simplemobiletools.smsmessenger.receivers
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.app.Notification
|
|
||||||
import android.app.NotificationChannel
|
|
||||||
import android.app.NotificationManager
|
|
||||||
import android.app.PendingIntent
|
|
||||||
import android.content.BroadcastReceiver
|
import android.content.BroadcastReceiver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Canvas
|
|
||||||
import android.graphics.Paint
|
|
||||||
import android.media.AudioAttributes
|
|
||||||
import android.media.AudioManager
|
|
||||||
import android.media.RingtoneManager
|
|
||||||
import android.provider.Telephony
|
import android.provider.Telephony
|
||||||
import android.widget.TextView
|
|
||||||
import androidx.core.app.NotificationCompat
|
|
||||||
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
|
|
||||||
import com.simplemobiletools.commons.extensions.getContrastColor
|
|
||||||
import com.simplemobiletools.commons.helpers.isOreoPlus
|
|
||||||
import com.simplemobiletools.smsmessenger.R
|
|
||||||
import com.simplemobiletools.smsmessenger.activities.ThreadActivity
|
|
||||||
import com.simplemobiletools.smsmessenger.extensions.getNameFromPhoneNumber
|
|
||||||
import com.simplemobiletools.smsmessenger.extensions.getThreadId
|
import com.simplemobiletools.smsmessenger.extensions.getThreadId
|
||||||
import com.simplemobiletools.smsmessenger.extensions.insertNewSMS
|
import com.simplemobiletools.smsmessenger.extensions.insertNewSMS
|
||||||
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
|
import com.simplemobiletools.smsmessenger.extensions.showReceivedMessageNotification
|
||||||
import com.simplemobiletools.smsmessenger.helpers.refreshMessages
|
import com.simplemobiletools.smsmessenger.helpers.refreshMessages
|
||||||
|
|
||||||
class SmsReceiver : BroadcastReceiver() {
|
class SmsReceiver : BroadcastReceiver() {
|
||||||
@ -40,87 +21,9 @@ class SmsReceiver : BroadcastReceiver() {
|
|||||||
val type = Telephony.Sms.MESSAGE_TYPE_INBOX
|
val type = Telephony.Sms.MESSAGE_TYPE_INBOX
|
||||||
val read = 0
|
val read = 0
|
||||||
context.insertNewSMS(address, subject, body, date, read, threadId, type)
|
context.insertNewSMS(address, subject, body, date, read, threadId, type)
|
||||||
showNotification(context, address, body, threadId.toInt())
|
context.showReceivedMessageNotification(address, body, threadId.toInt())
|
||||||
}
|
}
|
||||||
|
|
||||||
refreshMessages()
|
refreshMessages()
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
|
||||||
private fun showNotification(context: Context, address: String, body: String, threadID: Int) {
|
|
||||||
val notificationManager = context.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)
|
|
||||||
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
|
|
||||||
.setLegacyStreamType(AudioManager.STREAM_NOTIFICATION)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val name = context.getString(R.string.channel_received_sms)
|
|
||||||
val importance = NotificationManager.IMPORTANCE_HIGH
|
|
||||||
NotificationChannel(channelId, name, importance).apply {
|
|
||||||
setBypassDnd(false)
|
|
||||||
enableLights(true)
|
|
||||||
setSound(soundUri, audioAttributes)
|
|
||||||
enableVibration(true)
|
|
||||||
notificationManager.createNotificationChannel(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val intent = Intent(context, ThreadActivity::class.java).apply {
|
|
||||||
putExtra(THREAD_ID, threadID)
|
|
||||||
}
|
|
||||||
|
|
||||||
val pendingIntent = PendingIntent.getActivity(context, threadID, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
|
||||||
val summaryText = context.getString(R.string.new_message)
|
|
||||||
val sender = context.getNameFromPhoneNumber(address)
|
|
||||||
|
|
||||||
val firstLetter = sender.toCharArray().getOrNull(0)?.toString() ?: "S"
|
|
||||||
val builder = NotificationCompat.Builder(context, channelId)
|
|
||||||
.setContentTitle(sender)
|
|
||||||
.setContentText(body)
|
|
||||||
.setSmallIcon(R.drawable.ic_messenger)
|
|
||||||
.setLargeIcon(getNotificationLetterIcon(context, firstLetter))
|
|
||||||
.setStyle(NotificationCompat.BigTextStyle().setSummaryText(summaryText).bigText(body))
|
|
||||||
.setContentIntent(pendingIntent)
|
|
||||||
.setPriority(NotificationCompat.PRIORITY_MAX)
|
|
||||||
.setDefaults(Notification.DEFAULT_LIGHTS)
|
|
||||||
.setCategory(Notification.CATEGORY_MESSAGE)
|
|
||||||
.setAutoCancel(true)
|
|
||||||
.setSound(soundUri, AudioManager.STREAM_NOTIFICATION)
|
|
||||||
.setChannelId(channelId)
|
|
||||||
|
|
||||||
notificationManager.notify(threadID, builder.build())
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getNotificationLetterIcon(context: Context, letter: String): Bitmap {
|
|
||||||
val size = context.resources.getDimension(R.dimen.notification_large_icon_size).toInt()
|
|
||||||
val bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
|
|
||||||
val canvas = Canvas(bitmap)
|
|
||||||
val view = TextView(context)
|
|
||||||
view.layout(0, 0, size, size)
|
|
||||||
|
|
||||||
val circlePaint = Paint().apply {
|
|
||||||
color = context.getAdjustedPrimaryColor()
|
|
||||||
isAntiAlias = true
|
|
||||||
}
|
|
||||||
|
|
||||||
val wantedTextSize = size / 2f
|
|
||||||
val textPaint = Paint().apply {
|
|
||||||
color = circlePaint.color.getContrastColor()
|
|
||||||
isAntiAlias = true
|
|
||||||
textAlign = Paint.Align.CENTER
|
|
||||||
textSize = wantedTextSize
|
|
||||||
}
|
|
||||||
|
|
||||||
canvas.drawCircle(size / 2f, size / 2f, size / 2f, circlePaint)
|
|
||||||
|
|
||||||
val xPos = canvas.width / 2f
|
|
||||||
val yPos = canvas.height / 2 - (textPaint.descent() + textPaint.ascent()) / 2
|
|
||||||
canvas.drawText(letter, xPos, yPos, textPaint)
|
|
||||||
view.draw(canvas)
|
|
||||||
return bitmap
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user