| Index: remoting/ios/app/pin_entry_view.mm
|
| diff --git a/remoting/ios/app/pin_entry_view.mm b/remoting/ios/app/pin_entry_view.mm
|
| index 87a5a6b2523419773823b9488783e7d36bfe962b..c483fee586b44207aab6e8e5f7c8ffb895b99a44 100644
|
| --- a/remoting/ios/app/pin_entry_view.mm
|
| +++ b/remoting/ios/app/pin_entry_view.mm
|
| @@ -12,10 +12,12 @@
|
| #import "remoting/ios/app/remoting_theme.h"
|
|
|
| static const CGFloat kMargin = 5.f;
|
| -static const CGFloat kPadding = 6.f;
|
| +static const CGFloat kPadding = 8.f;
|
| static const CGFloat kLineSpace = 12.f;
|
|
|
| -@interface PinEntryView () {
|
| +static const int kMinPinLength = 6;
|
| +
|
| +@interface PinEntryView ()<UITextFieldDelegate> {
|
| UISwitch* _pairingSwitch;
|
| UILabel* _pairingLabel;
|
| MDCFloatingButton* _pinButton;
|
| @@ -36,6 +38,7 @@ static const CGFloat kLineSpace = 12.f;
|
| _pairingSwitch.tintColor =
|
| [UIColor colorWithRed:1.f green:1.f blue:1.f alpha:0.5];
|
| _pairingSwitch.transform = CGAffineTransformMakeScale(0.5, 0.5);
|
| + _pairingSwitch.translatesAutoresizingMaskIntoConstraints = NO;
|
| [self addSubview:_pairingSwitch];
|
|
|
| _pairingLabel = [[UILabel alloc] init];
|
| @@ -43,6 +46,7 @@ static const CGFloat kLineSpace = 12.f;
|
| [UIColor colorWithRed:1.f green:1.f blue:1.f alpha:0.5];
|
| _pairingLabel.font = [UIFont systemFontOfSize:12.f];
|
| _pairingLabel.text = @"Remember my PIN on this device.";
|
| + _pairingLabel.translatesAutoresizingMaskIntoConstraints = NO;
|
| [self addSubview:_pairingLabel];
|
|
|
| _pinButton =
|
| @@ -52,6 +56,8 @@ static const CGFloat kLineSpace = 12.f;
|
| action:@selector(didTapPinEntry:)
|
| forControlEvents:UIControlEventTouchUpInside];
|
| _pinButton.translatesAutoresizingMaskIntoConstraints = NO;
|
| + _pinButton.enabled = NO;
|
| + _pinButton.translatesAutoresizingMaskIntoConstraints = NO;
|
| [self addSubview:_pinButton];
|
|
|
| _pinEntry = [[UITextField alloc] init];
|
| @@ -65,11 +71,51 @@ static const CGFloat kLineSpace = 12.f;
|
| NSForegroundColorAttributeName :
|
| [UIColor colorWithRed:1.f green:1.f blue:1.f alpha:0.5]
|
| }];
|
| + _pinEntry.translatesAutoresizingMaskIntoConstraints = NO;
|
| + _pinEntry.delegate = self;
|
| [self addSubview:_pinEntry];
|
| +
|
| + [self
|
| + initializeLayoutConstraintsWithViews:NSDictionaryOfVariableBindings(
|
| + _pairingSwitch, _pairingLabel,
|
| + _pinButton, _pinEntry)];
|
| }
|
| return self;
|
| }
|
|
|
| +- (void)initializeLayoutConstraintsWithViews:(NSDictionary*)views {
|
| + // Metrics to use in visual format strings.
|
| + NSDictionary* layoutMetrics = @{
|
| + @"margin" : @(kMargin),
|
| + @"padding" : @(kPadding),
|
| + @"lineSpace" : @(kLineSpace),
|
| + };
|
| +
|
| + [self addConstraints:
|
| + [NSLayoutConstraint
|
| + constraintsWithVisualFormat:
|
| + @"H:|-[_pinEntry]-(padding)-[_pinButton]-|"
|
| + options:NSLayoutFormatAlignAllCenterY
|
| + metrics:layoutMetrics
|
| + views:views]];
|
| +
|
| + [self addConstraints:
|
| + [NSLayoutConstraint
|
| + constraintsWithVisualFormat:
|
| + @"H:|-[_pairingSwitch]-(padding)-[_pairingLabel]-|"
|
| + options:NSLayoutFormatAlignAllCenterY
|
| + metrics:layoutMetrics
|
| + views:views]];
|
| +
|
| + [self addConstraints:[NSLayoutConstraint
|
| + constraintsWithVisualFormat:
|
| + @"V:|-[_pinButton]-(lineSpace)-[_pairingSwitch]"
|
| + options:0
|
| + metrics:layoutMetrics
|
| + views:views]];
|
| + [self setNeedsUpdateConstraints];
|
| +}
|
| +
|
| #pragma mark - UIView
|
|
|
| - (BOOL)canBecomeFirstResponder {
|
| @@ -84,31 +130,32 @@ static const CGFloat kLineSpace = 12.f;
|
| return [_pinEntry endEditing:force];
|
| }
|
|
|
| -- (void)layoutSubviews {
|
| - [super layoutSubviews];
|
| +#pragma mark - UITextFieldDelegate
|
|
|
| - [_pinButton sizeToFit];
|
| - CGFloat buttonSize = _pinButton.frame.size.width; // Assume circle.
|
| -
|
| - _pinEntry.frame =
|
| - CGRectMake(kMargin, 0.f,
|
| - self.frame.size.width - kPadding - kMargin * 2.f - buttonSize,
|
| - buttonSize);
|
| +- (BOOL)textField:(UITextField*)textField
|
| + shouldChangeCharactersInRange:(NSRange)range
|
| + replacementString:(NSString*)string {
|
| + if (textField == _pinEntry) {
|
| + NSUInteger length = _pinEntry.text.length - range.length + string.length;
|
| + _pinButton.enabled = length >= kMinPinLength;
|
| + }
|
| + return YES;
|
| +}
|
|
|
| - [_pinButton sizeToFit];
|
| - _pinButton.frame =
|
| - CGRectMake(self.frame.size.width - kPadding - kMargin - buttonSize, 0.f,
|
| - buttonSize, buttonSize);
|
| +- (BOOL)textFieldShouldReturn:(UITextField*)textField {
|
| + NSLog(@"textFieldShouldReturn");
|
| + if ([_pinButton isEnabled]) {
|
| + [self didTapPinEntry:textField];
|
| + return YES;
|
| + }
|
| + return NO;
|
| +}
|
|
|
| - [_pairingSwitch sizeToFit];
|
| - _pairingSwitch.center = CGPointMake(
|
| - kMargin + _pairingSwitch.frame.size.width / 2.f,
|
| - buttonSize + _pairingSwitch.frame.size.height / 2.f + kLineSpace);
|
| +#pragma mark - Public
|
|
|
| - _pairingLabel.frame =
|
| - CGRectMake(kMargin + _pairingSwitch.frame.size.width + kPadding,
|
| - buttonSize + kLineSpace, 0.f, 0.f);
|
| - [_pairingLabel sizeToFit];
|
| +- (void)clearPinEntry {
|
| + _pinEntry.text = @"";
|
| + _pinButton.enabled = NO;
|
| }
|
|
|
| #pragma mark - Private
|
|
|