#ifndef CHROMEOS_COMPONENTS_QUICK_ANSWERS_QUICK_ANSWERS_MODEL_H_
#define CHROMEOS_COMPONENTS_QUICK_ANSWERS_QUICK_ANSWERS_MODEL_H_
#include <compare>
#include <string>
#include <vector>
#include "base/strings/utf_string_conversions.h"
#include "chromeos/components/quick_answers/public/cpp/constants.h"
#include "chromeos/components/quick_answers/utils/unit_conversion_constants.h"
#include "ui/color/color_id.h"
#include "ui/gfx/image/image.h"
#include "url/gurl.h"
namespace quick_answers {
enum class NoticeInteractionType {
kAccept = 0,
kManageSettings = 1,
kDismiss = 2
};
enum class LoadStatus {
kSuccess = 0,
kNetworkError = 1,
kNoResult = 2,
kMaxValue = kNoResult,
};
enum class ResultType {
kNoResult = 0,
kDefinitionResult = 5493,
kTranslationResult = 6613,
kUnitConversionResult = 13668,
};
enum class IntentType {
kUnknown = 0,
kUnit = 1,
kDictionary = 2,
kTranslation = 3,
kMaxValue = kTranslation
};
std::optional<quick_answers::Intent> ToIntent(IntentType intent_type);
enum class QuickAnswerUiElementType {
kUnknown = 0,
kText = 1,
kImage = 2,
};
enum class QuickAnswersExitPoint {
kUnspecified = 0,
kContextMenuDismiss = 1,
kContextMenuClick = 2,
kQuickAnswersClick = 3,
kSettingsButtonClick = 4,
kReportQueryButtonClick = 5,
kMaxValue = kReportQueryButtonClick,
};
struct QuickAnswerUiElement {
explicit QuickAnswerUiElement(QuickAnswerUiElementType type) : type(type) {}
QuickAnswerUiElement(const QuickAnswerUiElement&) = default;
QuickAnswerUiElement& operator=(const QuickAnswerUiElement&) = default;
QuickAnswerUiElement(QuickAnswerUiElement&&) = default;
virtual ~QuickAnswerUiElement() = default;
QuickAnswerUiElementType type = QuickAnswerUiElementType::kUnknown;
};
struct QuickAnswerText : public QuickAnswerUiElement {
explicit QuickAnswerText(const std::string& text,
ui::ColorId color_id = ui::kColorLabelForeground)
: QuickAnswerUiElement(QuickAnswerUiElementType::kText),
text(base::UTF8ToUTF16(text)),
color_id(color_id) {}
std::u16string text;
ui::ColorId color_id;
};
struct QuickAnswerResultText : public QuickAnswerText {
public:
QuickAnswerResultText(
const std::string& text,
ui::ColorId color_id = ui::kColorLabelForegroundSecondary)
: QuickAnswerText(text, color_id) {}
};
struct QuickAnswerImage : public QuickAnswerUiElement {
explicit QuickAnswerImage(const gfx::Image& image)
: QuickAnswerUiElement(QuickAnswerUiElementType::kImage), image(image) {}
gfx::Image image;
};
struct PhoneticsInfo {
public:
PhoneticsInfo();
PhoneticsInfo(const PhoneticsInfo&);
~PhoneticsInfo();
std::string text;
GURL phonetics_audio;
std::string query_text;
std::string locale;
bool PhoneticsInfoAvailable() const;
bool AudioUrlAvailable() const;
bool TtsAudioAvailable() const;
};
struct QuickAnswer {
QuickAnswer();
~QuickAnswer();
ResultType result_type = ResultType::kNoResult;
std::vector<std::unique_ptr<QuickAnswerUiElement>> title;
std::vector<std::unique_ptr<QuickAnswerUiElement>> first_answer_row;
std::unique_ptr<QuickAnswerImage> image;
PhoneticsInfo phonetics_info;
};
struct DeviceProperties {
bool is_internal = false;
};
struct IntentInfo {
IntentInfo();
IntentInfo(const IntentInfo& other);
IntentInfo(const std::string& intent_text,
IntentType intent_type,
std::string_view device_language = std::string_view(),
std::string_view source_language = std::string_view());
~IntentInfo();
std::string intent_text;
IntentType intent_type = IntentType::kUnknown;
std::string device_language;
std::string source_language;
};
struct PreprocessedOutput {
PreprocessedOutput();
PreprocessedOutput(const PreprocessedOutput& other);
~PreprocessedOutput();
IntentInfo intent_info;
std::string query;
};
struct Context {
DeviceProperties device_properties;
std::string surrounding_text;
};
struct QuickAnswersRequest {
QuickAnswersRequest();
QuickAnswersRequest(const QuickAnswersRequest& other);
~QuickAnswersRequest();
std::string selected_text;
PreprocessedOutput preprocessed_output;
Context context;
};
struct Sense {
public:
Sense();
Sense(const Sense& other);
Sense& operator=(const Sense& other);
~Sense();
std::string definition;
std::optional<std::string> sample_sentence;
std::optional<std::vector<std::string>> synonyms_list;
};
struct DefinitionResult {
public:
DefinitionResult();
DefinitionResult(const DefinitionResult& other);
DefinitionResult& operator=(const DefinitionResult& other);
~DefinitionResult();
std::string word;
std::string word_class;
PhoneticsInfo phonetics_info;
Sense sense;
std::optional<std::vector<Sense>> subsenses_list;
};
struct TranslationResult {
public:
TranslationResult();
TranslationResult(const TranslationResult& other);
TranslationResult& operator=(const TranslationResult& other);
~TranslationResult();
std::string text_to_translate;
std::string translated_text;
std::string source_locale;
std::string target_locale;
};
class ConversionRule {
public:
ConversionRule(const ConversionRule& other);
ConversionRule& operator=(const ConversionRule& other);
~ConversionRule();
static std::optional<ConversionRule> Create(
const std::string& category,
const std::string& unit_name,
const std::optional<double>& term_a,
const std::optional<double>& term_b,
const std::optional<double>& term_c);
double ConvertAmountToSi(double unit_amount) const;
double ConvertAmountFromSi(double si_amount) const;
bool IsSingleVariableLinearConversion() const;
double term_a() const { return term_a_; }
const std::string& category() const { return category_; }
const std::string& unit_name() const { return unit_name_; }
friend bool operator==(const ConversionRule&,
const ConversionRule&) = default;
private:
ConversionRule(const std::string& category,
const std::string& unit_name,
double term_a,
double term_b,
double term_c);
std::string category_;
std::string unit_name_;
double term_a_;
double term_b_;
double term_c_;
};
class UnitConversion {
public:
UnitConversion(const UnitConversion& other);
UnitConversion& operator=(const UnitConversion& other);
~UnitConversion();
static std::optional<UnitConversion> Create(const ConversionRule& source_rule,
const ConversionRule& dest_rule);
friend std::weak_ordering operator<=>(const UnitConversion& a,
const UnitConversion& b);
friend bool operator==(const UnitConversion&,
const UnitConversion&) = default;
double ConvertSourceAmountToDestAmount(double source_amount) const;
std::optional<std::string> GetConversionFormulaText() const;
const std::string& category() const { return source_rule_.category(); }
const ConversionRule& source_rule() const { return source_rule_; }
const ConversionRule& dest_rule() const { return dest_rule_; }
private:
UnitConversion(const ConversionRule& source_rule,
const ConversionRule& dest_rule);
static double MaybeGetRatio(double value1, double value2);
ConversionRule source_rule_;
ConversionRule dest_rule_;
};
struct UnitConversionResult {
public:
UnitConversionResult();
UnitConversionResult(const UnitConversionResult& other);
UnitConversionResult& operator=(const UnitConversionResult& other);
~UnitConversionResult();
std::string source_text;
std::string result_text;
std::string category;
double source_amount = 0;
std::optional<UnitConversion> source_to_dest_unit_conversion;
std::vector<UnitConversion> alternative_unit_conversions_list;
};
class StructuredResult {
public:
StructuredResult();
~StructuredResult();
StructuredResult(const StructuredResult&) = delete;
StructuredResult& operator=(const StructuredResult) = delete;
ResultType GetResultType() const;
std::unique_ptr<TranslationResult> translation_result;
std::unique_ptr<DefinitionResult> definition_result;
std::unique_ptr<UnitConversionResult> unit_conversion_result;
};
class QuickAnswersSession {
public:
QuickAnswersSession();
~QuickAnswersSession();
QuickAnswersSession(const QuickAnswersSession&) = delete;
QuickAnswersSession& operator=(const QuickAnswersSession) = delete;
std::unique_ptr<QuickAnswer> quick_answer;
std::unique_ptr<StructuredResult> structured_result;
};
}
#endif