diff --git a/submodules/ScreenCaptureDetection/Sources/ScreenCaptureDetection.swift b/submodules/ScreenCaptureDetection/Sources/ScreenCaptureDetection.swift index 0c35661804..26f6bfba5b 100644 --- a/submodules/ScreenCaptureDetection/Sources/ScreenCaptureDetection.swift +++ b/submodules/ScreenCaptureDetection/Sources/ScreenCaptureDetection.swift @@ -75,3 +75,50 @@ public func screenCaptureEvents() -> Signal { } |> runOn(Queue.mainQueue()) } + +public final class ScreenCaptureDetectionManager { + private var observer: NSObjectProtocol? + private var screenRecordingDisposable: Disposable? + private var screenRecordingCheckTimer: SwiftSignalKit.Timer? + + public init(check: @escaping () -> Bool) { + self.observer = NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: .main, using: { [weak self] _ in + guard let strongSelf = self else { + return + } + check() + }) + + self.screenRecordingDisposable = screenRecordingActive().start(next: { [weak self] value in + Queue.mainQueue().async { + guard let strongSelf = self else { + return + } + if value { + if strongSelf.screenRecordingCheckTimer == nil { + strongSelf.screenRecordingCheckTimer = SwiftSignalKit.Timer(timeout: 0.5, repeat: true, completion: { + guard let strongSelf = self else { + return + } + if check() { + strongSelf.screenRecordingCheckTimer?.invalidate() + strongSelf.screenRecordingCheckTimer = nil + } + }, queue: Queue.mainQueue()) + strongSelf.screenRecordingCheckTimer?.start() + } + } else if strongSelf.screenRecordingCheckTimer != nil { + strongSelf.screenRecordingCheckTimer?.invalidate() + strongSelf.screenRecordingCheckTimer = nil + } + } + }) + } + + deinit { + NotificationCenter.default.removeObserver(self.observer) + self.screenRecordingDisposable?.dispose() + self.screenRecordingCheckTimer?.invalidate() + self.screenRecordingCheckTimer = nil + } +} diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 80b1f3f7ad..8e92f38297 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -289,7 +289,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G private weak var sendMessageActionsController: ChatSendMessageActionSheetController? private var searchResultsController: ChatSearchResultsController? - private var screenCaptureEventsDisposable: Disposable? + private var screenCaptureManager: ScreenCaptureDetectionManager? private let chatAdditionalDataDisposable = MetaDisposable() private var reportIrrelvantGeoNoticePromise = Promise() @@ -2496,7 +2496,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.applicationInForegroundDisposable?.dispose() self.canReadHistoryDisposable?.dispose() self.networkStateDisposable?.dispose() - self.screenCaptureEventsDisposable?.dispose() self.chatAdditionalDataDisposable.dispose() self.shareStatusDisposable?.dispose() self.context.sharedContext.mediaManager.galleryHiddenMediaManager.removeTarget(self) @@ -4639,10 +4638,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if !self.checkedPeerChatServiceActions { self.checkedPeerChatServiceActions = true - if case let .peer(peerId) = self.chatLocation, peerId.namespace == Namespaces.Peer.SecretChat { - self.screenCaptureEventsDisposable = screenCaptureEvents().start(next: { [weak self] _ in + if case let .peer(peerId) = self.chatLocation, peerId.namespace == Namespaces.Peer.SecretChat, self.screenCaptureManager == nil { + self.screenCaptureManager = ScreenCaptureDetectionManager(check: { [weak self] in if let strongSelf = self, strongSelf.canReadHistoryValue, strongSelf.traceVisibility() { let _ = addSecretChatMessageScreenshot(account: strongSelf.context.account, peerId: peerId).start() + return true + } else { + return false } }) }