[go: nahoru, domu]

blob: a6faa7782561cfdcb6228d746d137aaa0b4ba426 [file] [log] [blame]
// 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.
#include "ash/wallpaper/wallpaper_utils/sea_pen_metadata_utils.h"
#include "ash/webui/common/mojom/sea_pen_generated.mojom-shared.h"
#include "base/i18n/time_formatting.h"
#include "base/json/json_writer.h"
#include "base/json/values_util.h"
#include "base/strings/stringprintf.h"
#include "base/time/time.h"
namespace ash {
namespace {
// Converts a base::Value `time_value` into human-readable string representation
// of the date, such as "Dec 30, 2023". The string is translated into the user's
// current locale. Returns null on failure.
std::optional<std::u16string> GetCreationTimeInfo(
const base::Value& time_value) {
auto time = base::ValueToTime(time_value);
if (!time) {
DVLOG(2) << __func__ << " invalid time value received";
return std::nullopt;
}
return base::TimeFormatShortDate(*time);
}
} // namespace
base::Value::Dict SeaPenQueryToDict(
const personalization_app::mojom::SeaPenQueryPtr& query) {
base::Value::Dict query_dict = base::Value::Dict();
query_dict.Set(kSeaPenCreationTimeKey, base::TimeToValue(base::Time::Now()));
switch (query->which()) {
case personalization_app::mojom::SeaPenQuery::Tag::kTextQuery:
query_dict.Set(kSeaPenFreeformQueryKey, query->get_text_query());
break;
case personalization_app::mojom::SeaPenQuery::Tag::kTemplateQuery:
query_dict.Set(kSeaPenTemplateIdKey,
base::NumberToString(static_cast<int32_t>(
query->get_template_query()->id)));
base::Value::Dict options_dict = base::Value::Dict();
for (const auto& [chip, option] : query->get_template_query()->options) {
options_dict.Set(base::NumberToString(static_cast<int32_t>(chip)),
base::NumberToString(static_cast<int32_t>(option)));
}
query_dict.Set(kSeaPenTemplateOptionsKey, std::move(options_dict));
query_dict.Set(kSeaPenUserVisibleQueryTextKey,
query->get_template_query()->user_visible_query->text);
query_dict.Set(
kSeaPenUserVisibleQueryTemplateKey,
query->get_template_query()->user_visible_query->template_title);
break;
}
return query_dict;
}
std::string QueryDictToXmpString(const base::Value::Dict& query_dict) {
static constexpr char kXmpData[] = R"(
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 6.0.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:description>%s</dc:description>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>)";
return base::StringPrintf(kXmpData,
base::WriteJson(query_dict).value_or("").c_str());
}
personalization_app::mojom::RecentSeaPenImageInfoPtr
SeaPenQueryDictToRecentImageInfo(const base::Value::Dict& query_dict) {
auto* creation_time = query_dict.Find(kSeaPenCreationTimeKey);
if (!creation_time) {
DVLOG(2) << __func__
<< " missing creation time information in extracted data";
return nullptr;
}
auto* freeform_query = query_dict.FindString(kSeaPenFreeformQueryKey);
if (freeform_query) {
return personalization_app::mojom::RecentSeaPenImageInfo::New(
personalization_app::mojom::SeaPenUserVisibleQuery::New(
/*text=*/*freeform_query, /*template_title=*/std::string()),
GetCreationTimeInfo(*creation_time));
}
auto* user_visible_query_text =
query_dict.FindString(kSeaPenUserVisibleQueryTextKey);
auto* user_visible_query_template =
query_dict.FindString(kSeaPenUserVisibleQueryTemplateKey);
if (!user_visible_query_text || !user_visible_query_template) {
DVLOG(2) << __func__
<< " missing user visible query information in extracted data";
return nullptr;
}
return personalization_app::mojom::RecentSeaPenImageInfo::New(
personalization_app::mojom::SeaPenUserVisibleQuery::New(
*user_visible_query_text, *user_visible_query_template),
GetCreationTimeInfo(*creation_time));
}
} // namespace ash