Index: ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.mm |
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.mm b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.mm |
index b488546cf267024fce3f1af47b04206769bea237..88f1e5f78bff67c085a1f8bfeb2faf4210629342 100644 |
--- a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.mm |
+++ b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.mm |
@@ -13,6 +13,7 @@ |
#import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h" |
#import "ios/third_party/material_roboto_font_loader_ios/src/src/MaterialRobotoFontLoader.h" |
#include "ui/base/l10n/l10n_util.h" |
+#include "ui/base/l10n/time_format.h" |
#import "url/gurl.h" |
#if !defined(__has_feature) || !__has_feature(objc_arc) |
@@ -28,6 +29,8 @@ const CGFloat kDistillationIndicatorSize = 18; |
// Margin for the elements displayed in the cell. |
gambard
2017/03/16 07:50:23
Update the comment
Olivier
2017/03/16 09:20:15
Done.
|
const CGFloat kMargin = 16; |
+// Margin for the elements displayed in the cell. |
gambard
2017/03/16 07:50:24
Change this comment (this is the margin between th
Olivier
2017/03/16 09:20:15
Done.
|
+const CGFloat kDetailsMargin = 7; |
} // namespace |
#pragma mark - ReadingListCell Private interface |
@@ -45,6 +48,11 @@ const CGFloat kMargin = 16; |
@property(nonatomic, assign) |
ReadingListEntry::DistillationState distillationState; |
+// Timestamp of the distillation in microseconds since Jan 1st 1970. |
+@property(nonatomic, assign) int64_t distillationDate; |
+// Size of the distilled files. |
+@property(nonatomic, assign) int64_t distillationSize; |
+ |
@end |
#pragma mark - ReadingListCollectionViewItem |
@@ -69,12 +77,14 @@ const CGFloat kMargin = 16; |
@implementation ReadingListCollectionViewItem |
@synthesize faviconAttributesProvider = _faviconAttributesProvider; |
@synthesize attributes = _attributes; |
-@synthesize text = _text; |
-@synthesize detailText = _detailText; |
+@synthesize title = _title; |
+@synthesize subtitle = _subtitle; |
@synthesize url = _url; |
@synthesize faviconPageURL = _faviconPageURL; |
@synthesize displayedCell = _displayedCell; |
@synthesize distillationState = _distillationState; |
+@synthesize distillationDate = _distillationDate; |
+@synthesize distillationSize = _distillationSize; |
@synthesize accessibilityDelegate = _accessibilityDelegate; |
- (instancetype)initWithType:(NSInteger)type |
@@ -121,6 +131,16 @@ const CGFloat kMargin = 16; |
_distillationState = distillationState; |
} |
+- (void)setDistillationSize:(int64_t)distillationSize { |
+ self.displayedCell.distillationSize = distillationSize; |
+ _distillationSize = distillationSize; |
+} |
+ |
+- (void)setDistillationDate:(int64_t)distillationDate { |
+ self.displayedCell.distillationDate = distillationDate; |
+ _distillationDate = distillationDate; |
+} |
+ |
#pragma mark - CollectionViewTextItem |
- (void)configureCell:(ReadingListCell*)cell { |
@@ -128,11 +148,13 @@ const CGFloat kMargin = 16; |
if (self.attributes) { |
[cell.faviconView configureWithAttributes:self.attributes]; |
} |
- cell.textLabel.text = self.text; |
- cell.detailTextLabel.text = self.detailText; |
+ cell.titleLabel.text = self.title; |
+ cell.subtitleLabel.text = self.subtitle; |
self.displayedCell = cell; |
cell.delegate = self; |
cell.distillationState = _distillationState; |
+ cell.distillationSize = _distillationSize; |
+ cell.distillationDate = _distillationDate; |
cell.isAccessibilityElement = YES; |
cell.accessibilityLabel = [self accessibilityLabel]; |
cell.accessibilityCustomActions = [self customActions]; |
@@ -157,9 +179,9 @@ const CGFloat kMargin = 16; |
} |
return l10n_util::GetNSStringF(IDS_IOS_READING_LIST_ENTRY_ACCESSIBILITY_LABEL, |
- base::SysNSStringToUTF16(self.text), |
+ base::SysNSStringToUTF16(self.title), |
base::SysNSStringToUTF16(accessibilityState), |
- base::SysNSStringToUTF16(self.detailText)); |
+ base::SysNSStringToUTF16(self.subtitle)); |
} |
#pragma mark - AccessibilityCustomAction |
@@ -262,7 +284,7 @@ const CGFloat kMargin = 16; |
- (NSString*)description { |
return [NSString stringWithFormat:@"Reading List item \"%@\" for url %@", |
- self.text, self.detailText]; |
+ self.title, self.subtitle]; |
} |
- (BOOL)isEqual:(id)other { |
@@ -272,9 +294,12 @@ const CGFloat kMargin = 16; |
return NO; |
ReadingListCollectionViewItem* otherItem = |
static_cast<ReadingListCollectionViewItem*>(other); |
- return [self.text isEqualToString:otherItem.text] && |
- [self.detailText isEqualToString:otherItem.detailText] && |
- self.distillationState == otherItem.distillationState; |
+ return self.type == otherItem.type && |
+ [self.title isEqualToString:otherItem.title] && |
+ [self.subtitle isEqualToString:otherItem.subtitle] && |
+ self.distillationState == otherItem.distillationState && |
+ self.distillationSize == otherItem.distillationSize && |
+ self.distillationDate == otherItem.distillationDate; |
} |
@end |
@@ -285,8 +310,12 @@ const CGFloat kMargin = 16; |
UIImageView* _downloadIndicator; |
} |
@synthesize faviconView = _faviconView; |
-@synthesize textLabel = _textLabel; |
-@synthesize detailTextLabel = _detailTextLabel; |
+@synthesize titleLabel = _titleLabel; |
+@synthesize subtitleLabel = _subtitleLabel; |
+@synthesize distillationDateLabel = _distillationDateLabel; |
+@synthesize distillationDate = _distillationDate; |
+@synthesize distillationSizeLabel = _distillationSizeLabel; |
+@synthesize distillationSize = _distillationSize; |
@synthesize distillationState = _distillationState; |
@synthesize delegate = _delegate; |
@@ -295,15 +324,25 @@ const CGFloat kMargin = 16; |
if (self) { |
MDFRobotoFontLoader* fontLoader = [MDFRobotoFontLoader sharedInstance]; |
CGFloat faviconSize = kFaviconPreferredSize; |
- _textLabel = [[UILabel alloc] init]; |
- _textLabel.font = [fontLoader mediumFontOfSize:16]; |
- _textLabel.textColor = [[MDCPalette greyPalette] tint900]; |
- _textLabel.translatesAutoresizingMaskIntoConstraints = NO; |
- |
- _detailTextLabel = [[UILabel alloc] init]; |
- _detailTextLabel.font = [fontLoader mediumFontOfSize:14]; |
- _detailTextLabel.textColor = [[MDCPalette greyPalette] tint500]; |
- _detailTextLabel.translatesAutoresizingMaskIntoConstraints = NO; |
+ _titleLabel = [[UILabel alloc] init]; |
+ _titleLabel.font = [fontLoader mediumFontOfSize:16]; |
+ _titleLabel.textColor = [[MDCPalette greyPalette] tint900]; |
+ _titleLabel.translatesAutoresizingMaskIntoConstraints = NO; |
+ |
+ _subtitleLabel = [[UILabel alloc] init]; |
+ _subtitleLabel.font = [fontLoader mediumFontOfSize:14]; |
+ _subtitleLabel.textColor = [[MDCPalette greyPalette] tint500]; |
+ _subtitleLabel.translatesAutoresizingMaskIntoConstraints = NO; |
+ |
+ _distillationDateLabel = [[UILabel alloc] init]; |
+ _distillationDateLabel.font = [fontLoader mediumFontOfSize:12]; |
+ _distillationDateLabel.textColor = [UIColor colorWithWhite:0 alpha:0.38]; |
+ _distillationDateLabel.translatesAutoresizingMaskIntoConstraints = NO; |
+ |
+ _distillationSizeLabel = [[UILabel alloc] init]; |
+ _distillationSizeLabel.font = [fontLoader mediumFontOfSize:12]; |
+ _distillationSizeLabel.textColor = [UIColor colorWithWhite:0 alpha:0.38]; |
+ _distillationSizeLabel.translatesAutoresizingMaskIntoConstraints = NO; |
_faviconView = [[FaviconViewNew alloc] init]; |
CGFloat fontSize = floorf(faviconSize / 2); |
@@ -314,30 +353,42 @@ const CGFloat kMargin = 16; |
[_downloadIndicator setTranslatesAutoresizingMaskIntoConstraints:NO]; |
[_faviconView addSubview:_downloadIndicator]; |
- [self.contentView addSubview:_textLabel]; |
- [self.contentView addSubview:_detailTextLabel]; |
+ [self.contentView addSubview:_titleLabel]; |
+ [self.contentView addSubview:_subtitleLabel]; |
[self.contentView addSubview:_faviconView]; |
+ [self.contentView addSubview:_distillationDateLabel]; |
+ [self.contentView addSubview:_distillationSizeLabel]; |
+ NSString* dateSizeFormat = |
+ @"H:|-(margin)-[favicon]-(margin)-[date]-(>=margin)-[size]-(margin)-|"; |
ApplyVisualConstraintsWithMetrics( |
@[ |
- @"V:|-(margin)-[title][text]-(margin)-|", |
+ @"V:|-(margin)-[favicon]", @"V:|-(margin)-[title][subtitle]", |
@"H:|-(margin)-[favicon]-(margin)-[title]-(>=margin)-|", |
- @"H:[favicon]-(margin)-[text]-(>=margin)-|" |
+ dateSizeFormat, @"H:[favicon]-(margin)-[subtitle]-(>=margin)-|" |
], |
@{ |
- @"title" : _textLabel, |
- @"text" : _detailTextLabel, |
- @"favicon" : _faviconView |
+ @"title" : _titleLabel, |
+ @"subtitle" : _subtitleLabel, |
+ @"favicon" : _faviconView, |
+ @"date" : _distillationDateLabel, |
+ @"size" : _distillationSizeLabel, |
}, |
- @{ @"margin" : @(kMargin) }); |
+ @{ |
+ @"margin" : @(kMargin), |
+ }); |
[NSLayoutConstraint activateConstraints:@[ |
// Favicons are always the same size. |
[_faviconView.widthAnchor constraintEqualToConstant:faviconSize], |
[_faviconView.heightAnchor constraintEqualToConstant:faviconSize], |
- [_faviconView.centerYAnchor |
- constraintEqualToAnchor:self.contentView.centerYAnchor], |
// Place the download indicator in the bottom right corner of the favicon. |
gambard
2017/03/16 07:50:24
This comment should be below the added constraints
Olivier
2017/03/16 09:20:14
Done.
|
+ [_distillationDateLabel.topAnchor |
gambard
2017/03/16 07:50:23
Add a comment for the constraints
Olivier
2017/03/16 09:20:15
Done.
|
+ constraintEqualToAnchor:_subtitleLabel.bottomAnchor |
+ constant:kDetailsMargin], |
+ [_distillationSizeLabel.topAnchor |
+ constraintEqualToAnchor:_subtitleLabel.bottomAnchor |
+ constant:kDetailsMargin], |
[[_downloadIndicator centerXAnchor] |
constraintEqualToAnchor:_faviconView.trailingAnchor], |
[[_downloadIndicator centerYAnchor] |
@@ -377,13 +428,42 @@ const CGFloat kMargin = 16; |
} |
} |
+- (void)setDistillationSize:(int64_t)distillationSize { |
+ self.distillationSizeLabel.hidden = distillationSize == 0; |
+ [self.distillationSizeLabel |
+ setText:[NSByteCountFormatter |
+ stringFromByteCount:distillationSize |
+ countStyle:NSByteCountFormatterCountStyleFile]]; |
+ _distillationSize = distillationSize; |
+} |
+ |
+- (void)setDistillationDate:(int64_t)distillationDate { |
+ self.distillationDateLabel.hidden = distillationDate == 0; |
+ int64_t now = (base::Time::Now() - base::Time::UnixEpoch()).InMicroseconds(); |
+ // Ellapsed is negative as required by TimeFormat. |
gambard
2017/03/16 07:50:23
Are you sure it is negative? |now| should be > |di
gambard
2017/03/16 07:50:24
s/Ellapsed/Elapsed
Olivier
2017/03/16 09:20:15
No, you are right, it is positive.
|
+ int64_t elapsed = now - distillationDate; |
+ NSString* text; |
+ if (elapsed < base::Time::kMicrosecondsPerMinute) { |
+ // This will also catch items added in the future. In that case, show the |
+ // "just now" string. |
+ text = l10n_util::GetNSString(IDS_IOS_READING_LIST_JUST_NOW); |
+ } else { |
+ text = base::SysUTF16ToNSString(ui::TimeFormat::Simple( |
+ ui::TimeFormat::FORMAT_ELAPSED, ui::TimeFormat::LENGTH_LONG, |
+ base::TimeDelta::FromMicroseconds(elapsed))); |
+ } |
+ |
+ [self.distillationDateLabel setText:text]; |
+ _distillationDate = distillationDate; |
+} |
+ |
#pragma mark - UICollectionViewCell |
- (void)prepareForReuse { |
[self.delegate readingListCellWillPrepareForReload:self]; |
self.delegate = nil; |
- self.textLabel.text = nil; |
- self.detailTextLabel.text = nil; |
+ self.titleLabel.text = nil; |
+ self.subtitleLabel.text = nil; |
gambard
2017/03/16 07:50:24
You should probably set the date and size to zero
Olivier
2017/03/16 09:20:15
Done.
|
self.distillationState = ReadingListEntry::WAITING; |
self.accessibilityCustomActions = nil; |
[super prepareForReuse]; |