Antidote/Antidote/AutomationCoordinator.swift

111 lines
3.6 KiB
Swift

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
import Foundation
import MobileCoreServices
import os
private struct Constants {
static let MaxFileSizeWiFi: OCTToxFileSize = 100 * 1024 * 1024
static let MaxFileSizeWWAN: OCTToxFileSize = 20 * 1024 * 1024
}
class AutomationCoordinator: NSObject {
fileprivate weak var submanagerFiles: OCTSubmanagerFiles!
fileprivate var fileMessagesToken: RLMNotificationToken?
fileprivate let userDefaults = UserDefaultsManager()
fileprivate let reachability = Reach()
init(submanagerObjects: OCTSubmanagerObjects, submanagerFiles: OCTSubmanagerFiles) {
self.submanagerFiles = submanagerFiles
super.init()
let predicate = NSPredicate(format: "senderUniqueIdentifier != nil AND messageFile != nil")
let results = submanagerObjects.messages(predicate: predicate)
fileMessagesToken = results.addNotificationBlock { [unowned self] change in
switch change {
case .initial:
break
case .update(let results, _, let insertions, _):
guard let results = results else {
break
}
for index in insertions {
let message = results[index]
self.proceedNewFileMessage(message)
}
case .error(let error):
fatalError("\(error)")
}
}
}
}
extension AutomationCoordinator: CoordinatorProtocol {
func startWithOptions(_ options: CoordinatorOptions?) {
// nop
}
}
private extension AutomationCoordinator {
func proceedNewFileMessage(_ message: OCTMessageAbstract) {
let usingWiFi = self.usingWiFi()
os_log("AutomationCoordinator:usingWiFi=%d", usingWiFi)
switch userDefaults.autodownloadImages {
case .Never:
return
case .UsingWiFi:
if !usingWiFi {
return
}
case .Always:
break
}
// HINT: now we apply autodownload to all files, not only images
// if !UTTypeConformsTo(message.messageFile!.fileUTI as CFString? ?? "" as CFString, kUTTypeImage) {
// // download images only
// return
// }
// skip too large files
if usingWiFi {
if message.messageFile!.fileSize > Constants.MaxFileSizeWiFi {
return
}
}
else {
if message.messageFile!.fileSize > Constants.MaxFileSizeWWAN {
return
}
}
// workaround for deadlock in objcTox https://github.com/Antidote-for-Tox/objcTox/issues/51
let delayTime = DispatchTime.now() + Double(Int64(0.0 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
DispatchQueue.main.asyncAfter(deadline: delayTime) { [weak self] in
self?.submanagerFiles.acceptFileTransfer(message, failureBlock: nil)
}
}
func usingWiFi() -> Bool
{
switch reachability.connectionStatus() {
case .offline:
return false
case .unknown:
return false
case .online(let type):
switch type {
case .wwan:
return false
case .wiFi:
return true
}
}
}
}