chromium/ios/chrome/browser/phone_number/ui_bundled/phone_number_actions_view_controller.mm

// Copyright 2024 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/phone_number/ui_bundled/phone_number_actions_view_controller.h"

#import "ios/chrome/browser/shared/public/commands/add_contacts_commands.h"
#import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_item.h"
#import "ios/chrome/browser/shared/ui/table_view/table_view_navigation_controller_constants.h"
#import "ios/chrome/browser/phone_number/ui_bundled/phone_number_constants.h"
#import "ios/chrome/common/ui/colors/semantic_color_names.h"
#import "ios/chrome/common/ui/util/constraints_ui_util.h"
#import "ios/chrome/grit/ios_strings.h"
#import "ui/base/l10n/l10n_util.h"

namespace {
typedef NS_ENUM(NSInteger, SectionIdentifier) {
  SectionIdentifierPhoneNumberActions = kSectionIdentifierEnumZero,
};

// This is used by TableViewModel to differentiate and identify phone number
// actions.
typedef NS_ENUM(NSInteger, ItemType) {
  ItemTypeActionCall = kItemTypeEnumZero,
  ItemTypeActionMessage,
  ItemTypeActionContacts,
  ItemTypeActionFacetime,

};

}  // namespace

@interface PhoneNumberActionsViewController ()

@end

@implementation PhoneNumberActionsViewController {
  // Unformatted phone number.
  NSString* _phoneNumber;

  // Formatted phone number with the call prefix.
  NSString* _phoneNumberCallFormat;

  // Formatted phone number with the message prefix.
  NSString* _phoneNumberMessageFormat;

  // Formatted phone number with the facetime prefix.
  NSString* _phoneNumberFacetimeFormat;

  // Cancel button item in navigation bar.
  UIBarButtonItem* _cancelButton;

  // Displayed unformatted phone number title.
  NSString* _phoneNumberTitle;
}

- (instancetype)initWithPhoneNumber:(NSString*)phoneNumber {
  self = [super initWithStyle:UITableViewStyleInsetGrouped];

  if (self) {
    _phoneNumber = [phoneNumber stringByReplacingOccurrencesOfString:@" "
                                                          withString:@""];
    _phoneNumberCallFormat =
        [NSString stringWithFormat:@"tel:%@", _phoneNumber];
    _phoneNumberMessageFormat =
        [NSString stringWithFormat:@"sms:%@", _phoneNumber];
    _phoneNumberFacetimeFormat =
        [NSString stringWithFormat:@"facetime://%@", _phoneNumber];
    _phoneNumberTitle = phoneNumber;
  }
  return self;
}

#pragma mark - UIViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.title = _phoneNumberTitle;
  _cancelButton = [[UIBarButtonItem alloc]
      initWithTitle:l10n_util::GetNSString(IDS_IOS_PHONE_NUMBER_CANCEL)
              style:UIBarButtonItemStylePlain
             target:self
             action:@selector(cancelButtonTapped:)];
  self.navigationItem.rightBarButtonItem = _cancelButton;
  self.tableView.accessibilityIdentifier = kPhoneNumberActionsViewIdentifier;

  [self loadModel];
}

#pragma mark - LegacyChromeTableViewController

- (void)loadModel {
  [super loadModel];
  TableViewModel* model = self.tableViewModel;
  [model addSectionWithIdentifier:SectionIdentifierPhoneNumberActions];
  TableViewTextItem* callButton =
      [[TableViewTextItem alloc] initWithType:ItemTypeActionCall];
  TableViewTextItem* messageButton =
      [[TableViewTextItem alloc] initWithType:ItemTypeActionMessage];
  TableViewTextItem* addToContactsbutton =
      [[TableViewTextItem alloc] initWithType:ItemTypeActionContacts];
  TableViewTextItem* facetimeButton =
      [[TableViewTextItem alloc] initWithType:ItemTypeActionFacetime];

  callButton.text = l10n_util::GetNSString(IDS_IOS_PHONE_NUMBER_CALL);
  callButton.textColor = [UIColor colorNamed:kBlueColor];
  callButton.accessibilityTraits = UIAccessibilityTraitButton;

  messageButton.text =
      l10n_util::GetNSString(IDS_IOS_PHONE_NUMBER_SEND_MESSAGE);
  messageButton.textColor = [UIColor colorNamed:kBlueColor];
  messageButton.accessibilityTraits = UIAccessibilityTraitButton;

  addToContactsbutton.text =
      l10n_util::GetNSString(IDS_IOS_PHONE_NUMBER_ADD_TO_CONTACTS);
  addToContactsbutton.textColor = [UIColor colorNamed:kBlueColor];
  addToContactsbutton.accessibilityTraits = UIAccessibilityTraitButton;

  facetimeButton.text = l10n_util::GetNSString(IDS_IOS_PHONE_NUMBER_FACETIME);
  facetimeButton.textColor = [UIColor colorNamed:kBlueColor];
  facetimeButton.accessibilityTraits = UIAccessibilityTraitButton;

  [model addItem:callButton
      toSectionWithIdentifier:SectionIdentifierPhoneNumberActions];
  [model addItem:messageButton
      toSectionWithIdentifier:SectionIdentifierPhoneNumberActions];
  [model addItem:addToContactsbutton
      toSectionWithIdentifier:SectionIdentifierPhoneNumberActions];
  [model addItem:facetimeButton
      toSectionWithIdentifier:SectionIdentifierPhoneNumberActions];
}

#pragma mark - UITableViewDelegate

- (void)tableView:(UITableView*)tableView
    didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
  TableViewItem* item = [self.tableViewModel itemAtIndexPath:indexPath];
  [self.presentingViewController dismissViewControllerAnimated:YES
                                                    completion:nil];
  switch (item.type) {
    case ItemTypeActionCall: {
      [[UIApplication sharedApplication]
                    openURL:[NSURL URLWithString:_phoneNumberCallFormat]
                    options:@{}
          completionHandler:nil];
      break;
    }
    case ItemTypeActionMessage: {
      [[UIApplication sharedApplication]
                    openURL:[NSURL URLWithString:_phoneNumberMessageFormat]
                    options:@{}
          completionHandler:nil];
      break;
    }
    case ItemTypeActionContacts: {
      [self.addContactsHandler presentAddContactsForPhoneNumber:_phoneNumber];
      break;
    }
    case ItemTypeActionFacetime: {
      [[UIApplication sharedApplication]
                    openURL:[NSURL URLWithString:_phoneNumberFacetimeFormat]
                    options:@{}
          completionHandler:nil];
      break;
    }
  }
}

#pragma mark - SettingsControllerProtocol

- (void)reportDismissalUserAction {
}

- (void)reportBackUserAction {
}

#pragma mark - Helper methods

// Action when the cancel is tapped.
- (void)cancelButtonTapped:(UIBarButtonItem*)item {
  [self.navigationController dismissViewControllerAnimated:YES completion:nil];
}

@end