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.
		
		
		
		
		
			
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Swift
		
	
| //
 | |
| //  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
 | |
| //
 | |
| 
 | |
| import UIKit
 | |
| import SignalUtilitiesKit
 | |
| 
 | |
| @objc public class AudioProgressView: UIView {
 | |
| 
 | |
|     @objc public override var bounds: CGRect {
 | |
|         didSet {
 | |
|             if oldValue != bounds {
 | |
|                 updateSubviews()
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @objc public override var frame: CGRect {
 | |
|         didSet {
 | |
|             if oldValue != frame {
 | |
|                 updateSubviews()
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @objc public var horizontalBarColor = UIColor.black {
 | |
|         didSet {
 | |
|             updateContent()
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @objc public var progressColor = UIColor.blue {
 | |
|         didSet {
 | |
|             updateContent()
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private let horizontalBarLayer: CAShapeLayer
 | |
|     private let progressLayer: CAShapeLayer
 | |
| 
 | |
|     @objc public var progress: CGFloat = 0 {
 | |
|         didSet {
 | |
|             if oldValue != progress {
 | |
|                 updateContent()
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @available(*, unavailable, message:"use other constructor instead.")
 | |
|     @objc public required init?(coder aDecoder: NSCoder) {
 | |
|         notImplemented()
 | |
|     }
 | |
| 
 | |
|     public required init() {
 | |
|         self.horizontalBarLayer = CAShapeLayer()
 | |
|         self.progressLayer = CAShapeLayer()
 | |
| 
 | |
|         super.init(frame: CGRect.zero)
 | |
| 
 | |
|         self.layer.addSublayer(self.horizontalBarLayer)
 | |
|         self.layer.addSublayer(self.progressLayer)
 | |
|     }
 | |
| 
 | |
|     internal func updateSubviews() {
 | |
|         AssertIsOnMainThread()
 | |
| 
 | |
|         self.horizontalBarLayer.frame = self.bounds
 | |
|         self.progressLayer.frame = self.bounds
 | |
| 
 | |
|         updateContent()
 | |
|     }
 | |
| 
 | |
|     internal func updateContent() {
 | |
|         AssertIsOnMainThread()
 | |
| 
 | |
|         // Prevent the shape layer from animating changes.
 | |
|         CATransaction.begin()
 | |
|         CATransaction.setDisableActions(true)
 | |
| 
 | |
|         let horizontalBarPath = UIBezierPath()
 | |
|         let horizontalBarHeightFraction = CGFloat(0.25)
 | |
|         let horizontalBarHeight = bounds.size.height * horizontalBarHeightFraction
 | |
|         horizontalBarPath.append(UIBezierPath(rect: CGRect(x: 0, y: (bounds.size.height - horizontalBarHeight) * 0.5, width: bounds.size.width, height: horizontalBarHeight)))
 | |
|         horizontalBarLayer.path = horizontalBarPath.cgPath
 | |
|         horizontalBarLayer.fillColor = horizontalBarColor.cgColor
 | |
| 
 | |
|         let progressHeight = bounds.self.height
 | |
|         let progressWidth = progressHeight * 0.15
 | |
|         let progressX = (bounds.self.width - progressWidth) * max(0.0, min(1.0, progress))
 | |
|         let progressBounds = CGRect(x: progressX, y: 0, width: progressWidth, height: progressHeight)
 | |
|         let progressCornerRadius = progressWidth * 0.5
 | |
|         let progressPath = UIBezierPath()
 | |
|         progressPath.append(UIBezierPath(roundedRect: progressBounds, cornerRadius: progressCornerRadius))
 | |
|         progressLayer.path = progressPath.cgPath
 | |
|         progressLayer.fillColor = progressColor.cgColor
 | |
| 
 | |
|         CATransaction.commit()
 | |
|     }
 | |
| }
 |