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 {
|
switch message {
|
||||||
case let visibleMessage as VisibleMessage:
|
case let visibleMessage as VisibleMessage:
|
||||||
let tsIncomingMessageID = try MessageReceiver.handleVisibleMessage(visibleMessage, associatedWithProto: proto, openGroupID: nil, isBackgroundPoll: false, using: transaction)
|
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()
|
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 {
|
if thread.isMuted {
|
||||||
// Ignore PNs if the thread is muted
|
// Ignore PNs if the thread is muted
|
||||||
return self.completeSilenty()
|
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,
|
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
|
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)
|
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
|
// Store the notification ID for unsend requests to later cancel this notification
|
||||||
tsIncomingMessage.setNotificationIdentifier(request.identifier, transaction: transaction)
|
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:
|
case let unsendRequest as UnsendRequest:
|
||||||
MessageReceiver.handleUnsendRequest(unsendRequest, using: transaction)
|
MessageReceiver.handleUnsendRequest(unsendRequest, using: transaction)
|
||||||
return self.completeSilenty()
|
return self.completeSilenty()
|
||||||
|
|
Loading…
Reference in New Issue