blob: 1662a84f7d68693f1d0be7b0c36375c9957b6cb0 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/showcase/content_suggestions/sc_content_suggestions_data_source.h"
#include "base/strings/sys_string_conversions.h"
#include "base/time/time.h"
#include "components/strings/grit/components_strings.h"
#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_learn_more_item.h"
#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_data_sink.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"
#import "ios/chrome/common/ui/favicon/favicon_attributes.h"
#include "ios/chrome/grit/ios_strings.h"
#import "ios/showcase/content_suggestions/sc_content_suggestions_item.h"
#import "ios/showcase/content_suggestions/sc_content_suggestions_most_visited_item.h"
#include "ui/base/l10n/l10n_util_mac.h"
#include "ui/base/l10n/time_format.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace {
using CSCollectionViewItem = CollectionViewItem<SuggestedContent>;
}
@interface SCContentSuggestionsDataSource ()
// Section Info of type Logo header. Created lazily.
@property(nonatomic, strong)
ContentSuggestionsSectionInformation* logoHeaderSection;
// Section Info of type MostVisited. Created lazily.
@property(nonatomic, strong)
ContentSuggestionsSectionInformation* mostVisitedSection;
// Section Info of type Reading List. Created lazily.
@property(nonatomic, strong)
ContentSuggestionsSectionInformation* readingListSection;
// Section Info of type Article. Created lazily.
@property(nonatomic, strong)
ContentSuggestionsSectionInformation* articleSection;
// Section Info of type Learn More. Created lazily.
@property(nonatomic, strong)
ContentSuggestionsSectionInformation* learnMoreSection;
@end
@implementation SCContentSuggestionsDataSource
@synthesize dataSink = _dataSink;
@synthesize logoHeaderSection = _logoHeaderSection;
@synthesize mostVisitedSection = _mostVisitedSection;
@synthesize readingListSection = _readingListSection;
@synthesize articleSection = _articleSection;
@synthesize learnMoreSection = _learnMoreSection;
#pragma mark - Public
+ (NSString*)titleFirstSuggestion {
return @"Title of the first suggestions";
}
+ (NSString*)titleReadingListItem {
return @"Reading List item: No subtitle, no image";
}
#pragma mark - ContentSuggestionsDataSource
- (NSArray<ContentSuggestionsSectionInformation*>*)sectionsInfo {
return @[
self.logoHeaderSection, self.mostVisitedSection, self.articleSection,
self.learnMoreSection
];
}
- (NSArray<CSCollectionViewItem*>*)itemsForSectionInfo:
(ContentSuggestionsSectionInformation*)sectionInfo {
switch (sectionInfo.sectionID) {
case ContentSuggestionsSectionMostVisited: {
NSMutableArray<CSCollectionViewItem*>* items = [NSMutableArray array];
for (int i = 0; i < 8; i++) {
SCContentSuggestionsMostVisitedItem* suggestion =
[[SCContentSuggestionsMostVisitedItem alloc] initWithType:0];
suggestion.title =
[NSString stringWithFormat:@"Test Tile number %i", i];
suggestion.attributes = [self randomColorFaviconAttributes];
[items addObject:suggestion];
}
return items;
}
case ContentSuggestionsSectionReadingList: {
SCContentSuggestionsItem* suggestion = [self article];
suggestion.title = [[self class] titleReadingListItem];
suggestion.hasImage = NO;
suggestion.suggestionIdentifier.sectionInfo = self.readingListSection;
return @[ suggestion ];
}
case ContentSuggestionsSectionArticles: {
NSMutableArray<CSCollectionViewItem*>* items = [NSMutableArray array];
SCContentSuggestionsItem* suggestion = [self article];
suggestion.title = [[self class] titleFirstSuggestion];
suggestion.suggestionIdentifier.IDInSection = std::to_string(1);
[items addObject:suggestion];
for (int i = 2; i < 6; i++) {
suggestion = suggestion = [self article];
suggestion.title = [NSString
stringWithFormat:@"Title of the suggestions number #%i", i];
suggestion.suggestionIdentifier.IDInSection = std::to_string(i);
[items addObject:suggestion];
}
return items;
}
case ContentSuggestionsSectionLearnMore: {
ContentSuggestionsLearnMoreItem* learnMore =
[[ContentSuggestionsLearnMoreItem alloc] init];
learnMore.suggestionIdentifier =
[[ContentSuggestionIdentifier alloc] init];
learnMore.suggestionIdentifier.sectionInfo = self.learnMoreSection;
return @[ learnMore ];
}
case ContentSuggestionsSectionLogo:
case ContentSuggestionsSectionReturnToRecentTab:
case ContentSuggestionsSectionPromo:
case ContentSuggestionsSectionDiscover:
case ContentSuggestionsSectionUnknown:
return @[];
}
}
- (void)fetchMoreSuggestionsKnowing:
(NSArray<ContentSuggestionIdentifier*>*)knownSuggestions
fromSectionInfo:
(ContentSuggestionsSectionInformation*)sectionInfo
callback:(MoreSuggestionsFetched)callback {
}
- (void)dismissSuggestion:(ContentSuggestionIdentifier*)suggestionIdentifier {
}
- (UIView*)headerViewForWidth:(CGFloat)width {
return nil;
}
- (void)toggleArticlesVisibility {
}
#pragma mark - Property
- (ContentSuggestionsSectionInformation*)logoHeaderSection {
if (!_logoHeaderSection) {
_logoHeaderSection = [[ContentSuggestionsSectionInformation alloc]
initWithSectionID:ContentSuggestionsSectionLogo];
_logoHeaderSection.showIfEmpty = YES;
_logoHeaderSection.layout = ContentSuggestionsSectionLayoutCustom;
_logoHeaderSection.title = nil;
_logoHeaderSection.footerTitle = nil;
_logoHeaderSection.emptyText = nil;
}
return _logoHeaderSection;
}
- (ContentSuggestionsSectionInformation*)mostVisitedSection {
if (!_mostVisitedSection) {
_mostVisitedSection = [[ContentSuggestionsSectionInformation alloc]
initWithSectionID:ContentSuggestionsSectionMostVisited];
_mostVisitedSection.layout = ContentSuggestionsSectionLayoutCustom;
_mostVisitedSection.title = nil;
_mostVisitedSection.footerTitle = nil;
_mostVisitedSection.emptyText = nil;
}
return _mostVisitedSection;
}
- (ContentSuggestionsSectionInformation*)readingListSection {
if (!_readingListSection) {
_readingListSection = [[ContentSuggestionsSectionInformation alloc]
initWithSectionID:ContentSuggestionsSectionReadingList];
_readingListSection.title =
l10n_util::GetNSString(IDS_NTP_READING_LIST_SUGGESTIONS_SECTION_HEADER);
_readingListSection.emptyText =
l10n_util::GetNSString(IDS_NTP_READING_LIST_SUGGESTIONS_SECTION_EMPTY);
_readingListSection.footerTitle =
l10n_util::GetNSString(IDS_IOS_CONTENT_SUGGESTIONS_FOOTER_TITLE);
}
return _readingListSection;
}
- (ContentSuggestionsSectionInformation*)articleSection {
if (!_articleSection) {
_articleSection = [[ContentSuggestionsSectionInformation alloc]
initWithSectionID:ContentSuggestionsSectionArticles];
_articleSection.title =
l10n_util::GetNSString(IDS_NTP_ARTICLE_SUGGESTIONS_SECTION_HEADER);
_articleSection.footerTitle =
l10n_util::GetNSString(IDS_IOS_CONTENT_SUGGESTIONS_FOOTER_TITLE);
}
return _articleSection;
}
- (ContentSuggestionsSectionInformation*)learnMoreSection {
if (!_learnMoreSection) {
_learnMoreSection = [[ContentSuggestionsSectionInformation alloc]
initWithSectionID:ContentSuggestionsSectionLearnMore];
_learnMoreSection.layout = ContentSuggestionsSectionLayoutCustom;
_learnMoreSection.title = nil;
_learnMoreSection.footerTitle = nil;
_learnMoreSection.emptyText = nil;
}
return _learnMoreSection;
}
#pragma mark - Private
// Returns favicon attributes with a random background color and a random
// monogram.
- (FaviconAttributes*)randomColorFaviconAttributes {
UIColor* backgroundColor = [[UIColor alloc] initWithHue:drand48()
saturation:drand48() / 2 + 0.5
brightness:drand48() / 2 + 0.5
alpha:1.0];
NSString* monogram =
[NSString stringWithFormat:@"%c", arc4random_uniform(26) + 'A'];
UIColor* textColor =
drand48() > 0.5 ? [UIColor whiteColor] : [UIColor blackColor];
return [FaviconAttributes attributesWithMonogram:monogram
textColor:textColor
backgroundColor:backgroundColor
defaultBackgroundColor:NO];
}
// Returns a random date between now and three days before now.
- (NSString*)randomDate {
int offset = arc4random_uniform(259200);
return base::SysUTF16ToNSString(ui::TimeFormat::SimpleWithMonthAndYear(
ui::TimeFormat::FORMAT_ELAPSED, ui::TimeFormat::LENGTH_LONG,
base::TimeDelta::FromSeconds(offset + 60), true));
}
// Returns an article with the fields set except the IDInSection.
- (SCContentSuggestionsItem*)article {
SCContentSuggestionsItem* suggestion =
[[SCContentSuggestionsItem alloc] initWithType:0];
suggestion.title = @"Title";
suggestion.publisher = @"Publisher of the new";
suggestion.hasImage = YES;
suggestion.image = [UIImage imageNamed:@"reading_list_empty_state"];
suggestion.publicationDate = [self randomDate];
suggestion.attributes = [self randomColorFaviconAttributes];
suggestion.suggestionIdentifier = [[ContentSuggestionIdentifier alloc] init];
suggestion.suggestionIdentifier.sectionInfo = self.articleSection;
return suggestion;
}
@end