session-ios/SignalUtilitiesKit/Messaging/DisappearingTimerConfigurationView.swift
2021-01-12 11:25:31 +11:00

116 lines
4.3 KiB
Swift

//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
import Foundation
@objc
public protocol DisappearingTimerConfigurationViewDelegate: class {
func disappearingTimerConfigurationViewWasTapped(_ disappearingTimerView: DisappearingTimerConfigurationView)
}
// DisappearingTimerConfigurationView shows a timer icon and a short label showing the duration
// of disappearing messages for a thread.
//
// If you assign a delegate, it behaves like a button.
@objc
public class DisappearingTimerConfigurationView: UIView {
@objc
public weak var delegate: DisappearingTimerConfigurationViewDelegate? {
didSet {
// gesture recognizer is only enabled when a delegate is assigned.
// This lets us use this view as either an interactive button
// or as a non-interactive status indicator
pressGesture.isEnabled = delegate != nil
}
}
private let imageView: UIImageView
private let label: UILabel
private var pressGesture: UILongPressGestureRecognizer!
public required init?(coder aDecoder: NSCoder) {
notImplemented()
}
@objc
public init(durationSeconds: UInt32) {
self.imageView = UIImageView(image: #imageLiteral(resourceName: "ic_timer"))
imageView.contentMode = .scaleAspectFit
self.label = UILabel()
label.text = NSString.formatDurationSeconds(durationSeconds, useShortFormat: true)
label.font = UIFont.systemFont(ofSize: 10)
label.textAlignment = .center
label.minimumScaleFactor = 0.5
super.init(frame: CGRect.zero)
applyTintColor(self.tintColor)
// Gesture, simulating button touch up inside
let gesture = UILongPressGestureRecognizer(target: self, action: #selector(pressHandler))
gesture.minimumPressDuration = 0
self.pressGesture = gesture
self.addGestureRecognizer(pressGesture)
// disable gesture recognizer until a delegate is assigned
// this lets us use the UI as either an interactive button
// or as a non-interactive status indicator
pressGesture.isEnabled = false
// Accessibility
self.accessibilityLabel = NSLocalizedString("DISAPPEARING_MESSAGES_LABEL", comment: "Accessibility label for disappearing messages")
let hintFormatString = NSLocalizedString("DISAPPEARING_MESSAGES_HINT", comment: "Accessibility hint that contains current timeout information")
let durationString = NSString.formatDurationSeconds(durationSeconds, useShortFormat: false)
self.accessibilityHint = String(format: hintFormatString, durationString)
// Layout
self.addSubview(imageView)
self.addSubview(label)
let kHorizontalPadding: CGFloat = 4
let kVerticalPadding: CGFloat = 6
imageView.autoPinEdgesToSuperviewEdges(with: UIEdgeInsets(top: kVerticalPadding, left: kHorizontalPadding, bottom: 0, right: kHorizontalPadding), excludingEdge: .bottom)
label.autoPinEdgesToSuperviewEdges(with: UIEdgeInsets(top: 0, left: kHorizontalPadding, bottom: kVerticalPadding, right: kHorizontalPadding), excludingEdge: .top)
label.autoPinEdge(.top, to: .bottom, of: imageView)
}
@objc
func pressHandler(_ gestureRecognizer: UILongPressGestureRecognizer) {
Logger.verbose("")
// handle touch down and touch up events separately
if gestureRecognizer.state == .began {
applyTintColor(UIColor.gray)
} else if gestureRecognizer.state == .ended {
applyTintColor(self.tintColor)
let location = gestureRecognizer.location(in: self)
let isTouchUpInside = self.bounds.contains(location)
if (isTouchUpInside) {
// Similar to a UIButton's touch-up-inside
self.delegate?.disappearingTimerConfigurationViewWasTapped(self)
} else {
// Similar to a UIButton's touch-up-outside
// cancel gesture
gestureRecognizer.isEnabled = false
gestureRecognizer.isEnabled = true
}
}
}
override public var tintColor: UIColor! {
didSet {
applyTintColor(tintColor)
}
}
private func applyTintColor(_ color: UIColor) {
imageView.tintColor = color
label.textColor = color
}
}