134 lines
5.0 KiB
Swift
134 lines
5.0 KiB
Swift
//
|
|
// Copyright (c) 2020 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import PromiseKit
|
|
|
|
@objc
|
|
public class StickerTooltip: TooltipView {
|
|
|
|
private let stickerPack: StickerPack
|
|
|
|
// MARK: Initializers
|
|
|
|
required init(fromView: UIView,
|
|
widthReferenceView: UIView,
|
|
tailReferenceView: UIView,
|
|
stickerPack: StickerPack,
|
|
wasTappedBlock: (() -> Void)?) {
|
|
self.stickerPack = stickerPack
|
|
|
|
super.init(fromView: fromView, widthReferenceView: widthReferenceView, tailReferenceView: tailReferenceView, wasTappedBlock: wasTappedBlock)
|
|
|
|
addObservers()
|
|
}
|
|
|
|
required init?(coder aDecoder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
deinit {
|
|
NotificationCenter.default.removeObserver(self)
|
|
}
|
|
|
|
private let iconView = UIView()
|
|
|
|
@objc
|
|
public class func present(fromView: UIView,
|
|
widthReferenceView: UIView,
|
|
tailReferenceView: UIView,
|
|
stickerPack: StickerPack,
|
|
wasTappedBlock: (() -> Void)?) -> StickerTooltip {
|
|
return StickerTooltip(fromView: fromView, widthReferenceView: widthReferenceView, tailReferenceView: tailReferenceView, stickerPack: stickerPack, wasTappedBlock: wasTappedBlock)
|
|
}
|
|
|
|
public override func bubbleContentView() -> UIView {
|
|
iconView.autoSetDimensions(to: CGSize(square: 24))
|
|
updateIconView()
|
|
|
|
let label = UILabel()
|
|
label.text = NSLocalizedString("STICKER_PACK_INSTALLED_TOOLTIP",
|
|
comment: "Tooltip indicating that a sticker pack was installed.")
|
|
label.font = UIFont.ows_dynamicTypeBody.ows_semibold
|
|
label.textColor = Theme.primaryTextColor
|
|
|
|
return horizontalStack(forSubviews: [iconView, label])
|
|
}
|
|
|
|
public override var bubbleColor: UIColor {
|
|
return (Theme.isDarkThemeEnabled
|
|
? UIColor.ows_accentBlue
|
|
: Theme.backgroundColor)
|
|
}
|
|
|
|
private func addObservers() {
|
|
NotificationCenter.default.addObserver(self,
|
|
selector: #selector(stickersOrPacksDidChange),
|
|
name: StickerManager.stickersOrPacksDidChange,
|
|
object: nil)
|
|
}
|
|
|
|
private func updateIconView() {
|
|
let stickerPackItem: StickerPackItem = stickerPack.cover
|
|
let stickerInfo = stickerPackItem.stickerInfo(with: stickerPack)
|
|
let installedMetadata = StickerManager.installedStickerMetadataWithSneakyTransaction(stickerInfo: stickerInfo)
|
|
guard let stickerMetadata = installedMetadata else {
|
|
updateIconView(stickerPackItem: stickerPackItem,
|
|
stickerDataUrl: nil)
|
|
|
|
// This sticker is not downloaded; try to download now.
|
|
firstly {
|
|
StickerManager.tryToDownloadSticker(stickerPack: self.stickerPack, stickerInfo: stickerInfo)
|
|
}.map(on: .global()) { (stickerData: Data) in
|
|
let stickerType = StickerManager.stickerType(forContentType: stickerPackItem.contentType)
|
|
let stickerDataUrl = OWSFileSystem.temporaryFileUrl(fileExtension: stickerType.fileExtension)
|
|
try stickerData.write(to: stickerDataUrl)
|
|
return stickerDataUrl
|
|
}.done { [weak self] (stickerDataUrl: URL) in
|
|
guard let self = self else {
|
|
return
|
|
}
|
|
self.updateIconView(stickerPackItem: stickerPackItem,
|
|
stickerDataUrl: stickerDataUrl)
|
|
}.catch {(error) in
|
|
owsFailDebug("error: \(error)")
|
|
}
|
|
|
|
return
|
|
}
|
|
updateIconView(stickerPackItem: stickerPackItem,
|
|
stickerDataUrl: stickerMetadata.stickerDataUrl)
|
|
}
|
|
|
|
private func updateIconView(stickerPackItem: StickerPackItem,
|
|
stickerDataUrl: URL?) {
|
|
for subview in iconView.subviews {
|
|
subview.removeFromSuperview()
|
|
}
|
|
guard let stickerDataUrl = stickerDataUrl else {
|
|
iconView.isHidden = true
|
|
return
|
|
}
|
|
let stickerInfo = stickerPackItem.stickerInfo(with: stickerPack)
|
|
let stickerType: StickerType = StickerManager.stickerType(forContentType: stickerPackItem.contentType)
|
|
guard let stickerView = StickerView.stickerView(stickerInfo: stickerInfo,
|
|
stickerType: stickerType,
|
|
stickerDataUrl: stickerDataUrl) else {
|
|
iconView.isHidden = true
|
|
return
|
|
}
|
|
iconView.addSubview(stickerView)
|
|
stickerView.autoPinEdgesToSuperviewEdges()
|
|
iconView.isHidden = false
|
|
}
|
|
|
|
// MARK: Events
|
|
|
|
@objc func stickersOrPacksDidChange() {
|
|
AssertIsOnMainThread()
|
|
|
|
updateIconView()
|
|
}
|
|
}
|