TM-SGNL-iOS/Signal/ConversationView/CVBackgroundContainer.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

96 lines
2.6 KiB
Swift

//
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import SignalServiceKit
public import SignalUI
public protocol CVBackgroundContainerDelegate: AnyObject {
func updateScrollingContent()
}
// MARK: -
public class CVBackgroundContainer: ManualLayoutViewWithLayer {
private enum ZPositioning: CGFloat {
case wallpaperContent = 0
case wallpaperDimming = 1
case selectionHighlight = 2
}
fileprivate var wallpaperView: WallpaperView?
public weak var delegate: CVBackgroundContainerDelegate?
public init() {
super.init(name: "CVBackgroundContainer")
self.shouldDeactivateConstraints = false
self.isUserInteractionEnabled = false
// Render all background views behind the collection view.
self.layer.zPosition = -1
}
public func set(wallpaperView: WallpaperView?) {
self.wallpaperView?.contentView?.removeFromSuperview()
self.wallpaperView?.dimmingView?.removeFromSuperview()
self.wallpaperView = wallpaperView
if let wallpaperView = wallpaperView {
self.backgroundColor = .clear
if let contentView = wallpaperView.contentView {
addSubview(contentView)
contentView.layer.zPosition = ZPositioning.wallpaperContent.rawValue
}
if let dimmingView = wallpaperView.dimmingView {
addSubview(dimmingView)
dimmingView.layer.zPosition = ZPositioning.wallpaperDimming.rawValue
}
setNeedsLayout()
} else {
self.backgroundColor = Theme.backgroundColor
}
}
public override func layoutSubviews() {
AssertIsOnMainThread()
super.layoutSubviews()
wallpaperView?.contentView?.frame = bounds
wallpaperView?.dimmingView?.frame = bounds
delegate?.updateScrollingContent()
}
}
// MARK: -
extension CVBackgroundContainer: WallpaperBlurProvider {
public var wallpaperBlurState: WallpaperBlurState? {
wallpaperView?.blurProvider?.wallpaperBlurState
}
}
// MARK: -
extension ConversationViewController: CVBackgroundContainerDelegate {
public func updateScrollingContent() {
AssertIsOnMainThread()
UIView.performWithoutAnimation {
for cell in collectionView.visibleCells {
guard let cell = cell as? CVCell else {
owsFailDebug("Invalid cell.")
continue
}
cell.updateScrollingContent()
}
}
}
}