chromium/ios/chrome/browser/ui/omnibox/keyboard_assist/omnibox_assistive_keyboard_views_utils.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 "ios/chrome/browser/ui/omnibox/keyboard_assist/omnibox_assistive_keyboard_views_utils.h"

#import "ios/chrome/browser/shared/public/features/system_flags.h"
#import "ios/chrome/browser/shared/ui/elements/extended_touch_target_button.h"
#import "ios/chrome/browser/shared/ui/symbols/symbols.h"
#import "ios/chrome/browser/shared/ui/util/layout_guide_names.h"
#import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
#import "ios/chrome/browser/shared/ui/util/util_swift.h"
#import "ios/chrome/browser/ui/omnibox/keyboard_assist/omnibox_assistive_keyboard_delegate.h"
#import "ios/chrome/browser/ui/omnibox/omnibox_ui_features.h"
#import "ios/chrome/common/ui/colors/semantic_color_names.h"
#import "ios/chrome/grit/ios_strings.h"
#import "ios/public/provider/chrome/browser/voice_search/voice_search_api.h"
#import "ui/base/l10n/l10n_util.h"
#import "ui/base/l10n/l10n_util_mac.h"

NSString* const kVoiceSearchInputAccessoryViewID =
    @"kVoiceSearchInputAccessoryViewID";

// Parameters for the appearance of the buttons.
const CGFloat kOmniboxAssistiveKeyboardSymbolPointSize = 23.0;
const CGFloat kSymbolButtonSize = 36.0;
const CGFloat kButtonShadowOpacity = 0.35;
const CGFloat kButtonShadowRadius = 1.0;
const CGFloat kButtonShadowVerticalOffset = 1.0;

namespace {

void SetUpButtonWithIcon(UIButton* button, NSString* iconName) {
  [button setTranslatesAutoresizingMaskIntoConstraints:NO];
  UIImage* icon = [UIImage imageNamed:iconName];
  [button setImage:icon forState:UIControlStateNormal];
  button.layer.shadowColor = [UIColor blackColor].CGColor;
  button.layer.shadowOffset = CGSizeMake(0, kButtonShadowVerticalOffset);
  button.layer.shadowOpacity = kButtonShadowOpacity;
  button.layer.shadowRadius = kButtonShadowRadius;
}

void SetUpButtonWithSymbol(UIButton* button,
                           NSString* symbolName,
                           BOOL isCustomSymbol) {
  [button setTranslatesAutoresizingMaskIntoConstraints:NO];
  UIImageSymbolConfiguration* configuration = [UIImageSymbolConfiguration
      configurationWithPointSize:kOmniboxAssistiveKeyboardSymbolPointSize
                          weight:UIImageSymbolWeightSemibold
                           scale:UIImageSymbolScaleMedium];

  UIImage* icon =
      isCustomSymbol
          ? CustomSymbolWithConfiguration(symbolName, configuration)
          : DefaultSymbolWithConfiguration(symbolName, configuration);
  if (UITraitCollection.currentTraitCollection.userInterfaceStyle ==
      UIUserInterfaceStyleDark) {
    icon = MakeSymbolMonochrome(icon);
    button.tintColor = [UIColor whiteColor];
  } else {
    icon = MakeSymbolMulticolor(icon);
  }

  button.backgroundColor = [UIColor colorNamed:kOmniboxKeyboardButtonColor];
  [button setImage:icon forState:UIControlStateNormal];
  button.layer.cornerRadius = kSymbolButtonSize / 2;

  button.layer.shadowColor = [UIColor blackColor].CGColor;
  button.layer.shadowOffset = CGSizeMake(0, kButtonShadowVerticalOffset);
  button.layer.shadowOpacity = kButtonShadowOpacity;
  button.layer.shadowRadius = kButtonShadowRadius;

  [NSLayoutConstraint activateConstraints:@[
    [button.widthAnchor constraintEqualToConstant:kSymbolButtonSize],
    [button.heightAnchor constraintEqualToConstant:kSymbolButtonSize]
  ]];
}

}  // namespace

void UpdateLensButtonAppearance(UIButton* button) {
  SetUpButtonWithSymbol(button, kCameraLensSymbol, YES);
}

NSArray<UIControl*>* OmniboxAssistiveKeyboardLeadingControls(
    id<OmniboxAssistiveKeyboardDelegate> delegate,
    id<UIPasteConfigurationSupporting> pasteTarget,
    bool useLens) {
  NSMutableArray<UIControl*>* controls = [NSMutableArray<UIControl*> array];

  UIButton* voiceSearchButton =
      [[ExtendedTouchTargetButton alloc] initWithFrame:CGRectZero];
  SetUpButtonWithIcon(voiceSearchButton, @"keyboard_accessory_voice_search");
  voiceSearchButton.enabled = ios::provider::IsVoiceSearchEnabled();
  NSString* accessibilityLabel =
      l10n_util::GetNSString(IDS_IOS_KEYBOARD_ACCESSORY_VIEW_VOICE_SEARCH);
  voiceSearchButton.accessibilityLabel = accessibilityLabel;
  voiceSearchButton.accessibilityIdentifier = kVoiceSearchInputAccessoryViewID;
  [voiceSearchButton addTarget:delegate
                        action:@selector(keyboardAccessoryVoiceSearchTapped:)
              forControlEvents:UIControlEventTouchUpInside];
  [controls addObject:voiceSearchButton];

  UIButton* cameraButton =
      [ExtendedTouchTargetButton buttonWithType:UIButtonTypeCustom];
  if (useLens) {
    // Set up the camera button for Lens.
    delegate.lensButton = cameraButton;
    [delegate.layoutGuideCenter referenceView:cameraButton
                                    underName:kLensKeyboardButtonGuide];
    UpdateLensButtonAppearance(cameraButton);
    [cameraButton addTarget:delegate
                     action:@selector(keyboardAccessoryLensTapped)
           forControlEvents:UIControlEventTouchUpInside];
    SetA11yLabelAndUiAutomationName(cameraButton,
                                    IDS_IOS_KEYBOARD_ACCESSORY_VIEW_LENS,
                                    @"Search With Lens");
  } else {
    // Set up the camera button for the QR scanner.
    SetUpButtonWithIcon(cameraButton, @"keyboard_accessory_qr_scanner");
    [cameraButton addTarget:delegate
                     action:@selector(keyboardAccessoryCameraSearchTapped)
           forControlEvents:UIControlEventTouchUpInside];
    SetA11yLabelAndUiAutomationName(
        cameraButton, IDS_IOS_KEYBOARD_ACCESSORY_VIEW_QR_CODE_SEARCH,
        @"QR code Search");
  }
  [controls addObject:cameraButton];

  if (experimental_flags::IsOmniboxDebuggingEnabled()) {
    UIButton* debuggerButton =
        [[ExtendedTouchTargetButton alloc] initWithFrame:CGRectZero];
    SetUpButtonWithSymbol(debuggerButton, kSettingsSymbol, NO);
    [debuggerButton addTarget:delegate
                       action:@selector(keyboardAccessoryDebuggerTapped)
             forControlEvents:UIControlEventTouchUpInside];
    [controls addObject:debuggerButton];
  }

  return controls;
}