docs: @UiThread
      public void notifyParentMoved(int fromParentPosition, int toParentPosition) {
          int fromFlatParentPosition = getFlatParentPosition(fromParentPosition);
          ExpandableWrapper<P, C> fromParentWrapper = mFlatItemList.get(fromFlatParentPosition);
  
          // If the parent is collapsed we can take advantage of notifyItemMoved otherwise
          // we are forced to do a "manual" move by removing and then adding the parent + children
          // (no notifyItemRangeMovedAvailable)
          boolean isCollapsed = !fromParentWrapper.isExpanded();
          boolean isExpandedNoChildren = !isCollapsed && (fromParentWrapper.getWrappedChildList().size() == 0);
          if (isCollapsed || isExpandedNoChildren) {
              int toFlatParentPosition = getFlatParentPosition(toParentPosition);
              ExpandableWrapper<P, C> toParentWrapper = mFlatItemList.get(toFlatParentPosition);
              mFlatItemList.remove(fromFlatParentPosition);
              int childOffset = 0;
              if (toParentWrapper.isExpanded()) {
                  childOffset = toParentWrapper.getWrappedChildList().size();
              }
              mFlatItemList.add(toFlatParentPosition + childOffset, fromParentWrapper);
  
              notifyItemMoved(fromFlatParentPosition, toFlatParentPosition + childOffset);
          } else {
              // Remove the parent and children
              int sizeChanged = 0;
              int childListSize = fromParentWrapper.getWrappedChildList().size();
              for (int i = 0; i < childListSize + 1; i++) {
                  mFlatItemList.remove(fromFlatParentPosition);
                  sizeChanged++;
              }
              notifyItemRangeRemoved(fromFlatParentPosition, sizeChanged);
  
  
              // Add the parent and children at new position
              int toFlatParentPosition = getFlatParentPosition(toParentPosition);
              int childOffset = 0;
              if (toFlatParentPosition != INVALID_FLAT_POSITION) {
                  ExpandableWrapper<P, C> toParentWrapper = mFlatItemList.get(toFlatParentPosition);
                  if (toParentWrapper.isExpanded()) {
                      childOffset = toParentWrapper.getWrappedChildList().size();
                  }
              } else {
                  toFlatParentPosition = mFlatItemList.size();
              }
  
              mFlatItemList.add(toFlatParentPosition + childOffset, fromParentWrapper);
              List<ExpandableWrapper<P, C>> wrappedChildList = fromParentWrapper.getWrappedChildList();
              sizeChanged = wrappedChildList.size() + 1;
  
              mFlatItemList.addAll(toFlatParentPosition + childOffset + 1, wrappedChildList);
  
              notifyItemRangeInserted(toFlatParentPosition + childOffset, sizeChanged);
          }
      }