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

Unified Diff: ios/chrome/browser/ui/bookmarks/bookmark_folder_collection_view.mm

Issue 2838373002: Adding Sign-in promo for bookmark view. (Closed)
Patch Set: From CGFLOAT_MAX to 1000 Created 3 years, 8 months 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/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

Powered by Google App Engine
This is Rietveld 408576698