From 1fe2f10d53428a209f854f4b1dc2ac48d4df7dde Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 4 Apr 2020 21:53:58 +0200 Subject: [PATCH] show a notification at receiving an SMS --- .../smsmessenger/extensions/Context.kt | 3 +- .../smsmessenger/receivers/SmsReceiver.kt | 71 ++++++++++++++++++- app/src/main/res/values/strings.xml | 3 + 3 files changed, 75 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index 130eb9fa..0fcb3e88 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -160,7 +160,7 @@ fun Context.getNameFromPhoneNumber(number: String): Int? { return null } -fun Context.insertNewSMS(address: String, subject: String, body: String, date: Long) { +fun Context.insertNewSMS(address: String, subject: String, body: String, date: Long, threadID: Long) { val uri = Telephony.Sms.CONTENT_URI val contentValues = ContentValues().apply { put(Telephony.Sms.ADDRESS, address) @@ -168,6 +168,7 @@ fun Context.insertNewSMS(address: String, subject: String, body: String, date: L put(Telephony.Sms.BODY, body) put(Telephony.Sms.DATE, date) put(Telephony.Sms.READ, 0) + put(Telephony.Sms.THREAD_ID, threadID) put(Telephony.Sms.TYPE, Telephony.Sms.MESSAGE_TYPE_INBOX) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt index 43ee2c08..1f76e22d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt @@ -1,14 +1,31 @@ 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.media.AudioAttributes +import android.media.AudioManager +import android.media.RingtoneManager import android.provider.Telephony +import androidx.core.app.NotificationCompat +import com.simplemobiletools.commons.helpers.isMarshmallowPlus +import com.simplemobiletools.commons.helpers.isOreoPlus +import com.simplemobiletools.smsmessenger.R +import com.simplemobiletools.smsmessenger.activities.ThreadActivity import com.simplemobiletools.smsmessenger.extensions.insertNewSMS +import com.simplemobiletools.smsmessenger.helpers.THREAD_ID +import com.simplemobiletools.smsmessenger.helpers.THREAD_NAME +import com.simplemobiletools.smsmessenger.helpers.THREAD_NUMBER import com.simplemobiletools.smsmessenger.models.Events import org.greenrobot.eventbus.EventBus class SmsReceiver : BroadcastReceiver() { + @SuppressLint("NewApi") override fun onReceive(context: Context, intent: Intent) { val messages = Telephony.Sms.Intents.getMessagesFromIntent(intent) messages.forEach { @@ -16,9 +33,61 @@ class SmsReceiver : BroadcastReceiver() { val subject = it.pseudoSubject val body = it.messageBody val date = it.timestampMillis - context.insertNewSMS(address, subject, body, date) + val threadID = if (isMarshmallowPlus()) { + Telephony.Threads.getOrCreateThreadId(context, address) + } else { + 0 + } + + context.insertNewSMS(address, subject, body, date, threadID) + showNotification(context, address, body, threadID.toInt()) } EventBus.getDefault().post(Events.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) + notificationManager.createNotificationChannel(this) + } + } + + val intent = Intent(context, ThreadActivity::class.java).apply { + putExtra(THREAD_ID, threadID) + putExtra(THREAD_NAME, address) + putExtra(THREAD_NUMBER, address) + } + + val pendingIntent = PendingIntent.getActivity(context, threadID, intent, PendingIntent.FLAG_UPDATE_CURRENT) + + val builder = NotificationCompat.Builder(context, channelId) + .setContentTitle(address) + .setContentText(body) + .setSmallIcon(R.drawable.ic_launcher_foreground) + .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()) + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 81c7ed89..feb3f5ef 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,4 +3,7 @@ SMS Messenger Type a message… Message has not been sent. + + + Received SMS