From 28ee0908d7944691437217646112d9362e94c08c Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Mon, 26 Jun 2023 21:35:15 -0700 Subject: [PATCH] Blur link card images when status is sensitive Closes #412 --- Tusker/Views/CachedImageView.swift | 7 +++++ Tusker/Views/Status/StatusCardView.swift | 39 ++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Tusker/Views/CachedImageView.swift b/Tusker/Views/CachedImageView.swift index 90a192e3..1344529f 100644 --- a/Tusker/Views/CachedImageView.swift +++ b/Tusker/Views/CachedImageView.swift @@ -46,6 +46,13 @@ class CachedImageView: UIImageView { } } + func showOnlyBlurHash(_ blurhash: String, for url: URL) { + if url != self.url { + self.url = url + updateBlurhash(blurhash, for: url) + } + } + @objc private func preferencesChanged() { if isGrayscale != Preferences.shared.grayscaleImages { updateImage() diff --git a/Tusker/Views/Status/StatusCardView.swift b/Tusker/Views/Status/StatusCardView.swift index bada10e3..8dce0a7d 100644 --- a/Tusker/Views/Status/StatusCardView.swift +++ b/Tusker/Views/Status/StatusCardView.swift @@ -30,7 +30,7 @@ class StatusCardView: UIView { private var titleLabel: UILabel! private var descriptionLabel: UILabel! private var domainLabel: UILabel! - private var imageView: CachedImageView! + private var imageView: StatusCardImageView! private var placeholderImageView: UIImageView! private var leadingSpacer: UIView! private var trailingSpacer: UIView! @@ -80,7 +80,7 @@ class StatusCardView: UIView { vStack.alignment = .leading vStack.spacing = 0 - imageView = CachedImageView(cache: .attachments) + imageView = StatusCardImageView(cache: .attachments) imageView.contentMode = .scaleAspectFill imageView.clipsToBounds = true @@ -167,7 +167,18 @@ class StatusCardView: UIView { } if let image = card.image { - imageView.update(for: URL(image), blurhash: card.blurhash) + if status.sensitive { + if let blurhash = card.blurhash { + imageView.blurImage = false + imageView.showOnlyBlurHash(blurhash, for: URL(image)!) + } else { + // if we don't have a blurhash, load the image and show it behind a blur + imageView.blurImage = true + imageView.update(for: URL(image), blurhash: nil) + } + } else { + imageView.update(for: URL(image), blurhash: card.blurhash) + } imageView.isHidden = false leadingSpacer.isHidden = true } else { @@ -257,3 +268,25 @@ extension StatusCardView: UIContextMenuInteractionDelegate { } } } + +private class StatusCardImageView: CachedImageView { + @Lazy private var blurView = UIVisualEffectView(effect: UIBlurEffect(style: .dark)) + var blurImage = false { + didSet { + if blurImage { + if !_blurView.isInitialized { + blurView.translatesAutoresizingMaskIntoConstraints = false + addSubview(blurView) + NSLayoutConstraint.activate([ + blurView.leadingAnchor.constraint(equalTo: leadingAnchor), + blurView.trailingAnchor.constraint(equalTo: trailingAnchor), + blurView.topAnchor.constraint(equalTo: topAnchor), + blurView.bottomAnchor.constraint(equalTo: bottomAnchor), + ]) + } + } else { + _blurView.valueIfInitialized?.removeFromSuperview() + } + } + } +}