[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 {