chromium/ios/chrome/browser/autofill/ui_bundled/expiration_date_picker.mm

// Copyright 2019 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/expiration_date_picker.h"

namespace {
int const kNumberOfSections = 2;
int const kMonthSection = 0;
int const kYearSection = 1;
int const kNumberOfYearsToShow = 20;
}

@interface ExpirationDatePicker () <UIPickerViewDelegate,
                                    UIPickerViewDataSource>
@end

@implementation ExpirationDatePicker {
  NSArray* _months;
  NSArray* _years;
}

@synthesize onDateSelected = _onDateSelected;

- (instancetype)initWithFrame:(CGRect)frame {
  if ((self = [super initWithFrame:frame])) {
    NSCalendar* calendar = NSCalendar.currentCalendar;
    NSDateComponents* calendarComponents =
        [calendar components:NSCalendarUnitMonth | NSCalendarUnitYear
                    fromDate:[NSDate date]];

    NSInteger currentYear = [calendarComponents year];
    NSMutableArray* years = [[NSMutableArray alloc] init];
    for (int i = 0; i < kNumberOfYearsToShow; i++) {
      [years addObject:[NSString stringWithFormat:@"%lu", currentYear + i]];
    }
    _years = [years copy];

    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    NSMutableArray<NSString*>* months = [[NSMutableArray alloc]
        initWithCapacity:dateFormatter.monthSymbols.count];
    for (NSUInteger i = 0; i < dateFormatter.monthSymbols.count; i++) {
      NSString* monthSymbol = dateFormatter.monthSymbols[i];
      [months addObject:[NSString
                            stringWithFormat:@"%@ (%lu)", monthSymbol, i + 1]];
    }
    _months = months;

    self.delegate = self;
    self.dataSource = self;
    self.backgroundColor = UIColor.whiteColor;

    NSInteger currentMonth = [calendarComponents month];
    [self selectRow:MAX(0, currentMonth - 1)
        inComponent:kMonthSection
           animated:NO];
  }

  return self;
}

- (NSString*)month {
  NSUInteger month = [self selectedRowInComponent:kMonthSection] + 1;
  return [NSString stringWithFormat:@"%lu", month];
}

- (NSString*)year {
  return _years[[self selectedRowInComponent:kYearSection]];
}

#pragma mark UIPickerViewDataSource

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView {
  return kNumberOfSections;
}

- (NSInteger)pickerView:(UIPickerView*)pickerView
    numberOfRowsInComponent:(NSInteger)component {
  switch (component) {
    case kMonthSection:
      return _months.count;
    case kYearSection:
      return _years.count;
    default:
      return 0;
  }
}

- (NSString*)pickerView:(UIPickerView*)pickerView
            titleForRow:(NSInteger)row
           forComponent:(NSInteger)component {
  switch (component) {
    case kMonthSection:
      return _months[row];
    case kYearSection:
      return _years[row];
    default:
      return nil;
  }
}

- (void)pickerView:(UIPickerView*)pickerView
      didSelectRow:(NSInteger)row
       inComponent:(NSInteger)component {
  if (_onDateSelected != nil) {
    _onDateSelected(self.month, self.year);
  }
}

@end