chromium/ios/chrome/browser/sessions/model/tab_group_util.mm

// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/browser/sessions/model/tab_group_util.h"

#import "base/notreached.h"
#import "base/strings/sys_string_conversions.h"
#import "base/strings/utf_string_conversions.h"
#import "components/tab_groups/tab_group_id.h"
#import "ios/chrome/browser/sessions/model/session_tab_group.h"

using tab_groups::TabGroupId;
using tab_groups::TabGroupVisualData;

namespace tab_group_util {

#pragma mark - Public methods

DeserializedGroup FromSerializedValue(ios::proto::TabGroupStorage group) {
  TabGroupVisualData visual_data = tab_groups::TabGroupVisualData(
      base::UTF8ToUTF16(group.title()), group.color(), group.collapsed());
  return DeserializedGroup{
      .range_start = group.range().start(),
      .range_count = group.range().count(),
      .visual_data = visual_data,
      .tab_group_id =
          tab_group_util::TabGroupIdFromStorage(group.tab_group_id())};
}

DeserializedGroup FromSerializedValue(SessionTabGroup* group) {
  TabGroupVisualData visual_data =
      tab_groups::TabGroupVisualData(base::SysNSStringToUTF16(group.title),
                                     group.colorId, group.collapsedState);
  return DeserializedGroup{.range_start = static_cast<int>(group.rangeStart),
                           .range_count = static_cast<int>(group.rangeCount),
                           .visual_data = visual_data,
                           .tab_group_id = group.tabGroupId};
}

ios::proto::TabGroupColorId ColorForStorage(
    tab_groups::TabGroupColorId color_id) {
  switch (color_id) {
    case tab_groups::TabGroupColorId::kGrey:
      return ios::proto::TabGroupColorId::GREY;
    case tab_groups::TabGroupColorId::kBlue:
      return ios::proto::TabGroupColorId::BLUE;
    case tab_groups::TabGroupColorId::kRed:
      return ios::proto::TabGroupColorId::RED;
    case tab_groups::TabGroupColorId::kYellow:
      return ios::proto::TabGroupColorId::YELLOW;
    case tab_groups::TabGroupColorId::kGreen:
      return ios::proto::TabGroupColorId::GREEN;
    case tab_groups::TabGroupColorId::kPink:
      return ios::proto::TabGroupColorId::PINK;
    case tab_groups::TabGroupColorId::kPurple:
      return ios::proto::TabGroupColorId::PURPLE;
    case tab_groups::TabGroupColorId::kCyan:
      return ios::proto::TabGroupColorId::CYAN;
    case tab_groups::TabGroupColorId::kOrange:
      return ios::proto::TabGroupColorId::ORANGE;
    case tab_groups::TabGroupColorId::kNumEntries:
      NOTREACHED() << "kNumEntries is not a supported color enum.";
  }
}

void TabGroupIdForStorage(TabGroupId tab_group_id,
                          ios::proto::TabGroupId& storage) {
  const base::Token token = tab_group_id.token();
  CHECK(!token.is_zero());
  storage.set_high(token.high());
  storage.set_low(token.low());
}

tab_groups::TabGroupColorId ColorFromStorage(
    ios::proto::TabGroupColorId color_id) {
  switch (color_id) {
    case ios::proto::TabGroupColorId::GREY:
      return tab_groups::TabGroupColorId::kGrey;
    case ios::proto::TabGroupColorId::BLUE:
      return tab_groups::TabGroupColorId::kBlue;
    case ios::proto::TabGroupColorId::RED:
      return tab_groups::TabGroupColorId::kRed;
    case ios::proto::TabGroupColorId::YELLOW:
      return tab_groups::TabGroupColorId::kYellow;
    case ios::proto::TabGroupColorId::GREEN:
      return tab_groups::TabGroupColorId::kGreen;
    case ios::proto::TabGroupColorId::PINK:
      return tab_groups::TabGroupColorId::kPink;
    case ios::proto::TabGroupColorId::PURPLE:
      return tab_groups::TabGroupColorId::kPurple;
    case ios::proto::TabGroupColorId::CYAN:
      return tab_groups::TabGroupColorId::kCyan;
    case ios::proto::TabGroupColorId::ORANGE:
      return tab_groups::TabGroupColorId::kOrange;
    default:
      NOTREACHED() << "value is not a supported color enum.";
  }
}

TabGroupId TabGroupIdFromStorage(ios::proto::TabGroupId tab_group_id) {
  return TabGroupId::FromRawToken(
      base::Token(tab_group_id.high(), tab_group_id.low()));
}

}  // namespace tab_group_util