| Index: ios/chrome/browser/ui/bookmarks/bookmark_folder_collection_view.mm
|
| diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_folder_collection_view.mm b/ios/chrome/browser/ui/bookmarks/bookmark_folder_collection_view.mm
|
| index 4b2a16a4b81bd8dc1d8021e97856d84a8203b35a..8234110a7dddfbe14153bf4970c2107b99e58c6f 100644
|
| --- a/ios/chrome/browser/ui/bookmarks/bookmark_folder_collection_view.mm
|
| +++ b/ios/chrome/browser/ui/bookmarks/bookmark_folder_collection_view.mm
|
| @@ -9,8 +9,13 @@
|
| #include "components/bookmarks/browser/bookmark_model.h"
|
| #include "ios/chrome/browser/bookmarks/bookmarks_utils.h"
|
| #include "ios/chrome/browser/experimental_flags.h"
|
| +#import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
|
| +#import "ios/chrome/browser/ui/authentication/signin_promo_view_configurator.h"
|
| +#import "ios/chrome/browser/ui/authentication/signin_promo_view_consumer.h"
|
| +#import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h"
|
| #import "ios/chrome/browser/ui/bookmarks/bookmark_collection_cells.h"
|
| #import "ios/chrome/browser/ui/bookmarks/bookmark_promo_cell.h"
|
| +#import "ios/chrome/browser/ui/bookmarks/bookmark_signin_promo_cell.h"
|
| #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h"
|
|
|
| #if !defined(__has_feature) || !__has_feature(objc_arc)
|
| @@ -19,7 +24,27 @@
|
|
|
| using bookmarks::BookmarkNode;
|
|
|
| -@interface BookmarkFolderCollectionView ()<BookmarkPromoCellDelegate> {
|
| +namespace {
|
| +// Computes the cell size based on width.
|
| +CGSize PreferredCellSizeForWidth(UICollectionViewCell* cell, CGFloat width) {
|
| + CGRect cellFrame = cell.frame;
|
| + cellFrame.size.width = width;
|
| + cellFrame.size.height = CGFLOAT_MAX;
|
| + cell.frame = cellFrame;
|
| + [cell setNeedsLayout];
|
| + [cell layoutIfNeeded];
|
| + CGSize result =
|
| + [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize
|
| + withHorizontalFittingPriority:UILayoutPriorityRequired
|
| + verticalFittingPriority:UILayoutPriorityDefaultLow];
|
| + cellFrame.size = result;
|
| + cell.frame = cellFrame;
|
| + return result;
|
| +}
|
| +}
|
| +
|
| +@interface BookmarkFolderCollectionView ()<BookmarkPromoCellDelegate,
|
| + SigninPromoViewConsumer> {
|
| // A vector of folders to display in the collection view.
|
| std::vector<const BookmarkNode*> _subFolders;
|
| // A vector of bookmark urls to display in the collection view.
|
| @@ -27,6 +52,9 @@ using bookmarks::BookmarkNode;
|
|
|
| // True if the promo is visible.
|
| BOOL _promoVisible;
|
| +
|
| + // Mediator, helper for the sign-in promo view.
|
| + SigninPromoViewMediator* _signinPromoViewMediator;
|
| }
|
| @property(nonatomic, assign) const bookmarks::BookmarkNode* folder;
|
|
|
| @@ -36,15 +64,11 @@ using bookmarks::BookmarkNode;
|
| @property(nonatomic, readonly, assign) NSInteger itemsSection;
|
| @property(nonatomic, readonly, assign) NSInteger sectionCount;
|
|
|
| -// Keep a reference to the promo cell to deregister as delegate.
|
| -@property(nonatomic, strong) BookmarkPromoCell* promoCell;
|
| -
|
| @end
|
|
|
| @implementation BookmarkFolderCollectionView
|
| @synthesize delegate = _delegate;
|
| @synthesize folder = _folder;
|
| -@synthesize promoCell = _promoCell;
|
|
|
| - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
|
| frame:(CGRect)frame {
|
| @@ -55,10 +79,6 @@ using bookmarks::BookmarkNode;
|
| return self;
|
| }
|
|
|
| -- (void)dealloc {
|
| - _promoCell.delegate = nil;
|
| -}
|
| -
|
| - (void)setDelegate:(id<BookmarkFolderCollectionViewDelegate>)delegate {
|
| _delegate = delegate;
|
| [self promoStateChangedAnimated:NO];
|
| @@ -356,14 +376,53 @@ using bookmarks::BookmarkNode;
|
| }
|
|
|
| // Parent class override.
|
| +- (CGSize)cellSizeForIndexPath:(NSIndexPath*)indexPath {
|
| + if ([self isPromoSection:indexPath.section]) {
|
| + UICollectionViewCell* cell =
|
| + [self.collectionView cellForItemAtIndexPath:indexPath];
|
| + if (!cell) {
|
| + // -[UICollectionView
|
| + // dequeueReusableCellWithReuseIdentifier:forIndexPath:] cannot be used
|
| + // here since this method is called by -[id<UICollectionViewDelegate>
|
| + // collectionView:layout:sizeForItemAtIndexPath:]. This would generate
|
| + // crash: SIGFPE, EXC_I386_DIV.
|
| + if (experimental_flags::IsSigninPromoEnabled()) {
|
| + DCHECK(_signinPromoViewMediator);
|
| + BookmarkSigninPromoCell* signinPromoCell =
|
| + [[BookmarkSigninPromoCell alloc]
|
| + initWithFrame:CGRectMake(0, 0, 1000, 1000)];
|
| + [[_signinPromoViewMediator createConfigurator]
|
| + configureSigninPromoView:signinPromoCell.signinPromoView];
|
| + cell = signinPromoCell;
|
| + } else {
|
| + cell = [[BookmarkPromoCell alloc] init];
|
| + }
|
| + }
|
| + return PreferredCellSizeForWidth(cell, CGRectGetWidth(self.bounds));
|
| + }
|
| + return [super cellSizeForIndexPath:indexPath];
|
| +}
|
| +
|
| +// Parent class override.
|
| - (UICollectionViewCell*)cellAtIndexPath:(NSIndexPath*)indexPath {
|
| if (indexPath.section == self.promoSection) {
|
| - self.promoCell = [self.collectionView
|
| - dequeueReusableCellWithReuseIdentifier:[BookmarkPromoCell
|
| - reuseIdentifier]
|
| - forIndexPath:indexPath];
|
| - self.promoCell.delegate = self;
|
| - return self.promoCell;
|
| + if (experimental_flags::IsSigninPromoEnabled()) {
|
| + BookmarkSigninPromoCell* signinPromoCell = [self.collectionView
|
| + dequeueReusableCellWithReuseIdentifier:[BookmarkSigninPromoCell
|
| + reuseIdentifier]
|
| + forIndexPath:indexPath];
|
| + signinPromoCell.signinPromoView.sendChromeCommand = YES;
|
| + [[_signinPromoViewMediator createConfigurator]
|
| + configureSigninPromoView:signinPromoCell.signinPromoView];
|
| + return signinPromoCell;
|
| + } else {
|
| + BookmarkPromoCell* promoCell = [self.collectionView
|
| + dequeueReusableCellWithReuseIdentifier:[BookmarkPromoCell
|
| + reuseIdentifier]
|
| + forIndexPath:indexPath];
|
| + promoCell.delegate = self;
|
| + return promoCell;
|
| + }
|
| }
|
| const BookmarkNode* node = [self nodeAtIndexPath:indexPath];
|
|
|
| @@ -445,6 +504,15 @@ using bookmarks::BookmarkNode;
|
| // in and out of edit mode is fixed, this is probably the cleanest thing to
|
| // do.
|
| _promoVisible = newPromoState;
|
| + if (experimental_flags::IsSigninPromoEnabled()) {
|
| + if (!_promoVisible) {
|
| + _signinPromoViewMediator.consumer = nil;
|
| + _signinPromoViewMediator = nil;
|
| + } else {
|
| + _signinPromoViewMediator = [[SigninPromoViewMediator alloc] init];
|
| + _signinPromoViewMediator.consumer = self;
|
| + }
|
| + }
|
| [self.collectionView reloadData];
|
| }
|
| }
|
| @@ -465,4 +533,25 @@ using bookmarks::BookmarkNode;
|
| return _promoVisible;
|
| }
|
|
|
| +#pragma mark - SigninPromoViewConsumer
|
| +
|
| +- (void)configureSigninPromoViewWithNewIdentity:(BOOL)newIdentity
|
| + configurator:(SigninPromoViewConfigurator*)
|
| + configurator {
|
| + DCHECK(_signinPromoViewMediator);
|
| + if (newIdentity) {
|
| + NSIndexSet* indexSet = [NSIndexSet indexSetWithIndex:self.promoSection];
|
| + [self.collectionView reloadSections:indexSet];
|
| + return;
|
| + }
|
| + NSIndexPath* indexPath =
|
| + [NSIndexPath indexPathForRow:0 inSection:self.promoSection];
|
| + BookmarkSigninPromoCell* signinPromoCell =
|
| + static_cast<BookmarkSigninPromoCell*>(
|
| + [self.collectionView cellForItemAtIndexPath:indexPath]);
|
| + if (!signinPromoCell)
|
| + return;
|
| + [configurator configureSigninPromoView:signinPromoCell.signinPromoView];
|
| +}
|
| +
|
| @end
|
|
|