import UIKit import LegacyComponents import AppBundle import Lottie import TelegramPresentationData final class LockView: UIButton, TGModernConversationInputMicButtonLock { private let useDarkTheme: Bool private let pause: Bool private let idleView: AnimationView private let lockingView: AnimationView init(frame: CGRect, theme: PresentationTheme, useDarkTheme: Bool = false, pause: Bool = false, strings: PresentationStrings) { self.useDarkTheme = useDarkTheme self.pause = pause if let url = getAppBundle().url(forResource: "LockWait", withExtension: "json"), let animation = Animation.filepath(url.path) { let view = AnimationView(animation: animation, configuration: LottieConfiguration(renderingEngine: .mainThread, decodingStrategy: .codable)) view.loopMode = .autoReverse view.backgroundColor = .clear view.isOpaque = false self.idleView = view } else { self.idleView = AnimationView() } if let url = getAppBundle().url(forResource: self.pause ? "LockPause" : "Lock", withExtension: "json"), let animation = Animation.filepath(url.path) { let view = AnimationView(animation: animation, configuration: LottieConfiguration(renderingEngine: .mainThread, decodingStrategy: .codable)) view.backgroundColor = .clear view.isOpaque = false self.lockingView = view } else { self.lockingView = AnimationView() } super.init(frame: frame) accessibilityLabel = strings.VoiceOver_Recording_StopAndPreview addSubview(idleView) idleView.frame = bounds addSubview(lockingView) lockingView.frame = bounds updateTheme(theme) updateLockness(0) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } func updateLockness(_ lockness: CGFloat) { idleView.isHidden = lockness > 0 if lockness > 0 && idleView.isAnimationPlaying { idleView.stop() } else if lockness == 0 && !idleView.isAnimationPlaying { idleView.play() } lockingView.isHidden = !idleView.isHidden lockingView.currentProgress = lockness } func updateTheme(_ theme: PresentationTheme) { // [ // "Rectangle.Заливка 1": theme.chat.inputPanel.panelBackgroundColor, // "Rectangle.Rectangle.Обводка 1": theme.chat.inputPanel.panelControlAccentColor, // "Rectangle 2.Rectangle.Обводка 1": theme.chat.inputPanel.panelControlAccentColor, // "Path.Path.Обводка 1": theme.chat.inputPanel.panelControlAccentColor, // "Path 4.Path 4.Обводка 1": theme.chat.inputPanel.panelControlAccentColor // ].forEach { key, value in // idleView.setValueProvider(ColorValueProvider(value.lottieColorValue), keypath: AnimationKeypath(keypath: "\(key).Color")) // } // for keypath in idleView.allKeypaths(predicate: { $0.keys.last == "Color" }) { idleView.setValueProvider(ColorValueProvider(theme.chat.inputPanel.panelControlAccentColor.lottieColorValue), keypath: AnimationKeypath(keypath: keypath)) } for keypath in lockingView.allKeypaths(predicate: { $0.keys.last == "Color" }) { lockingView.setValueProvider(ColorValueProvider(theme.chat.inputPanel.panelControlAccentColor.lottieColorValue), keypath: AnimationKeypath(keypath: keypath)) } // // [ // "Path.Path.Обводка 1": theme.chat.inputPanel.panelControlAccentColor, // "Path.Path.Заливка 1": theme.chat.inputPanel.panelBackgroundColor.withAlphaComponent(1.0), // "Rectangle.Rectangle.Обводка 1": theme.chat.inputPanel.panelControlAccentColor, // "Rectangle.Заливка 1": theme.chat.inputPanel.panelControlAccentColor, // "Path 4.Path 4.Обводка 1": theme.chat.inputPanel.panelControlAccentColor // ].forEach { key, value in // lockingView.setValueProvider(ColorValueProvider(value.lottieColorValue), keypath: AnimationKeypath(keypath: "\(key).Color")) // } } override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { let superTest = super.hitTest(point, with: event) if superTest === lockingView { return self } return superTest } }