chromium/ios/chrome/browser/autofill/ui_bundled/cells/expiration_date_edit_item.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/browser/autofill/ui_bundled/cells/expiration_date_edit_item.h"
#import "ios/chrome/browser/autofill/ui_bundled/cells/expiration_date_edit_item+Testing.h"

#import "components/strings/grit/components_strings.h"
#import "ios/chrome/browser/shared/ui/table_view/legacy_chrome_table_view_styler.h"
#import "ios/chrome/browser/autofill/ui_bundled/cells/expiration_date_edit_item_delegate.h"
#import "ios/chrome/browser/autofill/ui_bundled/expiration_date_picker.h"
#import "ios/chrome/common/ui/colors/semantic_color_names.h"
#import "ui/base/l10n/l10n_util.h"

@interface ExpirationDateEditItem ()

// Making both properties writable privately.
@property(nonatomic, readwrite, copy) NSString* month;
@property(nonatomic, readwrite, copy) NSString* year;

@end

@implementation ExpirationDateEditItem

- (instancetype)initWithType:(NSInteger)type {
  self = [super initWithType:type];
  if (self) {
    self.cellClass = ExpirationDateEditCell.class;
  }
  return self;
}

- (void)configureCell:(ExpirationDateEditCell*)cell
           withStyler:(ChromeTableViewStyler*)styler {
  [super configureCell:cell withStyler:styler];

  cell.textLabel.text = self.fieldNameLabelText;
  [cell setMonth:self.month year:self.year];

  if (self.fieldNameLabelText.length) {
    cell.textField.accessibilityIdentifier =
        [NSString stringWithFormat:@"%@_textField", self.fieldNameLabelText];
  }

  if (styler.cellBackgroundColor) {
    cell.textLabel.backgroundColor = styler.cellBackgroundColor;
    cell.textField.backgroundColor = styler.cellBackgroundColor;
  } else {
    cell.textLabel.backgroundColor = styler.tableViewBackgroundColor;
    cell.textField.backgroundColor = styler.tableViewBackgroundColor;
  }

  cell.textField.textColor = [UIColor colorNamed:kTextPrimaryColor];
  cell.textField.enabled = YES;
  // Prevent Voice Over from announcing autocorrection.
  cell.textField.autocorrectionType = UITextAutocorrectionTypeNo;

  [cell setIcon:TableViewTextEditItemIconTypeNone];

  cell.isAccessibilityElement = NO;

  __weak ExpirationDateEditItem* weakSelf = self;
  __weak ExpirationDateEditCell* weakCell = cell;
  cell.expirationDatePicker.onDateSelected =
      ^(NSString* month, NSString* year) {
        if (!weakSelf || !weakCell) {
          return;
        }
        auto* strongSelf = weakSelf;
        auto* strongCell = weakCell;
        strongSelf.month = month;
        strongSelf.year = year;
        [strongCell setMonth:month year:year];
        [strongSelf.delegate expirationDateEditItemDidChange:strongSelf];
      };
}

@end

@interface ExpirationDateEditCell () <UITextFieldDelegate>

@end

@implementation ExpirationDateEditCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style
              reuseIdentifier:(NSString*)reuseIdentifier {
  self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

  if (self) {
    _expirationDatePicker =
        [[ExpirationDatePicker alloc] initWithFrame:CGRectZero];
    _expirationDatePicker.backgroundColor = [UIColor clearColor];

    // Use the expiration date picker as input view instead of a keypad.
    self.textField.inputView = self.expirationDatePicker;
    self.textField.clearButtonMode = UITextFieldViewModeNever;
    self.textField.delegate = self;
  }

  return self;
}

- (void)prepareForReuse {
  [super prepareForReuse];

  self.textField.clearButtonMode = UITextFieldViewModeNever;
  self.expirationDatePicker.onDateSelected = nil;
  self.textField.text = @"";
}

#pragma mark - Public

- (void)setMonth:(NSString*)month year:(NSString*)year {
  if (month.length && year.length) {
    NSString* dateSeparator =
        l10n_util::GetNSString(IDS_AUTOFILL_EXPIRATION_DATE_SEPARATOR);
    self.textField.text =
        [NSString stringWithFormat:@"%@%@%@", month, dateSeparator, year];
  } else {
    self.textField.text = @"";
  }
}

#pragma mark - UITextFieldDelegate

- (BOOL)textField:(UITextField*)textField
    shouldChangeCharactersInRange:(NSRange)range
                replacementString:(NSString*)string {
  return NO; /* Prevent any input from outside the date picker. */
}

@end