| 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 |