OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ios/chrome/browser/ui/bookmarks/bookmark_collection_view.h" | 5 #import "ios/chrome/browser/ui/bookmarks/bookmark_collection_view.h" |
6 | 6 |
7 #import <UIKit/UIGestureRecognizerSubclass.h> | 7 #import <UIKit/UIGestureRecognizerSubclass.h> |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <map> | 9 #include <map> |
10 #include <memory> | 10 #include <memory> |
11 | 11 |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/mac/bind_objc_block.h" | 13 #include "base/mac/bind_objc_block.h" |
14 #include "base/mac/foundation_util.h" | 14 #include "base/mac/foundation_util.h" |
15 #include "base/strings/sys_string_conversions.h" | 15 #include "base/strings/sys_string_conversions.h" |
16 #include "components/bookmarks/browser/bookmark_model.h" | 16 #include "components/bookmarks/browser/bookmark_model.h" |
17 #include "components/bookmarks/browser/bookmark_model_observer.h" | 17 #include "components/bookmarks/browser/bookmark_model_observer.h" |
18 #include "components/favicon/core/fallback_url_util.h" | 18 #include "components/favicon/core/fallback_url_util.h" |
19 #include "components/favicon/core/large_icon_service.h" | 19 #include "components/favicon/core/large_icon_service.h" |
20 #include "components/favicon_base/fallback_icon_style.h" | 20 #include "components/favicon_base/fallback_icon_style.h" |
21 #include "components/favicon_base/favicon_types.h" | 21 #include "components/favicon_base/favicon_types.h" |
| 22 #include "components/pref_registry/pref_registry_syncable.h" |
22 #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" | 23 #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" |
23 #include "ios/chrome/browser/bookmarks/bookmarks_utils.h" | 24 #include "ios/chrome/browser/bookmarks/bookmarks_utils.h" |
24 #include "ios/chrome/browser/experimental_flags.h" | 25 #include "ios/chrome/browser/experimental_flags.h" |
25 #include "ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h" | 26 #include "ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h" |
| 27 #include "ios/chrome/browser/pref_names.h" |
26 #import "ios/chrome/browser/ui/authentication/signin_promo_view.h" | 28 #import "ios/chrome/browser/ui/authentication/signin_promo_view.h" |
27 #import "ios/chrome/browser/ui/authentication/signin_promo_view_configurator.h" | 29 #import "ios/chrome/browser/ui/authentication/signin_promo_view_configurator.h" |
28 #import "ios/chrome/browser/ui/authentication/signin_promo_view_consumer.h" | 30 #import "ios/chrome/browser/ui/authentication/signin_promo_view_consumer.h" |
29 #import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h" | 31 #import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h" |
30 #import "ios/chrome/browser/ui/bookmarks/bookmark_collection_cells.h" | 32 #import "ios/chrome/browser/ui/bookmarks/bookmark_collection_cells.h" |
31 #import "ios/chrome/browser/ui/bookmarks/bookmark_collection_view_background.h" | 33 #import "ios/chrome/browser/ui/bookmarks/bookmark_collection_view_background.h" |
32 #import "ios/chrome/browser/ui/bookmarks/bookmark_promo_cell.h" | 34 #import "ios/chrome/browser/ui/bookmarks/bookmark_promo_cell.h" |
33 #import "ios/chrome/browser/ui/bookmarks/bookmark_signin_promo_cell.h" | 35 #import "ios/chrome/browser/ui/bookmarks/bookmark_signin_promo_cell.h" |
34 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" | 36 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" |
35 #include "ios/chrome/browser/ui/ui_util.h" | 37 #include "ios/chrome/browser/ui/ui_util.h" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 CGFloat rowMarginTablet = 24.0; | 72 CGFloat rowMarginTablet = 24.0; |
71 CGFloat rowHeight = 48.0; | 73 CGFloat rowHeight = 48.0; |
72 // Minimal acceptable favicon size, in points. | 74 // Minimal acceptable favicon size, in points. |
73 CGFloat minFaviconSizePt = 16; | 75 CGFloat minFaviconSizePt = 16; |
74 | 76 |
75 // Delay in seconds to which the empty background view will be shown when the | 77 // Delay in seconds to which the empty background view will be shown when the |
76 // collection view is empty. | 78 // collection view is empty. |
77 // This delay should not be too small to let enough time to load bookmarks | 79 // This delay should not be too small to let enough time to load bookmarks |
78 // from network. | 80 // from network. |
79 const NSTimeInterval kShowEmptyBookmarksBackgroundRefreshDelay = 1.0; | 81 const NSTimeInterval kShowEmptyBookmarksBackgroundRefreshDelay = 1.0; |
| 82 |
| 83 // The histogram used to record the number of time was seen before the bookmark |
| 84 // view has been closed. |
| 85 const char kBookmarksDismissalCount[] = |
| 86 "MobileSignInPromo.BookmarkManager.DismissalCount"; |
| 87 // The histogram used to record the number of time was seen before the user uses |
| 88 // the sign-in promo. |
| 89 const char kBookmarksCountTilSignin[] = |
| 90 "MobileSignInPromo.BookmarkManager.CountTilSignin"; |
| 91 // The histogram used to record the number of time was seen before the user |
| 92 // dissmisses the sign-in promo. |
| 93 const char kBookmarkCountTilX[] = "MobileSignInPromo.BookmarkManager.CountTilX"; |
80 } | 94 } |
81 | 95 |
82 @interface BookmarkCollectionView ()<BookmarkPromoCellDelegate, | 96 @interface BookmarkCollectionView ()<BookmarkPromoCellDelegate, |
83 SigninPromoViewConsumer, | 97 SigninPromoViewConsumer, |
84 UICollectionViewDataSource, | 98 UICollectionViewDataSource, |
85 UICollectionViewDelegateFlowLayout, | 99 UICollectionViewDelegateFlowLayout, |
86 UIGestureRecognizerDelegate> { | 100 UIGestureRecognizerDelegate> { |
87 // A vector of folders to display in the collection view. | 101 // A vector of folders to display in the collection view. |
88 std::vector<const BookmarkNode*> _subFolders; | 102 std::vector<const BookmarkNode*> _subFolders; |
89 // A vector of bookmark urls to display in the collection view. | 103 // A vector of bookmark urls to display in the collection view. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 @synthesize folder = _folder; | 149 @synthesize folder = _folder; |
136 @synthesize bookmarkModel = _bookmarkModel; | 150 @synthesize bookmarkModel = _bookmarkModel; |
137 @synthesize collectionView = _collectionView; | 151 @synthesize collectionView = _collectionView; |
138 @synthesize editing = _editing; | 152 @synthesize editing = _editing; |
139 @synthesize emptyCollectionBackgroundView = _emptyCollectionBackgroundView; | 153 @synthesize emptyCollectionBackgroundView = _emptyCollectionBackgroundView; |
140 @synthesize loader = _loader; | 154 @synthesize loader = _loader; |
141 @synthesize longPressRecognizer = _longPressRecognizer; | 155 @synthesize longPressRecognizer = _longPressRecognizer; |
142 @synthesize browserState = _browserState; | 156 @synthesize browserState = _browserState; |
143 @synthesize shadow = _shadow; | 157 @synthesize shadow = _shadow; |
144 | 158 |
| 159 + (void)registerBrowserStatePrefs:(user_prefs::PrefRegistrySyncable*)registry { |
| 160 registry->RegisterIntegerPref(prefs::kIosBookmarkSigninPromoDisplayedCount, |
| 161 0); |
| 162 } |
| 163 |
145 #pragma mark - Initialization | 164 #pragma mark - Initialization |
146 | 165 |
147 - (void)setupViews { | 166 - (void)setupViews { |
148 self.backgroundColor = bookmark_utils_ios::mainBackgroundColor(); | 167 self.backgroundColor = bookmark_utils_ios::mainBackgroundColor(); |
149 UICollectionViewFlowLayout* layout = | 168 UICollectionViewFlowLayout* layout = |
150 [[UICollectionViewFlowLayout alloc] init]; | 169 [[UICollectionViewFlowLayout alloc] init]; |
151 | 170 |
152 UICollectionView* collectionView = | 171 UICollectionView* collectionView = |
153 [[UICollectionView alloc] initWithFrame:self.bounds | 172 [[UICollectionView alloc] initWithFrame:self.bounds |
154 collectionViewLayout:layout]; | 173 collectionViewLayout:layout]; |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 if (newPromoState != _promoVisible) { | 347 if (newPromoState != _promoVisible) { |
329 // This is awful, but until the old code to do the refresh when switching | 348 // This is awful, but until the old code to do the refresh when switching |
330 // in and out of edit mode is fixed, this is probably the cleanest thing to | 349 // in and out of edit mode is fixed, this is probably the cleanest thing to |
331 // do. | 350 // do. |
332 _promoVisible = newPromoState; | 351 _promoVisible = newPromoState; |
333 if (experimental_flags::IsSigninPromoEnabled()) { | 352 if (experimental_flags::IsSigninPromoEnabled()) { |
334 if (!_promoVisible) { | 353 if (!_promoVisible) { |
335 _signinPromoViewMediator.consumer = nil; | 354 _signinPromoViewMediator.consumer = nil; |
336 _signinPromoViewMediator = nil; | 355 _signinPromoViewMediator = nil; |
337 } else { | 356 } else { |
338 _signinPromoViewMediator = [[SigninPromoViewMediator alloc] init]; | 357 _signinPromoViewMediator = [[SigninPromoViewMediator alloc] |
| 358 initWithBrowserState:_browserState]; |
339 _signinPromoViewMediator.consumer = self; | 359 _signinPromoViewMediator.consumer = self; |
| 360 _signinPromoViewMediator.displayedCountPreferenceKey = |
| 361 prefs::kIosBookmarkSigninPromoDisplayedCount; |
| 362 _signinPromoViewMediator.alreadySeenSigninViewPreferenceKey = |
| 363 prefs::kIosBookmarkPromoAlreadySeen; |
| 364 _signinPromoViewMediator.dismissalCountHistogramName = |
| 365 kBookmarksDismissalCount; |
| 366 _signinPromoViewMediator.countTilXHistogramName = kBookmarkCountTilX; |
| 367 _signinPromoViewMediator.countTilSigninHistogramName = |
| 368 kBookmarksCountTilSignin; |
340 _signinPromoViewMediator.accessPoint = | 369 _signinPromoViewMediator.accessPoint = |
341 signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_MANAGER; | 370 signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_MANAGER; |
| 371 [_signinPromoViewMediator signinPromoViewVisible]; |
342 } | 372 } |
343 } | 373 } |
344 [self.collectionView reloadData]; | 374 [self.collectionView reloadData]; |
345 } | 375 } |
346 } | 376 } |
347 | 377 |
| 378 - (void)wasShown { |
| 379 [_signinPromoViewMediator signinPromoViewVisible]; |
| 380 } |
| 381 |
| 382 - (void)wasHidden { |
| 383 [_signinPromoViewMediator signinPromoViewHidden]; |
| 384 } |
| 385 |
348 #pragma mark - Sections | 386 #pragma mark - Sections |
349 | 387 |
350 - (NSInteger)promoSection { | 388 - (NSInteger)promoSection { |
351 return [self shouldShowPromoCell] ? 0 : -1; | 389 return [self shouldShowPromoCell] ? 0 : -1; |
352 } | 390 } |
353 | 391 |
354 - (NSInteger)folderSection { | 392 - (NSInteger)folderSection { |
355 return [self shouldShowPromoCell] ? 1 : 0; | 393 return [self shouldShowPromoCell] ? 1 : 0; |
356 } | 394 } |
357 | 395 |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 if (experimental_flags::IsSigninPromoEnabled()) { | 804 if (experimental_flags::IsSigninPromoEnabled()) { |
767 BookmarkSigninPromoCell* signinPromoCell = [self.collectionView | 805 BookmarkSigninPromoCell* signinPromoCell = [self.collectionView |
768 dequeueReusableCellWithReuseIdentifier:[BookmarkSigninPromoCell | 806 dequeueReusableCellWithReuseIdentifier:[BookmarkSigninPromoCell |
769 reuseIdentifier] | 807 reuseIdentifier] |
770 forIndexPath:indexPath]; | 808 forIndexPath:indexPath]; |
771 signinPromoCell.signinPromoView.delegate = _signinPromoViewMediator; | 809 signinPromoCell.signinPromoView.delegate = _signinPromoViewMediator; |
772 [[_signinPromoViewMediator createConfigurator] | 810 [[_signinPromoViewMediator createConfigurator] |
773 configureSigninPromoView:signinPromoCell.signinPromoView]; | 811 configureSigninPromoView:signinPromoCell.signinPromoView]; |
774 __weak BookmarkCollectionView* weakSelf = self; | 812 __weak BookmarkCollectionView* weakSelf = self; |
775 signinPromoCell.closeButtonAction = ^() { | 813 signinPromoCell.closeButtonAction = ^() { |
776 [weakSelf.delegate bookmarkCollectionViewDismissPromo:self]; | 814 [weakSelf signinPromoCloseButtonAction]; |
777 }; | 815 }; |
778 return signinPromoCell; | 816 return signinPromoCell; |
779 } else { | 817 } else { |
780 BookmarkPromoCell* promoCell = [self.collectionView | 818 BookmarkPromoCell* promoCell = [self.collectionView |
781 dequeueReusableCellWithReuseIdentifier:[BookmarkPromoCell | 819 dequeueReusableCellWithReuseIdentifier:[BookmarkPromoCell |
782 reuseIdentifier] | 820 reuseIdentifier] |
783 forIndexPath:indexPath]; | 821 forIndexPath:indexPath]; |
784 promoCell.delegate = self; | 822 promoCell.delegate = self; |
785 return promoCell; | 823 return promoCell; |
786 } | 824 } |
787 } | 825 } |
788 const BookmarkNode* node = [self nodeAtIndexPath:indexPath]; | 826 const BookmarkNode* node = [self nodeAtIndexPath:indexPath]; |
789 | 827 |
790 if (indexPath.section == self.folderSection) | 828 if (indexPath.section == self.folderSection) |
791 return [self cellForFolder:node indexPath:indexPath]; | 829 return [self cellForFolder:node indexPath:indexPath]; |
792 | 830 |
793 BookmarkItemCell* cell = [self cellForBookmark:node indexPath:indexPath]; | 831 BookmarkItemCell* cell = [self cellForBookmark:node indexPath:indexPath]; |
794 return cell; | 832 return cell; |
795 } | 833 } |
796 | 834 |
| 835 // Removes the sign-in promo view. |
| 836 - (void)signinPromoCloseButtonAction { |
| 837 [_signinPromoViewMediator signinPromoViewDismissed]; |
| 838 [_delegate bookmarkCollectionViewDismissPromo:self]; |
| 839 } |
| 840 |
797 // Create a header view for the element at |indexPath|. | 841 // Create a header view for the element at |indexPath|. |
798 - (UICollectionReusableView*)headerAtIndexPath:(NSIndexPath*)indexPath { | 842 - (UICollectionReusableView*)headerAtIndexPath:(NSIndexPath*)indexPath { |
799 if (![self needsSectionHeaderForSection:indexPath.section]) | 843 if (![self needsSectionHeaderForSection:indexPath.section]) |
800 return nil; | 844 return nil; |
801 | 845 |
802 BookmarkHeaderSeparatorView* view = [self.collectionView | 846 BookmarkHeaderSeparatorView* view = [self.collectionView |
803 dequeueReusableSupplementaryViewOfKind: | 847 dequeueReusableSupplementaryViewOfKind: |
804 UICollectionElementKindSectionHeader | 848 UICollectionElementKindSectionHeader |
805 withReuseIdentifier:[BookmarkHeaderSeparatorView | 849 withReuseIdentifier:[BookmarkHeaderSeparatorView |
806 reuseIdentifier] | 850 reuseIdentifier] |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1247 | 1291 |
1248 - (BOOL)shouldShowPromoCell { | 1292 - (BOOL)shouldShowPromoCell { |
1249 return _promoVisible; | 1293 return _promoVisible; |
1250 } | 1294 } |
1251 | 1295 |
1252 - (BOOL)isPromoActive { | 1296 - (BOOL)isPromoActive { |
1253 return NO; | 1297 return NO; |
1254 } | 1298 } |
1255 | 1299 |
1256 @end | 1300 @end |
OLD | NEW |