chromium/remoting/ios/app/session_reconnect_view.mm

// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "remoting/ios/app/session_reconnect_view.h"

#import <MaterialComponents/MaterialButtons.h>

#include "remoting/base/string_resources.h"
#import "remoting/ios/app/remoting_theme.h"
#include "ui/base/l10n/l10n_util.h"

static const CGFloat kPadding = 20.f;
static UIFont* const kErrorFont = [UIFont systemFontOfSize:13.f];

@interface SessionReconnectView () {
  MDCFloatingButton* _reconnectButton;
  UILabel* _errorLabel;
  UILabel* _reportThisLabel;
}
@end

@implementation SessionReconnectView

@synthesize delegate = _delegate;

- (id)initWithFrame:(CGRect)frame {
  self = [super initWithFrame:frame];
  if (self) {
    self.backgroundColor = [UIColor clearColor];

    _reconnectButton =
        [MDCFloatingButton floatingButtonWithShape:MDCFloatingButtonShapeMini];
    [_reconnectButton
        setImage:[RemotingTheme
                         .refreshIcon imageFlippedForRightToLeftLayoutDirection]
        forState:UIControlStateNormal];
    [_reconnectButton setBackgroundColor:RemotingTheme.buttonBackgroundColor
                                forState:UIControlStateNormal];

    [_reconnectButton setElevation:4.0f forState:UIControlStateNormal];
    [_reconnectButton setTitle:l10n_util::GetNSString(IDS_RECONNECT)
                      forState:UIControlStateNormal];
    [_reconnectButton addTarget:self
                         action:@selector(didTapReconnect:)
               forControlEvents:UIControlEventTouchUpInside];
    _reconnectButton.translatesAutoresizingMaskIntoConstraints = NO;
    [self addSubview:_reconnectButton];

    _errorLabel = [[UILabel alloc] init];
    _errorLabel.textColor = RemotingTheme.connectionViewForegroundColor;
    _errorLabel.font = kErrorFont;
    _errorLabel.numberOfLines = 0;
    _errorLabel.lineBreakMode = NSLineBreakByWordWrapping;
    _errorLabel.translatesAutoresizingMaskIntoConstraints = NO;
    [self addSubview:_errorLabel];

    _reportThisLabel = [[UILabel alloc] init];
    _reportThisLabel.accessibilityTraits = UIAccessibilityTraitLink;
    _reportThisLabel.text = l10n_util::GetNSString(IDS_REPORT_THIS);
    _reportThisLabel.textColor = RemotingTheme.hostErrorColor;
    _reportThisLabel.font = kErrorFont;
    _reportThisLabel.translatesAutoresizingMaskIntoConstraints = NO;
    [self addSubview:_reportThisLabel];

    UITapGestureRecognizer* tapReportRecognizer =
        [[UITapGestureRecognizer alloc] init];
    tapReportRecognizer.numberOfTapsRequired = 1;
    tapReportRecognizer.numberOfTouchesRequired = 1;
    [tapReportRecognizer addTarget:self action:@selector(didTapReport:)];
    _reportThisLabel.userInteractionEnabled = YES;
    [_reportThisLabel addGestureRecognizer:tapReportRecognizer];

    [self setupLayoutConstraints];
  }
  return self;
}

- (void)setupLayoutConstraints {
  UILayoutGuide* errorTextLayoutGuide = [[UILayoutGuide alloc] init];
  [self addLayoutGuide:errorTextLayoutGuide];

  [NSLayoutConstraint activateConstraints:@[
    [errorTextLayoutGuide.centerYAnchor
        constraintEqualToAnchor:self.centerYAnchor],
    [errorTextLayoutGuide.leadingAnchor
        constraintEqualToAnchor:self.leadingAnchor],

    [_errorLabel.topAnchor
        constraintEqualToAnchor:errorTextLayoutGuide.topAnchor],
    [_errorLabel.leadingAnchor
        constraintEqualToAnchor:errorTextLayoutGuide.leadingAnchor],
    [_errorLabel.trailingAnchor
        constraintEqualToAnchor:errorTextLayoutGuide.trailingAnchor],

    [_reportThisLabel.topAnchor
        constraintEqualToAnchor:_errorLabel.bottomAnchor],
    [_reportThisLabel.leadingAnchor
        constraintEqualToAnchor:errorTextLayoutGuide.leadingAnchor],
    [_reportThisLabel.bottomAnchor
        constraintEqualToAnchor:errorTextLayoutGuide.bottomAnchor],
    // _reportThisLabel's width should freely expand for its content.

    [_reconnectButton.centerYAnchor constraintEqualToAnchor:self.centerYAnchor],
    [_reconnectButton.leadingAnchor
        constraintEqualToAnchor:errorTextLayoutGuide.trailingAnchor
                       constant:kPadding],
    [_reconnectButton.trailingAnchor
        constraintEqualToAnchor:self.trailingAnchor],
  ]];
}

#pragma mark - Properties

- (void)setErrorText:(NSString*)errorText {
  if (errorText) {
    _errorLabel.text = errorText;
    _errorLabel.hidden = NO;
  } else {
    _errorLabel.hidden = YES;
  }
}

- (NSString*)errorText {
  return _errorLabel.text;
}

#pragma mark - Private

- (void)didTapReconnect:(id)sender {
  if ([_delegate respondsToSelector:@selector(didTapReconnect)]) {
    [_delegate didTapReconnect];
  }
}

- (void)didTapReport:(UITapGestureRecognizer*)sender {
  if (sender.state == UIGestureRecognizerStateEnded) {
    [self.delegate didTapReport];
  }
}

@end