diff --git a/Ring/Ring/Calls/ButtonsContainerView.swift b/Ring/Ring/Calls/ButtonsContainerView.swift index e6b692f9966eff9d131d3b0c11b1d4c4a6a1c650..7a8d30e108b08847dff516b1d615e5e06a4fffe0 100644 --- a/Ring/Ring/Calls/ButtonsContainerView.swift +++ b/Ring/Ring/Calls/ButtonsContainerView.swift @@ -22,31 +22,35 @@ import UIKit import Reusable import RxSwift -class ButtonsContainerView: UIView, NibLoadable { +class ButtonsContainerView: UIView, NibLoadable, UIScrollViewDelegate { //Outlets @IBOutlet var containerView: UIView! @IBOutlet weak var container: UIView! @IBOutlet weak var stackView: UIStackView! + @IBOutlet weak var firstPageStackView: UIStackView! + @IBOutlet weak var secondPageStackView: UIStackView! @IBOutlet weak var backgroundBlurEffect: UIVisualEffectView! - @IBOutlet weak var muteAudioButton: UIButton! - @IBOutlet weak var muteVideoButton: UIButton! - @IBOutlet weak var pauseCallButton: UIButton! - @IBOutlet weak var dialpadButton: UIButton! - @IBOutlet weak var switchSpeakerButton: UIButton! - @IBOutlet weak var cancelButton: UIButton! - @IBOutlet weak var switchCameraButton: UIButton! - @IBOutlet weak var acceptCallButton: UIButton! + @IBOutlet weak var cancelButton: UIButton! // cancel pending outgoing call + @IBOutlet weak var pageControl: UIPageControl! + @IBOutlet weak var scrollView: UIScrollView! //Constraints @IBOutlet weak var cancelButtonWidthConstraint: NSLayoutConstraint! - @IBOutlet weak var cancelButtonCenterConstraint: NSLayoutConstraint! - @IBOutlet weak var cancelButtonBottomConstraint: NSLayoutConstraint! @IBOutlet weak var cancelButtonHeightConstraint: NSLayoutConstraint! - @IBOutlet weak var stackViewYConstraint: NSLayoutConstraint! - @IBOutlet weak var stackViewWidthConstraint: NSLayoutConstraint! + @IBOutlet weak var cancelButtonBottomConstraint: NSLayoutConstraint! @IBOutlet weak var containerHeightConstraint: NSLayoutConstraint! + //Buttons + var muteAudioButton: UIButton! + var muteVideoButton: UIButton! + var pauseCallButton: UIButton! + var dialpadButton: UIButton! + var stopButton: UIButton! // stop current call + var switchCameraButton: UIButton! + var switchSpeakerButton: UIButton! + var addParticipantButton: UIButton! + let disposeBag = DisposeBag() var isCallStarted: Bool = false @@ -59,9 +63,9 @@ class ButtonsContainerView: UIView, NibLoadable { case .none: self?.withoutOptions() case .optionsWithoutSpeakerphone: - self?.optionsWithoutSpeaker() + self?.update(withSpeakerEnable: false) case .optionsWithSpeakerphone: - self?.optionsWithSpeaker() + self?.update(withSpeakerEnable: true) } }) .disposed(by: self.disposeBag) @@ -81,6 +85,7 @@ class ButtonsContainerView: UIView, NibLoadable { override func didMoveToWindow() { super.didMoveToWindow() self.cancelButton.backgroundColor = UIColor.red + self.stopButton.backgroundColor = UIColor.red } func commonInit() { @@ -88,93 +93,106 @@ class ButtonsContainerView: UIView, NibLoadable { addSubview(containerView) containerView.frame = self.bounds self.container.clipsToBounds = false + scrollView.delegate = self + muteAudioButton = configureButton(image: UIImage(asset: Asset.audioMuted)) + muteVideoButton = configureButton(image: UIImage(asset: Asset.videoMuted)) + pauseCallButton = configureButton(image: UIImage(asset: Asset.pauseCall)) + dialpadButton = configureButton(image: UIImage(asset: Asset.dialpad)) + stopButton = configureButton(image: UIImage(asset: Asset.stopCall)) + stopButton.borderColor = UIColor.red + switchCameraButton = configureButton(image: UIImage(asset: Asset.switchCamera)) + switchSpeakerButton = configureButton(image: UIImage(asset: Asset.enableSpeakerphone)) + addParticipantButton = configureButton(image: UIImage(asset: Asset.addPerson)) + pageControl.addTarget(self, action: #selector(changePage), for: UIControl.Event.valueChanged) + } + + func configureButton(image: UIImage?) -> UIButton { + let button = UIButton() + button.heightAnchor.constraint(equalToConstant: 50).isActive = true + button.widthAnchor.constraint(equalToConstant: 50).isActive = true + button.cornerRadius = 25 + button.borderWidth = 1 + button.borderColor = UIColor.white + button.tintColor = UIColor.white + button.setImage(image, for: .normal) + return button } func withoutOptions() { self.container.backgroundColor = UIColor.clear self.backgroundBlurEffect.isHidden = true - switchCameraButton.isHidden = true - muteAudioButton.isHidden = true - muteVideoButton.isHidden = true - pauseCallButton.isHidden = true - dialpadButton.isHidden = true - switchSpeakerButton.isHidden = true cancelButton.isHidden = false + firstPageStackView.removeSubviews() + secondPageStackView.removeSubviews() + pageControl.isHidden = true if self.viewModel?.isIncoming ?? false { - acceptCallButton.isHidden = false cancelButtonBottomConstraint.constant = 60 - cancelButtonCenterConstraint.constant = -80 return } - cancelButtonCenterConstraint.constant = 0 cancelButtonBottomConstraint.constant = 20 + scrollView.isScrollEnabled = false } - func optionsWithSpeaker() { - acceptCallButton.isHidden = true - cancelButtonCenterConstraint.constant = 0 + func update(withSpeakerEnable enable: Bool) { self.backgroundBlurEffect.isHidden = false - muteAudioButton.isHidden = false - if self.viewModel?.isAudioOnly ?? false { - muteVideoButton.isHidden = true - switchCameraButton.isHidden = true - if self.viewModel?.isSipCall ?? false { - dialpadButton.isHidden = false - } - cancelButtonBottomConstraint.constant = 20 + cancelButton.isHidden = true + switchSpeakerButton.isEnabled = enable + let isSip = self.viewModel?.isSipCall ?? false + let audioOnly = self.viewModel?.isAudioOnly ?? false + var havePages = false + if isSip { + firstPageStackView.removeSubviews() + secondPageStackView.removeSubviews() + firstPageStackView.addArrangedSubview(stopButton) + firstPageStackView.addArrangedSubview(pauseCallButton) + firstPageStackView.addArrangedSubview(muteAudioButton) + firstPageStackView.addArrangedSubview(switchSpeakerButton) + firstPageStackView.addArrangedSubview(dialpadButton) + } else if audioOnly { + firstPageStackView.removeSubviews() + secondPageStackView.removeSubviews() + firstPageStackView.addArrangedSubview(stopButton) + firstPageStackView.addArrangedSubview(pauseCallButton) + firstPageStackView.addArrangedSubview(muteAudioButton) + firstPageStackView.addArrangedSubview(switchSpeakerButton) + firstPageStackView.addArrangedSubview(addParticipantButton) } else { - muteVideoButton.isHidden = false - switchCameraButton.isHidden = false - cancelButtonBottomConstraint.constant = 80 + let screenRect = UIScreen.main.bounds + let screenWidth: CGFloat = screenRect.size.width + let buttonsWidth: CGFloat = 7 * 50 + 30 * 6 //540 + havePages = screenWidth < buttonsWidth + firstPageStackView.removeSubviews() + secondPageStackView.removeSubviews() + firstPageStackView.addArrangedSubview(stopButton) + firstPageStackView.addArrangedSubview(pauseCallButton) + firstPageStackView.addArrangedSubview(switchCameraButton) + firstPageStackView.addArrangedSubview(switchSpeakerButton) + firstPageStackView.addArrangedSubview(addParticipantButton) + if havePages { + secondPageStackView.addArrangedSubview(muteAudioButton) + secondPageStackView.addArrangedSubview(muteVideoButton) + } else { + firstPageStackView.addArrangedSubview(muteAudioButton) + firstPageStackView.addArrangedSubview(muteVideoButton) + } } - pauseCallButton.isHidden = false - switchSpeakerButton.isEnabled = true - switchSpeakerButton.isHidden = false - cancelButton.isHidden = false - setUpConference() - setButtonsColor() - } - - func optionsWithoutSpeaker() { - acceptCallButton.isHidden = true - cancelButtonCenterConstraint.constant = 0 + pageControl.isHidden = !havePages + scrollView.isScrollEnabled = havePages if self.viewModel?.isAudioOnly ?? false { - muteVideoButton.isHidden = true - switchCameraButton.isHidden = true - if self.viewModel?.isSipCall ?? false { - dialpadButton.isHidden = false - } cancelButtonBottomConstraint.constant = 20 } else { - switchCameraButton.isHidden = false - muteVideoButton.isHidden = false cancelButtonBottomConstraint.constant = 80 } - switchSpeakerButton.isEnabled = false - self.muteAudioButton.isHidden = false - switchSpeakerButton.isHidden = false - self.backgroundBlurEffect.isHidden = false - pauseCallButton.isHidden = false - cancelButton.isHidden = false - setUpConference() setButtonsColor() } - func setUpConference() { - if !(self.viewModel?.isConference ?? false) { - return - } - pauseCallButton.isHidden = true - muteAudioButton.isHidden = true - muteVideoButton.isHidden = true - cancelButtonBottomConstraint.constant = 0 - } - func updateView() { - if switchSpeakerButton.isEnabled && !switchSpeakerButton.isHidden { - self.optionsWithSpeaker() + if firstPageStackView.subviews.isEmpty { + self.withoutOptions() + } else if switchSpeakerButton.isEnabled && !switchSpeakerButton.isHidden { + self.update(withSpeakerEnable: true) } else if !switchSpeakerButton.isHidden { - self.optionsWithoutSpeaker() + self.update(withSpeakerEnable: false) } } @@ -202,4 +220,16 @@ class ButtonsContainerView: UIView, NibLoadable { muteVideoButton.borderColor = UIColor.white switchCameraButton.tintColor = UIColor.white } + + @objc + func changePage(sender: AnyObject) { + let xpoint = CGFloat(pageControl.currentPage) * scrollView.frame.size.width + scrollView.setContentOffset(CGPoint(x: xpoint, y: 0), animated: true) + } + + func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width) + pageControl.currentPage = Int(pageNumber) + } + } diff --git a/Ring/Ring/Calls/ButtonsContainerView.xib b/Ring/Ring/Calls/ButtonsContainerView.xib index b9b17c93740e9b80545b8d452d5f5307f143f945..5ecb3c8a995e25f7b185f3e4c2fbb76611fbf75c 100644 --- a/Ring/Ring/Calls/ButtonsContainerView.xib +++ b/Ring/Ring/Calls/ButtonsContainerView.xib @@ -1,48 +1,42 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <device id="retina4_7" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15509"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17703"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ButtonsContainerView" customModule="Ring" customModuleProvider="target"> <connections> - <outlet property="acceptCallButton" destination="rfz-9h-HoH" id="V6j-8E-g68"/> <outlet property="backgroundBlurEffect" destination="w5l-pw-1ET" id="YYh-qB-WIL"/> <outlet property="cancelButton" destination="ZxT-mA-1xU" id="4nk-iI-vPV"/> - <outlet property="cancelButtonBottomConstraint" destination="Ilu-Zu-JqW" id="Yeg-Ca-8pf"/> - <outlet property="cancelButtonCenterConstraint" destination="ls1-Ze-LXF" id="QlC-QB-oPz"/> - <outlet property="cancelButtonHeightConstraint" destination="kls-aA-2zS" id="CzE-vC-V5Z"/> - <outlet property="cancelButtonWidthConstraint" destination="0vV-4C-odp" id="beL-yR-ehA"/> + <outlet property="cancelButtonBottomConstraint" destination="Ilu-Zu-JqW" id="Kpe-jH-9iN"/> + <outlet property="cancelButtonHeightConstraint" destination="kls-aA-2zS" id="lsP-IM-HSb"/> + <outlet property="cancelButtonWidthConstraint" destination="0vV-4C-odp" id="guC-Z4-o2R"/> <outlet property="container" destination="a9g-pf-bHy" id="6bw-CB-5qN"/> <outlet property="containerHeightConstraint" destination="Gjk-7U-rEe" id="G5G-Uh-zRV"/> <outlet property="containerView" destination="iN0-l3-epB" id="mcP-kY-dVO"/> - <outlet property="dialpadButton" destination="izN-w3-Pc8" id="JWv-ys-ugD"/> - <outlet property="muteAudioButton" destination="tXL-FB-O0X" id="6Bh-x3-veQ"/> - <outlet property="muteVideoButton" destination="W7F-nH-kda" id="MWK-JU-544"/> - <outlet property="pauseCallButton" destination="MPk-dB-dhR" id="W4G-AB-WFw"/> + <outlet property="firstPageStackView" destination="U7m-9X-3Ld" id="Pn0-ga-Bgj"/> + <outlet property="pageControl" destination="p1T-pp-N9T" id="TbS-un-YZu"/> + <outlet property="scrollView" destination="GLe-dt-klX" id="n00-b5-Aq5"/> + <outlet property="secondPageStackView" destination="dc9-Dy-TLI" id="sgb-cv-OEJ"/> <outlet property="stackView" destination="RHx-cL-CV5" id="Iz9-B0-2Rd"/> - <outlet property="stackViewWidthConstraint" destination="ZuV-LV-CYZ" id="ita-8Y-fAb"/> - <outlet property="stackViewYConstraint" destination="z8B-uv-Vcb" id="Gaj-8x-yif"/> - <outlet property="switchCameraButton" destination="RJW-4D-bPR" id="74c-XD-hdA"/> - <outlet property="switchSpeakerButton" destination="0VH-mO-vFE" id="1Gy-a9-FAW"/> </connections> </placeholder> <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> <view contentMode="scaleToFill" id="iN0-l3-epB"> - <rect key="frame" x="0.0" y="0.0" width="375" height="108"/> + <rect key="frame" x="0.0" y="0.0" width="450" height="108"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="a9g-pf-bHy"> - <rect key="frame" x="0.0" y="-122" width="375" height="200"/> + <rect key="frame" x="-25" y="-122" width="500" height="200"/> <subviews> <visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="w5l-pw-1ET" userLabel="Background Blur Effect"> - <rect key="frame" x="0.0" y="0.0" width="375" height="220"/> + <rect key="frame" x="0.0" y="0.0" width="500" height="220"/> <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="JSn-50-Cd9"> - <rect key="frame" x="0.0" y="0.0" width="375" height="220"/> + <rect key="frame" x="0.0" y="0.0" width="500" height="220"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> </view> <vibrancyEffect> @@ -55,144 +49,64 @@ </userDefinedRuntimeAttribute> </userDefinedRuntimeAttributes> </visualEffectView> - <stackView opaque="NO" contentMode="scaleToFill" distribution="equalSpacing" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="RHx-cL-CV5"> - <rect key="frame" x="15" y="150" width="345" height="50"/> + <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" alwaysBounceHorizontal="YES" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GLe-dt-klX"> + <rect key="frame" x="0.0" y="117.5" width="500" height="50"/> <subviews> - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="tXL-FB-O0X"> - <rect key="frame" x="0.0" y="0.0" width="50" height="50"/> + <stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="RHx-cL-CV5"> + <rect key="frame" x="0.0" y="0.0" width="1000" height="50"/> + <subviews> + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="TOd-SD-lPc"> + <rect key="frame" x="0.0" y="0.0" width="500" height="50"/> + <subviews> + <stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" distribution="equalSpacing" alignment="center" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="U7m-9X-3Ld"> + <rect key="frame" x="225" y="0.0" width="50" height="50"/> + </stackView> + </subviews> + <constraints> + <constraint firstAttribute="bottom" secondItem="U7m-9X-3Ld" secondAttribute="bottom" id="DkW-WO-xTN"/> + <constraint firstItem="U7m-9X-3Ld" firstAttribute="centerX" secondItem="TOd-SD-lPc" secondAttribute="centerX" id="fci-9p-kSg"/> + <constraint firstItem="U7m-9X-3Ld" firstAttribute="top" secondItem="TOd-SD-lPc" secondAttribute="top" id="yAX-QO-Qeh"/> + </constraints> + </view> + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UX6-cQ-hKT"> + <rect key="frame" x="500" y="0.0" width="500" height="50"/> + <subviews> + <stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" distribution="equalSpacing" alignment="center" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="dc9-Dy-TLI"> + <rect key="frame" x="225" y="0.0" width="50" height="50"/> + </stackView> + </subviews> + <constraints> + <constraint firstAttribute="bottom" secondItem="dc9-Dy-TLI" secondAttribute="bottom" id="DAZ-5I-XBd"/> + <constraint firstItem="dc9-Dy-TLI" firstAttribute="centerX" secondItem="UX6-cQ-hKT" secondAttribute="centerX" id="ggB-b8-vvm"/> + <constraint firstItem="dc9-Dy-TLI" firstAttribute="top" secondItem="UX6-cQ-hKT" secondAttribute="top" id="ki1-hv-jbk"/> + </constraints> + </view> + </subviews> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> <constraints> - <constraint firstAttribute="width" constant="50" id="sDn-Gs-HlM"/> - <constraint firstAttribute="height" constant="50" id="zo6-Fk-IRh"/> + <constraint firstAttribute="bottom" secondItem="TOd-SD-lPc" secondAttribute="bottom" id="4E7-u8-Rl1"/> + <constraint firstAttribute="bottom" secondItem="UX6-cQ-hKT" secondAttribute="bottom" id="9WC-l8-9Ts"/> + <constraint firstAttribute="height" constant="50" id="gaC-GZ-ftw"/> + <constraint firstItem="TOd-SD-lPc" firstAttribute="top" secondItem="RHx-cL-CV5" secondAttribute="top" id="jd8-jQ-rrV"/> + <constraint firstItem="UX6-cQ-hKT" firstAttribute="top" secondItem="RHx-cL-CV5" secondAttribute="top" id="kIk-87-wML"/> </constraints> - <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - <state key="normal" image="audio_running"/> - <userDefinedRuntimeAttributes> - <userDefinedRuntimeAttribute type="boolean" keyPath="roundedCorners" value="YES"/> - <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius"> - <real key="value" value="25"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="number" keyPath="borderWidth"> - <real key="value" value="2"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="color" keyPath="borderColor"> - <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - </userDefinedRuntimeAttribute> - </userDefinedRuntimeAttributes> - </button> - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="W7F-nH-kda"> - <rect key="frame" x="74" y="0.0" width="50" height="50"/> - <constraints> - <constraint firstAttribute="height" constant="50" id="Pn1-SS-vPN"/> - <constraint firstAttribute="width" constant="50" id="jCp-ib-ySo"/> - </constraints> - <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - <state key="normal" image="video_running"/> - <userDefinedRuntimeAttributes> - <userDefinedRuntimeAttribute type="boolean" keyPath="roundedCorners" value="YES"/> - <userDefinedRuntimeAttribute type="number" keyPath="borderWidth"> - <real key="value" value="2"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="color" keyPath="borderColor"> - <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius"> - <real key="value" value="25"/> - </userDefinedRuntimeAttribute> - </userDefinedRuntimeAttributes> - </button> - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="RJW-4D-bPR"> - <rect key="frame" x="147.5" y="0.0" width="50" height="50"/> - <constraints> - <constraint firstAttribute="height" constant="50" id="DRc-Jz-wSo"/> - <constraint firstAttribute="width" constant="50" id="R9j-nN-Ez6"/> - </constraints> - <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - <state key="normal" image="switch_camera"/> - <userDefinedRuntimeAttributes> - <userDefinedRuntimeAttribute type="boolean" keyPath="roundedCorners" value="YES"/> - <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius"> - <real key="value" value="25"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="number" keyPath="borderWidth"> - <real key="value" value="2"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="color" keyPath="borderColor"> - <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - </userDefinedRuntimeAttribute> - </userDefinedRuntimeAttributes> - </button> - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="MPk-dB-dhR"> - <rect key="frame" x="221.5" y="0.0" width="50" height="50"/> - <constraints> - <constraint firstAttribute="width" constant="50" id="984-Na-56G"/> - <constraint firstAttribute="height" constant="50" id="kIF-vP-ZJP"/> - </constraints> - <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - <state key="normal" image="pause_call"/> - <userDefinedRuntimeAttributes> - <userDefinedRuntimeAttribute type="boolean" keyPath="roundedCorners" value="YES"/> - <userDefinedRuntimeAttribute type="number" keyPath="borderWidth"> - <real key="value" value="2"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="color" keyPath="borderColor"> - <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius"> - <real key="value" value="25"/> - </userDefinedRuntimeAttribute> - </userDefinedRuntimeAttributes> - </button> - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0VH-mO-vFE"> - <rect key="frame" x="295" y="0.0" width="50" height="50"/> - <constraints> - <constraint firstAttribute="width" constant="50" id="oso-jU-2U3"/> - <constraint firstAttribute="height" constant="50" id="qmE-To-ipl"/> - </constraints> - <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - <state key="normal" image="disable_speakerphone"/> - <userDefinedRuntimeAttributes> - <userDefinedRuntimeAttribute type="number" keyPath="borderWidth"> - <real key="value" value="2"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="boolean" keyPath="roundedCorners" value="YES"/> - <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius"> - <real key="value" value="25"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="color" keyPath="borderColor"> - <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - </userDefinedRuntimeAttribute> - </userDefinedRuntimeAttributes> - </button> - <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="izN-w3-Pc8"> - <rect key="frame" x="345" y="0.0" width="50" height="50"/> - <constraints> - <constraint firstAttribute="height" constant="50" id="PII-PT-xhP"/> - <constraint firstAttribute="width" constant="50" id="wje-Ic-6hu"/> - </constraints> - <color key="tintColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/> - <state key="normal" image="dialpad"/> - <userDefinedRuntimeAttributes> - <userDefinedRuntimeAttribute type="boolean" keyPath="roundedCorners" value="YES"/> - <userDefinedRuntimeAttribute type="number" keyPath="borderWidth"> - <real key="value" value="2"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="color" keyPath="borderColor"> - <color key="value" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius"> - <real key="value" value="25"/> - </userDefinedRuntimeAttribute> - </userDefinedRuntimeAttributes> - </button> + </stackView> </subviews> - <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> <constraints> - <constraint firstAttribute="width" priority="250" constant="230" id="ZuV-LV-CYZ"/> - <constraint firstAttribute="height" constant="50" id="gaC-GZ-ftw"/> + <constraint firstItem="TOd-SD-lPc" firstAttribute="width" secondItem="GLe-dt-klX" secondAttribute="width" id="Eps-CF-Pfp"/> + <constraint firstAttribute="trailing" secondItem="RHx-cL-CV5" secondAttribute="trailing" id="efN-Qt-2nw"/> + <constraint firstAttribute="bottom" secondItem="RHx-cL-CV5" secondAttribute="bottom" id="jay-I6-vJ5"/> + <constraint firstItem="RHx-cL-CV5" firstAttribute="leading" secondItem="GLe-dt-klX" secondAttribute="leading" id="lqg-MP-kJr"/> + <constraint firstItem="UX6-cQ-hKT" firstAttribute="width" secondItem="GLe-dt-klX" secondAttribute="width" id="qgL-iV-HcF"/> + <constraint firstAttribute="height" constant="50" id="uTj-pO-GgL"/> + <constraint firstItem="RHx-cL-CV5" firstAttribute="top" secondItem="GLe-dt-klX" secondAttribute="top" id="xYy-Kl-N5a"/> </constraints> - </stackView> + <connections> + <outlet property="delegate" destination="-1" id="xoy-Km-I2T"/> + </connections> + </scrollView> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ZxT-mA-1xU"> - <rect key="frame" x="152.5" y="10" width="70" height="70"/> + <rect key="frame" x="215" y="10" width="70" height="70"/> <constraints> <constraint firstAttribute="width" constant="70" id="0vV-4C-odp"/> <constraint firstAttribute="height" constant="70" id="kls-aA-2zS"/> @@ -212,45 +126,28 @@ </userDefinedRuntimeAttribute> </userDefinedRuntimeAttributes> </button> - <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="rfz-9h-HoH" userLabel="Accept"> - <rect key="frame" x="312.5" y="10" width="70" height="70"/> - <color key="backgroundColor" red="0.45098039215686275" green="0.98039215686274506" blue="0.47450980392156861" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> - <constraints> - <constraint firstAttribute="width" constant="70" id="cRi-F4-pPw"/> - <constraint firstAttribute="height" constant="70" id="vhg-1N-VIL"/> - </constraints> - <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - <state key="normal" image="call_button"/> - <userDefinedRuntimeAttributes> - <userDefinedRuntimeAttribute type="boolean" keyPath="roundedCorners" value="YES"/> - <userDefinedRuntimeAttribute type="number" keyPath="borderWidth"> - <real key="value" value="0.0"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius"> - <real key="value" value="35"/> - </userDefinedRuntimeAttribute> - </userDefinedRuntimeAttributes> - </button> + <pageControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" defersCurrentPageDisplay="YES" numberOfPages="2" translatesAutoresizingMaskIntoConstraints="NO" id="p1T-pp-N9T"> + <rect key="frame" x="198.5" y="172.5" width="103.5" height="27.5"/> + </pageControl> </subviews> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> <constraints> - <constraint firstItem="rfz-9h-HoH" firstAttribute="leading" secondItem="ZxT-mA-1xU" secondAttribute="trailing" constant="90" id="48d-Rh-4pI"/> <constraint firstAttribute="bottom" secondItem="w5l-pw-1ET" secondAttribute="bottom" constant="-20" id="6qu-Nn-b1Y"/> <constraint firstItem="w5l-pw-1ET" firstAttribute="top" secondItem="a9g-pf-bHy" secondAttribute="top" id="7OO-QU-y0u"/> <constraint firstAttribute="height" constant="200" id="Gjk-7U-rEe"/> <constraint firstAttribute="bottom" secondItem="ZxT-mA-1xU" secondAttribute="bottom" constant="120" id="Ilu-Zu-JqW"/> - <constraint firstItem="rfz-9h-HoH" firstAttribute="centerY" secondItem="ZxT-mA-1xU" secondAttribute="centerY" id="NZg-SL-A31"/> + <constraint firstItem="p1T-pp-N9T" firstAttribute="top" secondItem="GLe-dt-klX" secondAttribute="bottom" constant="5" id="Jhb-Qw-63S"/> + <constraint firstAttribute="bottom" secondItem="p1T-pp-N9T" secondAttribute="bottom" id="SG2-xV-gb5"/> + <constraint firstItem="p1T-pp-N9T" firstAttribute="centerX" secondItem="a9g-pf-bHy" secondAttribute="centerX" id="T7E-8d-eSh"/> <constraint firstAttribute="trailing" secondItem="w5l-pw-1ET" secondAttribute="trailing" id="TnQ-lp-9B9"/> - <constraint firstItem="RHx-cL-CV5" firstAttribute="leading" secondItem="a9g-pf-bHy" secondAttribute="leading" constant="15" id="Y9c-4n-eid"/> - <constraint firstAttribute="width" relation="lessThanOrEqual" constant="450" id="ZfR-cx-MUB"/> <constraint firstItem="w5l-pw-1ET" firstAttribute="leading" secondItem="a9g-pf-bHy" secondAttribute="leading" id="bbd-5D-5So"/> - <constraint firstItem="RHx-cL-CV5" firstAttribute="centerX" secondItem="a9g-pf-bHy" secondAttribute="centerX" id="bmE-qo-8aJ"/> <constraint firstItem="ZxT-mA-1xU" firstAttribute="centerX" secondItem="a9g-pf-bHy" secondAttribute="centerX" id="ls1-Ze-LXF"/> - <constraint firstAttribute="trailing" secondItem="RHx-cL-CV5" secondAttribute="trailing" constant="15" id="pgj-7m-5gr"/> - <constraint firstAttribute="bottom" secondItem="RHx-cL-CV5" secondAttribute="bottom" id="z8B-uv-Vcb"/> + <constraint firstItem="GLe-dt-klX" firstAttribute="leading" secondItem="a9g-pf-bHy" secondAttribute="leading" id="pV1-kv-bgK"/> + <constraint firstAttribute="trailing" secondItem="GLe-dt-klX" secondAttribute="trailing" id="yvd-I6-nyo"/> </constraints> </view> </subviews> + <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> <constraints> <constraint firstAttribute="bottom" secondItem="a9g-pf-bHy" secondAttribute="bottom" constant="30" id="YHm-ET-yjX"/> @@ -258,18 +155,10 @@ <constraint firstItem="a9g-pf-bHy" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="uv2-qL-KQX"/> </constraints> <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/> - <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/> <point key="canvasLocation" x="32.799999999999997" y="111.54422788605699"/> </view> </objects> <resources> - <image name="audio_running" width="24" height="24"/> - <image name="call_button" width="29" height="29"/> - <image name="dialpad" width="37.5" height="37.5"/> - <image name="disable_speakerphone" width="24" height="24"/> - <image name="pause_call" width="24" height="24"/> <image name="stop_call" width="24" height="24"/> - <image name="switch_camera" width="25" height="25"/> - <image name="video_running" width="29" height="29"/> </resources> </document> diff --git a/Ring/Ring/Calls/CallViewController.storyboard b/Ring/Ring/Calls/CallViewController.storyboard index 270c5bbaa19389dc37164bc0ef280d0acd9bd9f2..cc7f026f88419fa585b0958ab068973719b3a143 100644 --- a/Ring/Ring/Calls/CallViewController.storyboard +++ b/Ring/Ring/Calls/CallViewController.storyboard @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16097.3" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="ngv-XP-7A7"> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="ngv-XP-7A7"> <device id="retina5_9" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17703"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> @@ -76,7 +76,7 @@ <rect key="frame" x="0.0" y="0.0" width="375" height="110"/> <subviews> <stackView opaque="NO" contentMode="scaleToFill" distribution="fillProportionally" alignment="center" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="MdN-dF-4x3"> - <rect key="frame" x="20" y="0.0" width="80" height="30"/> + <rect key="frame" x="20" y="0.0" width="139.66666666666666" height="30"/> <subviews> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="GF7-hD-E63"> <rect key="frame" x="0.0" y="0.0" width="30" height="30"/> @@ -99,43 +99,19 @@ </userDefinedRuntimeAttribute> </userDefinedRuntimeAttributes> </button> - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hqW-Ju-HZo"> - <rect key="frame" x="50" y="0.0" width="30" height="30"/> - <constraints> - <constraint firstAttribute="width" constant="30" id="kyI-mi-4Mx"/> - <constraint firstAttribute="height" constant="30" id="loU-Q4-KDy"/> - </constraints> - <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - <state key="normal" backgroundImage="add_person"/> - <userDefinedRuntimeAttributes> - <userDefinedRuntimeAttribute type="boolean" keyPath="roundedCorners" value="NO"/> - <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius"> - <real key="value" value="0.0"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="number" keyPath="borderWidth"> - <real key="value" value="0.0"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="color" keyPath="borderColor"> - <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - </userDefinedRuntimeAttribute> - </userDefinedRuntimeAttributes> - <connections> - <action selector="addParticipant:" destination="ngv-XP-7A7" eventType="touchUpInside" id="Zl2-p2-TvE"/> - </connections> - </button> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cgd-Wa-clf"> + <rect key="frame" x="50.000000000000007" y="0.0" width="89.666666666666686" height="30"/> + <fontDescription key="fontDescription" type="system" pointSize="23"/> + <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + <nil key="highlightedColor"/> + </label> </subviews> <constraints> <constraint firstAttribute="height" constant="30" id="7GR-7Z-Jln"/> </constraints> </stackView> - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cgd-Wa-clf"> - <rect key="frame" x="20" y="50" width="0.0" height="0.0"/> - <fontDescription key="fontDescription" type="system" pointSize="23"/> - <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - <nil key="highlightedColor"/> - </label> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="00:00" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fac-lR-4on"> - <rect key="frame" x="19.999999999999996" y="70" width="54.666666666666657" height="24"/> + <rect key="frame" x="19.999999999999996" y="50" width="52.666666666666657" height="24"/> <fontDescription key="fontDescription" type="system" weight="light" pointSize="20"/> <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> @@ -143,11 +119,9 @@ </subviews> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> <constraints> - <constraint firstItem="fac-lR-4on" firstAttribute="top" secondItem="cgd-Wa-clf" secondAttribute="bottom" constant="20" id="EPP-y7-0sa"/> - <constraint firstItem="MdN-dF-4x3" firstAttribute="leading" secondItem="cgd-Wa-clf" secondAttribute="leading" id="Fz1-da-ydk"/> - <constraint firstItem="cgd-Wa-clf" firstAttribute="top" secondItem="MdN-dF-4x3" secondAttribute="bottom" constant="20" id="Jad-eC-Ybu"/> + <constraint firstItem="fac-lR-4on" firstAttribute="top" secondItem="MdN-dF-4x3" secondAttribute="bottom" constant="20" id="1ja-6Q-FJk"/> <constraint firstItem="MdN-dF-4x3" firstAttribute="top" secondItem="z3c-S7-uGw" secondAttribute="top" id="TVu-Mv-p0D"/> - <constraint firstItem="fac-lR-4on" firstAttribute="leading" secondItem="cgd-Wa-clf" secondAttribute="leading" id="l6h-Qa-Epk"/> + <constraint firstItem="fac-lR-4on" firstAttribute="leading" secondItem="MdN-dF-4x3" secondAttribute="leading" id="cJ6-kf-a3T"/> </constraints> </view> </subviews> @@ -209,7 +183,6 @@ </subviews> <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> <constraints> - <constraint firstItem="cgd-Wa-clf" firstAttribute="trailing" relation="lessThanOrEqual" secondItem="ZK1-Be-lcD" secondAttribute="leading" priority="999" constant="-7" id="1p9-dp-14p"/> <constraint firstItem="DMu-Or-dd7" firstAttribute="centerX" secondItem="ZVy-nB-bKJ" secondAttribute="centerX" id="2Lu-4b-uBO"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="3RN-4M-qR4" secondAttribute="trailing" identifier="InfoContainerTrailingConstraint" id="5V0-5o-h5c"/> <constraint firstItem="Zmp-OX-Cez" firstAttribute="height" secondItem="DMu-Or-dd7" secondAttribute="height" id="6ZM-UX-wEQ"/> @@ -233,10 +206,10 @@ </constraints> </view> <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" placeholderIntrinsicWidth="375" placeholderIntrinsicHeight="128" alwaysBounceHorizontal="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bij-Xb-EKH"> - <rect key="frame" x="10" y="856" width="365" height="300"/> + <rect key="frame" x="0.0" y="856" width="375" height="300"/> <subviews> <stackView opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" distribution="equalSpacing" alignment="top" spacing="40" translatesAutoresizingMaskIntoConstraints="NO" id="7G0-Fp-Xc3"> - <rect key="frame" x="10" y="10" width="345" height="260"/> + <rect key="frame" x="10" y="10" width="355" height="260"/> </stackView> </subviews> <constraints> @@ -250,69 +223,6 @@ <constraint firstItem="7G0-Fp-Xc3" firstAttribute="height" secondItem="bij-Xb-EKH" secondAttribute="height" constant="-40" id="xAL-yn-Zen"/> </constraints> </scrollView> - <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Y08-2c-sOI"> - <rect key="frame" x="0.0" y="856" width="90" height="90"/> - <subviews> - <visualEffectView opaque="NO" alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="J9A-jr-W2G"> - <rect key="frame" x="0.0" y="3" width="90" height="84"/> - <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="ZkA-ez-mlm"> - <rect key="frame" x="0.0" y="0.0" width="90" height="84"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <subviews> - <visualEffectView opaque="NO" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="EMj-da-ljj"> - <rect key="frame" x="0.0" y="0.0" width="10" height="0.0"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="cjm-hE-jSP"> - <rect key="frame" x="0.0" y="0.0" width="10" height="0.0"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - </view> - <vibrancyEffect> - <blurEffect style="regular"/> - </vibrancyEffect> - </visualEffectView> - </subviews> - </view> - <constraints> - <constraint firstAttribute="height" constant="84" id="qjG-Vg-ndR"/> - </constraints> - <blurEffect style="dark"/> - </visualEffectView> - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sMt-dh-EHe"> - <rect key="frame" x="30" y="20" width="30" height="30"/> - <constraints> - <constraint firstAttribute="height" constant="30" id="Doq-cc-WlD"/> - <constraint firstAttribute="width" constant="30" id="fg2-1d-RBx"/> - </constraints> - <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - <state key="normal" backgroundImage="add_person"/> - <userDefinedRuntimeAttributes> - <userDefinedRuntimeAttribute type="boolean" keyPath="roundedCorners" value="NO"/> - <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius"> - <real key="value" value="0.0"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="number" keyPath="borderWidth"> - <real key="value" value="0.0"/> - </userDefinedRuntimeAttribute> - <userDefinedRuntimeAttribute type="color" keyPath="borderColor"> - <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> - </userDefinedRuntimeAttribute> - </userDefinedRuntimeAttributes> - <connections> - <action selector="addParticipant:" destination="ngv-XP-7A7" eventType="touchUpInside" id="iUR-LT-6LX"/> - </connections> - </button> - </subviews> - <constraints> - <constraint firstItem="J9A-jr-W2G" firstAttribute="leading" secondItem="Y08-2c-sOI" secondAttribute="leading" id="5ms-2t-ver"/> - <constraint firstAttribute="trailing" secondItem="J9A-jr-W2G" secondAttribute="trailing" id="KX7-da-OPW"/> - <constraint firstAttribute="width" constant="90" id="Qhq-C7-ode"/> - <constraint firstItem="sMt-dh-EHe" firstAttribute="centerX" secondItem="Y08-2c-sOI" secondAttribute="centerX" id="SoJ-6Y-kuD"/> - <constraint firstAttribute="bottom" secondItem="J9A-jr-W2G" secondAttribute="bottom" constant="3" id="X2U-yZ-tFL"/> - <constraint firstItem="J9A-jr-W2G" firstAttribute="top" secondItem="Y08-2c-sOI" secondAttribute="top" constant="3" id="XAd-Nz-1bC"/> - <constraint firstItem="sMt-dh-EHe" firstAttribute="top" secondItem="Y08-2c-sOI" secondAttribute="top" constant="20" id="cYs-j4-5pj"/> - <constraint firstAttribute="height" constant="90" id="wv5-Q2-hGT"/> - </constraints> - </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5E0-lB-SkS" userLabel="AvatarView"> <rect key="frame" x="0.0" y="0.0" width="375" height="812"/> <subviews> @@ -403,12 +313,12 @@ </constraints> </view> </subviews> + <viewLayoutGuide key="safeArea" id="lZI-X0-bkP"/> <constraints> <constraint firstItem="5E0-lB-SkS" firstAttribute="top" secondItem="ZVy-nB-bKJ" secondAttribute="top" id="1PH-hE-Wgj"/> <constraint firstItem="ZK1-Be-lcD" firstAttribute="leading" relation="lessThanOrEqual" secondItem="lZI-X0-bkP" secondAttribute="trailing" constant="-25" id="5UD-4Q-iDL"/> <constraint firstItem="LK6-u0-eLU" firstAttribute="leading" secondItem="QpJ-Sx-9dG" secondAttribute="leading" id="6Ed-ct-5WE"/> - <constraint firstItem="cgd-Wa-clf" firstAttribute="leading" secondItem="lZI-X0-bkP" secondAttribute="leading" constant="20" id="9mi-XD-xLe"/> - <constraint firstItem="bij-Xb-EKH" firstAttribute="leading" secondItem="Y08-2c-sOI" secondAttribute="trailing" constant="-80" id="Ctl-wi-6oV"/> + <constraint firstItem="bij-Xb-EKH" firstAttribute="leading" secondItem="ZVy-nB-bKJ" secondAttribute="leading" id="77F-7w-YAb"/> <constraint firstItem="ZVy-nB-bKJ" firstAttribute="height" secondItem="QpJ-Sx-9dG" secondAttribute="height" id="DB0-aS-tKo"/> <constraint firstItem="LK6-u0-eLU" firstAttribute="width" secondItem="QpJ-Sx-9dG" secondAttribute="width" id="Eep-Jy-4aG"/> <constraint firstItem="3RN-4M-qR4" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="ZVy-nB-bKJ" secondAttribute="leading" id="ElV-U4-tpk"/> @@ -417,7 +327,6 @@ <constraint firstItem="lZI-X0-bkP" firstAttribute="top" secondItem="3RN-4M-qR4" secondAttribute="top" id="G1C-hv-89U"/> <constraint firstItem="5E0-lB-SkS" firstAttribute="centerX" secondItem="lZI-X0-bkP" secondAttribute="centerX" id="INh-Ix-uWw"/> <constraint firstItem="5E0-lB-SkS" firstAttribute="height" secondItem="QpJ-Sx-9dG" secondAttribute="height" id="KFS-O1-Acs"/> - <constraint firstItem="bij-Xb-EKH" firstAttribute="top" secondItem="Y08-2c-sOI" secondAttribute="top" id="MYo-iI-3Pl"/> <constraint firstItem="ZVy-nB-bKJ" firstAttribute="top" secondItem="QpJ-Sx-9dG" secondAttribute="top" id="NrK-DR-BPG"/> <constraint firstItem="lZI-X0-bkP" firstAttribute="top" secondItem="ZK1-Be-lcD" secondAttribute="top" constant="45" id="Uew-ao-q8k"/> <constraint firstItem="lZI-X0-bkP" firstAttribute="trailing" secondItem="bij-Xb-EKH" secondAttribute="trailing" id="W2C-XA-mUT"/> @@ -425,12 +334,11 @@ <constraint firstItem="ZVy-nB-bKJ" firstAttribute="centerY" secondItem="QpJ-Sx-9dG" secondAttribute="centerY" id="bAN-gX-nPE"/> <constraint firstAttribute="bottom" secondItem="LK6-u0-eLU" secondAttribute="bottom" id="dXj-zI-fQb"/> <constraint firstItem="ZVy-nB-bKJ" firstAttribute="centerX" secondItem="lZI-X0-bkP" secondAttribute="centerX" id="ff0-Nw-f2Y"/> - <constraint firstItem="Y08-2c-sOI" firstAttribute="leading" secondItem="lZI-X0-bkP" secondAttribute="leading" id="ly2-SN-MgX"/> <constraint firstItem="bij-Xb-EKH" firstAttribute="top" secondItem="ZK1-Be-lcD" secondAttribute="bottom" id="pgr-29-Lef"/> <constraint firstItem="5E0-lB-SkS" firstAttribute="width" secondItem="QpJ-Sx-9dG" secondAttribute="width" id="rOQ-In-yON"/> <constraint firstItem="ZVy-nB-bKJ" firstAttribute="width" secondItem="QpJ-Sx-9dG" secondAttribute="width" id="sCh-Gw-iu0"/> + <constraint firstItem="MdN-dF-4x3" firstAttribute="leading" secondItem="lZI-X0-bkP" secondAttribute="leading" constant="20" id="tsz-q2-iDb"/> </constraints> - <viewLayoutGuide key="safeArea" id="lZI-X0-bkP"/> <variation key="default"> <mask key="constraints"> <exclude reference="FbU-xz-BkQ"/> @@ -464,12 +372,10 @@ <outlet property="capturedVideoTrailingConstraint" destination="ugJ-SF-Enn" id="Xlm-dP-U9Y"/> <outlet property="capturedVideoWidthConstraint" destination="uTd-rs-MJH" id="4Fc-ot-W4i"/> <outlet property="conferenceCalls" destination="7G0-Fp-Xc3" id="KSO-wf-OJy"/> - <outlet property="conferenceCallsLeading" destination="Ctl-wi-6oV" id="osm-Po-RqY"/> <outlet property="conferenceCallsScrolView" destination="bij-Xb-EKH" id="YxK-ru-kO4"/> <outlet property="conferenceCallsTop" destination="pgr-29-Lef" id="Wug-zj-y0Q"/> <outlet property="conferenceLayout" destination="BOE-du-fSU" id="tCL-dC-2dy"/> <outlet property="durationLabel" destination="zMN-6z-uXT" id="Uuf-ph-lrC"/> - <outlet property="inConferenceAddContactButton" destination="Y08-2c-sOI" id="4TF-6J-FAp"/> <outlet property="incomingVideo" destination="DMu-Or-dd7" id="ogh-ft-54u"/> <outlet property="infoBlurEffect" destination="zuX-Zf-IN1" id="hAl-Rg-hPM"/> <outlet property="infoBottomLabel" destination="SdV-jx-Mla" id="yX9-em-p4w"/> @@ -493,7 +399,6 @@ </scene> </scenes> <resources> - <image name="add_person" width="24" height="24"/> <image name="ic_back" width="24" height="24"/> <image name="ic_contact_picture" width="170.66667175292969" height="170.66667175292969"/> <image name="left_arrow" width="48" height="48"/> diff --git a/Ring/Ring/Calls/CallViewController.swift b/Ring/Ring/Calls/CallViewController.swift index 2943e042a66b42fbb5ab6ac15dcb0b1b9666e5ba..e6112884b6a4df599239fe6ef16f3945169612fa 100644 --- a/Ring/Ring/Calls/CallViewController.swift +++ b/Ring/Ring/Calls/CallViewController.swift @@ -49,7 +49,6 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased, Con @IBOutlet weak var capturedVideoBlurEffect: UIVisualEffectView! @IBOutlet weak var viewCapturedVideo: UIView! @IBOutlet private weak var infoContainer: UIView! - //@IBOutlet private weak var callProfileImage: UIImageView! @IBOutlet private weak var callNameLabel: UILabel! @IBOutlet private weak var callInfoTimerLabel: UILabel! @IBOutlet private weak var buttonsContainer: ButtonsContainerView! @@ -74,8 +73,6 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased, Con @IBOutlet weak var conferenceLayout: ConferenceLayout! @IBOutlet weak var sendMessageButton: UIButton! - @IBOutlet weak var inConferenceAddContactButton: UIView! - @IBOutlet weak var conferenceCallsLeading: NSLayoutConstraint! @IBOutlet weak var conferenceCallsTop: NSLayoutConstraint! var viewModel: CallViewModel! @@ -124,7 +121,6 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased, Con UIApplication.shared.isIdleTimerDisabled = true initCallAnimation() self.configureConferenceLayout() - self.inConferenceAddContactButton.isHidden = !self.viewModel.conferenceMode.value if callCurrent { self.capturedVideoBlurEffect.alpha = 1 hideCapturedVideo() @@ -146,14 +142,6 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased, Con buttonsStackView.isHidden = self.viewModel.isBoothMode() } - @IBAction func addParticipant(_ sender: Any) { - let children = self.children - for child in children where child.isKind(of: (ContactPickerViewController).self) { - return - } - self.viewModel.showContactPickerVC() - } - func addTapGesture() { self.mainView.addGestureRecognizer(tapGestureRecognizer) } @@ -237,19 +225,16 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased, Con self?.removeFromScreen() }) .disposed(by: self.disposeBag) - self.sendMessageButton.rx.tap + self.buttonsContainer.stopButton.rx.tap .subscribe(onNext: { [weak self] in - self?.viewModel.showConversations() - self?.dismiss(animated: false, completion: nil) + self?.viewModel.cancelCall(stopProvider: true) + self?.removeFromScreen() }) .disposed(by: self.disposeBag) - - self.buttonsContainer.acceptCallButton.rx.tap + self.sendMessageButton.rx.tap .subscribe(onNext: { [weak self] in - guard let self = self else { return } - self.viewModel.answerCall() - .subscribe() - .disposed(by: self.disposeBag) + self?.viewModel.showConversations() + self?.dismiss(animated: false, completion: nil) }) .disposed(by: self.disposeBag) @@ -290,7 +275,16 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased, Con self?.viewModel.switchSpeaker() }) .disposed(by: self.disposeBag) - + self.buttonsContainer.addParticipantButton.rx.tap + .subscribe(onNext: { [weak self] in + guard let self = self else { return } + let children = self.children + for child in children where child.isKind(of: (ContactPickerViewController).self) { + return + } + self.viewModel.showContactPickerVC() + }) + .disposed(by: self.disposeBag) //Data bindings self.viewModel.videoButtonState .observeOn(MainScheduler.instance) @@ -356,8 +350,6 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased, Con if self?.viewModel.isAudioOnly ?? true { self?.buttonContainerHeightConstraint.constant = 200 self?.buttonsContainer.containerHeightConstraint.constant = 200 - self?.buttonsContainer.stackViewYConstraint.constant = 110 - self?.buttonsContainer.stackViewWidthConstraint.priority = UILayoutPriority(rawValue: 999) UIView.animate(withDuration: 0.3, animations: { self?.durationLabel.alpha = 1 self?.buttonsContainer.stackView.alpha = 1 @@ -461,25 +453,23 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased, Con self?.buttonsContainer.updateView() self?.infoContainer.isHidden = enteredConference ? true : false self?.resizeCapturedVideo(withInfoContainer: false) - self?.inConferenceAddContactButton.isHidden = !enteredConference - self?.conferenceCallsLeading.constant = enteredConference ? 0 : -80 // if entered conference add first participant to conference list if enteredConference { self?.removeConferenceParticipantMenu() guard let injectionBag = self?.viewModel.injectionBag else { return } // add self as a master call - let masterCallView = + let mainCallView = ConferenceParticipantView(frame: CGRect(x: 0, y: 0, width: inConfViewWidth, height: inConfViewHeight)) - let masterCallViewModel = + let mainCallViewModel = ConferenceParticipantViewModel(with: nil, injectionBag: injectionBag) - masterCallView.viewModel = masterCallViewModel - masterCallView.delegate = self - self?.conferenceCalls.insertArrangedSubview(masterCallView, at: 0) + mainCallView.viewModel = mainCallViewModel + mainCallView.delegate = self + self?.conferenceCalls.insertArrangedSubview(mainCallView, at: 0) let callView = ConferenceParticipantView(frame: CGRect(x: 0, y: 0, @@ -642,6 +632,7 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased, Con DispatchQueue.main.async { [weak self] in //guard let hidden = self?.infoContainer.isHidden else {return} self?.resizeCapturedVideo(withInfoContainer: false) + self?.buttonsContainer.updateView() if UIDevice.current.hasNotch && (UIDevice.current.orientation == .landscapeRight || UIDevice.current.orientation == .landscapeLeft) && self?.infoContainer.isHidden == false { self?.buttonsContainerBottomConstraint.constant = 1 } @@ -733,7 +724,6 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased, Con self.infoContainer.isHidden = false } else { self.conferenceCallsScrolView.isHidden = false - self.inConferenceAddContactButton.isHidden = false } self.view.layoutIfNeeded() @@ -763,7 +753,6 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased, Con self?.infoContainer.isHidden = true } else { self?.conferenceCallsScrolView.isHidden = true - self?.inConferenceAddContactButton.isHidden = true } self?.buttonsContainer.isHidden = true }) diff --git a/Ring/Ring/Calls/Conference/ContactPickerViewController.swift b/Ring/Ring/Calls/Conference/ContactPickerViewController.swift index 1ceca8c4388571912b9e846008c5ce9ba43d0146..6141e7aec254bc873a0f7696133998c81db6d43e 100644 --- a/Ring/Ring/Calls/Conference/ContactPickerViewController.swift +++ b/Ring/Ring/Calls/Conference/ContactPickerViewController.swift @@ -141,7 +141,7 @@ class ContactPickerViewController: UIViewController, StoryboardBased, ViewModelB var contact = contactItem.contacts.first! cell.nameLabel.text = contact.firstLine - cell.lastMessagePreviewLabel?.text = contact.secondLine + cell.lastMessagePreviewLabel?.isHidden = true var imageData: Data? if let contactProfile = contact.profile, let photo = contactProfile.photo,