1
0
Fork 0
e-ntfy-android/app/src/main/java/io/heckel/ntfy/msg/NotificationDispatcher.kt

119 lines
4.7 KiB
Kotlin
Raw Normal View History

2021-12-29 20:33:17 +01:00
package io.heckel.ntfy.msg
import android.content.Context
2022-01-18 14:28:48 -05:00
import io.heckel.ntfy.db.Notification
import io.heckel.ntfy.db.Repository
import io.heckel.ntfy.db.Subscription
import io.heckel.ntfy.util.Log
import io.heckel.ntfy.up.Distributor
import io.heckel.ntfy.util.decodeBytesMessage
2024-07-04 16:57:17 +05:30
import io.heckel.ntfy.util.decodeBytesTitle
import io.heckel.ntfy.util.safeLet
2021-12-31 02:00:08 +01:00
/**
* The notification dispatcher figures out what to do with a notification.
* It may display a notification, send out a broadcast, or forward via UnifiedPush.
*/
class NotificationDispatcher(val context: Context, val repository: Repository) {
private val notifier = NotificationService(context)
private val broadcaster = BroadcastService(context)
private val distributor = Distributor(context)
fun init() {
notifier.createDefaultNotificationChannels()
}
2021-12-29 20:33:17 +01:00
fun dispatch(subscription: Subscription, notification: Notification) {
Log.d(TAG, "Dispatching $notification for subscription $subscription")
val muted = getMuted(subscription)
val notify = shouldNotify(subscription, notification, muted)
val broadcast = shouldBroadcast(subscription)
val distribute = shouldDistribute(subscription)
2022-07-16 14:32:09 -06:00
val downloadAttachment = shouldDownloadAttachment(notification)
val downloadIcon = shouldDownloadIcon(notification)
if (notify) {
2022-01-04 00:54:18 +01:00
notifier.display(subscription, notification)
}
if (broadcast) {
2022-04-19 09:15:06 -04:00
broadcaster.sendMessage(subscription, notification, muted)
}
if (distribute) {
safeLet(subscription.upAppId, subscription.upConnectorToken) { appId, connectorToken ->
2024-07-04 16:57:17 +05:30
distributor.sendMessage(
appId,
connectorToken,
decodeBytesMessage(notification),
decodeBytesTitle(notification),
)
}
}
2022-07-16 14:32:09 -06:00
if (downloadAttachment && downloadIcon) {
DownloadManager.enqueue(context, notification.id, userAction = false, type = DownloadType.BOTH)
} else if (downloadAttachment) {
DownloadManager.enqueue(context, notification.id, userAction = false, type = DownloadType.ATTACHMENT)
} else if (downloadIcon) {
DownloadManager.enqueue(context, notification.id, userAction = false, type = DownloadType.ICON)
}
}
2022-07-16 14:32:09 -06:00
private fun shouldDownloadAttachment(notification: Notification): Boolean {
2022-01-11 19:37:34 -05:00
if (notification.attachment == null) {
return false
}
val attachment = notification.attachment
if (attachment.expires != null && attachment.expires < System.currentTimeMillis()/1000) {
Log.d(TAG, "Attachment already expired at ${attachment.expires}, not downloading")
return false
}
2022-08-25 21:58:37 -06:00
when (val maxAutoDownloadSize = repository.getAutoDownloadMaxSize()) {
2022-01-11 19:37:34 -05:00
Repository.AUTO_DOWNLOAD_ALWAYS -> return true
Repository.AUTO_DOWNLOAD_NEVER -> return false
else -> {
if (attachment.size == null) {
return true // DownloadWorker will bail out if attachment is too large!
2022-01-11 19:37:34 -05:00
}
return attachment.size <= maxAutoDownloadSize
2022-01-11 19:37:34 -05:00
}
}
}
2022-07-16 14:32:09 -06:00
private fun shouldDownloadIcon(notification: Notification): Boolean {
2022-08-25 21:58:37 -06:00
return notification.icon != null
2022-07-16 14:32:09 -06:00
}
private fun shouldNotify(subscription: Subscription, notification: Notification, muted: Boolean): Boolean {
if (subscription.upAppId != null) {
return false
}
val priority = if (notification.priority > 0) notification.priority else 3
2022-05-05 16:56:06 -04:00
val minPriority = if (subscription.minPriority > 0) subscription.minPriority else repository.getMinPriority()
if (priority < minPriority) {
return false
}
val detailsVisible = repository.detailViewSubscriptionId.get() == notification.subscriptionId
return !detailsVisible && !muted
}
2021-12-29 20:33:17 +01:00
private fun shouldBroadcast(subscription: Subscription): Boolean {
if (subscription.upAppId != null) { // Never broadcast for UnifiedPush subscriptions
return false
}
return repository.getBroadcastEnabled()
}
private fun shouldDistribute(subscription: Subscription): Boolean {
return subscription.upAppId != null // Only distribute for UnifiedPush subscriptions
}
private fun getMuted(subscription: Subscription): Boolean {
if (repository.isGlobalMuted()) {
return true
}
return subscription.mutedUntil == 1L || (subscription.mutedUntil > 1L && subscription.mutedUntil > System.currentTimeMillis()/1000)
2021-12-29 20:33:17 +01:00
}
companion object {
private const val TAG = "NtfyNotifDispatch"
}
2021-12-29 20:33:17 +01:00
}