diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2020-07-29 14:45:48 +0300 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2020-07-30 09:50:25 +0300 |
| commit | 206cd3aed968e6cec294ab36741097b4eae7c7c1 (patch) | |
| tree | 8f12a4133e8d18b892f3de9bc89f41e8521f0a2e | |
| parent | 3abddf418d2878095c971dd726154dad99dd5ce2 (diff) | |
| download | mullvadvpn-206cd3aed968e6cec294ab36741097b4eae7c7c1.tar.xz mullvadvpn-206cd3aed968e6cec294ab36741097b4eae7c7c1.zip | |
Add DisconnectSplitButton
| -rw-r--r-- | ios/MullvadVPN.xcodeproj/project.pbxproj | 8 | ||||
| -rw-r--r-- | ios/MullvadVPN/DisconnectSplitButton.swift | 53 | ||||
| -rw-r--r-- | ios/MullvadVPN/DisconnectSplitButton.xib | 100 |
3 files changed, 161 insertions, 0 deletions
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj index 618e5b370e..0c188fa520 100644 --- a/ios/MullvadVPN.xcodeproj/project.pbxproj +++ b/ios/MullvadVPN.xcodeproj/project.pbxproj @@ -105,6 +105,8 @@ 5888AD87227B17950051EB06 /* SelectLocationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5888AD86227B17950051EB06 /* SelectLocationController.swift */; }; 588D2FE3248AC27F00E313F7 /* AsyncOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E973DD24850EB600096F90 /* AsyncOperation.swift */; }; 58906DE02445C7A5002F0673 /* NEProviderStopReason+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58906DDF2445C7A5002F0673 /* NEProviderStopReason+Debug.swift */; }; + 58907D9324D167B400CFC3F5 /* DisconnectSplitButton.xib in Resources */ = {isa = PBXBuildFile; fileRef = 58907D9224D167B400CFC3F5 /* DisconnectSplitButton.xib */; }; + 58907D9524D17B4E00CFC3F5 /* DisconnectSplitButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58907D9424D17B4E00CFC3F5 /* DisconnectSplitButton.swift */; }; 5896AE7E246ACE65005B36CB /* KeychainAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FAEDEB245059F000CB0F5B /* KeychainAttributes.swift */; }; 5896AE7F246ACE76005B36CB /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FAEDF6245088E100CB0F5B /* Keychain.swift */; }; 5896AE80246ACE79005B36CB /* KeychainClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FAEE0024533A9C00CB0F5B /* KeychainClass.swift */; }; @@ -297,6 +299,8 @@ 5888AD82227B11080051EB06 /* SelectLocationCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectLocationCell.swift; sourceTree = "<group>"; }; 5888AD86227B17950051EB06 /* SelectLocationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectLocationController.swift; sourceTree = "<group>"; }; 58906DDF2445C7A5002F0673 /* NEProviderStopReason+Debug.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NEProviderStopReason+Debug.swift"; sourceTree = "<group>"; }; + 58907D9224D167B400CFC3F5 /* DisconnectSplitButton.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DisconnectSplitButton.xib; sourceTree = "<group>"; }; + 58907D9424D17B4E00CFC3F5 /* DisconnectSplitButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisconnectSplitButton.swift; sourceTree = "<group>"; }; 5894E725236B2801008A2793 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; 5896AE83246D5889005B36CB /* CustomDateComponentsFormatting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomDateComponentsFormatting.swift; sourceTree = "<group>"; }; 5896AE85246D6AD8005B36CB /* CustomDateComponentsFormattingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomDateComponentsFormattingTests.swift; sourceTree = "<group>"; }; @@ -502,6 +506,8 @@ 5896AE83246D5889005B36CB /* CustomDateComponentsFormatting.swift */, 582BB1B0229569620055B6EF /* CustomNavigationBar.swift */, 58C6B35D22BBBFE3003C19AD /* Data+HexCoding.swift */, + 58907D9424D17B4E00CFC3F5 /* DisconnectSplitButton.swift */, + 58907D9224D167B400CFC3F5 /* DisconnectSplitButton.xib */, 58B9EB142489139B00095626 /* DisplayChainedError.swift */, 5873884C239E6D7E00E96C4E /* EmbeddedViewContainerView.swift */, 58F3C0A3249CB069003E76BE /* HeaderBarView.swift */, @@ -792,6 +798,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 58907D9324D167B400CFC3F5 /* DisconnectSplitButton.xib in Resources */, 58F3C0A2249CA1E0003E76BE /* HeaderBarView.xib in Resources */, 58F3C0A624A50157003E76BE /* relays.json in Resources */, 58CE5E6E224146210008646E /* LaunchScreen.storyboard in Resources */, @@ -926,6 +933,7 @@ 580EE20924B3224200F9D8A1 /* RetryOperation.swift in Sources */, 582AE3102440A6CA00E6733A /* AccountTokenInput.swift in Sources */, 58FAEDF7245088E100CB0F5B /* Keychain.swift in Sources */, + 58907D9524D17B4E00CFC3F5 /* DisconnectSplitButton.swift in Sources */, 5888AD87227B17950051EB06 /* SelectLocationController.swift in Sources */, 580EE20424B321EC00F9D8A1 /* OperationObserver.swift in Sources */, 58F19E35228C15BA00C7710B /* SpinnerActivityIndicatorView.swift in Sources */, diff --git a/ios/MullvadVPN/DisconnectSplitButton.swift b/ios/MullvadVPN/DisconnectSplitButton.swift new file mode 100644 index 0000000000..4e1357c57c --- /dev/null +++ b/ios/MullvadVPN/DisconnectSplitButton.swift @@ -0,0 +1,53 @@ +// +// DisconnectSplitButton.swift +// MullvadVPN +// +// Created by pronebird on 29/07/2020. +// Copyright © 2020 Mullvad VPN AB. All rights reserved. +// + +import Foundation +import UIKit + +class DisconnectSplitButton: UIView { + @IBOutlet var contentView: UIView! + @IBOutlet var primaryButton: AppButton! + @IBOutlet var secondaryButton: AppButton! + + init(bundle: Bundle?) { + super.init(frame: .zero) + + loadFromNib(bundle: bundle) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func loadFromNib(bundle: Bundle?) { + let nib = UINib(nibName: "DisconnectSplitButton", bundle: bundle) + _ = nib.instantiate(withOwner: self, options: nil) + + contentView.translatesAutoresizingMaskIntoConstraints = false + addSubview(contentView) + + NSLayoutConstraint.activate([ + contentView.leadingAnchor.constraint(equalTo: leadingAnchor), + contentView.trailingAnchor.constraint(equalTo: trailingAnchor), + contentView.topAnchor.constraint(equalTo: topAnchor), + contentView.bottomAnchor.constraint(equalTo: bottomAnchor) + ]) + } + + override func layoutSubviews() { + super.layoutSubviews() + + adjustTitleLabelPosition() + } + + private func adjustTitleLabelPosition() { + let offset = secondaryButton.frame.width + AppButton.defaultContentInsets.left + + primaryButton.contentEdgeInsets.left = offset + } +} diff --git a/ios/MullvadVPN/DisconnectSplitButton.xib b/ios/MullvadVPN/DisconnectSplitButton.xib new file mode 100644 index 0000000000..d8a898846f --- /dev/null +++ b/ios/MullvadVPN/DisconnectSplitButton.xib @@ -0,0 +1,100 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> + <device id="retina6_1" orientation="portrait" appearance="light"/> + <dependencies> + <deployment identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <objects> + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="DisconnectSplitButton" customModule="MullvadVPN" customModuleProvider="target"> + <connections> + <outlet property="contentView" destination="iN0-l3-epB" id="l9N-3B-7an"/> + <outlet property="primaryButton" destination="PD0-Fv-22K" id="dSp-cI-IXZ"/> + <outlet property="secondaryButton" destination="2ka-zL-tZX" id="U5c-9n-CJD"/> + </connections> + </placeholder> + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> + <view contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="iN0-l3-epB"> + <rect key="frame" x="0.0" y="0.0" width="420" height="50"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <stackView opaque="NO" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" spacing="1" translatesAutoresizingMaskIntoConstraints="NO" id="LYA-qF-TWz"> + <rect key="frame" x="0.0" y="0.0" width="420" height="50"/> + <subviews> + <visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gDt-Zi-SNP" customClass="TranslucentButtonBlurView" customModule="MullvadVPN" customModuleProvider="target"> + <rect key="frame" x="0.0" y="0.0" width="369" height="50"/> + <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="Z5z-dl-BIA"> + <rect key="frame" x="0.0" y="0.0" width="369" height="50"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="PD0-Fv-22K" userLabel="Primary Button" customClass="AppButton" customModule="MullvadVPN" customModuleProvider="target"> + <rect key="frame" x="0.0" y="0.0" width="369" height="50"/> + <state key="normal" title="Button"/> + <userDefinedRuntimeAttributes> + <userDefinedRuntimeAttribute type="number" keyPath="interfaceBuilderStyle"> + <integer key="value" value="5"/> + </userDefinedRuntimeAttribute> + </userDefinedRuntimeAttributes> + </button> + </subviews> + <constraints> + <constraint firstAttribute="trailing" secondItem="PD0-Fv-22K" secondAttribute="trailing" id="0sb-IJ-x0M"/> + <constraint firstItem="PD0-Fv-22K" firstAttribute="leading" secondItem="Z5z-dl-BIA" secondAttribute="leading" id="Ah6-1f-VuI"/> + <constraint firstItem="PD0-Fv-22K" firstAttribute="top" secondItem="Z5z-dl-BIA" secondAttribute="top" id="gfC-T2-1NN"/> + <constraint firstAttribute="bottom" secondItem="PD0-Fv-22K" secondAttribute="bottom" id="nto-wB-nPC"/> + </constraints> + </view> + <blurEffect style="regular"/> + </visualEffectView> + <visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XyY-R3-ytQ" customClass="TranslucentButtonBlurView" customModule="MullvadVPN" customModuleProvider="target"> + <rect key="frame" x="370" y="0.0" width="50" height="50"/> + <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="N0x-Hd-Pi6"> + <rect key="frame" x="0.0" y="0.0" width="50" height="50"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <button opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" horizontalCompressionResistancePriority="50" verticalCompressionResistancePriority="50" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="2ka-zL-tZX" userLabel="Secondary Button" customClass="AppButton" customModule="MullvadVPN" customModuleProvider="target"> + <rect key="frame" x="0.0" y="0.0" width="50" height="50"/> + <constraints> + <constraint firstAttribute="width" secondItem="2ka-zL-tZX" secondAttribute="height" multiplier="1:1" id="oBq-BR-iqo"/> + </constraints> + <state key="normal" title="Button" image="IconReload"/> + <userDefinedRuntimeAttributes> + <userDefinedRuntimeAttribute type="number" keyPath="interfaceBuilderStyle"> + <integer key="value" value="6"/> + </userDefinedRuntimeAttribute> + </userDefinedRuntimeAttributes> + </button> + </subviews> + <constraints> + <constraint firstAttribute="bottom" secondItem="2ka-zL-tZX" secondAttribute="bottom" id="3Sh-gX-GkA"/> + <constraint firstItem="2ka-zL-tZX" firstAttribute="leading" secondItem="N0x-Hd-Pi6" secondAttribute="leading" id="6ts-lS-vm6"/> + <constraint firstItem="2ka-zL-tZX" firstAttribute="top" secondItem="N0x-Hd-Pi6" secondAttribute="top" id="8HK-t6-YVW"/> + <constraint firstAttribute="trailing" secondItem="2ka-zL-tZX" secondAttribute="trailing" id="rvn-tI-FOp"/> + </constraints> + </view> + <blurEffect style="regular"/> + </visualEffectView> + </subviews> + <constraints> + <constraint firstItem="2ka-zL-tZX" firstAttribute="height" secondItem="PD0-Fv-22K" secondAttribute="height" id="3cN-0n-7HF"/> + </constraints> + </stackView> + </subviews> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + <constraints> + <constraint firstItem="LYA-qF-TWz" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="2kj-go-VNG"/> + <constraint firstAttribute="bottom" secondItem="LYA-qF-TWz" secondAttribute="bottom" id="C7Z-zY-N4F"/> + <constraint firstAttribute="trailing" secondItem="LYA-qF-TWz" secondAttribute="trailing" id="L01-AG-HOt"/> + <constraint firstItem="LYA-qF-TWz" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="d9k-Gy-lnD"/> + </constraints> + <nil key="simulatedTopBarMetrics"/> + <nil key="simulatedBottomBarMetrics"/> + <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/> + <point key="canvasLocation" x="142.02898550724638" y="-25.446428571428569"/> + </view> + </objects> + <resources> + <image name="IconReload" width="512" height="512"/> + </resources> +</document> |
