Index: ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm |
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm |
index 6d5c0700309de111532350438604c0132b6f8f92..38aebe6e64301b71c5782d9c62d92d66b4e31d11 100644 |
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm |
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm |
@@ -7,6 +7,7 @@ |
#include "base/logging.h" |
#include "base/mac/foundation_util.h" |
#include "base/time/time.h" |
+#include "components/strings/grit/components_strings.h" |
#import "ios/chrome/browser/ui/collection_view/cells/collection_view_text_item.h" |
#import "ios/chrome/browser/ui/collection_view/collection_view_controller.h" |
#import "ios/chrome/browser/ui/collection_view/collection_view_model.h" |
@@ -16,6 +17,7 @@ |
#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_favicon_item.h" |
#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_footer_item.h" |
#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_stack_item.h" |
+#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.h" |
#import "ios/chrome/browser/ui/content_suggestions/content_suggestion.h" |
#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_data_sink.h" |
#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_data_source.h" |
@@ -23,6 +25,7 @@ |
#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h" |
#import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestion_identifier.h" |
#import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestions_section_information.h" |
+#include "ui/base/l10n/l10n_util.h" |
#include "ui/gfx/image/image.h" |
#include "url/gurl.h" |
@@ -32,6 +35,10 @@ |
namespace { |
+using CSCollectionViewItem = |
+ CollectionViewItem<ContentSuggestionIdentification>; |
+using CSCollectionViewModel = CollectionViewModel<CSCollectionViewItem*>; |
+ |
// Enum defining the ItemType of this ContentSuggestionsCollectionUpdater. |
typedef NS_ENUM(NSInteger, ItemType) { |
ItemTypeText = kItemTypeEnumZero, |
@@ -41,6 +48,7 @@ typedef NS_ENUM(NSInteger, ItemType) { |
ItemTypeFavicon, |
ItemTypeFooter, |
ItemTypeHeader, |
+ ItemTypeEmpty, |
}; |
typedef NS_ENUM(NSInteger, SectionIdentifier) { |
@@ -53,16 +61,20 @@ ItemType ItemTypeForContentSuggestionType(ContentSuggestionType type) { |
switch (type) { |
case ContentSuggestionTypeArticle: |
return ItemTypeArticle; |
+ case ContentSuggestionTypeEmpty: |
+ return ItemTypeEmpty; |
} |
} |
ContentSuggestionType ContentSuggestionTypeForItemType(NSInteger type) { |
if (type == ItemTypeArticle) |
return ContentSuggestionTypeArticle; |
+ if (type == ItemTypeEmpty) |
+ return ContentSuggestionTypeEmpty; |
// Add new type here |
// Default type. |
- return ContentSuggestionTypeArticle; |
+ return ContentSuggestionTypeEmpty; |
} |
// Returns the section identifier corresponding to the section |info|. |
@@ -124,7 +136,7 @@ SectionIdentifier SectionIdentifierForInfo( |
(ContentSuggestionsSectionInformation*)sectionInfo { |
SectionIdentifier sectionIdentifier = SectionIdentifierForInfo(sectionInfo); |
- CollectionViewModel* model = |
+ CSCollectionViewModel* model = |
self.collectionViewController.collectionViewModel; |
if ([model hasSectionForSectionIdentifier:sectionIdentifier] && |
[model itemsInSectionWithIdentifier:sectionIdentifier].count > 0) { |
@@ -144,13 +156,12 @@ SectionIdentifier SectionIdentifierForInfo( |
return; |
} |
- NSArray<CollectionViewItem<ContentSuggestionIdentification>*>* |
- itemsInSection = [self.collectionViewController.collectionViewModel |
+ NSArray<CSCollectionViewItem*>* itemsInSection = |
+ [self.collectionViewController.collectionViewModel |
itemsInSectionWithIdentifier:sectionIdentifier]; |
- CollectionViewItem<ContentSuggestionIdentification>* correspondingItem = nil; |
- for (CollectionViewItem<ContentSuggestionIdentification>* item in |
- itemsInSection) { |
+ CSCollectionViewItem* correspondingItem = nil; |
+ for (CSCollectionViewItem* item in itemsInSection) { |
if (item.suggestionIdentifier == suggestionIdentifier) { |
correspondingItem = item; |
break; |
@@ -206,33 +217,47 @@ SectionIdentifier SectionIdentifierForInfo( |
return [NSArray array]; |
} |
- CollectionViewModel* model = |
- self.collectionViewController.collectionViewModel; |
- |
NSMutableArray<NSIndexPath*>* indexPaths = [NSMutableArray array]; |
for (ContentSuggestion* suggestion in suggestions) { |
- NSInteger sectionIdentifier = |
- SectionIdentifierForInfo(suggestion.suggestionIdentifier.sectionInfo); |
- |
- ContentSuggestionsArticleItem* articleItem = |
- [[ContentSuggestionsArticleItem alloc] |
- initWithType:ItemTypeForContentSuggestionType(suggestion.type) |
- title:suggestion.title |
- subtitle:suggestion.text |
- delegate:self |
- url:suggestion.url]; |
- |
- articleItem.publisher = suggestion.publisher; |
- articleItem.publishDate = suggestion.publishDate; |
- |
- articleItem.suggestionIdentifier = suggestion.suggestionIdentifier; |
- |
- NSInteger section = [model sectionForSectionIdentifier:sectionIdentifier]; |
- NSInteger itemNumber = [model numberOfItemsInSection:section]; |
- [model addItem:articleItem toSectionWithIdentifier:sectionIdentifier]; |
- |
- [indexPaths |
- addObject:[NSIndexPath indexPathForItem:itemNumber inSection:section]]; |
+ ContentSuggestionsSectionInformation* sectionInfo = |
+ suggestion.suggestionIdentifier.sectionInfo; |
+ NSInteger sectionIdentifier = SectionIdentifierForInfo(sectionInfo); |
+ CSCollectionViewModel* model = |
+ self.collectionViewController.collectionViewModel; |
+ |
+ switch (suggestion.type) { |
+ case ContentSuggestionTypeEmpty: { |
+ if ([model hasSectionForSectionIdentifier:sectionIdentifier] && |
+ [model numberOfItemsInSection:[model sectionForSectionIdentifier: |
+ sectionIdentifier]] == 0) { |
+ CSCollectionViewItem* item = |
+ [self emptyItemForSectionInfo:sectionInfo]; |
+ NSIndexPath* addedIndexPath = |
+ [self addItem:item toSectionWithIdentifier:sectionIdentifier]; |
+ [indexPaths addObject:addedIndexPath]; |
+ } |
+ break; |
+ } |
+ case ContentSuggestionTypeArticle: { |
+ ContentSuggestionsArticleItem* articleItem = |
+ [[ContentSuggestionsArticleItem alloc] |
+ initWithType:ItemTypeForContentSuggestionType(suggestion.type) |
+ title:suggestion.title |
+ subtitle:suggestion.text |
+ delegate:self |
+ url:suggestion.url]; |
+ |
+ articleItem.publisher = suggestion.publisher; |
+ articleItem.publishDate = suggestion.publishDate; |
+ |
+ articleItem.suggestionIdentifier = suggestion.suggestionIdentifier; |
+ |
+ NSIndexPath* addedIndexPath = [self addItem:articleItem |
+ toSectionWithIdentifier:sectionIdentifier]; |
+ [indexPaths addObject:addedIndexPath]; |
+ break; |
+ } |
+ } |
} |
return indexPaths; |
@@ -242,25 +267,40 @@ SectionIdentifier SectionIdentifierForInfo( |
(NSArray<ContentSuggestion*>*)suggestions { |
NSMutableIndexSet* indexSet = [NSMutableIndexSet indexSet]; |
- CollectionViewModel* model = |
+ CSCollectionViewModel* model = |
self.collectionViewController.collectionViewModel; |
for (ContentSuggestion* suggestion in suggestions) { |
ContentSuggestionsSectionInformation* sectionInfo = |
suggestion.suggestionIdentifier.sectionInfo; |
NSInteger sectionIdentifier = SectionIdentifierForInfo(sectionInfo); |
- if (![model hasSectionForSectionIdentifier:sectionIdentifier]) { |
- [model addSectionWithIdentifier:sectionIdentifier]; |
- self.sectionInfoBySectionIdentifier[@(sectionIdentifier)] = sectionInfo; |
- [indexSet addIndex:[model sectionForSectionIdentifier:sectionIdentifier]]; |
- |
- [self addHeader:suggestion.suggestionIdentifier.sectionInfo]; |
- [self addFooterIfNeeded:suggestion.suggestionIdentifier.sectionInfo]; |
+ if ([model hasSectionForSectionIdentifier:sectionIdentifier] || |
+ (suggestion.type == ContentSuggestionTypeEmpty && |
+ !sectionInfo.showIfEmpty)) { |
+ continue; |
} |
+ |
+ [model addSectionWithIdentifier:sectionIdentifier]; |
+ self.sectionInfoBySectionIdentifier[@(sectionIdentifier)] = sectionInfo; |
+ [indexSet addIndex:[model sectionForSectionIdentifier:sectionIdentifier]]; |
+ |
+ [self addHeader:sectionInfo]; |
+ [self addFooterIfNeeded:sectionInfo]; |
} |
return indexSet; |
} |
+- (NSIndexPath*)addEmptyItemForSection:(NSInteger)section { |
+ CSCollectionViewModel* model = |
+ self.collectionViewController.collectionViewModel; |
+ NSInteger sectionIdentifier = [model sectionIdentifierForSection:section]; |
+ ContentSuggestionsSectionInformation* sectionInfo = |
+ self.sectionInfoBySectionIdentifier[@(sectionIdentifier)]; |
+ |
+ CSCollectionViewItem* item = [self emptyItemForSectionInfo:sectionInfo]; |
+ return [self addItem:item toSectionWithIdentifier:sectionIdentifier]; |
+} |
+ |
#pragma mark - ContentSuggestionsArticleItemDelegate |
- (void)loadImageForArticleItem:(ContentSuggestionsArticleItem*)articleItem { |
@@ -345,12 +385,13 @@ SectionIdentifier SectionIdentifierForInfo( |
NSMutableArray<ContentSuggestionIdentifier*>* knownSuggestionIdentifiers = |
[NSMutableArray array]; |
- NSArray<CollectionViewItem<ContentSuggestionIdentification>*>* |
- knownSuggestions = [self.collectionViewController.collectionViewModel |
+ NSArray<CSCollectionViewItem*>* knownSuggestions = |
+ [self.collectionViewController.collectionViewModel |
itemsInSectionWithIdentifier:sectionIdentifier]; |
- for (CollectionViewItem<ContentSuggestionIdentification>* suggestion in |
- knownSuggestions) { |
- [knownSuggestionIdentifiers addObject:suggestion.suggestionIdentifier]; |
+ for (CSCollectionViewItem* suggestion in knownSuggestions) { |
+ if (suggestion.type != ItemTypeEmpty) { |
+ [knownSuggestionIdentifiers addObject:suggestion.suggestionIdentifier]; |
+ } |
} |
__weak ContentSuggestionsCollectionUpdater* weakSelf = self; |
@@ -368,4 +409,29 @@ SectionIdentifier SectionIdentifierForInfo( |
[self.collectionViewController addSuggestions:suggestions]; |
} |
+// Returns a item to be displayed when the section identified by |sectionInfo| |
+// is empty. |
+- (CSCollectionViewItem*)emptyItemForSectionInfo: |
+ (ContentSuggestionsSectionInformation*)sectionInfo { |
+ ContentSuggestionsTextItem* item = |
+ [[ContentSuggestionsTextItem alloc] initWithType:ItemTypeEmpty]; |
+ item.text = l10n_util::GetNSString(IDS_NTP_TITLE_NO_SUGGESTIONS); |
+ item.detailText = sectionInfo.emptyText; |
+ |
+ return item; |
+} |
+ |
+// Adds |item| to |sectionIdentifier| section of the model of the |
+// CollectionView. Returns the IndexPath of the newly added item. |
+- (NSIndexPath*)addItem:(CSCollectionViewItem*)item |
+ toSectionWithIdentifier:(NSInteger)sectionIdentifier { |
+ CSCollectionViewModel* model = |
+ self.collectionViewController.collectionViewModel; |
+ NSInteger section = [model sectionForSectionIdentifier:sectionIdentifier]; |
+ NSInteger itemNumber = [model numberOfItemsInSection:section]; |
+ [model addItem:item toSectionWithIdentifier:sectionIdentifier]; |
+ |
+ return [NSIndexPath indexPathForItem:itemNumber inSection:section]; |
+} |
+ |
@end |