| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // 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/settings/google_services_settings_view_controller.h" |
| |
| #include "base/mac/foundation_util.h" |
| #import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h" |
| #import "ios/chrome/browser/ui/settings/cells/sync_switch_item.h" |
| #import "ios/chrome/browser/ui/settings/google_services_settings_service_delegate.h" |
| #import "ios/chrome/browser/ui/settings/google_services_settings_view_controller_model_delegate.h" |
| #include "ios/chrome/grit/ios_strings.h" |
| #include "ui/base/l10n/l10n_util_mac.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| namespace { |
| |
| // Constants used to convert NSIndexPath into a tag. Used as: |
| // item + section * kSectionOffset |
| constexpr NSInteger kSectionOffset = 1000; |
| |
| } // namespace |
| |
| @implementation GoogleServicesSettingsViewController |
| |
| - (void)viewDidLoad { |
| [super viewDidLoad]; |
| self.tableView.accessibilityIdentifier = |
| @"google_services_settings_view_controller"; |
| self.title = l10n_util::GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_TITLE); |
| } |
| |
| #pragma mark - Private |
| |
| - (NSInteger)tagForIndexPath:(NSIndexPath*)indexPath { |
| return indexPath.item + indexPath.section * kSectionOffset; |
| } |
| |
| - (NSIndexPath*)indexPathForTag:(NSInteger)tag { |
| NSInteger section = tag / kSectionOffset; |
| NSInteger item = tag - (section * kSectionOffset); |
| return [NSIndexPath indexPathForItem:item inSection:section]; |
| } |
| |
| - (void)switchAction:(UISwitch*)sender { |
| NSIndexPath* indexPath = [self indexPathForTag:sender.tag]; |
| SyncSwitchItem* syncSwitchItem = base::mac::ObjCCastStrict<SyncSwitchItem>( |
| [self.tableViewModel itemAtIndexPath:indexPath]); |
| [self.serviceDelegate toggleSwitchItem:syncSwitchItem withValue:sender.isOn]; |
| } |
| |
| #pragma mark - UITableViewDataSource |
| |
| - (UITableViewCell*)tableView:(UITableView*)tableView |
| cellForRowAtIndexPath:(NSIndexPath*)indexPath { |
| UITableViewCell* cell = [super tableView:tableView |
| cellForRowAtIndexPath:indexPath]; |
| if ([cell isKindOfClass:[SettingsSwitchCell class]]) { |
| SettingsSwitchCell* switchCell = |
| base::mac::ObjCCastStrict<SettingsSwitchCell>(cell); |
| [switchCell.switchView addTarget:self |
| action:@selector(switchAction:) |
| forControlEvents:UIControlEventValueChanged]; |
| switchCell.switchView.tag = [self tagForIndexPath:indexPath]; |
| } |
| return cell; |
| } |
| |
| #pragma mark - GoogleServicesSettingsConsumer |
| |
| - (void)insertSections:(NSIndexSet*)sections { |
| if (!self.tableViewModel) { |
| // No need to reload since the model has not been loaded yet. |
| return; |
| } |
| [self.tableView insertSections:sections |
| withRowAnimation:UITableViewRowAnimationNone]; |
| } |
| |
| - (void)deleteSections:(NSIndexSet*)sections { |
| if (!self.tableViewModel) { |
| // No need to reload since the model has not been loaded yet. |
| return; |
| } |
| [self.tableView deleteSections:sections |
| withRowAnimation:UITableViewRowAnimationNone]; |
| } |
| |
| - (void)reloadSections:(NSIndexSet*)sections { |
| if (!self.tableViewModel) { |
| // No need to reload since the model has not been loaded yet. |
| return; |
| } |
| [self.tableView reloadSections:sections |
| withRowAnimation:UITableViewRowAnimationNone]; |
| } |
| |
| - (void)reloadItem:(TableViewItem*)item { |
| if (!self.tableViewModel) { |
| // No need to reload since the model has not been loaded yet. |
| return; |
| } |
| NSIndexPath* indexPath = [self.tableViewModel indexPathForItem:item]; |
| [self.tableView reloadRowsAtIndexPaths:@[ indexPath ] |
| withRowAnimation:UITableViewRowAnimationNone]; |
| } |
| |
| #pragma mark - CollectionViewController |
| |
| - (void)loadModel { |
| [super loadModel]; |
| [self.modelDelegate googleServicesSettingsViewControllerLoadModel:self]; |
| } |
| |
| #pragma mark - UIViewController |
| |
| - (void)viewWillAppear:(BOOL)animated { |
| [super viewWillAppear:animated]; |
| [self reloadData]; |
| } |
| |
| - (void)didMoveToParentViewController:(UIViewController*)parent { |
| [super didMoveToParentViewController:parent]; |
| if (!parent) { |
| [self.presentationDelegate |
| googleServicesSettingsViewControllerDidRemove:self]; |
| } |
| } |
| |
| #pragma mark - UITableViewDelegate |
| |
| - (void)tableView:(UITableView*)tableView |
| didSelectRowAtIndexPath:(NSIndexPath*)indexPath { |
| [super tableView:tableView didSelectRowAtIndexPath:indexPath]; |
| TableViewItem* item = [self.tableViewModel itemAtIndexPath:indexPath]; |
| [self.serviceDelegate didSelectItem:item]; |
| } |
| |
| @end |