Handle screenshot notifications

pull/362/head
Niels Andriesse 4 years ago
parent 08015f570f
commit 9d6d68d33e

@ -653,6 +653,16 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
audioRecorder?.stop() audioRecorder?.stop()
audioSession.endAudioActivity(recordVoiceMessageActivity) audioSession.endAudioActivity(recordVoiceMessageActivity)
} }
// MARK: Screenshot Notifications
@objc func sendScreenshotNotificationIfNeeded() {
guard thread is TSContactThread else { return }
let message = DataExtractionNotification()
message.kind = .screenshot
Storage.write { transaction in
MessageSender.send(message, in: self.thread, using: transaction)
}
}
// MARK: Requesting Permission // MARK: Requesting Permission
func requestCameraPermissionIfNeeded() -> Bool { func requestCameraPermissionIfNeeded() -> Bool {

@ -184,6 +184,7 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, OWSConversat
notificationCenter.addObserver(self, selector: #selector(handleAudioDidFinishPlayingNotification(_:)), name: .SNAudioDidFinishPlaying, object: nil) notificationCenter.addObserver(self, selector: #selector(handleAudioDidFinishPlayingNotification(_:)), name: .SNAudioDidFinishPlaying, object: nil)
notificationCenter.addObserver(self, selector: #selector(addOrRemoveBlockedBanner), name: NSNotification.Name(rawValue: kNSNotificationName_BlockListDidChange), object: nil) notificationCenter.addObserver(self, selector: #selector(addOrRemoveBlockedBanner), name: NSNotification.Name(rawValue: kNSNotificationName_BlockListDidChange), object: nil)
notificationCenter.addObserver(self, selector: #selector(handleGroupUpdatedNotification), name: .groupThreadUpdated, object: nil) notificationCenter.addObserver(self, selector: #selector(handleGroupUpdatedNotification), name: .groupThreadUpdated, object: nil)
notificationCenter.addObserver(self, selector: #selector(sendScreenshotNotificationIfNeeded), name: UIApplication.userDidTakeScreenshotNotification, object: nil)
// Mentions // Mentions
MentionsManager.populateUserPublicKeyCacheIfNeeded(for: thread.uniqueId!) MentionsManager.populateUserPublicKeyCacheIfNeeded(for: thread.uniqueId!)
// Draft // Draft

@ -1,35 +1,29 @@
@objc(SNDataExtractionNotificationInfoMessage) @objc(SNDataExtractionNotificationInfoMessage)
final class DataExtractionNotificationInfoMessage : TSInfoMessage { final class DataExtractionNotificationInfoMessage : TSInfoMessage {
private let kind: DataExtractionNotification.Kind
init(kind: DataExtractionNotification.Kind, timestamp: UInt64, thread: TSThread) { init(type: TSInfoMessageType, sentTimestamp: UInt64, thread: TSThread, referencedAttachmentTimestamp: UInt64?) {
self.kind = kind super.init(timestamp: sentTimestamp, in: thread, messageType: type)
let infoMessageType: TSInfoMessageType
switch kind {
case .screenshot: infoMessageType = .screenshotNotification
case .mediaSaved: infoMessageType = .mediaSavedNotification
}
super.init(timestamp: timestamp, in: thread, messageType: infoMessageType)
} }
required init(coder: NSCoder) { required init(coder: NSCoder) {
preconditionFailure("Not implemented.") super.init(coder: coder)
} }
required init(dictionary dictionaryValue: [String:Any]!) throws { required init(dictionary dictionaryValue: [String:Any]!) throws {
preconditionFailure("Not implemented.") try super.init(dictionary: dictionaryValue)
} }
override func previewText(with transaction: YapDatabaseReadTransaction) -> String { override func previewText(with transaction: YapDatabaseReadTransaction) -> String {
guard let thread = thread as? TSContactThread else { return "" } // Should never occur guard let thread = thread as? TSContactThread else { return "" } // Should never occur
let sessionID = thread.contactIdentifier() let sessionID = thread.contactIdentifier()
let displayName = Storage.shared.getContact(with: sessionID)?.displayName(for: .regular) ?? sessionID let displayName = Storage.shared.getContact(with: sessionID)?.displayName(for: .regular) ?? sessionID
switch kind { switch messageType {
case .screenshot: return "\(displayName) took a screenshot." case .screenshotNotification: return "\(displayName) took a screenshot."
case .mediaSaved: case .mediaSavedNotification:
// TODO: Use the timestamp and tell the user * which * media was saved // TODO: Use referencedAttachmentTimestamp to tell the user * which * media was saved
return "Media saved by \(displayName)." return "Media saved by \(displayName)."
default: preconditionFailure()
} }
} }
} }

@ -108,7 +108,12 @@ extension MessageReceiver {
// MARK: - Data Extraction Notification // MARK: - Data Extraction Notification
private static func handleDataExtractionNotification(_ message: DataExtractionNotification, using transaction: Any) { private static func handleDataExtractionNotification(_ message: DataExtractionNotification, using transaction: Any) {
let transaction = transaction as! YapDatabaseReadWriteTransaction
guard message.groupPublicKey == nil,
let thread = TSContactThread.getWithContactId(message.sender!, transaction: transaction) else { return }
// TODO: Handle media saved type notifications
let message = DataExtractionNotificationInfoMessage(type: .screenshotNotification, sentTimestamp: message.sentTimestamp!, thread: thread, referencedAttachmentTimestamp: nil)
message.save(with: transaction)
} }

Loading…
Cancel
Save