Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Unified Diff: ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm

Issue 2587023002: Upstream Chrome on iOS source code [8/11]. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm
diff --git a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm
new file mode 100644
index 0000000000000000000000000000000000000000..0e1653970ba159155819df255636af87a8cf76c8
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm
@@ -0,0 +1,272 @@
+// Copyright 2016 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/settings_root_collection_view_controller.h"
+
+#include "base/ios/ios_util.h"
+#include "base/logging.h"
+#import "base/mac/foundation_util.h"
+#include "base/mac/objc_property_releaser.h"
+#include "base/mac/scoped_nsobject.h"
+#import "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h"
+#include "ios/chrome/browser/ui/commands/ios_command_ids.h"
+#import "ios/chrome/browser/ui/commands/open_url_command.h"
+#include "ios/chrome/browser/ui/settings/bar_button_activity_indicator.h"
+#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
+#import "ios/chrome/browser/ui/settings/settings_utils.h"
+#include "ios/chrome/browser/ui/ui_util.h"
+#import "ios/chrome/browser/ui/uikit_ui_util.h"
+#include "ios/chrome/grit/ios_strings.h"
+#import "ios/third_party/material_components_ios/src/components/Collections/src/MaterialCollections.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace {
+enum SavedBarButtomItemPositionEnum {
+ kUndefinedBarButtonItemPosition,
+ kLeftBarButtonItemPosition,
+ kRightBarButtonItemPosition
+};
+
+// Dimension of the authentication operation activity indicator frame.
+const CGFloat kActivityIndicatorDimensionIPad = 64;
+const CGFloat kActivityIndicatorDimensionIPhone = 56;
+
+} // namespace
+
+@implementation SettingsRootCollectionViewController {
+ SavedBarButtomItemPositionEnum savedBarButtonItemPosition_;
+ base::scoped_nsobject<UIBarButtonItem> savedBarButtonItem_;
+ base::scoped_nsobject<UIView> veil_;
+
+ base::mac::ObjCPropertyReleaser
+ propertyReleaser_SettingsRootCollectionViewController_;
+}
+
+@synthesize shouldHideDoneButton = shouldHideDoneButton_;
+@synthesize collectionViewAccessibilityIdentifier =
+ collectionViewAccessibilityIdentifier_;
+
+- (instancetype)initWithStyle:(CollectionViewControllerStyle)style {
+ self = [super initWithStyle:style];
+ if (self) {
+ propertyReleaser_SettingsRootCollectionViewController_.Init(
+ self, [SettingsRootCollectionViewController class]);
+ }
+ return self;
+}
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+ self.collectionView.accessibilityIdentifier =
+ self.collectionViewAccessibilityIdentifier;
+
+ // Customize collection view settings.
+ self.styler.cellStyle = MDCCollectionViewCellStyleCard;
+ self.styler.separatorInset = UIEdgeInsetsMake(0, 16, 0, 16);
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+ [super viewWillAppear:animated];
+ UIBarButtonItem* doneButton = [self doneButtonIfNeeded];
+ if (!self.navigationItem.rightBarButtonItem && doneButton) {
+ self.navigationItem.rightBarButtonItem = doneButton;
+ }
+}
+
+- (UIBarButtonItem*)doneButtonIfNeeded {
+ if (self.shouldHideDoneButton) {
+ return nil;
+ }
+ SettingsNavigationController* navigationController =
+ base::mac::ObjCCast<SettingsNavigationController>(
+ self.navigationController);
+ return [navigationController doneButton];
+}
+
+- (UIBarButtonItem*)createEditButton {
+ // Create a custom Edit bar button item, as Material Navigation Bar does not
+ // handle a system UIBarButtonSystemItemEdit item.
+ UIBarButtonItem* button = [[[UIBarButtonItem alloc]
+ initWithTitle:l10n_util::GetNSString(IDS_IOS_NAVIGATION_BAR_EDIT_BUTTON)
+ style:UIBarButtonItemStyleDone
+ target:self
+ action:@selector(editButtonPressed)] autorelease];
+ [button setEnabled:[self editButtonEnabled]];
+ return button;
+}
+
+- (UIBarButtonItem*)createEditDoneButton {
+ // Create a custom Done bar button item, as Material Navigation Bar does not
+ // handle a system UIBarButtonSystemItemDone item.
+ return [[[UIBarButtonItem alloc]
+ initWithTitle:l10n_util::GetNSString(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON)
+ style:UIBarButtonItemStyleDone
+ target:self
+ action:@selector(editButtonPressed)] autorelease];
+}
+
+- (void)updateEditButton {
+ if ([self.editor isEditing]) {
+ self.navigationItem.rightBarButtonItem = [self createEditDoneButton];
+ } else if ([self shouldShowEditButton]) {
+ self.navigationItem.rightBarButtonItem = [self createEditButton];
+ } else {
+ self.navigationItem.rightBarButtonItem = [self doneButtonIfNeeded];
+ }
+}
+
+- (void)editButtonPressed {
+ [self.editor setEditing:![self.editor isEditing] animated:YES];
+ [self updateEditButton];
+}
+
+- (void)reloadData {
+ [self loadModel];
+ [self.collectionView reloadData];
+}
+
+#pragma mark - CollectionViewFooterLinkDelegate
+
+- (void)cell:(CollectionViewFooterCell*)cell didTapLinkURL:(GURL)URL {
+ base::scoped_nsobject<OpenUrlCommand> command(
+ [[OpenUrlCommand alloc] initWithURLFromChrome:URL]);
+ [command setTag:IDC_CLOSE_SETTINGS_AND_OPEN_URL];
+ [self chromeExecuteCommand:command];
+}
+
+#pragma mark - Status bar
+
+- (UIViewController*)childViewControllerForStatusBarHidden {
+ if (!base::ios::IsRunningOnIOS10OrLater()) {
+ // TODO(crbug.com/620361): Remove the entire method override when iOS 9 is
+ // dropped.
+ return nil;
+ } else {
+ return [super childViewControllerForStatusBarHidden];
+ }
+}
+
+- (BOOL)prefersStatusBarHidden {
+ if (!base::ios::IsRunningOnIOS10OrLater()) {
+ // TODO(crbug.com/620361): Remove the entire method override when iOS 9 is
+ // dropped.
+ return NO;
+ } else {
+ return [super prefersStatusBarHidden];
+ }
+}
+
+- (UIViewController*)childViewControllerForStatusBarStyle {
+ if (!base::ios::IsRunningOnIOS10OrLater()) {
+ // TODO(crbug.com/620361): Remove the entire method override when iOS 9 is
+ // dropped.
+ return nil;
+ } else {
+ return [super childViewControllerForStatusBarStyle];
+ }
+}
+
+- (UIStatusBarStyle)preferredStatusBarStyle {
+ if (!base::ios::IsRunningOnIOS10OrLater()) {
+ // TODO(crbug.com/620361): Remove the entire method override when iOS 9 is
+ // dropped.
+ if (IsIPadIdiom() && !IsCompact()) {
+ return UIStatusBarStyleLightContent;
+ } else {
+ return UIStatusBarStyleDefault;
+ }
+ } else {
+ return [super preferredStatusBarStyle];
+ }
+}
+
+#pragma mark - Subclassing
+
+- (BOOL)shouldShowEditButton {
+ return NO;
+}
+
+- (BOOL)editButtonEnabled {
+ return NO;
+}
+
+- (void)preventUserInteraction {
+ DCHECK(!savedBarButtonItem_);
+ DCHECK_EQ(kUndefinedBarButtonItemPosition, savedBarButtonItemPosition_);
+
+ // Create |waitButton|.
+ BOOL displayActivityIndicatorOnTheRight =
+ self.navigationItem.rightBarButtonItem != nil;
+ CGFloat activityIndicatorDimension = IsIPadIdiom()
+ ? kActivityIndicatorDimensionIPad
+ : kActivityIndicatorDimensionIPhone;
+ base::scoped_nsobject<BarButtonActivityIndicator> indicator(
+ [[BarButtonActivityIndicator alloc]
+ initWithFrame:CGRectMake(0.0, 0.0, activityIndicatorDimension,
+ activityIndicatorDimension)]);
+ base::scoped_nsobject<UIBarButtonItem> waitButton(
+ [[UIBarButtonItem alloc] initWithCustomView:indicator]);
+
+ if (displayActivityIndicatorOnTheRight) {
+ // If there is a right bar button item, then it is the "Done" button.
+ savedBarButtonItem_.reset([self.navigationItem.rightBarButtonItem retain]);
+ savedBarButtonItemPosition_ = kRightBarButtonItemPosition;
+ self.navigationItem.rightBarButtonItem = waitButton;
+ [self.navigationItem.leftBarButtonItem setEnabled:NO];
+ } else {
+ savedBarButtonItem_.reset([self.navigationItem.leftBarButtonItem retain]);
+ savedBarButtonItemPosition_ = kLeftBarButtonItemPosition;
+ self.navigationItem.leftBarButtonItem = waitButton;
+ }
+
+ // Adds a veil that covers the collection view and prevents user interaction.
+ DCHECK(self.view);
+ DCHECK(!veil_);
+ veil_.reset([[UIView alloc] initWithFrame:self.view.bounds]);
+ [veil_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth |
+ UIViewAutoresizingFlexibleHeight)];
+ [veil_ setBackgroundColor:[UIColor colorWithWhite:1.0 alpha:0.5]];
+ [self.view addSubview:veil_];
+
+ // Disable user interaction for the navigation controller view to ensure
+ // that the user cannot go back by swipping the navigation's top view
+ // controller
+ [self.navigationController.view setUserInteractionEnabled:NO];
+}
+
+- (void)allowUserInteraction {
+ DCHECK(self.navigationController)
+ << "|allowUserInteraction| should always be called before this settings"
+ " controller is popped or dismissed.";
+ [self.navigationController.view setUserInteractionEnabled:YES];
+
+ // Removes the veil that prevents user interaction.
+ DCHECK(veil_);
+ [UIView animateWithDuration:0.3
+ animations:^{
+ [veil_ removeFromSuperview];
+ }
+ completion:^(BOOL finished) {
+ veil_.reset();
+ }];
+
+ DCHECK(savedBarButtonItem_);
+ switch (savedBarButtonItemPosition_) {
+ case kLeftBarButtonItemPosition:
+ self.navigationItem.leftBarButtonItem = savedBarButtonItem_;
+ break;
+ case kRightBarButtonItemPosition:
+ self.navigationItem.rightBarButtonItem = savedBarButtonItem_;
+ [self.navigationItem.leftBarButtonItem setEnabled:YES];
+ break;
+ default:
+ NOTREACHED();
+ break;
+ }
+ savedBarButtonItem_.reset();
+ savedBarButtonItemPosition_ = kUndefinedBarButtonItemPosition;
+}
+
+@end

Powered by Google App Engine
This is Rietveld 408576698