111 lines
5.1 KiB
Kotlin
111 lines
5.1 KiB
Kotlin
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.Context
|
|
import android.content.Intent
|
|
import android.media.AudioAttributes
|
|
import android.media.AudioManager
|
|
import android.media.RingtoneManager
|
|
import android.net.Uri
|
|
import android.os.Handler
|
|
import android.os.Looper
|
|
import android.provider.Telephony
|
|
import androidx.core.app.NotificationCompat
|
|
import com.klinker.android.send_message.SentReceiver
|
|
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
|
|
import com.simplemobiletools.commons.extensions.getMyContactsCursor
|
|
import com.simplemobiletools.commons.helpers.SimpleContactsHelper
|
|
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
|
import com.simplemobiletools.commons.helpers.isOreoPlus
|
|
import com.simplemobiletools.smsmessenger.R
|
|
import com.simplemobiletools.smsmessenger.activities.ThreadActivity
|
|
import com.simplemobiletools.smsmessenger.extensions.*
|
|
import com.simplemobiletools.smsmessenger.helpers.NOTIFICATION_CHANNEL
|
|
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
|
|
import com.simplemobiletools.smsmessenger.helpers.refreshMessages
|
|
|
|
class SmsStatusSentReceiver : SentReceiver() {
|
|
|
|
override fun onMessageStatusUpdated(context: Context, intent: Intent, receiverResultCode: Int) {
|
|
if (intent.extras?.containsKey("message_uri") == true) {
|
|
val uri = Uri.parse(intent.getStringExtra("message_uri"))
|
|
val messageId = uri?.lastPathSegment?.toLong() ?: 0L
|
|
ensureBackgroundThread {
|
|
val type = if (intent.extras!!.containsKey("errorCode")) {
|
|
showSendingFailedNotification(context, messageId)
|
|
Telephony.Sms.MESSAGE_TYPE_FAILED
|
|
} else {
|
|
Telephony.Sms.MESSAGE_TYPE_OUTBOX
|
|
}
|
|
|
|
context.updateMessageType(messageId, type)
|
|
context.messagesDB.updateType(messageId, type)
|
|
refreshMessages()
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun showSendingFailedNotification(context: Context, messageId: Long) {
|
|
Handler(Looper.getMainLooper()).post {
|
|
val privateCursor = context.getMyContactsCursor(false, true)?.loadInBackground()
|
|
ensureBackgroundThread {
|
|
val address = context.getMessageRecipientAddress(messageId)
|
|
val threadId = context.getThreadId(address)
|
|
val senderName = context.getNameFromAddress(address, privateCursor)
|
|
showNotification(context, senderName, threadId)
|
|
}
|
|
}
|
|
}
|
|
|
|
@SuppressLint("NewApi")
|
|
private fun showNotification(context: Context, recipientName: String, threadId: Long) {
|
|
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
|
val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
|
|
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.message_not_sent_short)
|
|
val importance = NotificationManager.IMPORTANCE_HIGH
|
|
NotificationChannel(NOTIFICATION_CHANNEL, 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.hashCode(), intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
|
val summaryText = String.format(context.getString(R.string.message_sending_error), recipientName)
|
|
|
|
val largeIcon = SimpleContactsHelper(context).getContactLetterIcon(recipientName)
|
|
val builder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL)
|
|
.setContentTitle(context.getString(R.string.message_not_sent_short))
|
|
.setContentText(summaryText)
|
|
.setColor(context.getAdjustedPrimaryColor())
|
|
.setSmallIcon(R.drawable.ic_messenger)
|
|
.setLargeIcon(largeIcon)
|
|
.setStyle(NotificationCompat.BigTextStyle().bigText(summaryText))
|
|
.setContentIntent(pendingIntent)
|
|
.setPriority(NotificationCompat.PRIORITY_MAX)
|
|
.setDefaults(Notification.DEFAULT_LIGHTS)
|
|
.setCategory(Notification.CATEGORY_MESSAGE)
|
|
.setAutoCancel(true)
|
|
.setSound(soundUri, AudioManager.STREAM_NOTIFICATION)
|
|
.setChannelId(NOTIFICATION_CHANNEL)
|
|
|
|
notificationManager.notify(threadId.hashCode(), builder.build())
|
|
}
|
|
}
|