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 | ||||
|  | ||||
| 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.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.provider.ContactsContract | ||||
| import android.provider.ContactsContract.CommonDataKinds | ||||
| @@ -11,12 +22,14 @@ import android.provider.ContactsContract.CommonDataKinds.StructuredName | ||||
| import android.provider.ContactsContract.PhoneLookup | ||||
| import android.provider.Telephony.* | ||||
| import android.text.TextUtils | ||||
| import android.widget.TextView | ||||
| import androidx.core.app.NotificationCompat | ||||
| import com.simplemobiletools.commons.extensions.* | ||||
| import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS | ||||
| import com.simplemobiletools.commons.helpers.ensureBackgroundThread | ||||
| import com.simplemobiletools.commons.helpers.isMarshmallowPlus | ||||
| import com.simplemobiletools.commons.helpers.isQPlus | ||||
| import com.simplemobiletools.commons.helpers.* | ||||
| import com.simplemobiletools.smsmessenger.R | ||||
| import com.simplemobiletools.smsmessenger.activities.ThreadActivity | ||||
| import com.simplemobiletools.smsmessenger.helpers.Config | ||||
| import com.simplemobiletools.smsmessenger.helpers.THREAD_ID | ||||
| import com.simplemobiletools.smsmessenger.models.Contact | ||||
| import com.simplemobiletools.smsmessenger.models.Message | ||||
| import com.simplemobiletools.smsmessenger.models.MessageAttachment | ||||
| @@ -409,3 +422,81 @@ fun Context.isNumberBlocked(number: String): Boolean { | ||||
|     val numberToCompare = number.trimToComparableNumber() | ||||
|     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 | ||||
|  | ||||
| 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.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.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.insertNewSMS | ||||
| import com.simplemobiletools.smsmessenger.helpers.THREAD_ID | ||||
| import com.simplemobiletools.smsmessenger.extensions.showReceivedMessageNotification | ||||
| import com.simplemobiletools.smsmessenger.helpers.refreshMessages | ||||
|  | ||||
| class SmsReceiver : BroadcastReceiver() { | ||||
| @@ -40,87 +21,9 @@ class SmsReceiver : BroadcastReceiver() { | ||||
|             val type = Telephony.Sms.MESSAGE_TYPE_INBOX | ||||
|             val read = 0 | ||||
|             context.insertNewSMS(address, subject, body, date, read, threadId, type) | ||||
|             showNotification(context, address, body, threadId.toInt()) | ||||
|             context.showReceivedMessageNotification(address, body, threadId.toInt()) | ||||
|         } | ||||
|  | ||||
|         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