blob: 5caa8b95b9feb01466def07c940aa3f79b720fcb [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/omnibox/browser/suggestion_group_util.h"
#include <optional>
#include "base/feature_list.h"
#include "base/lazy_instance.h"
#include "components/omnibox/browser/match_compare.h"
#include "components/omnibox/browser/omnibox_field_trial.h"
#include "components/omnibox/common/omnibox_features.h"
#include "components/strings/grit/components_strings.h"
#include "omnibox_event.pb.h"
#include "third_party/omnibox_proto/groups.pb.h"
#include "ui/base/l10n/l10n_util.h"
namespace omnibox {
namespace {
GroupConfig CreateGroup(GroupSection section,
GroupConfig::RenderType render_type =
GroupConfig_RenderType_DEFAULT_VERTICAL,
std::optional<int32_t> header_text = {}) {
GroupConfig group;
group.set_section(section);
group.set_render_type(render_type);
if (header_text) {
group.set_header_text(l10n_util::GetStringUTF8(*header_text));
}
return group;
}
base::LazyInstance<GroupConfigMap>::DestructorAtExit g_default_groups =
LAZY_INSTANCE_INITIALIZER;
base::LazyInstance<GroupConfigMap>::DestructorAtExit g_default_hub_zps_groups =
LAZY_INSTANCE_INITIALIZER;
base::LazyInstance<GroupConfigMap>::DestructorAtExit
g_default_hub_typed_groups = LAZY_INSTANCE_INITIALIZER;
const GroupConfigMap& BuildDefaultGroups() {
if (g_default_groups.Get().empty()) {
g_default_groups.Get() = {
// clang-format off
{GROUP_MOBILE_SEARCH_READY_OMNIBOX, CreateGroup(SECTION_MOBILE_VERBATIM)},
{GROUP_MOBILE_CLIPBOARD, CreateGroup(SECTION_MOBILE_CLIPBOARD)},
{GROUP_PERSONALIZED_ZERO_SUGGEST, CreateGroup(SECTION_PERSONALIZED_ZERO_SUGGEST)},
{GROUP_MOBILE_MOST_VISITED,
CreateGroup(SECTION_MOBILE_MOST_VISITED,
base::FeatureList::IsEnabled(
kMostVisitedTilesHorizontalRenderGroup)
? GroupConfig_RenderType_HORIZONTAL
: GroupConfig_RenderType_DEFAULT_VERTICAL)},
{GROUP_MOBILE_RICH_ANSWER,
OmniboxFieldTrial::kAnswerActionsShowRichCard.Get()
? CreateGroup(SECTION_MOBILE_RICH_ANSWER)
: CreateGroup(SECTION_SEARCH)},
{GROUP_SEARCH, CreateGroup(SECTION_SEARCH)},
{GROUP_OTHER_NAVS, CreateGroup(SECTION_SEARCH)},
// clang-format on
};
}
return g_default_groups.Get();
}
const GroupConfigMap& BuildDefaultHubZPSGroups() {
if (g_default_hub_zps_groups.Get().empty()) {
g_default_hub_zps_groups.Get() = {
// clang-format off
{GROUP_MOBILE_OPEN_TABS,
CreateGroup(SECTION_MOBILE_OPEN_TABS,
GroupConfig_RenderType_DEFAULT_VERTICAL,
IDS_OMNIBOX_HUB_OPEN_TABS_HEADER)}
// clang-format on
};
}
return g_default_hub_zps_groups.Get();
}
const GroupConfigMap& BuildDefaultHubTypedGroups() {
if (g_default_hub_typed_groups.Get().empty()) {
g_default_hub_typed_groups.Get() = {
// clang-format off
{GROUP_MOBILE_OPEN_TABS, CreateGroup(SECTION_MOBILE_OPEN_TABS)},
{GROUP_MOBILE_BOOKMARKS,
CreateGroup(SECTION_MOBILE_BOOKMARKS,
GroupConfig_RenderType_DEFAULT_VERTICAL,
IDS_SEARCH_ENGINES_STARTER_PACK_BOOKMARKS_NAME)},
{GROUP_MOBILE_HISTORY,
CreateGroup(SECTION_MOBILE_HISTORY,
GroupConfig_RenderType_DEFAULT_VERTICAL,
IDS_OMNIBOX_HUB_HISTORY_HEADER)},
{GROUP_SEARCH,
CreateGroup(SECTION_SEARCH,
GroupConfig_RenderType_DEFAULT_VERTICAL,
IDS_OMNIBOX_HUB_SEARCH_HEADER)}
// clang-format on
};
}
return g_default_hub_typed_groups.Get();
}
} // namespace
const omnibox::GroupConfigMap& BuildDefaultGroupsForInput(
const AutocompleteInput& input) {
using OEP = ::metrics::OmniboxEventProto;
switch (input.current_page_classification()) {
case OEP::ANDROID_HUB:
return input.IsZeroSuggest() || input.text().empty()
? BuildDefaultHubZPSGroups()
: BuildDefaultHubTypedGroups();
default:
return BuildDefaultGroups();
}
}
void ResetDefaultGroupsForTest() {
g_default_groups.Get().clear();
}
GroupId GroupIdForNumber(int value) {
return GroupId_IsValid(value) ? static_cast<GroupId>(value) : GROUP_INVALID;
}
} // namespace omnibox