Index: ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm |
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm |
index 42a2c9da05255f7ca733da5b2c33beb5b5b93506..627c577169fa88d4241d353db93dd0513a9e0b30 100644 |
--- a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm |
+++ b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm |
@@ -128,14 +128,14 @@ using ItemsMapByDate = std::multimap<int64_t, ReadingListCollectionViewItem*>; |
- (void)markAllRead; |
// Marks all items as unread. |
- (void)markAllUnread; |
-// Marks the selected items as read. |
-- (void)markItemsRead; |
-// Marks the selected items as unread. |
-- (void)markItemsUnread; |
+// Marks the items at |indexPaths| as read. |
+- (void)markItemsReadAtIndexPath:(NSArray*)indexPaths; |
+// Marks the items at |indexPaths| as unread. |
+- (void)markItemsUnreadAtIndexPath:(NSArray*)indexPaths; |
// Deletes all the read items. |
- (void)deleteAllReadItems; |
-// Deletes all the selected items. |
-- (void)deleteSelectedItems; |
+// Deletes all the items at |indexPaths|. |
+- (void)deleteItemsAtIndexPaths:(NSArray*)indexPaths; |
// Initializes |_actionSheet| with |self| as base view controller, and the |
// toolbar's mark button as anchor point. |
- (void)initializeActionSheet; |
@@ -599,10 +599,12 @@ using ItemsMapByDate = std::multimap<int64_t, ReadingListCollectionViewItem*>; |
[self markAllItemsAs]; |
break; |
case OnlyUnreadSelected: |
- [self markItemsRead]; |
+ [self markItemsReadAtIndexPath:self.collectionView |
+ .indexPathsForSelectedItems]; |
break; |
case OnlyReadSelected: |
- [self markItemsUnread]; |
+ [self markItemsUnreadAtIndexPath:self.collectionView |
+ .indexPathsForSelectedItems]; |
break; |
case MixedItemsSelected: |
[self markMixedItemsAs]; |
@@ -617,7 +619,8 @@ using ItemsMapByDate = std::multimap<int64_t, ReadingListCollectionViewItem*>; |
if ([_toolbar state] == NoneSelected) { |
[self deleteAllReadItems]; |
} else { |
- [self deleteSelectedItems]; |
+ [self |
+ deleteItemsAtIndexPaths:self.collectionView.indexPathsForSelectedItems]; |
} |
} |
- (void)enterEditingModePressed { |
@@ -707,18 +710,24 @@ using ItemsMapByDate = std::multimap<int64_t, ReadingListCollectionViewItem*>; |
- (void)markMixedItemsAs { |
[self initializeActionSheet]; |
__weak ReadingListCollectionViewController* weakSelf = self; |
- [_actionSheet addItemWithTitle:l10n_util::GetNSStringWithFixup( |
- IDS_IOS_READING_LIST_MARK_READ_BUTTON) |
- action:^{ |
- [weakSelf markItemsRead]; |
- } |
- style:UIAlertActionStyleDefault]; |
- [_actionSheet addItemWithTitle:l10n_util::GetNSStringWithFixup( |
- IDS_IOS_READING_LIST_MARK_UNREAD_BUTTON) |
- action:^{ |
- [weakSelf markItemsUnread]; |
- } |
- style:UIAlertActionStyleDefault]; |
+ [_actionSheet |
+ addItemWithTitle:l10n_util::GetNSStringWithFixup( |
+ IDS_IOS_READING_LIST_MARK_READ_BUTTON) |
+ action:^{ |
+ [weakSelf |
+ markItemsReadAtIndexPath:weakSelf.collectionView |
+ .indexPathsForSelectedItems]; |
+ } |
+ style:UIAlertActionStyleDefault]; |
+ [_actionSheet |
+ addItemWithTitle:l10n_util::GetNSStringWithFixup( |
+ IDS_IOS_READING_LIST_MARK_UNREAD_BUTTON) |
+ action:^{ |
+ [weakSelf |
+ markItemsUnreadAtIndexPath: |
+ weakSelf.collectionView.indexPathsForSelectedItems]; |
+ } |
+ style:UIAlertActionStyleDefault]; |
[_actionSheet start]; |
} |
@@ -743,6 +752,7 @@ using ItemsMapByDate = std::multimap<int64_t, ReadingListCollectionViewItem*>; |
usingEntryUpdater:^(const GURL& url) { |
[self readingListModel]->SetReadStatus(url, true); |
}]; |
+ |
[self exitEditingModeAnimated:YES]; |
[self moveItemsFromSection:SectionIdentifierUnread |
toSection:SectionIdentifierRead]; |
@@ -758,15 +768,16 @@ using ItemsMapByDate = std::multimap<int64_t, ReadingListCollectionViewItem*>; |
usingEntryUpdater:^(const GURL& url) { |
[self readingListModel]->SetReadStatus(url, false); |
}]; |
+ |
[self exitEditingModeAnimated:YES]; |
[self moveItemsFromSection:SectionIdentifierRead |
toSection:SectionIdentifierUnread]; |
} |
-- (void)markItemsRead { |
+- (void)markItemsReadAtIndexPath:(NSArray*)indexPaths { |
base::RecordAction(base::UserMetricsAction("MobileReadingListMarkRead")); |
- NSArray* sortedIndexPaths = [self.collectionView.indexPathsForSelectedItems |
- sortedArrayUsingSelector:@selector(compare:)]; |
+ NSArray* sortedIndexPaths = |
+ [indexPaths sortedArrayUsingSelector:@selector(compare:)]; |
[self updateIndexPaths:sortedIndexPaths |
usingEntryUpdater:^(const GURL& url) { |
[self readingListModel]->SetReadStatus(url, true); |
@@ -776,10 +787,10 @@ using ItemsMapByDate = std::multimap<int64_t, ReadingListCollectionViewItem*>; |
[self moveSelectedItems:sortedIndexPaths toSection:SectionIdentifierRead]; |
} |
-- (void)markItemsUnread { |
+- (void)markItemsUnreadAtIndexPath:(NSArray*)indexPaths { |
base::RecordAction(base::UserMetricsAction("MobileReadingListMarkUnread")); |
- NSArray* sortedIndexPaths = [self.collectionView.indexPathsForSelectedItems |
- sortedArrayUsingSelector:@selector(compare:)]; |
+ NSArray* sortedIndexPaths = |
+ [indexPaths sortedArrayUsingSelector:@selector(compare:)]; |
[self updateIndexPaths:sortedIndexPaths |
usingEntryUpdater:^(const GURL& url) { |
[self readingListModel]->SetReadStatus(url, false); |
@@ -820,8 +831,7 @@ using ItemsMapByDate = std::multimap<int64_t, ReadingListCollectionViewItem*>; |
[self removeEmptySections]; |
} |
-- (void)deleteSelectedItems { |
- NSArray* indexPaths = [self.collectionView.indexPathsForSelectedItems copy]; |
+- (void)deleteItemsAtIndexPaths:(NSArray*)indexPaths { |
[self updateIndexPaths:indexPaths |
usingEntryUpdater:^(const GURL& url) { |
[self logDeletionHistogramsForEntry:url]; |
@@ -907,44 +917,28 @@ using ItemsMapByDate = std::multimap<int64_t, ReadingListCollectionViewItem*>; |
- (void)moveItemsFromSection:(SectionIdentifier)sourceSectionIdentifier |
toSection:(SectionIdentifier)destinationSectionIdentifier { |
- [self initializeSection:destinationSectionIdentifier]; |
- |
NSInteger sourceSection = [self.collectionViewModel |
sectionForSectionIdentifier:sourceSectionIdentifier]; |
- NSInteger destinationSection = [self.collectionViewModel |
- sectionForSectionIdentifier:destinationSectionIdentifier]; |
NSInteger numberOfSourceItems = |
[self.collectionViewModel numberOfItemsInSection:sourceSection]; |
- [self.collectionView performBatchUpdates:^{ |
- for (int index = 0; index < numberOfSourceItems; index++) { |
- NSIndexPath* firstItemIndex = |
- [NSIndexPath indexPathForItem:0 inSection:sourceSection]; |
- NSIndexPath* sourceItemIndex = |
- [NSIndexPath indexPathForItem:index inSection:sourceSection]; |
- NSIndexPath* destinationItemIndex = |
- [NSIndexPath indexPathForItem:index inSection:destinationSection]; |
- |
- // The collection view model gets updated instantaneously, the collection |
- // view does batch updates. |
- [self collectionView:self.collectionView |
- willMoveItemAtIndexPath:firstItemIndex |
- toIndexPath:destinationItemIndex]; |
- [self.collectionView moveItemAtIndexPath:sourceItemIndex |
- toIndexPath:destinationItemIndex]; |
- } |
+ NSMutableArray* sortedIndexPaths = [NSMutableArray array]; |
+ |
+ for (int index = 0; index < numberOfSourceItems; index++) { |
+ NSIndexPath* itemIndex = |
+ [NSIndexPath indexPathForItem:index inSection:sourceSection]; |
+ [sortedIndexPaths addObject:itemIndex]; |
} |
- completion:^(BOOL) { |
- // Reload data to take into account possible sync events. |
- [self applyPendingUpdates]; |
- }]; |
- // As we modified the section in the batch update block, remove the section in |
- // another block. |
- [self removeEmptySections]; |
+ |
+ [self moveSelectedItems:sortedIndexPaths |
+ toSection:destinationSectionIdentifier]; |
} |
- (void)moveSelectedItems:(NSArray*)sortedIndexPaths |
toSection:(SectionIdentifier)sectionIdentifier { |
+ // Reconfigure cells, allowing the custom actions to be updated. |
+ [self reconfigureCellsAtIndexPaths:sortedIndexPaths]; |
+ |
NSInteger sectionCreatedIndex = [self initializeSection:sectionIdentifier]; |
[self.collectionView performBatchUpdates:^{ |
@@ -975,6 +969,7 @@ using ItemsMapByDate = std::multimap<int64_t, ReadingListCollectionViewItem*>; |
// this item in the targeted section. |
NSIndexPath* newIndexPath = |
[NSIndexPath indexPathForItem:newItemIndex++ inSection:section]; |
+ |
[self collectionView:self.collectionView |
willMoveItemAtIndexPath:indexForModel |
toIndexPath:newIndexPath]; |