cancel notification if there is an outgoing message coming in
This commit is contained in:
parent
bfc1e96c9d
commit
340d2abc05
|
@ -43,18 +43,19 @@ public final class NotificationServiceExtension : UNNotificationServiceExtension
|
|||
switch message {
|
||||
case let visibleMessage as VisibleMessage:
|
||||
let tsIncomingMessageID = try MessageReceiver.handleVisibleMessage(visibleMessage, associatedWithProto: proto, openGroupID: nil, isBackgroundPoll: false, using: transaction)
|
||||
guard let tsIncomingMessage = TSIncomingMessage.fetch(uniqueId: tsIncomingMessageID, transaction: transaction) else {
|
||||
guard let tsMessage = TSMessage.fetch(uniqueId: tsIncomingMessageID, transaction: transaction) else {
|
||||
return self.completeSilenty()
|
||||
}
|
||||
let thread = tsIncomingMessage.thread(with: transaction)
|
||||
let thread = tsMessage.thread(with: transaction)
|
||||
let threadID = thread.uniqueId!
|
||||
userInfo[NotificationServiceExtension.threadIdKey] = threadID
|
||||
snippet = tsMessage.previewText(with: transaction).filterForDisplay?.replacingMentions(for: threadID, using: transaction)
|
||||
?? "You've got a new message"
|
||||
if let tsIncomingMessage = tsMessage as? TSIncomingMessage {
|
||||
if thread.isMuted {
|
||||
// Ignore PNs if the thread is muted
|
||||
return self.completeSilenty()
|
||||
}
|
||||
let threadID = thread.uniqueId!
|
||||
userInfo[NotificationServiceExtension.threadIdKey] = threadID
|
||||
snippet = tsIncomingMessage.previewText(with: transaction).filterForDisplay?.replacingMentions(for: threadID, using: transaction)
|
||||
?? "You've got a new message"
|
||||
if let thread = TSThread.fetch(uniqueId: threadID, transaction: transaction), let group = thread as? TSGroupThread,
|
||||
group.groupModel.groupType == .closedGroup { // Should always be true because we don't get PNs for open groups
|
||||
senderDisplayName = String(format: NotificationStrings.incomingGroupMessageTitleFormat, senderDisplayName, group.groupModel.groupName ?? MessageStrings.newGroupDefaultTitle)
|
||||
|
@ -65,6 +66,17 @@ public final class NotificationServiceExtension : UNNotificationServiceExtension
|
|||
}
|
||||
// Store the notification ID for unsend requests to later cancel this notification
|
||||
tsIncomingMessage.setNotificationIdentifier(request.identifier, transaction: transaction)
|
||||
} else {
|
||||
let semaphore = DispatchSemaphore(value: 0)
|
||||
let center = UNUserNotificationCenter.current()
|
||||
center.getDeliveredNotifications { notifications in
|
||||
let matchingNotifications = notifications.filter({ $0.request.content.userInfo[NotificationServiceExtension.threadIdKey] as? String == threadID})
|
||||
center.removeDeliveredNotifications(withIdentifiers: matchingNotifications.map({ $0.request.identifier }))
|
||||
// Hack: removeDeliveredNotifications seems to be async,need to wait for some time before the delivered notifications can be removed.
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { semaphore.signal() }
|
||||
}
|
||||
semaphore.wait()
|
||||
}
|
||||
case let unsendRequest as UnsendRequest:
|
||||
MessageReceiver.handleUnsendRequest(unsendRequest, using: transaction)
|
||||
return self.completeSilenty()
|
||||
|
|
Loading…
Reference in New Issue