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
		
	
| 
											8 years ago
										 | // | ||
| 
											7 years ago
										 | //  Copyright (c) 2019 Open Whisper Systems. All rights reserved. | ||
| 
											8 years ago
										 | // | ||
|  | 
 | ||
|  | 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 { | ||
|  | 
 | ||
| 
											8 years ago
										 |     @objc | ||
| 
											8 years ago
										 |     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) { | ||
| 
											7 years ago
										 |         notImplemented() | ||
| 
											8 years ago
										 |     } | ||
|  | 
 | ||
|  |     @objc | ||
|  |     public init(durationSeconds: UInt32) { | ||
|  |         self.imageView = UIImageView(image: #imageLiteral(resourceName: "ic_timer")) | ||
|  |         imageView.contentMode = .scaleAspectFit | ||
|  | 
 | ||
|  |         self.label = UILabel() | ||
| 
											8 years ago
										 |         label.text = NSString.formatDurationSeconds(durationSeconds, useShortFormat: true) | ||
| 
											8 years ago
										 |         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 | ||
|  | 
 | ||
| 
											8 years ago
										 |         // Accessibility | ||
| 
											8 years ago
										 |         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") | ||
| 
											8 years ago
										 |         let durationString = NSString.formatDurationSeconds(durationSeconds, useShortFormat: false) | ||
| 
											8 years ago
										 |         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) { | ||
| 
											7 years ago
										 |         Logger.verbose("") | ||
| 
											8 years ago
										 | 
 | ||
|  |         // 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 | ||
|  |     } | ||
|  | } |