Merge pull request #61 from vector-im/authentication_screen

Authentication screen
This commit is contained in:
giomfo
2016-01-29 11:32:03 +01:00
17 changed files with 899 additions and 218 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

+6 -5
View File
@@ -35,14 +35,15 @@
"camera" = "Camera";
// Authentication
"auth_sign_in" = "Sign in";
"auth_login" = "Log in";
"auth_create_account" = "Create a new account";
"auth_create_account_title" = "Create an account";
"auth_register" = "Register";
"auth_back_to_login" = "I already have an account";
"auth_email_placeholder" = "Email address";
"auth_user_id_placeholder" = "Email or user name";
"auth_password_placeholder" = "Password";
"auth_user_name_placeholder" = "Your name";
"auth_email_placeholder" = "Email address";
"auth_repeat_password_placeholder" = "Repeat password";
"auth_forgot_password" = "Forgot password?";
"auth_use_server_options" = "Use custom server options (advanced)";
// Chat creation
"room_creation_title" = "New Chat";
-2
View File
@@ -103,7 +103,6 @@
<navigationItem key="navigationItem" title="Settings" id="7NM-zW-wJT"/>
<connections>
<segue destination="KeQ-Sp-kmH" kind="show" identifier="showAccountDetails" id="flf-61-vgV"/>
<segue destination="ZlD-EU-ncw" kind="show" identifier="addAccount" id="17E-G9-IZ6"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="ZKJ-22-Asy" userLabel="First Responder" sceneMemberID="firstResponder"/>
@@ -281,6 +280,5 @@
</resources>
<inferredMetricsTieBreakers>
<segue reference="agy-3r-khl"/>
<segue reference="17E-G9-IZ6"/>
</inferredMetricsTieBreakers>
</document>
+1 -1
View File
@@ -7,7 +7,7 @@
<key>pusherAppIdProd</key>
<string>im.vector.app.ios.prod</string>
<key>identityserverurl</key>
<string>https://matrix.org</string>
<string>https://vector.im</string>
<key>homeserverurl</key>
<string>https://matrix.org</string>
<key>homeserver</key>
@@ -18,5 +18,18 @@
@interface AuthenticationViewController : MXKAuthenticationViewController <MXKAuthenticationViewControllerDelegate>
@property (weak, nonatomic) IBOutlet UINavigationItem *mainNavigationItem;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *rightBarButtonItem;
@property (weak, nonatomic) IBOutlet UIButton *forgotPasswordButton;
@property (weak, nonatomic) IBOutlet UIButton *serverOptionsTickButton;
@property (weak, nonatomic) IBOutlet UIView *serverOptionsContainer;
@property (weak, nonatomic) IBOutlet UIView *homeServerContainer;
@property (weak, nonatomic) IBOutlet UIView *identityServerContainer;
@property (weak, nonatomic) IBOutlet UIView *homeServerSeparator;
@property (weak, nonatomic) IBOutlet UIView *identityServerSeparator;
@end
@@ -16,12 +16,26 @@
#import "AuthenticationViewController.h"
#import "AuthInputsEmailIdentityBasedView.h"
#import "AuthInputsPasswordBasedView.h"
#import "RageShakeManager.h"
#import "VectorDesignValues.h"
@implementation AuthenticationViewController
+ (UINib *)nib
{
return [UINib nibWithNibName:NSStringFromClass(self)
bundle:[NSBundle bundleForClass:self]];
}
+ (instancetype)authenticationViewController
{
return [[[self class] alloc] initWithNibName:NSStringFromClass(self)
bundle:[NSBundle bundleForClass:self]];
}
- (void)viewDidLoad
{
[super viewDidLoad];
@@ -29,71 +43,166 @@
// Setup `MXKAuthenticationViewController` properties
self.rageShakeManager = [RageShakeManager sharedManager];
self.defaultHomeServerUrl = [[NSUserDefaults standardUserDefaults] objectForKey:@"homeserverurl"];
self.defaultIdentityServerUrl = [[NSUserDefaults standardUserDefaults] objectForKey:@"identityserverurl"];
self.mainNavigationItem.title = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];
self.rightBarButtonItem.title = NSLocalizedStringFromTable(@"auth_register", @"Vector", nil);
self.defaultHomeServerUrl = [[NSUserDefaults standardUserDefaults] objectForKey:@"homeserverurl"];
self.homeServerTextField.textColor = VECTOR_TEXT_BLACK_COLOR;
self.homeServerLabel.textColor = VECTOR_TEXT_GRAY_COLOR;
self.defaultIdentityServerUrl = [[NSUserDefaults standardUserDefaults] objectForKey:@"identityserverurl"];
self.identityServerTextField.textColor = VECTOR_TEXT_BLACK_COLOR;
self.identityServerLabel.textColor = VECTOR_TEXT_GRAY_COLOR;
// Load welcome image from MatrixKit asset bundle
self.welcomeImageView.image = [UIImage imageNamed:@"logo"];
self.subTitleLabel.hidden = NO;
[self.submitButton.layer setCornerRadius:5];
self.submitButton.clipsToBounds = YES;
self.submitButton.backgroundColor = VECTOR_GREEN_COLOR;
[self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_login", @"Vector", nil) forState:UIControlStateNormal];
[self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_login", @"Vector", nil) forState:UIControlStateHighlighted];
[self.forgotPasswordButton setTitle:NSLocalizedStringFromTable(@"auth_forgot_password", @"Vector", nil) forState:UIControlStateNormal];
[self.forgotPasswordButton setTitle:NSLocalizedStringFromTable(@"auth_forgot_password", @"Vector", nil) forState:UIControlStateHighlighted];
[self.forgotPasswordButton setTitleColor:VECTOR_TEXT_GRAY_COLOR forState:UIControlStateNormal];
[self.forgotPasswordButton setTitleColor:VECTOR_TEXT_GRAY_COLOR forState:UIControlStateHighlighted];
[self.serverOptionsTickButton setImage:[UIImage imageNamed:@"selection_untick"] forState:UIControlStateNormal];
[self.serverOptionsTickButton setImage:[UIImage imageNamed:@"selection_untick"] forState:UIControlStateHighlighted];
NSAttributedString *serverOptionsTitle = [[NSAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"auth_use_server_options", @"Vector", nil) attributes:@{NSForegroundColorAttributeName : VECTOR_TEXT_GRAY_COLOR, NSFontAttributeName: [UIFont systemFontOfSize:14]}];
[self.serverOptionsTickButton setAttributedTitle:serverOptionsTitle forState:UIControlStateNormal];
[self.serverOptionsTickButton setAttributedTitle:serverOptionsTitle forState:UIControlStateHighlighted];
[self hideServerOptionsContainer:YES];
// The view controller dismiss itself on successful login.
self.delegate = self;
// Custom used authInputsView
[self registerAuthInputsViewClass:AuthInputsEmailIdentityBasedView.class forFlowType:kMXLoginFlowTypeEmailIdentity andAuthType:MXKAuthenticationTypeRegister];
[self registerAuthInputsViewClass:AuthInputsPasswordBasedView.class forFlowType:kMXLoginFlowTypePassword andAuthType:MXKAuthenticationTypeLogin];
[self registerAuthInputsViewClass:AuthInputsPasswordBasedView.class forFlowType:kMXLoginFlowTypeEmailIdentity andAuthType:MXKAuthenticationTypeRegister];
// Initialize the auth inputs display
self.selectedFlow = [MXLoginFlow modelFromJSON:@{@"type": kMXLoginFlowTypePassword}];
// FIXME handle "Forgot password"
self.forgotPasswordButton.hidden = YES;
}
- (void)setAuthType:(MXKAuthenticationType)authType
{
super.authType = authType;
self.subTitleLabel.hidden = NO;
if (authType == MXKAuthenticationTypeLogin)
{
self.subTitleLabel.text = NSLocalizedStringFromTable(@"auth_sign_in", @"Vector", nil);
[self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_login", @"Vector", nil) forState:UIControlStateNormal];
[self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_login", @"Vector", nil) forState:UIControlStateHighlighted];
[self.authSwitchButton setTitle:NSLocalizedStringFromTable(@"auth_create_account", @"Vector", nil) forState:UIControlStateNormal];
[self.authSwitchButton setTitle:NSLocalizedStringFromTable(@"auth_create_account", @"Vector", nil) forState:UIControlStateHighlighted];
}
else
{
self.subTitleLabel.text = NSLocalizedStringFromTable(@"auth_create_account_title", @"Vector", nil);
[self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_register", @"Vector", nil) forState:UIControlStateNormal];
[self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_register", @"Vector", nil) forState:UIControlStateHighlighted];
[self.authSwitchButton setTitle:NSLocalizedStringFromTable(@"auth_back_to_login", @"Vector", nil) forState:UIControlStateNormal];
[self.authSwitchButton setTitle:NSLocalizedStringFromTable(@"auth_back_to_login", @"Vector", nil) forState:UIControlStateHighlighted];
}
// Update supported authentication flow
[self refreshSupportedAuthFlow];
}
- (IBAction)onButtonPressed:(id)sender
{
if (sender == self.serverOptionsTickButton)
{
[self hideServerOptionsContainer:!self.serverOptionsContainer.hidden];
}
else if (sender == self.forgotPasswordButton)
{
// TODO
}
else if (sender == self.rightBarButtonItem)
{
if (self.authType == MXKAuthenticationTypeLogin)
{
self.authType = MXKAuthenticationTypeRegister;
self.rightBarButtonItem.title = NSLocalizedStringFromTable(@"auth_login", @"Vector", nil);
self.forgotPasswordButton.hidden = YES;
}
else
{
self.authType = MXKAuthenticationTypeLogin;
self.rightBarButtonItem.title = NSLocalizedStringFromTable(@"auth_register", @"Vector", nil);
self.forgotPasswordButton.hidden = NO;
}
[self hideServerOptionsContainer:YES];
}
else
{
[super onButtonPressed:sender];
}
}
#pragma mark -
- (void)hideServerOptionsContainer:(BOOL)hidden
{
if (self.serverOptionsContainer.isHidden == hidden)
{
return;
}
if (hidden)
{
[self.homeServerTextField resignFirstResponder];
[self.identityServerTextField resignFirstResponder];
[self.serverOptionsTickButton setImage:[UIImage imageNamed:@"selection_untick"] forState:UIControlStateNormal];
self.serverOptionsContainer.hidden = YES;
// Refresh content view height
self.contentViewHeightConstraint.constant -= self.serverOptionsContainer.frame.size.height;
}
else
{
[self.serverOptionsTickButton setImage:[UIImage imageNamed:@"selection_tick"] forState:UIControlStateNormal];
self.serverOptionsContainer.hidden = NO;
// Refresh content view height
self.contentViewHeightConstraint.constant += self.serverOptionsContainer.frame.size.height;
// Scroll to display server options
CGPoint offset = self.authenticationScrollView.contentOffset;
offset.y += self.serverOptionsContainer.frame.size.height;
self.authenticationScrollView.contentOffset = offset;
}
}
#pragma mark - MXKAuthenticationViewControllerDelegate
- (void)authenticationViewController:(MXKAuthenticationViewController *)authenticationViewController didLogWithUserId:(NSString *)userId {
- (void)authenticationViewController:(MXKAuthenticationViewController *)authenticationViewController didLogWithUserId:(NSString *)userId
{
// Report server url typed by the user as default url.
if (self.homeServerTextField.text.length) {
if (self.homeServerTextField.text.length)
{
[[NSUserDefaults standardUserDefaults] setObject:self.homeServerTextField.text forKey:@"homeserverurl"];
}
if (self.identityServerTextField.text.length) {
if (self.identityServerTextField.text.length)
{
[[NSUserDefaults standardUserDefaults] setObject:self.identityServerTextField.text forKey:@"identityserverurl"];
}
[[NSUserDefaults standardUserDefaults] synchronize];
// Remove auth view controller on successful login
if (self.navigationController) {
if (self.navigationController)
{
// Pop the view controller
[self.navigationController popViewControllerAnimated:YES];
} else {
}
else
{
// Dismiss on successful login
[self dismissViewControllerAnimated:YES completion:nil];
}
}
@end
@@ -0,0 +1,368 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="AuthenticationViewController">
<connections>
<outlet property="authFallbackContentView" destination="q1e-Wg-6t7" id="mR6-hS-5YB"/>
<outlet property="authFallbackWebView" destination="Vhh-m0-nXN" id="YWJ-8T-74t"/>
<outlet property="authInputContainerViewHeightConstraint" destination="e04-1Y-4gZ" id="5qa-cu-M8v"/>
<outlet property="authInputContainerViewMinHeightConstraint" destination="8K0-es-Aee" id="PVf-si-yet"/>
<outlet property="authInputsContainerView" destination="xWb-IJ-v7F" id="DEo-Ji-wPT"/>
<outlet property="authScrollViewBottomConstraint" destination="g7o-eO-7Yr" id="kVv-Xp-aTT"/>
<outlet property="authenticationActivityIndicator" destination="30E-gm-z6O" id="DDw-QJ-ND8"/>
<outlet property="authenticationScrollView" destination="OHV-KQ-Ww0" id="gyc-zq-fA1"/>
<outlet property="cancelAuthFallbackButton" destination="9qj-5c-Sfb" id="IH4-cc-kKx"/>
<outlet property="contentView" destination="rhx-dD-4EJ" id="XXc-2j-Gi6"/>
<outlet property="contentViewHeightConstraint" destination="6v6-fz-e8o" id="wHX-YX-3gE"/>
<outlet property="forgotPasswordButton" destination="AJ2-lJ-NUq" id="DZw-3o-ioE"/>
<outlet property="homeServerContainer" destination="1YY-gb-LG4" id="ASO-JT-0iV"/>
<outlet property="homeServerLabel" destination="kHf-s1-cZa" id="nSI-4K-aQq"/>
<outlet property="homeServerSeparator" destination="ZZP-eI-bXP" id="Vip-yy-WPd"/>
<outlet property="homeServerTextField" destination="G8l-AP-iRs" id="F4s-Sf-TTZ"/>
<outlet property="identityServerContainer" destination="kjJ-Tb-SIW" id="xVi-uN-2to"/>
<outlet property="identityServerLabel" destination="5CT-Ht-Z3v" id="9h4-6J-n3X"/>
<outlet property="identityServerSeparator" destination="t08-ua-0mJ" id="Sbf-ps-zeK"/>
<outlet property="identityServerTextField" destination="PZC-Hd-Q6a" id="vKg-sd-dzJ"/>
<outlet property="mainNavigationItem" destination="rj9-wP-8QS" id="yNN-Dg-4Yw"/>
<outlet property="noFlowLabel" destination="54b-4O-ip9" id="f18-H1-cQm"/>
<outlet property="retryButton" destination="wIH-Kd-r7q" id="42j-Ad-zVS"/>
<outlet property="rightBarButtonItem" destination="Kwt-KN-aVL" id="Y3F-wA-tf8"/>
<outlet property="serverOptionsContainer" destination="uOi-KN-l9I" id="DPa-Kr-caW"/>
<outlet property="serverOptionsTickButton" destination="6yx-o1-vbD" id="bep-34-8UU"/>
<outlet property="submitButton" destination="k3J-Eg-itz" id="fiZ-wK-6YM"/>
<outlet property="view" destination="5rn-KE-plm" id="bFJ-yJ-vc0"/>
<outlet property="welcomeImageView" destination="d8r-TX-pwX" id="vzD-zK-EeC"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="5rn-KE-plm">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<navigationBar contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="k7D-Gy-yBR">
<rect key="frame" x="0.0" y="20" width="600" height="44"/>
<constraints>
<constraint firstAttribute="height" constant="44" id="GiL-7R-Wm2"/>
</constraints>
<color key="barTintColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<items>
<navigationItem title="Vector" id="rj9-wP-8QS">
<barButtonItem key="rightBarButtonItem" title="Register" id="Kwt-KN-aVL">
<connections>
<action selector="onButtonPressed:" destination="-1" id="nwk-aV-eBO"/>
</connections>
</barButtonItem>
</navigationItem>
</items>
</navigationBar>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="izX-ya-hXh">
<rect key="frame" x="0.0" y="63" width="600" height="1"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="ZiW-uP-cgo"/>
</constraints>
</view>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" keyboardDismissMode="onDrag" translatesAutoresizingMaskIntoConstraints="NO" id="OHV-KQ-Ww0">
<rect key="frame" x="0.0" y="64" width="600" height="536"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rhx-dD-4EJ" userLabel="Content View">
<rect key="frame" x="0.0" y="0.0" width="600" height="555"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="logo.png" translatesAutoresizingMaskIntoConstraints="NO" id="d8r-TX-pwX" userLabel="Welcome Image View">
<rect key="frame" x="280" y="30" width="40" height="40"/>
<constraints>
<constraint firstAttribute="width" constant="40" id="ZFx-Mn-Kzq"/>
<constraint firstAttribute="height" constant="40" id="zA1-WN-LdU"/>
</constraints>
</imageView>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xWb-IJ-v7F" userLabel="AuthInputsContainerView">
<rect key="frame" x="0.0" y="76" width="600" height="200"/>
<subviews>
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="30E-gm-z6O">
<rect key="frame" x="290" y="90" width="20" height="20"/>
</activityIndicatorView>
<label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Currently we do not support authentication flows defined by this Home Server" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="54b-4O-ip9" userLabel="noFlowLabel">
<rect key="frame" x="49" y="8" width="503" height="17"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="wIH-Kd-r7q" userLabel="retryButton">
<rect key="frame" x="278" y="30" width="45" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="WtO-NT-ei8"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="45" id="YYb-6s-rgd"/>
</constraints>
<state key="normal" title="Retry">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="ZW9-lZ-tLj"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="centerX" secondItem="54b-4O-ip9" secondAttribute="centerX" id="0bV-x1-MhX"/>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="200" id="8K0-es-Aee"/>
<constraint firstItem="54b-4O-ip9" firstAttribute="top" secondItem="xWb-IJ-v7F" secondAttribute="top" constant="8" id="Ddp-gU-nLY"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="54b-4O-ip9" secondAttribute="trailing" constant="8" id="VEQ-w9-9Ln"/>
<constraint firstAttribute="centerY" secondItem="30E-gm-z6O" secondAttribute="centerY" id="ctL-D3-bgP"/>
<constraint firstAttribute="height" constant="200" id="e04-1Y-4gZ"/>
<constraint firstItem="wIH-Kd-r7q" firstAttribute="top" secondItem="54b-4O-ip9" secondAttribute="bottom" constant="5" id="grf-0I-rwT"/>
<constraint firstItem="54b-4O-ip9" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="xWb-IJ-v7F" secondAttribute="leading" constant="8" id="phW-Yy-zN7"/>
<constraint firstAttribute="centerX" secondItem="wIH-Kd-r7q" secondAttribute="centerX" id="rTd-Qc-xrD"/>
<constraint firstAttribute="centerX" secondItem="30E-gm-z6O" secondAttribute="centerX" id="sSN-PO-Q6t"/>
</constraints>
</view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="AJ2-lJ-NUq">
<rect key="frame" x="19" y="333" width="123" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="1mr-dZ-KtP"/>
</constraints>
<state key="normal" title="Forgot password?">
<color key="titleColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="UVJ-Re-xe2"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="k3J-Eg-itz" userLabel="SubmitBtn">
<rect key="frame" x="469" y="333" width="120" height="30"/>
<color key="backgroundColor" red="0.028153735480000001" green="0.82494870580000002" blue="0.051896891280000003" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="width" constant="120" id="H9x-Zc-0sE"/>
<constraint firstAttribute="height" constant="30" id="rR8-KH-2z5"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
<state key="normal" title="Log In">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="Ocd-Ag-6hf"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" lineBreakMode="middleTruncation" hasAttributedTitle="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6yx-o1-vbD">
<rect key="frame" x="19" y="373" width="562" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="buF-NU-DPO"/>
</constraints>
<inset key="titleEdgeInsets" minX="8" minY="0.0" maxX="0.0" maxY="0.0"/>
<state key="normal" image="untick.png">
<attributedString key="attributedTitle">
<fragment content="Use custom server options">
<attributes>
<font key="NSFont" size="14" name="HelveticaNeue"/>
<paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
</attributedString>
</state>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="oEd-H1-EDj"/>
</connections>
</button>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="uOi-KN-l9I" userLabel="ServerOptionsContainerView">
<rect key="frame" x="0.0" y="406" width="600" height="140"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="1YY-gb-LG4">
<rect key="frame" x="0.0" y="0.0" width="600" height="70"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Home Server:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kHf-s1-cZa">
<rect key="frame" x="18" y="8" width="564" height="20"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="SgI-dz-C8b"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="URL (e.g. https://matrix.org)" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="G8l-AP-iRs">
<rect key="frame" x="18" y="36" width="564" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="RT2-FT-tLZ"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" returnKeyType="done"/>
<connections>
<outlet property="delegate" destination="-1" id="UVr-c4-V8L"/>
</connections>
</textField>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZZP-eI-bXP">
<rect key="frame" x="10" y="69" width="580" height="1"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="XdZ-tB-v6d"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="G8l-AP-iRs" firstAttribute="leading" secondItem="1YY-gb-LG4" secondAttribute="leading" constant="18" id="0tL-7X-7HQ"/>
<constraint firstAttribute="bottom" secondItem="ZZP-eI-bXP" secondAttribute="bottom" id="1JS-eI-7hU"/>
<constraint firstAttribute="trailing" secondItem="ZZP-eI-bXP" secondAttribute="trailing" constant="10" id="9q3-GY-TrI"/>
<constraint firstItem="kHf-s1-cZa" firstAttribute="leading" secondItem="1YY-gb-LG4" secondAttribute="leading" constant="18" id="Bww-He-GGJ"/>
<constraint firstItem="G8l-AP-iRs" firstAttribute="top" secondItem="kHf-s1-cZa" secondAttribute="bottom" constant="8" id="HUb-A5-Fnn"/>
<constraint firstAttribute="trailing" secondItem="kHf-s1-cZa" secondAttribute="trailing" constant="18" id="K4u-XW-UqK"/>
<constraint firstAttribute="trailing" secondItem="G8l-AP-iRs" secondAttribute="trailing" constant="18" id="O7t-Uf-wPo"/>
<constraint firstItem="kHf-s1-cZa" firstAttribute="top" secondItem="1YY-gb-LG4" secondAttribute="top" constant="8" id="l9i-gw-NaZ"/>
<constraint firstItem="ZZP-eI-bXP" firstAttribute="leading" secondItem="1YY-gb-LG4" secondAttribute="leading" constant="10" id="rbh-mU-NLC"/>
<constraint firstAttribute="height" constant="70" id="wa1-77-Lb4"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="kjJ-Tb-SIW">
<rect key="frame" x="0.0" y="70" width="600" height="70"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Identity Server:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5CT-Ht-Z3v">
<rect key="frame" x="18" y="8" width="564" height="20"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="aWu-GG-POi"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="URL (e.g. https://matrix.org)" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="PZC-Hd-Q6a">
<rect key="frame" x="18" y="36" width="564" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="XTt-dw-c6p"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" returnKeyType="done"/>
<connections>
<outlet property="delegate" destination="-1" id="nZF-by-6t6"/>
</connections>
</textField>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="t08-ua-0mJ">
<rect key="frame" x="10" y="69" width="580" height="1"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="h6p-cH-vPq"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="PZC-Hd-Q6a" firstAttribute="leading" secondItem="kjJ-Tb-SIW" secondAttribute="leading" constant="18" id="Khv-I4-mWb"/>
<constraint firstAttribute="trailing" secondItem="PZC-Hd-Q6a" secondAttribute="trailing" constant="18" id="VJ7-z3-LW3"/>
<constraint firstAttribute="bottom" secondItem="t08-ua-0mJ" secondAttribute="bottom" id="VNJ-sn-cbd"/>
<constraint firstItem="t08-ua-0mJ" firstAttribute="leading" secondItem="kjJ-Tb-SIW" secondAttribute="leading" constant="10" id="aaN-eN-yz7"/>
<constraint firstItem="PZC-Hd-Q6a" firstAttribute="top" secondItem="5CT-Ht-Z3v" secondAttribute="bottom" constant="8" id="bZn-CT-m7K"/>
<constraint firstItem="5CT-Ht-Z3v" firstAttribute="leading" secondItem="kjJ-Tb-SIW" secondAttribute="leading" constant="18" id="e5q-YY-hSP"/>
<constraint firstAttribute="height" constant="70" id="kCj-jw-q4B"/>
<constraint firstItem="5CT-Ht-Z3v" firstAttribute="top" secondItem="kjJ-Tb-SIW" secondAttribute="top" constant="8" id="r5R-Ap-b9I"/>
<constraint firstAttribute="trailing" secondItem="5CT-Ht-Z3v" secondAttribute="trailing" constant="18" id="smO-Tz-CPx"/>
<constraint firstAttribute="trailing" secondItem="t08-ua-0mJ" secondAttribute="trailing" constant="10" id="z9T-Cv-5SH"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="1YY-gb-LG4" firstAttribute="top" secondItem="uOi-KN-l9I" secondAttribute="top" id="6LT-5K-ftH"/>
<constraint firstItem="kjJ-Tb-SIW" firstAttribute="leading" secondItem="uOi-KN-l9I" secondAttribute="leading" id="GJK-3l-t3Y"/>
<constraint firstAttribute="trailing" secondItem="1YY-gb-LG4" secondAttribute="trailing" id="M3s-AR-hKf"/>
<constraint firstAttribute="height" constant="140" id="aWW-v9-LSk"/>
<constraint firstAttribute="trailing" secondItem="kjJ-Tb-SIW" secondAttribute="trailing" id="eIu-yM-Lhs"/>
<constraint firstItem="1YY-gb-LG4" firstAttribute="leading" secondItem="uOi-KN-l9I" secondAttribute="leading" id="mGS-4h-HKB"/>
<constraint firstItem="kjJ-Tb-SIW" firstAttribute="top" secondItem="uOi-KN-l9I" secondAttribute="top" constant="70" id="n8T-xk-7sh"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="uOi-KN-l9I" secondAttribute="trailing" id="1Sf-bE-wYd"/>
<constraint firstItem="uOi-KN-l9I" firstAttribute="leading" secondItem="rhx-dD-4EJ" secondAttribute="leading" id="2fA-Yk-wWM"/>
<constraint firstAttribute="height" constant="555" id="6v6-fz-e8o"/>
<constraint firstItem="k3J-Eg-itz" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="AJ2-lJ-NUq" secondAttribute="trailing" constant="10" id="Dqz-kf-feR"/>
<constraint firstItem="6yx-o1-vbD" firstAttribute="leading" secondItem="rhx-dD-4EJ" secondAttribute="leading" constant="19" id="N10-Ro-yH2"/>
<constraint firstAttribute="trailing" secondItem="6yx-o1-vbD" secondAttribute="trailing" constant="19" id="OOw-6o-Tgu"/>
<constraint firstItem="uOi-KN-l9I" firstAttribute="top" secondItem="rhx-dD-4EJ" secondAttribute="top" constant="406" id="XV1-Eu-q2K"/>
<constraint firstItem="xWb-IJ-v7F" firstAttribute="leading" secondItem="rhx-dD-4EJ" secondAttribute="leading" id="YnP-Nk-QxR"/>
<constraint firstItem="6yx-o1-vbD" firstAttribute="top" secondItem="AJ2-lJ-NUq" secondAttribute="bottom" constant="10" id="aKJ-nR-LVK"/>
<constraint firstItem="k3J-Eg-itz" firstAttribute="top" secondItem="rhx-dD-4EJ" secondAttribute="top" constant="333" id="bga-yP-JTC"/>
<constraint firstAttribute="width" constant="600" placeholder="YES" id="hOT-Wn-hIb"/>
<constraint firstAttribute="trailing" secondItem="xWb-IJ-v7F" secondAttribute="trailing" id="hko-ol-XDd"/>
<constraint firstAttribute="trailing" secondItem="k3J-Eg-itz" secondAttribute="trailing" constant="11" id="i9P-es-EQL"/>
<constraint firstItem="AJ2-lJ-NUq" firstAttribute="leading" secondItem="rhx-dD-4EJ" secondAttribute="leading" constant="19" id="j4p-mo-ZxL"/>
<constraint firstItem="xWb-IJ-v7F" firstAttribute="top" secondItem="rhx-dD-4EJ" secondAttribute="top" constant="76" id="khR-Uj-OTH"/>
<constraint firstItem="d8r-TX-pwX" firstAttribute="top" secondItem="rhx-dD-4EJ" secondAttribute="top" constant="30" id="l68-Ta-YKg"/>
<constraint firstAttribute="centerX" secondItem="d8r-TX-pwX" secondAttribute="centerX" id="l6k-EH-Yb8"/>
<constraint firstItem="AJ2-lJ-NUq" firstAttribute="centerY" secondItem="k3J-Eg-itz" secondAttribute="centerY" id="xNG-4j-ETw"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="rhx-dD-4EJ" secondAttribute="bottom" id="0Ex-X9-7WC"/>
<constraint firstAttribute="trailing" secondItem="rhx-dD-4EJ" secondAttribute="trailing" id="Ztq-8U-wlX"/>
<constraint firstItem="rhx-dD-4EJ" firstAttribute="top" secondItem="OHV-KQ-Ww0" secondAttribute="top" id="ePD-me-ymh"/>
<constraint firstItem="rhx-dD-4EJ" firstAttribute="leading" secondItem="OHV-KQ-Ww0" secondAttribute="leading" id="h1J-cn-QL1"/>
</constraints>
</scrollView>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="q1e-Wg-6t7" userLabel="Authentication Fallback ContentView">
<rect key="frame" x="0.0" y="20" width="600" height="580"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9qj-5c-Sfb">
<rect key="frame" x="542" y="5" width="50" height="35"/>
<constraints>
<constraint firstAttribute="width" constant="50" id="GMq-PF-fBv"/>
<constraint firstAttribute="height" constant="35" id="KfQ-gX-IHF"/>
</constraints>
<state key="normal" title="Cancel">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="Pxo-2q-AdE"/>
</connections>
</button>
<webView contentMode="scaleToFill" scalesPageToFit="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Vhh-m0-nXN" userLabel="fallback WebView" customClass="MXKAuthenticationFallbackWebView">
<rect key="frame" x="0.0" y="40" width="600" height="540"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</webView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="Vhh-m0-nXN" firstAttribute="leading" secondItem="q1e-Wg-6t7" secondAttribute="leading" id="8zH-1r-Jgh"/>
<constraint firstAttribute="trailing" secondItem="9qj-5c-Sfb" secondAttribute="trailing" constant="8" id="AUi-MV-V60"/>
<constraint firstAttribute="trailing" secondItem="Vhh-m0-nXN" secondAttribute="trailing" id="K9n-rL-E72"/>
<constraint firstItem="9qj-5c-Sfb" firstAttribute="top" secondItem="q1e-Wg-6t7" secondAttribute="top" constant="5" id="ZKZ-pg-xzV"/>
<constraint firstAttribute="bottom" secondItem="Vhh-m0-nXN" secondAttribute="bottom" id="qEl-Dd-BlB"/>
<constraint firstItem="Vhh-m0-nXN" firstAttribute="top" secondItem="9qj-5c-Sfb" secondAttribute="bottom" id="uCo-aG-Xa8"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="OHV-KQ-Ww0" firstAttribute="leading" secondItem="5rn-KE-plm" secondAttribute="leading" id="1Rd-Il-6MW"/>
<constraint firstAttribute="trailing" secondItem="k7D-Gy-yBR" secondAttribute="trailing" id="5VB-NY-mpo"/>
<constraint firstAttribute="trailing" secondItem="izX-ya-hXh" secondAttribute="trailing" id="8Ae-F5-jr2"/>
<constraint firstAttribute="bottom" secondItem="q1e-Wg-6t7" secondAttribute="bottom" id="8Bc-V7-iP3"/>
<constraint firstItem="k7D-Gy-yBR" firstAttribute="top" secondItem="5rn-KE-plm" secondAttribute="top" constant="20" id="BIH-pR-miA"/>
<constraint firstItem="q1e-Wg-6t7" firstAttribute="leading" secondItem="5rn-KE-plm" secondAttribute="leading" id="DiC-Ui-3Wk"/>
<constraint firstItem="OHV-KQ-Ww0" firstAttribute="top" secondItem="izX-ya-hXh" secondAttribute="bottom" id="Epg-2f-qa1"/>
<constraint firstItem="OHV-KQ-Ww0" firstAttribute="top" secondItem="5rn-KE-plm" secondAttribute="top" constant="20" symbolic="YES" id="FGm-jm-8r0"/>
<constraint firstAttribute="trailing" secondItem="OHV-KQ-Ww0" secondAttribute="trailing" id="KAu-Wf-ojt"/>
<constraint firstItem="izX-ya-hXh" firstAttribute="leading" secondItem="5rn-KE-plm" secondAttribute="leading" id="MrU-gL-vGG"/>
<constraint firstAttribute="trailing" secondItem="q1e-Wg-6t7" secondAttribute="trailing" id="XIS-Jp-qZf"/>
<constraint firstItem="OHV-KQ-Ww0" firstAttribute="top" secondItem="k7D-Gy-yBR" secondAttribute="bottom" id="aCW-Po-Hty"/>
<constraint firstAttribute="bottom" secondItem="OHV-KQ-Ww0" secondAttribute="bottom" id="g7o-eO-7Yr"/>
<constraint firstItem="q1e-Wg-6t7" firstAttribute="top" secondItem="5rn-KE-plm" secondAttribute="top" constant="20" id="sT2-HR-vou"/>
<constraint firstItem="k7D-Gy-yBR" firstAttribute="leading" secondItem="5rn-KE-plm" secondAttribute="leading" id="z6D-6L-5Ud"/>
</constraints>
<variation key="default">
<mask key="constraints">
<exclude reference="FGm-jm-8r0"/>
</mask>
</variation>
</view>
</objects>
<resources>
<image name="logo.png" width="40" height="40"/>
<image name="untick.png" width="31" height="31"/>
</resources>
</document>
@@ -1,31 +0,0 @@
/*
Copyright 2015 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import <MatrixKit/MatrixKit.h>
@interface AuthInputsEmailIdentityBasedView : MXKAuthInputsView
/**
The input text field used to fill an email.
*/
@property (weak, nonatomic) IBOutlet UITextField *emailTextField;
/**
The input text field used to fill the password.
*/
@property (weak, nonatomic) IBOutlet UITextField *passWordTextField;
@end
@@ -1,80 +0,0 @@
/*
Copyright 2015 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import "AuthInputsEmailIdentityBasedView.h"
@implementation AuthInputsEmailIdentityBasedView
+ (UINib *)nib
{
return [UINib nibWithNibName:NSStringFromClass([AuthInputsEmailIdentityBasedView class])
bundle:[NSBundle bundleForClass:[AuthInputsEmailIdentityBasedView class]]];
}
- (void)awakeFromNib
{
[super awakeFromNib];
_emailTextField.placeholder = NSLocalizedStringFromTable(@"auth_email_placeholder", @"Vector", nil);
_passWordTextField.placeholder = NSLocalizedStringFromTable(@"auth_password_placeholder", @"Vector", nil);
self.passWordTextField.returnKeyType = UIReturnKeyDone;
}
- (BOOL)areAllRequiredFieldsFilled
{
BOOL ret = [super areAllRequiredFieldsFilled];
// Check user email and pass fields
ret = (ret && self.emailTextField.text.length && self.passWordTextField.text.length);
return ret;
}
- (void)dismissKeyboard
{
[self.passWordTextField resignFirstResponder];
[self.emailTextField resignFirstResponder];
[super dismissKeyboard];
}
#pragma mark UITextField delegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
if (textField.returnKeyType == UIReturnKeyDone)
{
// "Done" key has been pressed
[textField resignFirstResponder];
if (self.delegate && [self.delegate respondsToSelector:@selector(authInputsDoneKeyHasBeenPressed:)])
{
// Launch authentication now
[self.delegate authInputsDoneKeyHasBeenPressed:self];
}
}
else
{
//"Next" key has been pressed
if (textField == self.emailTextField)
{
[self.passWordTextField becomeFirstResponder];
}
}
return YES;
}
@end
@@ -1,57 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="8191" systemVersion="14F27" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="x74-04-ezp" customClass="AuthInputsEmailIdentityBasedView">
<rect key="frame" x="0.0" y="0.0" width="300" height="84"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Email address" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="i51-ym-i9T">
<rect key="frame" x="14" y="8" width="272" height="30"/>
<constraints>
<constraint firstAttribute="width" constant="272" id="IhR-uY-MJZ"/>
<constraint firstAttribute="height" constant="30" id="x3j-uC-j0U"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" returnKeyType="next"/>
<connections>
<outlet property="delegate" destination="x74-04-ezp" id="LcQ-A2-9mF"/>
</connections>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Password" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="6rs-rR-DkS">
<rect key="frame" x="14" y="46" width="272" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="Fh2-oZ-UBe"/>
<constraint firstAttribute="width" constant="272" id="pCs-je-5Rd"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" returnKeyType="done" secureTextEntry="YES"/>
<connections>
<outlet property="delegate" destination="x74-04-ezp" id="QPi-9N-663"/>
</connections>
</textField>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="i51-ym-i9T" firstAttribute="top" secondItem="x74-04-ezp" secondAttribute="top" constant="8" id="2sO-Wi-AFi"/>
<constraint firstItem="6rs-rR-DkS" firstAttribute="top" secondItem="i51-ym-i9T" secondAttribute="bottom" constant="8" id="EJf-md-dcj"/>
<constraint firstAttribute="width" constant="300" id="ERU-Wm-hMV"/>
<constraint firstAttribute="bottom" secondItem="6rs-rR-DkS" secondAttribute="bottom" constant="8" id="Nip-Se-aLL"/>
<constraint firstAttribute="centerX" secondItem="i51-ym-i9T" secondAttribute="centerX" id="WKP-y0-Jon"/>
<constraint firstAttribute="centerX" secondItem="6rs-rR-DkS" secondAttribute="centerX" id="nIk-ev-cFe"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<nil key="simulatedTopBarMetrics"/>
<nil key="simulatedBottomBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<connections>
<outlet property="emailTextField" destination="i51-ym-i9T" id="0Ti-aL-YWl"/>
<outlet property="passWordTextField" destination="6rs-rR-DkS" id="VeL-kt-Fpp"/>
</connections>
</view>
</objects>
</document>
@@ -0,0 +1,36 @@
/*
Copyright 2016 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import "MXKAuthInputsPasswordBasedView.h"
@interface AuthInputsPasswordBasedView : MXKAuthInputsPasswordBasedView
@property (weak, nonatomic) IBOutlet UITextField *repeatPasswordTextField;
@property (weak, nonatomic) IBOutlet UIView *userLoginContainer;
@property (weak, nonatomic) IBOutlet UIView *emailContainer;
@property (weak, nonatomic) IBOutlet UIView *passwordContainer;
@property (weak, nonatomic) IBOutlet UIView *repeatPasswordContainer;
@property (weak, nonatomic) IBOutlet UIView *userLoginSeparator;
@property (weak, nonatomic) IBOutlet UIView *emailSeparator;
@property (weak, nonatomic) IBOutlet UIView *passwordSeparator;
@property (weak, nonatomic) IBOutlet UIView *repeatPasswordSeparator;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *passwordContainerTopConstraint;
@end
@@ -0,0 +1,136 @@
/*
Copyright 2016 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import "AuthInputsPasswordBasedView.h"
#import "NSBundle+MatrixKit.h"
#import "VectorDesignValues.h"
@implementation AuthInputsPasswordBasedView
+ (UINib *)nib
{
return [UINib nibWithNibName:NSStringFromClass(self)
bundle:[NSBundle bundleForClass:self]];
}
- (void)awakeFromNib
{
[super awakeFromNib];
_repeatPasswordTextField.placeholder = NSLocalizedStringFromTable(@"auth_repeat_password_placeholder", @"Vector", nil);
_repeatPasswordTextField.textColor = VECTOR_TEXT_BLACK_COLOR;
self.userLoginTextField.placeholder = NSLocalizedStringFromTable(@"auth_user_id_placeholder", @"Vector", nil);
self.userLoginTextField.textColor = VECTOR_TEXT_BLACK_COLOR;
self.passWordTextField.placeholder = NSLocalizedStringFromTable(@"auth_password_placeholder", @"Vector", nil);
self.passWordTextField.textColor = VECTOR_TEXT_BLACK_COLOR;
self.emailTextField.placeholder = NSLocalizedStringFromTable(@"auth_email_placeholder", @"Vector", nil);
self.emailTextField.textColor = VECTOR_TEXT_BLACK_COLOR;
}
- (CGFloat)actualHeight
{
return self.viewHeightConstraint.constant;
}
- (BOOL)areAllRequiredFieldsFilled
{
if (self.authType == MXKAuthenticationTypeLogin)
{
return (self.userLoginTextField.text.length && self.passWordTextField.text.length);
}
return (self.userLoginTextField.text.length && self.emailTextField.text.length && self.passWordTextField.text.length && self.repeatPasswordTextField.text.length);
}
- (void)setAuthType:(MXKAuthenticationType)authType
{
super.authType = authType;
if (authType == MXKAuthenticationTypeLogin)
{
self.userLoginTextField.placeholder = NSLocalizedStringFromTable(@"auth_user_id_placeholder", @"Vector", nil);
self.passwordContainerTopConstraint.constant = 50;
self.emailContainer.hidden = YES;
self.repeatPasswordContainer.hidden = YES;
}
else
{
self.userLoginTextField.placeholder = NSLocalizedStringFromTable(@"auth_user_name_placeholder", @"Vector", nil);
self.passwordContainerTopConstraint.constant = 100;
self.emailContainer.hidden = NO;
self.repeatPasswordContainer.hidden = NO;
}
}
- (void)dismissKeyboard
{
[self.userLoginTextField resignFirstResponder];
[self.passWordTextField resignFirstResponder];
[self.emailTextField resignFirstResponder];
[self.repeatPasswordTextField resignFirstResponder];
}
#pragma mark UITextField delegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
if (textField.returnKeyType == UIReturnKeyDone)
{
// "Done" key has been pressed
[textField resignFirstResponder];
if (self.delegate && [self.delegate respondsToSelector:@selector(authInputsDoneKeyHasBeenPressed:)])
{
// Launch authentication now
[self.delegate authInputsDoneKeyHasBeenPressed:self];
}
}
else
{
//"Next" key has been pressed
if (textField == self.userLoginTextField)
{
if (self.emailContainer.isHidden)
{
[self.passWordTextField becomeFirstResponder];
}
else
{
[self.emailTextField becomeFirstResponder];
}
}
else if (textField == self.emailTextField)
{
[self.passwordContainer becomeFirstResponder];
}
else if (textField == self.passWordTextField)
{
[self.repeatPasswordTextField becomeFirstResponder];
}
}
return YES;
}
@end
@@ -0,0 +1,184 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="x74-04-ezp" customClass="AuthInputsPasswordBasedView">
<rect key="frame" x="0.0" y="0.0" width="600" height="200"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xOW-lo-QGC">
<rect key="frame" x="0.0" y="0.0" width="600" height="50"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Email or user name" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="i51-ym-i9T">
<rect key="frame" x="18" y="18" width="564" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="x3j-uC-j0U"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" returnKeyType="next"/>
<connections>
<outlet property="delegate" destination="x74-04-ezp" id="cIj-f6-NKj"/>
</connections>
</textField>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Kqj-Ol-DR6">
<rect key="frame" x="10" y="49" width="580" height="1"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="nbP-a0-tLN"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="Kqj-Ol-DR6" secondAttribute="trailing" constant="10" id="Fc5-Fe-lsm"/>
<constraint firstItem="i51-ym-i9T" firstAttribute="leading" secondItem="xOW-lo-QGC" secondAttribute="leading" constant="18" id="GmY-6I-8F9"/>
<constraint firstAttribute="trailing" secondItem="i51-ym-i9T" secondAttribute="trailing" constant="18" id="XSY-7f-BTe"/>
<constraint firstItem="i51-ym-i9T" firstAttribute="top" secondItem="xOW-lo-QGC" secondAttribute="top" constant="18" id="cUj-8U-uxp"/>
<constraint firstAttribute="height" constant="50" id="crt-JN-TaR"/>
<constraint firstItem="Kqj-Ol-DR6" firstAttribute="leading" secondItem="xOW-lo-QGC" secondAttribute="leading" constant="10" id="qAe-fc-Omy"/>
<constraint firstAttribute="bottom" secondItem="Kqj-Ol-DR6" secondAttribute="bottom" id="xhI-Sl-SEv"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UfH-jv-6w4">
<rect key="frame" x="0.0" y="50" width="600" height="50"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Password" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="6rs-rR-DkS">
<rect key="frame" x="18" y="18" width="564" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="iai-tB-l7T"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" returnKeyType="done" secureTextEntry="YES"/>
<connections>
<outlet property="delegate" destination="x74-04-ezp" id="GjY-xZ-s5J"/>
</connections>
</textField>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vUH-bJ-5gJ">
<rect key="frame" x="10" y="49" width="580" height="1"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="31n-kG-Ka9"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="6rs-rR-DkS" firstAttribute="leading" secondItem="UfH-jv-6w4" secondAttribute="leading" constant="18" id="3x6-dS-z8n"/>
<constraint firstItem="6rs-rR-DkS" firstAttribute="top" secondItem="UfH-jv-6w4" secondAttribute="top" constant="18" id="On3-vo-idU"/>
<constraint firstAttribute="height" constant="50" id="Tfr-nK-79j"/>
<constraint firstAttribute="trailing" secondItem="vUH-bJ-5gJ" secondAttribute="trailing" constant="10" id="Unk-xg-I4s"/>
<constraint firstItem="vUH-bJ-5gJ" firstAttribute="leading" secondItem="UfH-jv-6w4" secondAttribute="leading" constant="10" id="kDs-d1-r3h"/>
<constraint firstAttribute="trailing" secondItem="6rs-rR-DkS" secondAttribute="trailing" constant="18" id="p8i-KE-71B"/>
<constraint firstAttribute="bottom" secondItem="vUH-bJ-5gJ" secondAttribute="bottom" id="zwd-xh-eDk"/>
</constraints>
</view>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bXz-VI-5FS">
<rect key="frame" x="0.0" y="50" width="600" height="50"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Email address" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="odF-W1-Vdr">
<rect key="frame" x="18" y="18" width="564" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="Kvu-hz-22A"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" returnKeyType="done" secureTextEntry="YES"/>
<connections>
<outlet property="delegate" destination="x74-04-ezp" id="ViI-x8-eWu"/>
</connections>
</textField>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YQ4-Kj-XPh">
<rect key="frame" x="10" y="49" width="580" height="1"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="ZLw-Hh-BkN"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="YQ4-Kj-XPh" firstAttribute="leading" secondItem="bXz-VI-5FS" secondAttribute="leading" constant="10" id="0Lj-tL-8mV"/>
<constraint firstAttribute="trailing" secondItem="YQ4-Kj-XPh" secondAttribute="trailing" constant="10" id="JTP-Rx-FsE"/>
<constraint firstItem="odF-W1-Vdr" firstAttribute="leading" secondItem="bXz-VI-5FS" secondAttribute="leading" constant="18" id="LlG-Lg-woQ"/>
<constraint firstAttribute="trailing" secondItem="odF-W1-Vdr" secondAttribute="trailing" constant="18" id="VLl-bq-aHE"/>
<constraint firstItem="odF-W1-Vdr" firstAttribute="top" secondItem="bXz-VI-5FS" secondAttribute="top" constant="18" id="fso-d2-GyZ"/>
<constraint firstAttribute="bottom" secondItem="YQ4-Kj-XPh" secondAttribute="bottom" id="tOd-El-ztB"/>
<constraint firstAttribute="height" constant="50" id="toP-dC-Aiz"/>
</constraints>
</view>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rb1-L5-udI">
<rect key="frame" x="0.0" y="150" width="600" height="50"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Repeat password" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="BQM-LP-8Eq">
<rect key="frame" x="18" y="18" width="564" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="87Q-0f-X45"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" returnKeyType="next" secureTextEntry="YES"/>
<connections>
<outlet property="delegate" destination="x74-04-ezp" id="28g-3U-BBM"/>
</connections>
</textField>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ddx-5u-PbG">
<rect key="frame" x="10" y="49" width="580" height="1"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="XYi-5d-bZs"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="ddx-5u-PbG" secondAttribute="trailing" constant="10" id="1BD-IR-hbK"/>
<constraint firstAttribute="bottom" secondItem="ddx-5u-PbG" secondAttribute="bottom" id="20V-Dg-8wr"/>
<constraint firstAttribute="height" constant="50" id="3q4-4P-iJB"/>
<constraint firstItem="ddx-5u-PbG" firstAttribute="leading" secondItem="rb1-L5-udI" secondAttribute="leading" constant="10" id="5hT-vS-fCs"/>
<constraint firstItem="BQM-LP-8Eq" firstAttribute="leading" secondItem="rb1-L5-udI" secondAttribute="leading" constant="18" id="Q4d-UG-Pdq"/>
<constraint firstAttribute="trailing" secondItem="BQM-LP-8Eq" secondAttribute="trailing" constant="18" id="szW-TY-aUw"/>
<constraint firstItem="BQM-LP-8Eq" firstAttribute="top" secondItem="rb1-L5-udI" secondAttribute="top" constant="18" id="yhI-hm-zp5"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="UfH-jv-6w4" firstAttribute="top" secondItem="x74-04-ezp" secondAttribute="top" constant="50" id="1LY-GW-rgL"/>
<constraint firstItem="rb1-L5-udI" firstAttribute="top" secondItem="x74-04-ezp" secondAttribute="top" constant="150" id="75U-tx-PsQ"/>
<constraint firstItem="UfH-jv-6w4" firstAttribute="leading" secondItem="x74-04-ezp" secondAttribute="leading" id="7Bk-GF-MZ0"/>
<constraint firstAttribute="trailing" secondItem="UfH-jv-6w4" secondAttribute="trailing" id="8dz-wY-Kxx"/>
<constraint firstItem="bXz-VI-5FS" firstAttribute="leading" secondItem="x74-04-ezp" secondAttribute="leading" id="Frq-sH-HZT"/>
<constraint firstItem="xOW-lo-QGC" firstAttribute="leading" secondItem="x74-04-ezp" secondAttribute="leading" id="NOu-LR-RvE"/>
<constraint firstAttribute="trailing" secondItem="bXz-VI-5FS" secondAttribute="trailing" id="NiV-pJ-PfV"/>
<constraint firstAttribute="trailing" secondItem="xOW-lo-QGC" secondAttribute="trailing" id="SNm-WQ-Piu"/>
<constraint firstItem="xOW-lo-QGC" firstAttribute="top" secondItem="x74-04-ezp" secondAttribute="top" id="WmX-gO-hPJ"/>
<constraint firstItem="rb1-L5-udI" firstAttribute="leading" secondItem="x74-04-ezp" secondAttribute="leading" id="XAJ-ST-sWV"/>
<constraint firstAttribute="trailing" secondItem="rb1-L5-udI" secondAttribute="trailing" id="c49-Cf-H9a"/>
<constraint firstItem="bXz-VI-5FS" firstAttribute="top" secondItem="x74-04-ezp" secondAttribute="top" constant="50" id="enV-j0-cgR"/>
<constraint firstAttribute="height" constant="200" id="qBF-0J-3VM"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<nil key="simulatedTopBarMetrics"/>
<nil key="simulatedBottomBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<connections>
<outlet property="emailContainer" destination="bXz-VI-5FS" id="4J7-D0-Dmf"/>
<outlet property="emailSeparator" destination="YQ4-Kj-XPh" id="iub-NG-iJR"/>
<outlet property="emailTextField" destination="odF-W1-Vdr" id="DOS-H7-MZy"/>
<outlet property="passWordTextField" destination="6rs-rR-DkS" id="VeL-kt-Fpp"/>
<outlet property="passwordContainer" destination="UfH-jv-6w4" id="aGz-rZ-j5q"/>
<outlet property="passwordContainerTopConstraint" destination="1LY-GW-rgL" id="feb-7y-uob"/>
<outlet property="passwordSeparator" destination="vUH-bJ-5gJ" id="mub-of-o9s"/>
<outlet property="repeatPasswordContainer" destination="rb1-L5-udI" id="NjO-O7-WYX"/>
<outlet property="repeatPasswordSeparator" destination="ddx-5u-PbG" id="MtA-Rf-dhU"/>
<outlet property="repeatPasswordTextField" destination="BQM-LP-8Eq" id="mgM-dU-mJo"/>
<outlet property="userLoginContainer" destination="xOW-lo-QGC" id="K4T-Jo-AQz"/>
<outlet property="userLoginSeparator" destination="Kqj-Ol-DR6" id="ZjO-Gx-bXl"/>
<outlet property="userLoginTextField" destination="i51-ym-i9T" id="XKi-6m-tFv"/>
<outlet property="viewHeightConstraint" destination="qBF-0J-3VM" id="GLh-gg-bh5"/>
</connections>
</view>
</objects>
</document>