blob: 2b08e82068b4ecc114f6aa7f0bb4fb5e2ed57919 [file] [log] [blame]
// Copyright 2015 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/import_data_collection_view_controller.h"
#include "base/logging.h"
#import "base/mac/foundation_util.h"
#include "base/strings/sys_string_conversions.h"
#import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
#import "ios/chrome/browser/ui/collection_view/cells/collection_view_detail_item.h"
#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h"
#import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
#import "ios/chrome/browser/ui/settings/cells/card_multiline_item.h"
#import "ios/chrome/browser/ui/settings/cells/import_data_multiline_detail_cell.h"
#include "ios/chrome/grit/ios_chromium_strings.h"
#include "ios/chrome/grit/ios_strings.h"
#import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h"
#import "ios/third_party/material_components_ios/src/components/Collections/src/MaterialCollections.h"
#include "ui/base/l10n/l10n_util_mac.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
// The accessibility identifier of the Import Data cell.
NSString* const kImportDataImportCellId = @"kImportDataImportCellId";
// The accessibility identifier of the Keep Data Separate cell.
NSString* const kImportDataKeepSeparateCellId =
@"kImportDataKeepSeparateCellId";
namespace {
typedef NS_ENUM(NSInteger, SectionIdentifier) {
SectionIdentifierDisclaimer = kSectionIdentifierEnumZero,
SectionIdentifierOptions,
};
typedef NS_ENUM(NSInteger, ItemType) {
ItemTypeFooter = kItemTypeEnumZero,
ItemTypeOptionImportData,
ItemTypeOptionKeepDataSeparate,
};
} // namespace
@implementation ImportDataCollectionViewController {
__weak id<ImportDataControllerDelegate> _delegate;
NSString* _fromEmail;
NSString* _toEmail;
BOOL _isSignedIn;
ShouldClearData _shouldClearData;
CollectionViewDetailItem* _importDataItem;
CollectionViewDetailItem* _keepDataSeparateItem;
}
#pragma mark Initialization
- (instancetype)initWithDelegate:(id<ImportDataControllerDelegate>)delegate
fromEmail:(NSString*)fromEmail
toEmail:(NSString*)toEmail
isSignedIn:(BOOL)isSignedIn {
DCHECK(fromEmail);
DCHECK(toEmail);
self = [super initWithStyle:CollectionViewControllerStyleAppBar];
if (self) {
_delegate = delegate;
_fromEmail = [fromEmail copy];
_toEmail = [toEmail copy];
_isSignedIn = isSignedIn;
_shouldClearData = isSignedIn ? SHOULD_CLEAR_DATA_CLEAR_DATA
: SHOULD_CLEAR_DATA_MERGE_DATA;
self.title =
isSignedIn
? l10n_util::GetNSString(IDS_IOS_OPTIONS_IMPORT_DATA_TITLE_SWITCH)
: l10n_util::GetNSString(IDS_IOS_OPTIONS_IMPORT_DATA_TITLE_SIGNIN);
[self setShouldHideDoneButton:YES];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]
initWithTitle:l10n_util::GetNSString(
IDS_IOS_OPTIONS_IMPORT_DATA_CONTINUE_BUTTON)
style:UIBarButtonItemStyleDone
target:self
action:@selector(didTapContinue)];
[self loadModel];
}
return self;
}
#pragma mark SettingsRootCollectionViewController
- (void)loadModel {
[super loadModel];
CollectionViewModel* model = self.collectionViewModel;
[model addSectionWithIdentifier:SectionIdentifierDisclaimer];
[model addItem:[self descriptionItem]
toSectionWithIdentifier:SectionIdentifierDisclaimer];
[model addSectionWithIdentifier:SectionIdentifierOptions];
_importDataItem = [self importDataItem];
_keepDataSeparateItem = [self keepDataSeparateItem];
if (_isSignedIn) {
[model addItem:_keepDataSeparateItem
toSectionWithIdentifier:SectionIdentifierOptions];
[model addItem:_importDataItem
toSectionWithIdentifier:SectionIdentifierOptions];
} else {
[model addItem:_importDataItem
toSectionWithIdentifier:SectionIdentifierOptions];
[model addItem:_keepDataSeparateItem
toSectionWithIdentifier:SectionIdentifierOptions];
}
}
#pragma mark Items
- (CollectionViewItem*)descriptionItem {
CardMultilineItem* item =
[[CardMultilineItem alloc] initWithType:ItemTypeFooter];
item.text = l10n_util::GetNSStringF(IDS_IOS_OPTIONS_IMPORT_DATA_HEADER,
base::SysNSStringToUTF16(_fromEmail));
return item;
}
- (CollectionViewDetailItem*)importDataItem {
CollectionViewDetailItem* item =
[[CollectionViewDetailItem alloc] initWithType:ItemTypeOptionImportData];
item.cellClass = [ImportDataMultilineDetailCell class];
item.text = l10n_util::GetNSString(IDS_IOS_OPTIONS_IMPORT_DATA_IMPORT_TITLE);
item.detailText =
l10n_util::GetNSStringF(IDS_IOS_OPTIONS_IMPORT_DATA_IMPORT_SUBTITLE,
base::SysNSStringToUTF16(_toEmail));
item.accessoryType = _isSignedIn ? MDCCollectionViewCellAccessoryNone
: MDCCollectionViewCellAccessoryCheckmark;
item.accessibilityIdentifier = kImportDataImportCellId;
return item;
}
- (CollectionViewDetailItem*)keepDataSeparateItem {
CollectionViewDetailItem* item = [[CollectionViewDetailItem alloc]
initWithType:ItemTypeOptionKeepDataSeparate];
item.cellClass = [ImportDataMultilineDetailCell class];
item.text = l10n_util::GetNSString(IDS_IOS_OPTIONS_IMPORT_DATA_KEEP_TITLE);
if (_isSignedIn) {
item.detailText = l10n_util::GetNSStringF(
IDS_IOS_OPTIONS_IMPORT_DATA_KEEP_SUBTITLE_SWITCH,
base::SysNSStringToUTF16(_fromEmail));
} else {
item.detailText = l10n_util::GetNSString(
IDS_IOS_OPTIONS_IMPORT_DATA_KEEP_SUBTITLE_SIGNIN);
}
item.accessoryType = _isSignedIn ? MDCCollectionViewCellAccessoryCheckmark
: MDCCollectionViewCellAccessoryNone;
item.accessibilityIdentifier = kImportDataKeepSeparateCellId;
return item;
}
#pragma mark MDCCollectionViewStylingDelegate
- (CGFloat)collectionView:(UICollectionView*)collectionView
cellHeightAtIndexPath:(NSIndexPath*)indexPath {
CollectionViewItem* item =
[self.collectionViewModel itemAtIndexPath:indexPath];
CGFloat cardWidth = CGRectGetWidth(collectionView.bounds) -
2 * MDCCollectionViewCellStyleCardSectionInset;
return
[MDCCollectionViewCell cr_preferredHeightForWidth:cardWidth forItem:item];
}
#pragma mark UICollectionViewDelegate
- (void)collectionView:(UICollectionView*)collectionView
didSelectItemAtIndexPath:(NSIndexPath*)indexPath {
[super collectionView:collectionView didSelectItemAtIndexPath:indexPath];
NSInteger sectionIdentifier =
[self.collectionViewModel sectionIdentifierForSection:indexPath.section];
if (sectionIdentifier == SectionIdentifierOptions) {
// Store the user choice.
NSInteger itemType =
[self.collectionViewModel itemTypeForIndexPath:indexPath];
_shouldClearData = (itemType == ItemTypeOptionImportData)
? SHOULD_CLEAR_DATA_MERGE_DATA
: SHOULD_CLEAR_DATA_CLEAR_DATA;
[self updateUI];
}
}
#pragma mark Private methods
// Updates the UI based on the value of |_shouldClearData|.
- (void)updateUI {
BOOL importDataSelected = _shouldClearData == SHOULD_CLEAR_DATA_MERGE_DATA;
_importDataItem.accessoryType = importDataSelected
? MDCCollectionViewCellAccessoryCheckmark
: MDCCollectionViewCellAccessoryNone;
_keepDataSeparateItem.accessoryType =
importDataSelected ? MDCCollectionViewCellAccessoryNone
: MDCCollectionViewCellAccessoryCheckmark;
[self reconfigureCellsForItems:@[ _importDataItem, _keepDataSeparateItem ]
inSectionWithIdentifier:SectionIdentifierOptions];
}
- (void)didTapContinue {
[_delegate didChooseClearDataPolicy:self shouldClearData:_shouldClearData];
}
@end