Signal-iOS/SignalMessaging/Views/Tooltips/StickerTooltip.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()
}
}