summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2020-07-29 14:45:48 +0300
committerAndrej Mihajlov <and@mullvad.net>2020-07-30 09:50:25 +0300
commit206cd3aed968e6cec294ab36741097b4eae7c7c1 (patch)
tree8f12a4133e8d18b892f3de9bc89f41e8521f0a2e
parent3abddf418d2878095c971dd726154dad99dd5ce2 (diff)
downloadmullvadvpn-206cd3aed968e6cec294ab36741097b4eae7c7c1.tar.xz
mullvadvpn-206cd3aed968e6cec294ab36741097b4eae7c7c1.zip
Add DisconnectSplitButton
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj8
-rw-r--r--ios/MullvadVPN/DisconnectSplitButton.swift53
-rw-r--r--ios/MullvadVPN/DisconnectSplitButton.xib100
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>