chromium/ios/chrome/app/launch_screen_view_controller.mm

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

#import "ios/chrome/app/launch_screen_view_controller.h"

#import "ios/chrome/browser/first_run/ui_bundled/first_run_constants.h"
#import "ios/chrome/common/ui/colors/semantic_color_names.h"

namespace {

// All the following values are from "ios/chrome/app/resources/LaunchScreen.xib"
// and should be in sync so that the transition between app launch screen and
// the launch screen view is invisible for the users.
constexpr CGFloat kBottomMargin = 20;
constexpr CGFloat kLogoMultiplier = 0.381966;
constexpr CGFloat kBrandWidth = 107;
constexpr CGFloat kStatusWidth = 195;
}  // namespace

@interface LaunchScreenViewController ()

// Label displayed during the loading.
@property(nonatomic, strong) UILabel* loadingLabel;

@end

@implementation LaunchScreenViewController

#pragma mark - UIViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  UIView* view = self.view;
  view.accessibilityIdentifier =
      first_run::kLaunchScreenAccessibilityIdentifier;

  view.backgroundColor = [UIColor colorNamed:kBackgroundColor];

  UIImageView* logo = [self createLogoView];
  UIImageView* brand = [self createBrandView];
  NSArray<UIView*>* arrangedSubviews = self.detailView == nil
                                           ? @[ logo, brand ]
                                           : @[ logo, self.detailView, brand ];
  UIStackView* mainStackView =
      [[UIStackView alloc] initWithArrangedSubviews:arrangedSubviews];
  mainStackView.axis = UILayoutConstraintAxisVertical;
  mainStackView.translatesAutoresizingMaskIntoConstraints = NO;
  mainStackView.distribution = UIStackViewDistributionEqualSpacing;
  mainStackView.alignment = UIStackViewAlignmentCenter;

  [view addSubview:mainStackView];

  [NSLayoutConstraint activateConstraints:@[
    [logo.widthAnchor constraintEqualToAnchor:view.widthAnchor
                                   multiplier:kLogoMultiplier],
    [logo.centerYAnchor constraintEqualToAnchor:view.centerYAnchor],
    [brand.bottomAnchor
        constraintEqualToAnchor:view.layoutMarginsGuide.bottomAnchor
                       constant:-kBottomMargin],
    [brand.widthAnchor constraintEqualToConstant:kBrandWidth],
    [mainStackView.widthAnchor constraintEqualToAnchor:view.widthAnchor],
    [mainStackView.centerXAnchor constraintEqualToAnchor:view.centerXAnchor],
  ]];
  if (self.detailView) {
    [self.detailView.widthAnchor constraintEqualToConstant:kStatusWidth]
        .active = YES;
  }
}

#pragma mark - Private

// Creates and configures the logo image view.
- (UIImageView*)createLogoView {
  UIImage* logo = [UIImage imageNamed:@"launchscreen_app_logo"];
  UIImageView* logoImageView = [[UIImageView alloc] initWithImage:logo];
  logoImageView.contentMode = UIViewContentModeScaleAspectFit;
  logoImageView.translatesAutoresizingMaskIntoConstraints = NO;
  return logoImageView;
}

// Creates and configures the brand name image.
- (UIImageView*)createBrandView {
  UIImage* brandNameLogo = [UIImage imageNamed:@"launchscreen_brand_name"];
  UIImageView* brandImageView =
      [[UIImageView alloc] initWithImage:brandNameLogo];
  brandImageView.contentMode = UIViewContentModeScaleAspectFit;
  brandImageView.translatesAutoresizingMaskIntoConstraints = NO;
  return brandImageView;
}

@end