blob: 878a037afd3569e83bfa7bbcabb61afbe8e7c41e [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_SYNC_SERVICE_LOCAL_DATA_DESCRIPTION_H_
#define COMPONENTS_SYNC_SERVICE_LOCAL_DATA_DESCRIPTION_H_
#include <string>
#include <variant>
#include <vector>
#include "components/sync/base/data_type.h"
#include "url/gurl.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/android/scoped_java_ref.h"
#endif
namespace syncer {
// Representation of a single item to be displayed in the Batch Upload dialog.
struct LocalDataItemModel {
// This id corresponds to the data item being represented in the model. It
// is used to link back to the data accurately when needing to process the
// result of the dialog.
// The variant allow for different data types to add their Id types. Multiple
// data types may have the same Id type.
// The `DataId` is also used as key of map.
using DataId = std::variant<
// BOOKMARKS.
int64_t, // bookmarks::BookmarkNode::id()
// READING_LIST.
GURL,
// CONTACT_INFO, THEMES.
std::string,
// PASSWORDS.
std::tuple<std::string,
GURL,
std::u16string,
std::u16string,
std::u16string>>;
// Reprensents the id of the underlying data.
DataId id;
// The Icon class encapsulates the different representations of an icon to be
// displayed. It contains one of the following types.
//
// NoIcon:
// No icon is displayed.
// PageUrlIcon:
// A page URL for which a favicon should be displayed.
// Example:
// https://www.chromium.org
// FolderIcon:
// The folder icon.
struct NoIcon {
bool operator==(const NoIcon& other) const = default;
};
using PageUrlIcon = GURL;
struct FolderIcon {
bool operator==(const FolderIcon& other) const = default;
};
using Icon = std::variant<NoIcon, PageUrlIcon, FolderIcon>;
// This is default-constructed as the NoIcon variant.
Icon icon;
// Used as the primary text of the item model.
std::string title;
// Used as the secondary text of the item model.
std::string subtitle;
LocalDataItemModel();
~LocalDataItemModel();
// Copyable.
LocalDataItemModel(const LocalDataItemModel&);
LocalDataItemModel& operator=(const LocalDataItemModel&);
// Movable.
LocalDataItemModel(LocalDataItemModel&& other);
LocalDataItemModel& operator=(LocalDataItemModel&& other);
friend bool operator==(const LocalDataItemModel&,
const LocalDataItemModel&) = default;
};
// TODO(crbug.com/373568992): Merge Desktop and Mobile data under common struct.
struct LocalDataDescription {
// The following data is currently only used on Desktop platforms in the Batch
// Upload Dialog.
//
// Type that the model list represent.
syncer::DataType type = syncer::DataType::UNSPECIFIED;
// List of local data model representations.
std::vector<LocalDataItemModel> local_data_models;
// The following data is currently only used on Mobile platforms in the Batch
// Upload view.
//
// Actual count of local items.
size_t item_count = 0;
// Contains up to 3 distinct domains corresponding to some of the local items,
// to be used for a preview.
std::vector<std::string> domains;
// Count of distinct domains for preview.
// Note: This may be different from the count of items(`item_count`), since a
// user might have, for e.g., multiple bookmarks or passwords for the same
// domain. It may also be different from domains.size(), that one contains
// only up to 3 elements.
size_t domain_count = 0;
LocalDataDescription();
// `all_urls` should be the corresponding URL for each local data item, e.g.
// the URL of each local bookmark. In the resulting object, fields will be as
// below.
// item_count: The size of `all_urls`.
// domain_count: The number of unique domains in `all_urls`. For instance
// for {a.com, a.com/foo and b.com}, domain_count will be 2.
// domains: The first (up to) 3 domains in alphabetical order.
explicit LocalDataDescription(const std::vector<GURL>& all_urls);
LocalDataDescription(const LocalDataDescription&);
LocalDataDescription& operator=(const LocalDataDescription&);
LocalDataDescription(LocalDataDescription&&);
LocalDataDescription& operator=(LocalDataDescription&&);
~LocalDataDescription();
friend bool operator==(const LocalDataDescription&,
const LocalDataDescription&) = default;
};
// Returns a string that summarizes the domain content of `description`, meant
// to be consumed by the UI. Must not be called if the `description.domains` is
// empty.
std::u16string GetDomainsDisplayText(const LocalDataDescription& description);
// gmock printer helper.
void PrintTo(const LocalDataDescription& local_data_description,
std::ostream* os);
#if BUILDFLAG(IS_ANDROID)
// Constructs a Java LocalDataDescription from the provided C++
// LocalDataDescription
base::android::ScopedJavaLocalRef<jobject> ConvertToJavaLocalDataDescription(
JNIEnv* env,
const syncer::LocalDataDescription& local_data_description);
#endif
} // namespace syncer
#endif // COMPONENTS_SYNC_SERVICE_LOCAL_DATA_DESCRIPTION_H_