summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2020-09-01 18:50:09 +0200
committerAndrej Mihajlov <and@mullvad.net>2020-09-03 19:45:31 +0200
commit5dbd6f48e76bf2459e740ab5538865df50534126 (patch)
tree7b363595350b60f400807b269ee11fefd8e3e1be
parent533a0097a17839c78f2687999fe2be4b467e0422 (diff)
downloadmullvadvpn-5dbd6f48e76bf2459e740ab5538865df50534126.tar.xz
mullvadvpn-5dbd6f48e76bf2459e740ab5538865df50534126.zip
Move WireguardKeysViewController to XIB
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj6
-rw-r--r--ios/MullvadVPN/Base.lproj/Main.storyboard237
-rw-r--r--ios/MullvadVPN/SegueIdentifier.swift1
-rw-r--r--ios/MullvadVPN/SettingsViewController.swift6
-rw-r--r--ios/MullvadVPN/WireguardKeysViewController.swift2
-rw-r--r--ios/MullvadVPN/WireguardKeysViewController.xib259
6 files changed, 269 insertions, 242 deletions
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj
index 8f3cfbd48d..1c73476c2b 100644
--- a/ios/MullvadVPN.xcodeproj/project.pbxproj
+++ b/ios/MullvadVPN.xcodeproj/project.pbxproj
@@ -144,6 +144,7 @@
58B0A2AD238EE6EC00BC001D /* MullvadEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5840250322B11AB700E4CFEC /* MullvadEndpoint.swift */; };
58B8743222B25A7600015324 /* WireguardAssociatedAddresses.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58B8743122B25A7600015324 /* WireguardAssociatedAddresses.swift */; };
58B8743B22B788D200015324 /* PacketTunnelSettingsGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58B8743722B25EAB00015324 /* PacketTunnelSettingsGenerator.swift */; };
+ 58B9814E24FEA70D00C0D59E /* WireguardKeysViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 58B9814D24FEA70D00C0D59E /* WireguardKeysViewController.xib */; };
58B9EB132488ED2100095626 /* AlertPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58B9EB122488ED2100095626 /* AlertPresenter.swift */; };
58B9EB152489139B00095626 /* DisplayChainedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58B9EB142489139B00095626 /* DisplayChainedError.swift */; };
58BA692E23E99EFF009DC256 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BA692D23E99EFF009DC256 /* Locking.swift */; };
@@ -336,6 +337,7 @@
58B0A2A4238EE67E00BC001D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
58B8743122B25A7600015324 /* WireguardAssociatedAddresses.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireguardAssociatedAddresses.swift; sourceTree = "<group>"; };
58B8743722B25EAB00015324 /* PacketTunnelSettingsGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelSettingsGenerator.swift; sourceTree = "<group>"; };
+ 58B9814D24FEA70D00C0D59E /* WireguardKeysViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WireguardKeysViewController.xib; sourceTree = "<group>"; };
58B9EB122488ED2100095626 /* AlertPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertPresenter.swift; sourceTree = "<group>"; };
58B9EB142489139B00095626 /* DisplayChainedError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayChainedError.swift; sourceTree = "<group>"; };
58BA692D23E99EFF009DC256 /* Locking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Locking.swift; sourceTree = "<group>"; };
@@ -579,6 +581,7 @@
5811DE4F239014550011EB53 /* NEVPNStatus+Debug.swift */,
58CC40EE24A601900019D96E /* ObserverList.swift */,
580EE1FF24B3218800F9D8A1 /* Operations */,
+ 583BC70624FE4DC400C9DE04 /* Optional+DispatchQueue.swift */,
5845F841236CBACD00B2D93C /* PacketTunnelIpc.swift */,
58BFA5C522A7C97F00A6173D /* RelayCache.swift */,
58781CC822AE7CA8009B9D8E /* RelayConstraints.swift */,
@@ -612,10 +615,10 @@
581CBCE52296B97300727D7F /* ViewControllerIdentifier.swift */,
58B8743122B25A7600015324 /* WireguardAssociatedAddresses.swift */,
5877152F23981F7B001F8237 /* WireguardKeysViewController.swift */,
+ 58B9814D24FEA70D00C0D59E /* WireguardKeysViewController.xib */,
58C6B35322BB87C4003C19AD /* WireguardPrivateKey.swift */,
58F3C098249B978C003E76BE /* x25519.c */,
58F3C097249B978C003E76BE /* x25519.h */,
- 583BC70624FE4DC400C9DE04 /* Optional+DispatchQueue.swift */,
);
path = MullvadVPN;
sourceTree = "<group>";
@@ -849,6 +852,7 @@
58CE5E6E224146210008646E /* LaunchScreen.storyboard in Resources */,
58CE5E6B224146210008646E /* Assets.xcassets in Resources */,
58CE5E69224146200008646E /* Main.storyboard in Resources */,
+ 58B9814E24FEA70D00C0D59E /* WireguardKeysViewController.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/ios/MullvadVPN/Base.lproj/Main.storyboard b/ios/MullvadVPN/Base.lproj/Main.storyboard
index f2ce083c98..9e01cd6423 100644
--- a/ios/MullvadVPN/Base.lproj/Main.storyboard
+++ b/ios/MullvadVPN/Base.lproj/Main.storyboard
@@ -448,7 +448,6 @@
</navigationItem>
<connections>
<outlet property="staticDataSource" destination="9xf-6a-8vR" id="E8j-Z4-Ljk"/>
- <segue destination="vAK-MJ-h3c" kind="show" identifier="ShowWireguardKeys" id="eDY-gl-kvu"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="sR5-ix-4x7" userLabel="First Responder" sceneMemberID="firstResponder"/>
@@ -460,242 +459,6 @@
</objects>
<point key="canvasLocation" x="1690" y="-832"/>
</scene>
- <!--WireGuard key-->
- <scene sceneID="fcg-jd-GmS">
- <objects>
- <viewController id="vAK-MJ-h3c" customClass="WireguardKeysViewController" customModule="MullvadVPN" customModuleProvider="target" sceneMemberID="viewController">
- <view key="view" contentMode="scaleToFill" id="NHk-FR-Mwy">
- <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
- <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
- <subviews>
- <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fa2-zl-Fc4">
- <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
- <subviews>
- <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5VO-oQ-4jM" userLabel="Container">
- <rect key="frame" x="0.0" y="0.0" width="375" height="295.5"/>
- <subviews>
- <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Lx5-tV-hNL" userLabel="Content">
- <rect key="frame" x="24" y="24" width="327" height="247.5"/>
- <subviews>
- <view contentMode="scaleToFill" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="xch-VD-kOQ" userLabel="Account number">
- <rect key="frame" x="0.0" y="0.0" width="327" height="46"/>
- <subviews>
- <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="CtE-XF-2uJ">
- <rect key="frame" x="0.0" y="0.0" width="327" height="46"/>
- <subviews>
- <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="29J-lm-A4D">
- <rect key="frame" x="0.0" y="0.0" width="327" height="17"/>
- <subviews>
- <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="751" text="Public key" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="riQ-cz-0de">
- <rect key="frame" x="0.0" y="0.0" width="66" height="17"/>
- <fontDescription key="fontDescription" type="system" pointSize="14"/>
- <color key="textColor" white="1" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
- <nil key="highlightedColor"/>
- </label>
- <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Z76-2G-dkn" customClass="EmbeddedViewContainerView" customModule="MullvadVPN" customModuleProvider="target">
- <rect key="frame" x="185" y="0.0" width="142" height="17"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
- <constraints>
- <constraint firstAttribute="width" constant="142" placeholder="YES" id="v4m-dU-J71"/>
- </constraints>
- <connections>
- <outlet property="embeddedView" destination="1Ue-pb-GCu" id="uUI-08-4yA"/>
- </connections>
- </view>
- </subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
- <constraints>
- <constraint firstAttribute="bottom" secondItem="Z76-2G-dkn" secondAttribute="bottom" id="I4r-uc-kgH"/>
- <constraint firstItem="riQ-cz-0de" firstAttribute="leading" secondItem="29J-lm-A4D" secondAttribute="leading" id="TZy-KN-DUR"/>
- <constraint firstAttribute="trailing" secondItem="Z76-2G-dkn" secondAttribute="trailing" id="cto-xJ-P12"/>
- <constraint firstItem="Z76-2G-dkn" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="riQ-cz-0de" secondAttribute="trailing" constant="8" id="kUO-SM-ut1"/>
- <constraint firstItem="riQ-cz-0de" firstAttribute="top" secondItem="29J-lm-A4D" secondAttribute="top" id="pef-9R-fZa"/>
- <constraint firstAttribute="bottom" secondItem="riQ-cz-0de" secondAttribute="bottom" id="sTe-ay-g1z"/>
- <constraint firstItem="Z76-2G-dkn" firstAttribute="top" secondItem="29J-lm-A4D" secondAttribute="top" id="w1K-nl-2QW"/>
- </constraints>
- </view>
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="leading" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="F0p-ra-1bv">
- <rect key="frame" x="0.0" y="25" width="327" height="21"/>
- <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
- <inset key="contentEdgeInsets" minX="0.01" minY="0.0" maxX="1" maxY="0.0"/>
- <state key="normal" title="123456789">
- <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
- </state>
- <connections>
- <action selector="copyPublicKey:" destination="vAK-MJ-h3c" eventType="touchUpInside" id="xqz-Xp-I45"/>
- </connections>
- </button>
- </subviews>
- </stackView>
- </subviews>
- <constraints>
- <constraint firstItem="CtE-XF-2uJ" firstAttribute="top" secondItem="xch-VD-kOQ" secondAttribute="top" id="9pN-dP-gTH"/>
- <constraint firstAttribute="trailing" secondItem="CtE-XF-2uJ" secondAttribute="trailing" id="Kjq-dh-nxS"/>
- <constraint firstAttribute="bottom" secondItem="CtE-XF-2uJ" secondAttribute="bottom" id="coJ-q9-t0B"/>
- <constraint firstItem="CtE-XF-2uJ" firstAttribute="leading" secondItem="xch-VD-kOQ" secondAttribute="leading" id="wHk-cr-fV2"/>
- </constraints>
- </view>
- <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Bjs-D6-NVj" userLabel="Expiry">
- <rect key="frame" x="0.0" y="70" width="327" height="45.5"/>
- <subviews>
- <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="8f3-SD-t3K">
- <rect key="frame" x="0.0" y="0.0" width="327" height="45.5"/>
- <subviews>
- <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Key generated" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FMt-bt-4gy">
- <rect key="frame" x="0.0" y="0.0" width="327" height="17"/>
- <fontDescription key="fontDescription" type="system" pointSize="14"/>
- <color key="textColor" white="1" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
- <nil key="highlightedColor"/>
- </label>
- <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="6 days ago" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsLetterSpacingToFitWidth="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CvU-pV-ixr">
- <rect key="frame" x="0.0" y="25" width="327" height="20.5"/>
- <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
- <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
- <nil key="highlightedColor"/>
- </label>
- </subviews>
- </stackView>
- </subviews>
- <constraints>
- <constraint firstAttribute="bottom" secondItem="8f3-SD-t3K" secondAttribute="bottom" id="Lou-NI-gF9"/>
- <constraint firstAttribute="trailing" secondItem="8f3-SD-t3K" secondAttribute="trailing" id="Xok-g3-2S0"/>
- <constraint firstItem="8f3-SD-t3K" firstAttribute="top" secondItem="Bjs-D6-NVj" secondAttribute="top" id="asr-RD-H6w"/>
- <constraint firstItem="8f3-SD-t3K" firstAttribute="leading" secondItem="Bjs-D6-NVj" secondAttribute="leading" id="fvj-uI-LRp"/>
- </constraints>
- </view>
- <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ydQ-IP-KZb" userLabel="Buttons">
- <rect key="frame" x="0.0" y="139.5" width="327" height="108"/>
- <subviews>
- <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="24" translatesAutoresizingMaskIntoConstraints="NO" id="zF0-5W-t7M">
- <rect key="frame" x="0.0" y="0.0" width="327" height="108"/>
- <subviews>
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="OCa-Jz-b7W" customClass="AppButton" customModule="MullvadVPN" customModuleProvider="target">
- <rect key="frame" x="0.0" y="0.0" width="327" height="42"/>
- <constraints>
- <constraint firstAttribute="height" constant="42" placeholder="YES" id="IpC-KC-l52"/>
- </constraints>
- <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
- <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
- <state key="normal" title="Regenerate key" backgroundImage="SuccessButton"/>
- <connections>
- <action selector="handleRegenerateKey:" destination="vAK-MJ-h3c" eventType="touchUpInside" id="s39-bg-vkG"/>
- </connections>
- </button>
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qEF-8w-MdR" customClass="AppButton" customModule="MullvadVPN" customModuleProvider="target">
- <rect key="frame" x="0.0" y="66" width="327" height="42"/>
- <constraints>
- <constraint firstAttribute="height" constant="42" placeholder="YES" id="299-Lu-yIB"/>
- </constraints>
- <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
- <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
- <state key="normal" title="Verify key" backgroundImage="DefaultButton"/>
- <connections>
- <action selector="handleVerifyKey:" destination="vAK-MJ-h3c" eventType="touchUpInside" id="wGf-5k-Zw2"/>
- </connections>
- </button>
- </subviews>
- </stackView>
- </subviews>
- <constraints>
- <constraint firstAttribute="bottom" secondItem="zF0-5W-t7M" secondAttribute="bottom" id="Hb8-OT-rIo"/>
- <constraint firstAttribute="trailing" secondItem="zF0-5W-t7M" secondAttribute="trailing" id="bO9-9j-LGw"/>
- <constraint firstItem="zF0-5W-t7M" firstAttribute="leading" secondItem="ydQ-IP-KZb" secondAttribute="leading" id="d8z-bR-Gjl"/>
- <constraint firstItem="zF0-5W-t7M" firstAttribute="top" secondItem="ydQ-IP-KZb" secondAttribute="top" id="ylb-xz-fnV"/>
- </constraints>
- </view>
- </subviews>
- <constraints>
- <constraint firstItem="ydQ-IP-KZb" firstAttribute="top" secondItem="Bjs-D6-NVj" secondAttribute="bottom" constant="24" id="37w-fI-zi8"/>
- <constraint firstItem="Bjs-D6-NVj" firstAttribute="top" secondItem="xch-VD-kOQ" secondAttribute="bottom" constant="24" id="8F9-gx-ngL"/>
- <constraint firstAttribute="trailing" secondItem="xch-VD-kOQ" secondAttribute="trailing" id="GLB-vv-DDi"/>
- <constraint firstAttribute="trailing" secondItem="Bjs-D6-NVj" secondAttribute="trailing" id="Hpo-go-tU4"/>
- <constraint firstAttribute="trailing" secondItem="ydQ-IP-KZb" secondAttribute="trailing" id="OwJ-Xb-q8O"/>
- <constraint firstItem="ydQ-IP-KZb" firstAttribute="leading" secondItem="Lx5-tV-hNL" secondAttribute="leading" id="P69-3O-u0S"/>
- <constraint firstItem="Bjs-D6-NVj" firstAttribute="leading" secondItem="Lx5-tV-hNL" secondAttribute="leading" id="Qj6-44-14Q"/>
- <constraint firstItem="xch-VD-kOQ" firstAttribute="leading" secondItem="Lx5-tV-hNL" secondAttribute="leading" id="Y3H-6z-JyF"/>
- <constraint firstAttribute="bottom" secondItem="ydQ-IP-KZb" secondAttribute="bottom" id="aRW-Pg-yg6"/>
- <constraint firstItem="xch-VD-kOQ" firstAttribute="top" secondItem="Lx5-tV-hNL" secondAttribute="top" id="i3j-2f-8vV"/>
- </constraints>
- </view>
- </subviews>
- <constraints>
- <constraint firstAttribute="bottom" secondItem="Lx5-tV-hNL" secondAttribute="bottom" constant="24" id="1sW-Lm-fPs"/>
- <constraint firstItem="Lx5-tV-hNL" firstAttribute="top" secondItem="5VO-oQ-4jM" secondAttribute="top" constant="24" id="6F1-G5-kJW"/>
- <constraint firstAttribute="trailing" secondItem="Lx5-tV-hNL" secondAttribute="trailing" constant="24" id="YZH-zj-zvM"/>
- <constraint firstItem="Lx5-tV-hNL" firstAttribute="leading" secondItem="5VO-oQ-4jM" secondAttribute="leading" constant="24" id="rHz-2D-i6n"/>
- </constraints>
- </view>
- </subviews>
- <constraints>
- <constraint firstItem="5VO-oQ-4jM" firstAttribute="width" secondItem="fa2-zl-Fc4" secondAttribute="width" id="86a-VC-VLn"/>
- <constraint firstAttribute="bottom" secondItem="5VO-oQ-4jM" secondAttribute="bottom" id="ERb-9i-nFf"/>
- <constraint firstItem="5VO-oQ-4jM" firstAttribute="leading" secondItem="fa2-zl-Fc4" secondAttribute="leading" id="KdL-EB-Idq"/>
- <constraint firstItem="5VO-oQ-4jM" firstAttribute="top" secondItem="fa2-zl-Fc4" secondAttribute="top" id="avu-mu-m90"/>
- <constraint firstAttribute="trailing" secondItem="5VO-oQ-4jM" secondAttribute="trailing" id="sUD-Wq-7oa"/>
- </constraints>
- </scrollView>
- </subviews>
- <color key="backgroundColor" name="Secondary"/>
- <constraints>
- <constraint firstItem="fa2-zl-Fc4" firstAttribute="top" secondItem="NHk-FR-Mwy" secondAttribute="top" id="0XS-W3-vV4"/>
- <constraint firstItem="fa2-zl-Fc4" firstAttribute="bottom" secondItem="uHO-zG-HAA" secondAttribute="bottom" id="3Uo-OT-Y0q"/>
- <constraint firstItem="fa2-zl-Fc4" firstAttribute="leading" secondItem="uHO-zG-HAA" secondAttribute="leading" id="4rW-4C-pRs"/>
- <constraint firstItem="fa2-zl-Fc4" firstAttribute="trailing" secondItem="uHO-zG-HAA" secondAttribute="trailing" id="VuC-Wb-6U4"/>
- </constraints>
- <viewLayoutGuide key="safeArea" id="uHO-zG-HAA"/>
- </view>
- <navigationItem key="navigationItem" title="WireGuard key" id="6ve-v7-tYQ"/>
- <connections>
- <outlet property="creationDateLabel" destination="CvU-pV-ixr" id="qSg-Be-sO0"/>
- <outlet property="publicKeyButton" destination="F0p-ra-1bv" id="pZV-nS-lIs"/>
- <outlet property="regenerateKeyButton" destination="OCa-Jz-b7W" id="BZD-Qc-8lO"/>
- <outlet property="verifyKeyButton" destination="qEF-8w-MdR" id="zuU-Ts-QNG"/>
- <outlet property="wireguardKeyStatusView" destination="1Ue-pb-GCu" id="VV8-bG-SgD"/>
- </connections>
- </viewController>
- <placeholder placeholderIdentifier="IBFirstResponder" id="WDa-g6-tXg" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
- <view contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="1Ue-pb-GCu" customClass="WireguardKeyStatusView" customModule="MullvadVPN" customModuleProvider="target">
- <rect key="frame" x="0.0" y="0.0" width="240" height="16"/>
- <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
- <subviews>
- <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="751" text="Key is valid" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ocb-Gs-xuo">
- <rect key="frame" x="0.0" y="0.0" width="240" height="16"/>
- <fontDescription key="fontDescription" type="system" pointSize="14"/>
- <color key="textColor" name="Success"/>
- <nil key="highlightedColor"/>
- </label>
- <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZN9-r7-vKB" customClass="SpinnerActivityIndicatorView" customModule="MullvadVPN" customModuleProvider="target">
- <rect key="frame" x="224" y="0.0" width="16" height="16"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
- <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
- <constraints>
- <constraint firstAttribute="width" secondItem="ZN9-r7-vKB" secondAttribute="height" multiplier="1:1" id="7dm-3X-rB1"/>
- </constraints>
- <userDefinedRuntimeAttributes>
- <userDefinedRuntimeAttribute type="number" keyPath="thickness">
- <real key="value" value="2"/>
- </userDefinedRuntimeAttribute>
- </userDefinedRuntimeAttributes>
- </view>
- </subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
- <constraints>
- <constraint firstItem="ZN9-r7-vKB" firstAttribute="height" secondItem="Ocb-Gs-xuo" secondAttribute="height" id="0GM-ky-aMe"/>
- <constraint firstAttribute="trailing" secondItem="Ocb-Gs-xuo" secondAttribute="trailing" id="C6Q-Ie-omp"/>
- <constraint firstItem="Ocb-Gs-xuo" firstAttribute="leading" secondItem="1Ue-pb-GCu" secondAttribute="leading" id="M7j-bw-5Ye"/>
- <constraint firstAttribute="trailing" secondItem="ZN9-r7-vKB" secondAttribute="trailing" id="YRs-9L-5CY"/>
- <constraint firstItem="ZN9-r7-vKB" firstAttribute="centerY" secondItem="Ocb-Gs-xuo" secondAttribute="centerY" id="d43-KC-IK5"/>
- <constraint firstAttribute="bottom" secondItem="Ocb-Gs-xuo" secondAttribute="bottom" id="ivo-8C-Rj8"/>
- <constraint firstItem="Ocb-Gs-xuo" firstAttribute="top" secondItem="1Ue-pb-GCu" secondAttribute="top" id="kgV-z9-gxp"/>
- </constraints>
- <connections>
- <outlet property="activityIndicator" destination="ZN9-r7-vKB" id="lj5-xB-7Ra"/>
- <outlet property="textLabel" destination="Ocb-Gs-xuo" id="LoV-ls-1BU"/>
- </connections>
- </view>
- </objects>
- <point key="canvasLocation" x="2576.8000000000002" y="-513.19340329835086"/>
- </scene>
<!--Account-->
<scene sceneID="Ca0-W1-eLb">
<objects>
diff --git a/ios/MullvadVPN/SegueIdentifier.swift b/ios/MullvadVPN/SegueIdentifier.swift
index 2edf12abeb..df15be6bd7 100644
--- a/ios/MullvadVPN/SegueIdentifier.swift
+++ b/ios/MullvadVPN/SegueIdentifier.swift
@@ -18,7 +18,6 @@ extension SegueIdentifier {
}
enum Settings: String, SegueConvertible {
- case showWireguardKeys = "ShowWireguardKeys"
case showAccount = "ShowAccount"
}
diff --git a/ios/MullvadVPN/SettingsViewController.swift b/ios/MullvadVPN/SettingsViewController.swift
index 6991202afc..4e625eec17 100644
--- a/ios/MullvadVPN/SettingsViewController.swift
+++ b/ios/MullvadVPN/SettingsViewController.swift
@@ -78,9 +78,9 @@ class SettingsViewController: UITableViewController {
}
wireguardKeyRow.actionBlock = { [weak self] (indexPath) in
- self?.performSegue(
- withIdentifier: SegueIdentifier.Settings.showWireguardKeys.rawValue,
- sender: nil)
+ let controller = WireguardKeysViewController()
+
+ self?.navigationController?.pushViewController(controller, animated: true)
}
self.accountRow = accountRow
diff --git a/ios/MullvadVPN/WireguardKeysViewController.swift b/ios/MullvadVPN/WireguardKeysViewController.swift
index 66cd8abf33..8c0ab1f486 100644
--- a/ios/MullvadVPN/WireguardKeysViewController.swift
+++ b/ios/MullvadVPN/WireguardKeysViewController.swift
@@ -46,6 +46,8 @@ class WireguardKeysViewController: UIViewController, TunnelObserver {
override func viewDidLoad() {
super.viewDidLoad()
+ navigationItem.title = NSLocalizedString("WireGuard key", comment: "Navigation title")
+
TunnelManager.shared.addObserver(self)
updatePublicKey(publicKey: TunnelManager.shared.publicKey, animated: false)
diff --git a/ios/MullvadVPN/WireguardKeysViewController.xib b/ios/MullvadVPN/WireguardKeysViewController.xib
new file mode 100644
index 0000000000..46e0084a49
--- /dev/null
+++ b/ios/MullvadVPN/WireguardKeysViewController.xib
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097.2" 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="Named colors" minToolsVersion="9.0"/>
+ <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="WireguardKeysViewController" customModule="MullvadVPN" customModuleProvider="target">
+ <connections>
+ <outlet property="creationDateLabel" destination="lzi-4c-l9v" id="0Z2-ew-RhM"/>
+ <outlet property="publicKeyButton" destination="bD5-xv-y6Z" id="C0z-zj-s1r"/>
+ <outlet property="regenerateKeyButton" destination="moM-8X-Qyw" id="Lk5-iu-49e"/>
+ <outlet property="verifyKeyButton" destination="aB5-uU-WIR" id="KXV-vp-x6x"/>
+ <outlet property="view" destination="0KT-g1-t9r" id="QAy-jD-drf"/>
+ <outlet property="wireguardKeyStatusView" destination="UWn-xd-nij" id="det-Vn-9ID"/>
+ </connections>
+ </placeholder>
+ <view contentMode="scaleToFill" id="0KT-g1-t9r">
+ <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ef2-EJ-GbD">
+ <rect key="frame" x="0.0" y="0.0" width="414" height="862"/>
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8RA-l5-l5o" userLabel="Container">
+ <rect key="frame" x="0.0" y="0.0" width="414" height="295.5"/>
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nm3-Kj-ONm" userLabel="Content">
+ <rect key="frame" x="24" y="24" width="366" height="247.5"/>
+ <subviews>
+ <view contentMode="scaleToFill" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="TQT-yd-nbI" userLabel="Account number">
+ <rect key="frame" x="0.0" y="0.0" width="366" height="46"/>
+ <subviews>
+ <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="vMc-wW-ggf">
+ <rect key="frame" x="0.0" y="0.0" width="366" height="46"/>
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="OrE-dl-8bW">
+ <rect key="frame" x="0.0" y="0.0" width="366" height="17"/>
+ <subviews>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="751" text="Public key" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="g23-nO-ste">
+ <rect key="frame" x="0.0" y="0.0" width="66" height="17"/>
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <color key="textColor" white="1" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UgW-XB-q8E" customClass="EmbeddedViewContainerView" customModule="MullvadVPN" customModuleProvider="target">
+ <rect key="frame" x="224" y="0.0" width="142" height="17"/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="142" placeholder="YES" id="tdi-3g-eCH"/>
+ </constraints>
+ <connections>
+ <outlet property="embeddedView" destination="UWn-xd-nij" id="DCV-o7-ddF"/>
+ </connections>
+ </view>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <constraints>
+ <constraint firstItem="UgW-XB-q8E" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="g23-nO-ste" secondAttribute="trailing" constant="8" id="L13-rB-Uy0"/>
+ <constraint firstAttribute="trailing" secondItem="UgW-XB-q8E" secondAttribute="trailing" id="YCs-71-hye"/>
+ <constraint firstItem="g23-nO-ste" firstAttribute="leading" secondItem="OrE-dl-8bW" secondAttribute="leading" id="YI1-PR-QX4"/>
+ <constraint firstItem="UgW-XB-q8E" firstAttribute="top" secondItem="OrE-dl-8bW" secondAttribute="top" id="aUr-hg-Omr"/>
+ <constraint firstAttribute="bottom" secondItem="g23-nO-ste" secondAttribute="bottom" id="cPa-1N-3xG"/>
+ <constraint firstAttribute="bottom" secondItem="UgW-XB-q8E" secondAttribute="bottom" id="dEW-6v-kNP"/>
+ <constraint firstItem="g23-nO-ste" firstAttribute="top" secondItem="OrE-dl-8bW" secondAttribute="top" id="r9d-Wb-cDT"/>
+ </constraints>
+ </view>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="leading" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bD5-xv-y6Z">
+ <rect key="frame" x="0.0" y="25" width="366" height="21"/>
+ <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+ <inset key="contentEdgeInsets" minX="0.01" minY="0.0" maxX="1" maxY="0.0"/>
+ <state key="normal" title="123456789">
+ <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </state>
+ <connections>
+ <action selector="copyPublicKey:" destination="-1" eventType="touchUpInside" id="lcS-i9-vnc"/>
+ </connections>
+ </button>
+ </subviews>
+ </stackView>
+ </subviews>
+ <constraints>
+ <constraint firstItem="vMc-wW-ggf" firstAttribute="top" secondItem="TQT-yd-nbI" secondAttribute="top" id="0h8-eE-6HJ"/>
+ <constraint firstAttribute="bottom" secondItem="vMc-wW-ggf" secondAttribute="bottom" id="Biu-i4-kLE"/>
+ <constraint firstItem="vMc-wW-ggf" firstAttribute="leading" secondItem="TQT-yd-nbI" secondAttribute="leading" id="aLi-aW-dRS"/>
+ <constraint firstAttribute="trailing" secondItem="vMc-wW-ggf" secondAttribute="trailing" id="j8I-aY-laA"/>
+ </constraints>
+ </view>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="WE4-cD-dXV" userLabel="Expiry">
+ <rect key="frame" x="0.0" y="70" width="366" height="45.5"/>
+ <subviews>
+ <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="qQz-cx-MJT">
+ <rect key="frame" x="0.0" y="0.0" width="366" height="45.5"/>
+ <subviews>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Key generated" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="017-qu-nUG">
+ <rect key="frame" x="0.0" y="0.0" width="366" height="17"/>
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <color key="textColor" white="1" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="6 days ago" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsLetterSpacingToFitWidth="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lzi-4c-l9v">
+ <rect key="frame" x="0.0" y="25" width="366" height="20.5"/>
+ <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+ <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ </stackView>
+ </subviews>
+ <constraints>
+ <constraint firstAttribute="bottom" secondItem="qQz-cx-MJT" secondAttribute="bottom" id="7CP-kA-aNk"/>
+ <constraint firstItem="qQz-cx-MJT" firstAttribute="leading" secondItem="WE4-cD-dXV" secondAttribute="leading" id="Cdg-Vz-UPX"/>
+ <constraint firstAttribute="trailing" secondItem="qQz-cx-MJT" secondAttribute="trailing" id="aYR-XF-Fm4"/>
+ <constraint firstItem="qQz-cx-MJT" firstAttribute="top" secondItem="WE4-cD-dXV" secondAttribute="top" id="vC6-tk-rlS"/>
+ </constraints>
+ </view>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Rnk-UH-rRP" userLabel="Buttons">
+ <rect key="frame" x="0.0" y="139.5" width="366" height="108"/>
+ <subviews>
+ <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="24" translatesAutoresizingMaskIntoConstraints="NO" id="hTO-tb-TtE">
+ <rect key="frame" x="0.0" y="0.0" width="366" height="108"/>
+ <subviews>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="moM-8X-Qyw" customClass="AppButton" customModule="MullvadVPN" customModuleProvider="target">
+ <rect key="frame" x="0.0" y="0.0" width="366" height="42"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="42" placeholder="YES" id="hcH-5Y-7hH"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
+ <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <state key="normal" title="Regenerate key" backgroundImage="SuccessButton"/>
+ <connections>
+ <action selector="handleRegenerateKey:" destination="-1" eventType="touchUpInside" id="MPC-g8-z3f"/>
+ </connections>
+ </button>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aB5-uU-WIR" customClass="AppButton" customModule="MullvadVPN" customModuleProvider="target">
+ <rect key="frame" x="0.0" y="66" width="366" height="42"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="42" placeholder="YES" id="lzN-hG-dmz"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
+ <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <state key="normal" title="Verify key" backgroundImage="DefaultButton"/>
+ <connections>
+ <action selector="handleVerifyKey:" destination="-1" eventType="touchUpInside" id="tkx-8o-gGK"/>
+ </connections>
+ </button>
+ </subviews>
+ </stackView>
+ </subviews>
+ <constraints>
+ <constraint firstAttribute="bottom" secondItem="hTO-tb-TtE" secondAttribute="bottom" id="XYT-Mh-nOc"/>
+ <constraint firstItem="hTO-tb-TtE" firstAttribute="top" secondItem="Rnk-UH-rRP" secondAttribute="top" id="eLy-gb-ayb"/>
+ <constraint firstItem="hTO-tb-TtE" firstAttribute="leading" secondItem="Rnk-UH-rRP" secondAttribute="leading" id="lBy-5I-ndg"/>
+ <constraint firstAttribute="trailing" secondItem="hTO-tb-TtE" secondAttribute="trailing" id="m07-nv-nWj"/>
+ </constraints>
+ </view>
+ </subviews>
+ <constraints>
+ <constraint firstItem="Rnk-UH-rRP" firstAttribute="top" secondItem="WE4-cD-dXV" secondAttribute="bottom" constant="24" id="2sI-jI-10o"/>
+ <constraint firstAttribute="trailing" secondItem="Rnk-UH-rRP" secondAttribute="trailing" id="7kY-ED-xKR"/>
+ <constraint firstItem="TQT-yd-nbI" firstAttribute="leading" secondItem="nm3-Kj-ONm" secondAttribute="leading" id="9ok-6a-WGz"/>
+ <constraint firstItem="Rnk-UH-rRP" firstAttribute="leading" secondItem="nm3-Kj-ONm" secondAttribute="leading" id="DIF-4p-U9a"/>
+ <constraint firstAttribute="trailing" secondItem="TQT-yd-nbI" secondAttribute="trailing" id="Msk-pE-y04"/>
+ <constraint firstItem="WE4-cD-dXV" firstAttribute="top" secondItem="TQT-yd-nbI" secondAttribute="bottom" constant="24" id="XYW-Zd-IB6"/>
+ <constraint firstAttribute="bottom" secondItem="Rnk-UH-rRP" secondAttribute="bottom" id="amK-et-wSg"/>
+ <constraint firstAttribute="trailing" secondItem="WE4-cD-dXV" secondAttribute="trailing" id="c5R-u5-ncH"/>
+ <constraint firstItem="TQT-yd-nbI" firstAttribute="top" secondItem="nm3-Kj-ONm" secondAttribute="top" id="yWj-DN-anI"/>
+ <constraint firstItem="WE4-cD-dXV" firstAttribute="leading" secondItem="nm3-Kj-ONm" secondAttribute="leading" id="zcQ-MS-Mkz"/>
+ </constraints>
+ </view>
+ </subviews>
+ <constraints>
+ <constraint firstItem="nm3-Kj-ONm" firstAttribute="leading" secondItem="8RA-l5-l5o" secondAttribute="leading" constant="24" id="6xO-Yz-LyP"/>
+ <constraint firstAttribute="trailing" secondItem="nm3-Kj-ONm" secondAttribute="trailing" constant="24" id="8ps-I8-JZz"/>
+ <constraint firstAttribute="bottom" secondItem="nm3-Kj-ONm" secondAttribute="bottom" constant="24" id="SNO-Jm-cFh"/>
+ <constraint firstItem="nm3-Kj-ONm" firstAttribute="top" secondItem="8RA-l5-l5o" secondAttribute="top" constant="24" id="xhA-R2-TRH"/>
+ </constraints>
+ </view>
+ </subviews>
+ <constraints>
+ <constraint firstItem="8RA-l5-l5o" firstAttribute="width" secondItem="Ef2-EJ-GbD" secondAttribute="width" id="2wa-Gf-kAz"/>
+ <constraint firstItem="8RA-l5-l5o" firstAttribute="top" secondItem="Ef2-EJ-GbD" secondAttribute="top" id="5US-02-mPv"/>
+ <constraint firstAttribute="trailing" secondItem="8RA-l5-l5o" secondAttribute="trailing" id="Woy-WL-LaP"/>
+ <constraint firstAttribute="bottom" secondItem="8RA-l5-l5o" secondAttribute="bottom" id="weK-v1-ewb"/>
+ <constraint firstItem="8RA-l5-l5o" firstAttribute="leading" secondItem="Ef2-EJ-GbD" secondAttribute="leading" id="xbl-T4-0ym"/>
+ </constraints>
+ </scrollView>
+ </subviews>
+ <color key="backgroundColor" name="Secondary"/>
+ <constraints>
+ <constraint firstItem="Ef2-EJ-GbD" firstAttribute="trailing" secondItem="BeY-Zt-zoO" secondAttribute="trailing" id="AVa-p6-gnL"/>
+ <constraint firstItem="Ef2-EJ-GbD" firstAttribute="top" secondItem="0KT-g1-t9r" secondAttribute="top" id="DUA-7u-Tpr"/>
+ <constraint firstItem="Ef2-EJ-GbD" firstAttribute="bottom" secondItem="BeY-Zt-zoO" secondAttribute="bottom" id="Xqi-8g-wIh"/>
+ <constraint firstItem="Ef2-EJ-GbD" firstAttribute="leading" secondItem="BeY-Zt-zoO" secondAttribute="leading" id="sST-q5-QMi"/>
+ </constraints>
+ <viewLayoutGuide key="safeArea" id="BeY-Zt-zoO"/>
+ <point key="canvasLocation" x="3274" y="-451"/>
+ </view>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="UWn-xd-nij" customClass="WireguardKeyStatusView" customModule="MullvadVPN" customModuleProvider="target">
+ <rect key="frame" x="0.0" y="0.0" width="332" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="751" text="Key is valid" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Hfe-qt-Bfg">
+ <rect key="frame" x="0.0" y="0.0" width="332" height="30"/>
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <color key="textColor" name="Success"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="izE-NT-b2X" customClass="SpinnerActivityIndicatorView" customModule="MullvadVPN" customModuleProvider="target">
+ <rect key="frame" x="302" y="0.0" width="30" height="30"/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <constraints>
+ <constraint firstAttribute="width" secondItem="izE-NT-b2X" secondAttribute="height" multiplier="1:1" id="Hb3-oO-ph9"/>
+ </constraints>
+ <userDefinedRuntimeAttributes>
+ <userDefinedRuntimeAttribute type="number" keyPath="thickness">
+ <real key="value" value="2"/>
+ </userDefinedRuntimeAttribute>
+ </userDefinedRuntimeAttributes>
+ </view>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <constraints>
+ <constraint firstItem="izE-NT-b2X" firstAttribute="height" secondItem="Hfe-qt-Bfg" secondAttribute="height" id="5CX-7Y-dTK"/>
+ <constraint firstItem="Hfe-qt-Bfg" firstAttribute="top" secondItem="UWn-xd-nij" secondAttribute="top" id="8c7-fU-nCj"/>
+ <constraint firstAttribute="bottom" secondItem="Hfe-qt-Bfg" secondAttribute="bottom" id="FdG-Wt-XTb"/>
+ <constraint firstItem="Hfe-qt-Bfg" firstAttribute="leading" secondItem="UWn-xd-nij" secondAttribute="leading" id="Rwl-nz-b8C"/>
+ <constraint firstAttribute="trailing" secondItem="Hfe-qt-Bfg" secondAttribute="trailing" id="dhs-MG-8Va"/>
+ <constraint firstAttribute="trailing" secondItem="izE-NT-b2X" secondAttribute="trailing" id="iIb-6W-Xx6"/>
+ <constraint firstItem="izE-NT-b2X" firstAttribute="centerY" secondItem="Hfe-qt-Bfg" secondAttribute="centerY" id="iiN-wu-4SO"/>
+ </constraints>
+ <nil key="simulatedTopBarMetrics"/>
+ <nil key="simulatedBottomBarMetrics"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <viewLayoutGuide key="safeArea" id="4Jg-lh-k5T"/>
+ <connections>
+ <outlet property="activityIndicator" destination="izE-NT-b2X" id="BrH-U3-uZU"/>
+ <outlet property="textLabel" destination="Hfe-qt-Bfg" id="An4-Wb-wtv"/>
+ </connections>
+ <point key="canvasLocation" x="2561" y="-159"/>
+ </view>
+ </objects>
+ <resources>
+ <image name="DefaultButton" width="9" height="9"/>
+ <image name="SuccessButton" width="9" height="9"/>
+ <namedColor name="Secondary">
+ <color red="0.098039215686274508" green="0.1803921568627451" blue="0.27058823529411763" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </namedColor>
+ <namedColor name="Success">
+ <color red="0.26666666666666666" green="0.67843137254901964" blue="0.30196078431372547" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </namedColor>
+ </resources>
+</document>