only notifying message notifications when they're new
This commit is contained in:
parent
8716500d99
commit
ffa8fad2b0
|
@ -8,6 +8,7 @@ import android.content.Intent
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import app.dapk.st.imageloader.IconLoader
|
import app.dapk.st.imageloader.IconLoader
|
||||||
|
import app.dapk.st.matrix.common.RoomId
|
||||||
import app.dapk.st.matrix.sync.RoomEvent
|
import app.dapk.st.matrix.sync.RoomEvent
|
||||||
import app.dapk.st.matrix.sync.RoomOverview
|
import app.dapk.st.matrix.sync.RoomOverview
|
||||||
import app.dapk.st.messenger.MessengerActivity
|
import app.dapk.st.messenger.MessengerActivity
|
||||||
|
@ -22,12 +23,12 @@ class NotificationFactory(
|
||||||
private val intentFactory: IntentFactory,
|
private val intentFactory: IntentFactory,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
suspend fun createNotifications(events: Map<RoomOverview, List<RoomEvent>>, onlyContainsRemovals: Boolean): Notifications {
|
suspend fun createNotifications(events: Map<RoomOverview, List<RoomEvent>>, onlyContainsRemovals: Boolean, roomsWithNewEvents: Set<RoomId>): Notifications {
|
||||||
val notifications = events.map { (roomOverview, events) ->
|
val notifications = events.map { (roomOverview, events) ->
|
||||||
val messageEvents = events.filterIsInstance<RoomEvent.Message>()
|
val messageEvents = events.filterIsInstance<RoomEvent.Message>()
|
||||||
when (messageEvents.isEmpty()) {
|
when (messageEvents.isEmpty()) {
|
||||||
true -> NotificationDelegate.DismissRoom(roomOverview.roomId)
|
true -> NotificationDelegate.DismissRoom(roomOverview.roomId)
|
||||||
false -> createNotification(messageEvents, roomOverview)
|
false -> createNotification(messageEvents, roomOverview, roomsWithNewEvents)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +111,7 @@ class NotificationFactory(
|
||||||
return messageStyle
|
return messageStyle
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun createNotification(events: List<RoomEvent.Message>, roomOverview: RoomOverview): NotificationDelegate {
|
private suspend fun createNotification(events: List<RoomEvent.Message>, roomOverview: RoomOverview, roomsWithNewEvents: Set<RoomId>): NotificationDelegate {
|
||||||
val sortedEvents = events.sortedBy { it.utcTimestamp }
|
val sortedEvents = events.sortedBy { it.utcTimestamp }
|
||||||
|
|
||||||
val messageStyle = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
val messageStyle = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
|
@ -136,7 +137,7 @@ class NotificationFactory(
|
||||||
.setWhen(sortedEvents.last().utcTimestamp)
|
.setWhen(sortedEvents.last().utcTimestamp)
|
||||||
.setShowWhen(true)
|
.setShowWhen(true)
|
||||||
.setGroup(GROUP_ID)
|
.setGroup(GROUP_ID)
|
||||||
.setOnlyAlertOnce(roomOverview.isGroup)
|
.setOnlyAlertOnce(roomOverview.isGroup || !roomsWithNewEvents.contains(roomOverview.roomId))
|
||||||
.setContentIntent(openRoomIntent)
|
.setContentIntent(openRoomIntent)
|
||||||
.setStyle(messageStyle)
|
.setStyle(messageStyle)
|
||||||
.setCategory(Notification.CATEGORY_MESSAGE)
|
.setCategory(Notification.CATEGORY_MESSAGE)
|
||||||
|
|
|
@ -19,9 +19,9 @@ class NotificationRenderer(
|
||||||
private val notificationFactory: NotificationFactory,
|
private val notificationFactory: NotificationFactory,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
suspend fun render(result: Map<RoomOverview, List<RoomEvent>>, removedRooms: Set<RoomId>, onlyContainsRemovals: Boolean) {
|
suspend fun render(result: Map<RoomOverview, List<RoomEvent>>, removedRooms: Set<RoomId>, onlyContainsRemovals: Boolean, roomsWithNewEvents: Set<RoomId>) {
|
||||||
removedRooms.forEach { notificationManager.cancel(it.value, MESSAGE_NOTIFICATION_ID) }
|
removedRooms.forEach { notificationManager.cancel(it.value, MESSAGE_NOTIFICATION_ID) }
|
||||||
val notifications = notificationFactory.createNotifications(result, onlyContainsRemovals)
|
val notifications = notificationFactory.createNotifications(result, onlyContainsRemovals, roomsWithNewEvents)
|
||||||
|
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
notifications.summaryNotification.ifNull {
|
notifications.summaryNotification.ifNull {
|
||||||
|
|
|
@ -4,7 +4,6 @@ import app.dapk.st.core.AppLogTag.NOTIFICATION
|
||||||
import app.dapk.st.core.log
|
import app.dapk.st.core.log
|
||||||
import app.dapk.st.matrix.common.RoomId
|
import app.dapk.st.matrix.common.RoomId
|
||||||
import app.dapk.st.matrix.sync.RoomEvent
|
import app.dapk.st.matrix.sync.RoomEvent
|
||||||
import app.dapk.st.matrix.sync.RoomOverview
|
|
||||||
import app.dapk.st.matrix.sync.RoomStore
|
import app.dapk.st.matrix.sync.RoomStore
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
|
|
||||||
|
@ -31,12 +30,16 @@ class NotificationsUseCase(
|
||||||
val asRooms = changes.keys
|
val asRooms = changes.keys
|
||||||
val removedRooms = inferredCurrentNotifications.keys - asRooms
|
val removedRooms = inferredCurrentNotifications.keys - asRooms
|
||||||
|
|
||||||
|
val roomsWithNewEvents = changes.filter {
|
||||||
|
inferredCurrentNotifications[it.key]?.map { it.eventId } != it.value.map { it.eventId }
|
||||||
|
}.keys
|
||||||
|
|
||||||
val onlyContainsRemovals =
|
val onlyContainsRemovals =
|
||||||
inferredCurrentNotifications.filterKeys { !removedRooms.contains(it) } == changes.filterKeys { !removedRooms.contains(it) }
|
inferredCurrentNotifications.filterKeys { !removedRooms.contains(it) } == changes.filterKeys { !removedRooms.contains(it) }
|
||||||
inferredCurrentNotifications.clear()
|
inferredCurrentNotifications.clear()
|
||||||
inferredCurrentNotifications.putAll(changes)
|
inferredCurrentNotifications.putAll(changes)
|
||||||
|
|
||||||
notificationRenderer.render(result, removedRooms, onlyContainsRemovals)
|
notificationRenderer.render(result, removedRooms, onlyContainsRemovals, roomsWithNewEvents)
|
||||||
}
|
}
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue