[iOS] Take into account move inside our outside a group
Currently move change are only moving next to items. But move call can
occur when a tab is moved inside a group. This CL manages group in
move notification.
See video:
https://drive.google.com/file/d/1iwcFS0-ELnTKgycHsFYaaiVaAhuAkiQO/view?usp=drive_link
Bug: 1501837
Change-Id: Ic9c22cf105b3027ca4de75a820e50afc0df21f57
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5419975
Reviewed-by: Ewann Pellé <ewannpv@chromium.org>
Commit-Queue: Aliona Dangla <alionadangla@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1282380}
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator.mm
index d59dee0..7186d45 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator.mm
@@ -419,23 +419,24 @@
} else if (![self isPinnedWebState:moveChange.moved_to_index()]) {
// BaseGridMediator handles only non pinned tabs because pinned tabs are
// handled in PinnedTabsMediator.
- int nextItemIndex = moveChange.moved_to_index() + 1;
- GridItemIdentifier* nextItem = nil;
- if (webStateList->ContainsIndex(nextItemIndex)) {
- const TabGroup* group =
- webStateList->GetGroupOfWebStateAt(nextItemIndex);
- if (group) {
- nextItem = [GridItemIdentifier groupIdentifier:group
- withWebStateList:webStateList];
- } else {
- nextItem = [GridItemIdentifier
- tabIdentifier:webStateList->GetWebStateAt(nextItemIndex)];
- }
+ if (moveChange.old_group()) {
+ [self updateCellGroup:moveChange.old_group()];
}
-
- [self.consumer moveItem:[GridItemIdentifier
- tabIdentifier:moveChange.moved_web_state()]
- beforeItem:nextItem];
+ if (moveChange.new_group()) {
+ if (!moveChange.old_group()) {
+ [self.consumer
+ removeItemWithIdentifier:
+ [GridItemIdentifier
+ tabIdentifier:moveChange.moved_web_state()]
+ selectedItemIdentifier:GetActiveNonPinnedIdentifier(
+ webStateList)];
+ }
+ [self updateCellGroup:moveChange.new_group()];
+ } else {
+ [self moveItem:[GridItemIdentifier
+ tabIdentifier:moveChange.moved_web_state()]
+ beforeIndex:moveChange.moved_to_index() + 1];
+ }
}
break;
}
@@ -511,24 +512,10 @@
case WebStateListChange::Type::kGroupMove: {
const WebStateListChangeGroupMove& groupMoveChange =
change.As<WebStateListChangeGroupMove>();
- int nextItemIndex = groupMoveChange.moved_to_range().range_end() + 1;
- GridItemIdentifier* nextItem = nil;
- if (webStateList->ContainsIndex(nextItemIndex)) {
- const TabGroup* group =
- webStateList->GetGroupOfWebStateAt(nextItemIndex);
- if (group) {
- nextItem = [GridItemIdentifier groupIdentifier:group
- withWebStateList:webStateList];
- } else {
- nextItem = [GridItemIdentifier
- tabIdentifier:webStateList->GetWebStateAt(nextItemIndex)];
- }
- }
-
- [self.consumer moveItem:[GridItemIdentifier
- groupIdentifier:groupMoveChange.moved_group()
- withWebStateList:webStateList]
- beforeItem:nextItem];
+ [self moveItem:[GridItemIdentifier
+ groupIdentifier:groupMoveChange.moved_group()
+ withWebStateList:webStateList]
+ beforeIndex:groupMoveChange.moved_to_range().range_end() + 1];
break;
}
case WebStateListChange::Type::kGroupDelete: {
@@ -1429,6 +1416,33 @@
}
}
+// Updates the cell of the given `group`.
+- (void)updateCellGroup:(const TabGroup*)group {
+ GridItemIdentifier* groupIdentifier =
+ [GridItemIdentifier groupIdentifier:group
+ withWebStateList:self.webStateList];
+ [self.consumer replaceItem:groupIdentifier
+ withReplacementItem:groupIdentifier];
+}
+
+// Moves `item` before the item at `nextItemIndex`.
+- (void)moveItem:(GridItemIdentifier*)item beforeIndex:(int)nextItemIndex {
+ GridItemIdentifier* nextItem = nil;
+ if (self.webStateList->ContainsIndex(nextItemIndex)) {
+ const TabGroup* group =
+ self.webStateList->GetGroupOfWebStateAt(nextItemIndex);
+ if (group) {
+ nextItem = [GridItemIdentifier groupIdentifier:group
+ withWebStateList:self.webStateList];
+ } else {
+ nextItem = [GridItemIdentifier
+ tabIdentifier:self.webStateList->GetWebStateAt(nextItemIndex)];
+ }
+ }
+
+ [self.consumer moveItem:item beforeItem:nextItem];
+}
+
#pragma mark - TabGridPageMutator
- (void)currentlySelectedGrid:(BOOL)selected {