Sketch out installed sticker classes.

This commit is contained in:
Matthew Chen 2019-04-18 13:48:24 -04:00
parent 2744cb8269
commit ef1f227e65
2 changed files with 134 additions and 7 deletions

View File

@ -42,6 +42,9 @@ $REPO_ROOT/Scripts/sds_codegen/sds_parse_objc.py --src-path SignalServiceKit/src
$REPO_ROOT/Scripts/sds_codegen/sds_parse_objc.py --src-path Signal/src/ViewControllers/ConversationView/TypingIndicatorInteraction.swift --swift-bridging-path $REPO_ROOT/Scripts/sds_codegen/sds-includes
$REPO_ROOT/Scripts/sds_codegen/sds_parse_objc.py --src-path SignalServiceKit/src/Messages --swift-bridging-path $REPO_ROOT/Scripts/sds_codegen/sds-includes
# Other
$REPO_ROOT/Scripts/sds_codegen/sds_parse_objc.py --src-path SignalServiceKit/src/Messages/Stickers --swift-bridging-path $REPO_ROOT/Scripts/sds_codegen/sds-includes
# We parse Swift source files to extract simple class descriptions (class name, base class, property names and types, etc.)
#
# NOTE: This script isn't working yet.

View File

@ -12,9 +12,21 @@ public class InstalledStickers: NSObject {
return SDSDatabaseStorage.shared
}
public static let collection = "InstalledStickers"
// private static var cdnSessionManager: AFHTTPSessionManager {
// return OWSSignalService.sharedInstance().cdnSessionManager
// }
private let store = SDSKeyValueStore(collection: InstalledStickers.collection)
// public static let collection = "InstalledStickers"
//
// private let store = SDSKeyValueStore(collection: InstalledStickers.collection)
// private static let serialQueue = DispatchQueue(label: "org.signal.installedStickers")
private static let operationQueue: OperationQueue = {
let operationQueue = OperationQueue()
operationQueue.name = "org.signal.installedStickers"
operationQueue.maxConcurrentOperationCount = 1
return operationQueue
}()
private override init() {}
@ -40,8 +52,6 @@ public class InstalledStickers: NSObject {
return url
}
// MARK: - Internal Methods
// MARK: -
@objc
@ -77,9 +87,9 @@ public class InstalledStickers: NSObject {
@objc
public class func installSticker(packId: Data,
packKey: Data,
stickerId: UInt32,
stickerData: Data) {
packKey: Data,
stickerId: UInt32,
stickerData: Data) {
assert(packId.count > 0)
assert(packKey.count > 0)
assert(stickerData.count > 0)
@ -110,4 +120,118 @@ public class InstalledStickers: NSObject {
}
}
}
@objc
public class func tryToDownloadAndInstallSticker(packId: Data,
packKey: Data,
stickerId: UInt32) {
assert(packId.count > 0)
assert(packKey.count > 0)
let operation = DownloadStickerOperation(packId: packId,
packKey: packKey,
stickerId: stickerId,
success: { (stickerData) in
self.installSticker(packId: packId, packKey: packKey, stickerId: stickerId, stickerData: stickerData)
},
failure: { (_) in
// Do nothing.
})
operationQueue.addOperation(operation)
}
}
// MARK: -
private class DownloadStickerOperation: OWSOperation {
private let success: (Data) -> Void
private let failure: (Error) -> Void
private let packId: Data
private let packKey: Data
private let stickerId: UInt32
var stickerData: Data?
@objc public required init(packId: Data,
packKey: Data,
stickerId: UInt32,
success : @escaping (Data) -> Void,
failure : @escaping (Error) -> Void) {
assert(packId.count > 0)
assert(packKey.count > 0)
self.success = success
self.failure = failure
self.packId = packId
self.packKey = packKey
self.stickerId = stickerId
super.init()
self.remainingRetries = 10
}
// MARK: Dependencies
private var cdnSessionManager: AFHTTPSessionManager {
return OWSSignalService.sharedInstance().cdnSessionManager
}
var firstAttempt = true
override public func run() {
// https://cdn.signal.org/stickers/<pack_id>/full/<sticker_id>
let urlPath = "stickers/\(packId.hexadecimalString)/full/\(stickerId)"
cdnSessionManager.get(urlPath,
parameters: nil,
progress: { (_) in
// Do nothing.
},
success: { [weak self] (_, response) in
guard let self = self else {
return
}
guard let data = response as? Data else {
owsFailDebug("Unexpected response: \(type(of: response))")
return
}
Logger.verbose("Download succeeded.")
self.stickerData = data
self.success(data)
self.didSucceed()
}) { [weak self] (_, error) in
guard let self = self else {
return
}
Logger.error("Download failed: \(error)")
self.failureCount += 1
self.reportError(error)
}
}
override public func didFail(error: Error) {
Logger.error("Download exhausted retries: \(error)")
failure(error)
}
private var failureCount: UInt = 0
override public func retryInterval() -> TimeInterval {
// Arbitrary backoff factor...
// With backOffFactor of 1.9
// try 1 delay: 0.00s
// try 2 delay: 0.19s
// ...
// try 5 delay: 1.30s
// ...
// try 11 delay: 61.31s
let backoffFactor = 1.9
let maxBackoff = kHourInterval
let seconds = 0.1 * min(maxBackoff, pow(backoffFactor, Double(self.failureCount)))
return seconds
}
}