mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			117 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			117 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
 | |
|     }
 | |
| }
 |