Add td_api::updateProfileAccentColors.
This commit is contained in:
parent
fbcd4c7198
commit
60eb989657
@ -750,6 +750,18 @@ premiumGiveawayInfoCompleted creation_date:int32 actual_winners_selection_date:i
|
|||||||
//@dark_theme_colors The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in dark themes
|
//@dark_theme_colors The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in dark themes
|
||||||
accentColor id:int32 built_in_accent_color_id:int32 light_theme_colors:vector<int32> dark_theme_colors:vector<int32> = AccentColor;
|
accentColor id:int32 built_in_accent_color_id:int32 light_theme_colors:vector<int32> dark_theme_colors:vector<int32> = AccentColor;
|
||||||
|
|
||||||
|
//@description Contains information about supported accent colors for user profile photo background in RGB format
|
||||||
|
//@palette_colors The list of 1-2 colors in RGB format, describing the colors, as expected to be shown in the color palette settings
|
||||||
|
//@background_colors The list of 1-2 colors in RGB format, describing the colors, as expected to be used for the profile photo background
|
||||||
|
//@story_colors The list of 2 colors in RGB format, describing the colors of the gradient to be used for the unread active story indicator around profile photo
|
||||||
|
profileAccentColors palette_colors:vector<int32> background_colors:vector<int32> story_colors:vector<int32> = ProfileAccentColors;
|
||||||
|
|
||||||
|
//@description Contains information about supported accent color for user profile photo background
|
||||||
|
//@id Profile accent color identifier
|
||||||
|
//@light_theme_colors The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in light themes
|
||||||
|
//@dark_theme_colors The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in dark themes
|
||||||
|
profileAccentColor id:int32 light_theme_colors:profileAccentColors dark_theme_colors:profileAccentColors = ProfileAccentColor;
|
||||||
|
|
||||||
//@description Describes a custom emoji to be shown instead of the Telegram Premium badge
|
//@description Describes a custom emoji to be shown instead of the Telegram Premium badge
|
||||||
//@custom_emoji_id Identifier of the custom emoji in stickerFormatTgs format
|
//@custom_emoji_id Identifier of the custom emoji in stickerFormatTgs format
|
||||||
//@expiration_date Point in time (Unix timestamp) when the status will expire; 0 if never
|
//@expiration_date Point in time (Unix timestamp) when the status will expire; 0 if never
|
||||||
@ -4522,7 +4534,7 @@ premiumFeatureUpgradedStories = PremiumFeature;
|
|||||||
//@description The ability to boost chats
|
//@description The ability to boost chats
|
||||||
premiumFeatureChatBoost = PremiumFeature;
|
premiumFeatureChatBoost = PremiumFeature;
|
||||||
|
|
||||||
//@description The ability to choose accent color
|
//@description The ability to choose accent color for replies and user profile
|
||||||
premiumFeatureAccentColor = PremiumFeature;
|
premiumFeatureAccentColor = PremiumFeature;
|
||||||
|
|
||||||
|
|
||||||
@ -6389,6 +6401,11 @@ updateChatThemes chat_themes:vector<chatTheme> = Update;
|
|||||||
//@available_accent_color_ids The list of accent color identifiers, which can be set through setAccentColor and setChatAccentColor. The colors must be shown in the specififed order
|
//@available_accent_color_ids The list of accent color identifiers, which can be set through setAccentColor and setChatAccentColor. The colors must be shown in the specififed order
|
||||||
updateAccentColors colors:vector<accentColor> available_accent_color_ids:vector<int32> = Update;
|
updateAccentColors colors:vector<accentColor> available_accent_color_ids:vector<int32> = Update;
|
||||||
|
|
||||||
|
//@description The list of supported accent colors for user profiles has changed
|
||||||
|
//@colors Information about supported colors
|
||||||
|
//@available_accent_color_ids The list of accent color identifiers, which can be set through setProfileAccentColor. The colors must be shown in the specififed order
|
||||||
|
updateProfileAccentColors colors:vector<profileAccentColor> available_accent_color_ids:vector<int32> = Update;
|
||||||
|
|
||||||
//@description Some language pack strings have been updated @localization_target Localization target to which the language pack belongs @language_pack_id Identifier of the updated language pack @strings List of changed language pack strings; empty if all strings have changed
|
//@description Some language pack strings have been updated @localization_target Localization target to which the language pack belongs @language_pack_id Identifier of the updated language pack @strings List of changed language pack strings; empty if all strings have changed
|
||||||
updateLanguagePackStrings localization_target:string language_pack_id:string strings:vector<languagePackString> = Update;
|
updateLanguagePackStrings localization_target:string language_pack_id:string strings:vector<languagePackString> = Update;
|
||||||
|
|
||||||
|
@ -78,6 +78,32 @@ class GetPeerColorsQuery final : public Td::ResultHandler {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class GetPeerProfileColorsQuery final : public Td::ResultHandler {
|
||||||
|
Promise<telegram_api::object_ptr<telegram_api::help_PeerColors>> promise_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit GetPeerProfileColorsQuery(Promise<telegram_api::object_ptr<telegram_api::help_PeerColors>> &&promise)
|
||||||
|
: promise_(std::move(promise)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void send(int32 hash) {
|
||||||
|
send_query(G()->net_query_creator().create(telegram_api::help_getPeerProfileColors(hash)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_result(BufferSlice packet) final {
|
||||||
|
auto result_ptr = fetch_result<telegram_api::help_getPeerProfileColors>(packet);
|
||||||
|
if (result_ptr.is_error()) {
|
||||||
|
return on_error(result_ptr.move_as_error());
|
||||||
|
}
|
||||||
|
|
||||||
|
promise_.set_value(result_ptr.move_as_ok());
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_error(Status status) final {
|
||||||
|
promise_.set_error(std::move(status));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
bool operator==(const ThemeManager::ThemeSettings &lhs, const ThemeManager::ThemeSettings &rhs) {
|
bool operator==(const ThemeManager::ThemeSettings &lhs, const ThemeManager::ThemeSettings &rhs) {
|
||||||
return lhs.accent_color == rhs.accent_color && lhs.message_accent_color == rhs.message_accent_color &&
|
return lhs.accent_color == rhs.accent_color && lhs.message_accent_color == rhs.message_accent_color &&
|
||||||
lhs.background_info == rhs.background_info && lhs.base_theme == rhs.base_theme &&
|
lhs.background_info == rhs.background_info && lhs.base_theme == rhs.base_theme &&
|
||||||
@ -88,6 +114,15 @@ bool operator!=(const ThemeManager::ThemeSettings &lhs, const ThemeManager::Them
|
|||||||
return !(lhs == rhs);
|
return !(lhs == rhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool operator==(const ThemeManager::ProfileAccentColor &lhs, const ThemeManager::ProfileAccentColor &rhs) {
|
||||||
|
return lhs.palette_colors_ == rhs.palette_colors_ && lhs.background_colors_ == rhs.background_colors_ &&
|
||||||
|
lhs.story_colors_ == rhs.story_colors_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const ThemeManager::ProfileAccentColor &lhs, const ThemeManager::ProfileAccentColor &rhs) {
|
||||||
|
return !(lhs == rhs);
|
||||||
|
}
|
||||||
|
|
||||||
template <class StorerT>
|
template <class StorerT>
|
||||||
void ThemeManager::ThemeSettings::store(StorerT &storer) const {
|
void ThemeManager::ThemeSettings::store(StorerT &storer) const {
|
||||||
using td::store;
|
using td::store;
|
||||||
@ -217,8 +252,76 @@ void ThemeManager::AccentColors::parse(ParserT &parser) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class StorerT>
|
||||||
|
void ThemeManager::ProfileAccentColor::store(StorerT &storer) const {
|
||||||
|
td::store(palette_colors_, storer);
|
||||||
|
td::store(background_colors_, storer);
|
||||||
|
td::store(story_colors_, storer);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class ParserT>
|
||||||
|
void ThemeManager::ProfileAccentColor::parse(ParserT &parser) {
|
||||||
|
td::parse(palette_colors_, parser);
|
||||||
|
td::parse(background_colors_, parser);
|
||||||
|
td::parse(story_colors_, parser);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class StorerT>
|
||||||
|
void ThemeManager::ProfileAccentColors::store(StorerT &storer) const {
|
||||||
|
bool has_hash = hash_ != 0;
|
||||||
|
BEGIN_STORE_FLAGS();
|
||||||
|
STORE_FLAG(has_hash);
|
||||||
|
END_STORE_FLAGS();
|
||||||
|
td::store(static_cast<int32>(light_colors_.size()), storer);
|
||||||
|
for (auto &it : light_colors_) {
|
||||||
|
td::store(it.first, storer);
|
||||||
|
td::store(it.second, storer);
|
||||||
|
}
|
||||||
|
td::store(static_cast<int32>(dark_colors_.size()), storer);
|
||||||
|
for (auto &it : dark_colors_) {
|
||||||
|
td::store(it.first, storer);
|
||||||
|
td::store(it.second, storer);
|
||||||
|
}
|
||||||
|
td::store(accent_color_ids_, storer);
|
||||||
|
if (has_hash) {
|
||||||
|
td::store(hash_, storer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class ParserT>
|
||||||
|
void ThemeManager::ProfileAccentColors::parse(ParserT &parser) {
|
||||||
|
bool has_hash;
|
||||||
|
BEGIN_PARSE_FLAGS();
|
||||||
|
PARSE_FLAG(has_hash);
|
||||||
|
END_PARSE_FLAGS();
|
||||||
|
int32 size;
|
||||||
|
td::parse(size, parser);
|
||||||
|
for (int32 i = 0; i < size; i++) {
|
||||||
|
AccentColorId accent_color_id;
|
||||||
|
ProfileAccentColor colors;
|
||||||
|
td::parse(accent_color_id, parser);
|
||||||
|
td::parse(colors, parser);
|
||||||
|
CHECK(accent_color_id.is_valid());
|
||||||
|
light_colors_.emplace(accent_color_id, std::move(colors));
|
||||||
|
}
|
||||||
|
td::parse(size, parser);
|
||||||
|
for (int32 i = 0; i < size; i++) {
|
||||||
|
AccentColorId accent_color_id;
|
||||||
|
ProfileAccentColor colors;
|
||||||
|
td::parse(accent_color_id, parser);
|
||||||
|
td::parse(colors, parser);
|
||||||
|
CHECK(accent_color_id.is_valid());
|
||||||
|
dark_colors_.emplace(accent_color_id, std::move(colors));
|
||||||
|
}
|
||||||
|
td::parse(accent_color_ids_, parser);
|
||||||
|
if (has_hash) {
|
||||||
|
td::parse(hash_, parser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ThemeManager::ThemeManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) {
|
ThemeManager::ThemeManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) {
|
||||||
load_accent_colors();
|
load_accent_colors();
|
||||||
|
load_profile_accent_colors();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThemeManager::start_up() {
|
void ThemeManager::start_up() {
|
||||||
@ -259,6 +362,23 @@ void ThemeManager::load_accent_colors() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThemeManager::load_profile_accent_colors() {
|
||||||
|
if (!td_->auth_manager_->is_authorized() || td_->auth_manager_->is_bot()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto log_event_string = G()->td_db()->get_binlog_pmc()->get(get_profile_accent_colors_database_key());
|
||||||
|
if (!log_event_string.empty()) {
|
||||||
|
auto status = log_event_parse(profile_accent_colors_, log_event_string);
|
||||||
|
if (status.is_ok()) {
|
||||||
|
send_update_profile_accent_colors();
|
||||||
|
} else {
|
||||||
|
LOG(ERROR) << "Failed to parse profile accent colors from binlog: " << status;
|
||||||
|
profile_accent_colors_ = ProfileAccentColors();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ThemeManager::init() {
|
void ThemeManager::init() {
|
||||||
load_chat_themes();
|
load_chat_themes();
|
||||||
if (td_->auth_manager_->is_authorized() && !td_->auth_manager_->is_bot()) {
|
if (td_->auth_manager_->is_authorized() && !td_->auth_manager_->is_bot()) {
|
||||||
@ -268,6 +388,9 @@ void ThemeManager::init() {
|
|||||||
if (accent_colors_.hash_ == 0) {
|
if (accent_colors_.hash_ == 0) {
|
||||||
reload_accent_colors();
|
reload_accent_colors();
|
||||||
}
|
}
|
||||||
|
if (profile_accent_colors_.hash_ == 0) {
|
||||||
|
reload_profile_accent_colors();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -359,6 +482,38 @@ bool ThemeManager::on_update_accent_colors(FlatHashMap<AccentColorId, vector<int
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ThemeManager::on_update_profile_accent_colors(
|
||||||
|
FlatHashMap<AccentColorId, ProfileAccentColor, AccentColorIdHash> light_colors,
|
||||||
|
FlatHashMap<AccentColorId, ProfileAccentColor, AccentColorIdHash> dark_colors,
|
||||||
|
vector<AccentColorId> accent_color_ids) {
|
||||||
|
auto are_equal = [](const FlatHashMap<AccentColorId, ProfileAccentColor, AccentColorIdHash> &lhs,
|
||||||
|
const FlatHashMap<AccentColorId, ProfileAccentColor, AccentColorIdHash> &rhs) {
|
||||||
|
for (auto &lhs_it : lhs) {
|
||||||
|
auto rhs_it = rhs.find(lhs_it.first);
|
||||||
|
if (rhs_it == rhs.end() || rhs_it->second != lhs_it.second) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
if (accent_color_ids == profile_accent_colors_.accent_color_ids_ &&
|
||||||
|
are_equal(light_colors, profile_accent_colors_.light_colors_) &&
|
||||||
|
are_equal(dark_colors, profile_accent_colors_.dark_colors_)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (auto &it : light_colors) {
|
||||||
|
profile_accent_colors_.light_colors_[it.first] = std::move(it.second);
|
||||||
|
}
|
||||||
|
for (auto &it : dark_colors) {
|
||||||
|
profile_accent_colors_.dark_colors_[it.first] = std::move(it.second);
|
||||||
|
}
|
||||||
|
profile_accent_colors_.accent_color_ids_ = std::move(accent_color_ids);
|
||||||
|
|
||||||
|
save_profile_accent_colors();
|
||||||
|
send_update_profile_accent_colors();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
template <bool for_web_view>
|
template <bool for_web_view>
|
||||||
static auto get_color_json(int32 color);
|
static auto get_color_json(int32 color);
|
||||||
@ -427,6 +582,14 @@ int32 ThemeManager::get_accent_color_id_object(AccentColorId accent_color_id,
|
|||||||
return fallback_accent_color_id.get();
|
return fallback_accent_color_id.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32 ThemeManager::get_profile_accent_color_id_object(AccentColorId accent_color_id) const {
|
||||||
|
CHECK(accent_color_id.is_valid());
|
||||||
|
if (td_->auth_manager_->is_bot() || profile_accent_colors_.light_colors_.count(accent_color_id) != 0) {
|
||||||
|
return accent_color_id.get();
|
||||||
|
}
|
||||||
|
return 5; // blue
|
||||||
|
}
|
||||||
|
|
||||||
td_api::object_ptr<td_api::themeSettings> ThemeManager::get_theme_settings_object(const ThemeSettings &settings) const {
|
td_api::object_ptr<td_api::themeSettings> ThemeManager::get_theme_settings_object(const ThemeSettings &settings) const {
|
||||||
auto fill = [colors = settings.message_colors]() mutable -> td_api::object_ptr<td_api::BackgroundFill> {
|
auto fill = [colors = settings.message_colors]() mutable -> td_api::object_ptr<td_api::BackgroundFill> {
|
||||||
if (colors.size() >= 3) {
|
if (colors.size() >= 3) {
|
||||||
@ -492,6 +655,33 @@ td_api::object_ptr<td_api::updateAccentColors> ThemeManager::AccentColors::get_u
|
|||||||
return td_api::make_object<td_api::updateAccentColors>(std::move(colors), std::move(available_accent_color_ids));
|
return td_api::make_object<td_api::updateAccentColors>(std::move(colors), std::move(available_accent_color_ids));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
td_api::object_ptr<td_api::updateProfileAccentColors> ThemeManager::get_update_profile_accent_colors_object() const {
|
||||||
|
return profile_accent_colors_.get_update_profile_accent_colors_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
td_api::object_ptr<td_api::profileAccentColors> ThemeManager::ProfileAccentColor::get_profile_accent_colors_object()
|
||||||
|
const {
|
||||||
|
return td_api::make_object<td_api::profileAccentColors>(
|
||||||
|
vector<int32>(palette_colors_), vector<int32>(background_colors_), vector<int32>(story_colors_));
|
||||||
|
}
|
||||||
|
|
||||||
|
td_api::object_ptr<td_api::updateProfileAccentColors>
|
||||||
|
ThemeManager::ProfileAccentColors::get_update_profile_accent_colors_object() const {
|
||||||
|
vector<td_api::object_ptr<td_api::profileAccentColor>> colors;
|
||||||
|
for (auto &it : light_colors_) {
|
||||||
|
auto light_colors = it.second.get_profile_accent_colors_object();
|
||||||
|
auto dark_it = dark_colors_.find(it.first);
|
||||||
|
auto dark_colors = dark_it != dark_colors_.end() ? dark_it->second.get_profile_accent_colors_object()
|
||||||
|
: it.second.get_profile_accent_colors_object();
|
||||||
|
colors.push_back(td_api::make_object<td_api::profileAccentColor>(it.first.get(), std::move(light_colors),
|
||||||
|
std::move(dark_colors)));
|
||||||
|
}
|
||||||
|
auto available_accent_color_ids =
|
||||||
|
transform(accent_color_ids_, [](AccentColorId accent_color_id) { return accent_color_id.get(); });
|
||||||
|
return td_api::make_object<td_api::updateProfileAccentColors>(std::move(colors),
|
||||||
|
std::move(available_accent_color_ids));
|
||||||
|
}
|
||||||
|
|
||||||
string ThemeManager::get_chat_themes_database_key() {
|
string ThemeManager::get_chat_themes_database_key() {
|
||||||
return "chat_themes";
|
return "chat_themes";
|
||||||
}
|
}
|
||||||
@ -500,6 +690,10 @@ string ThemeManager::get_accent_colors_database_key() {
|
|||||||
return "accent_colors";
|
return "accent_colors";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string ThemeManager::get_profile_accent_colors_database_key() {
|
||||||
|
return "profile_accent_colors";
|
||||||
|
}
|
||||||
|
|
||||||
void ThemeManager::save_chat_themes() {
|
void ThemeManager::save_chat_themes() {
|
||||||
G()->td_db()->get_binlog_pmc()->set(get_chat_themes_database_key(), log_event_store(chat_themes_).as_slice().str());
|
G()->td_db()->get_binlog_pmc()->set(get_chat_themes_database_key(), log_event_store(chat_themes_).as_slice().str());
|
||||||
}
|
}
|
||||||
@ -509,6 +703,11 @@ void ThemeManager::save_accent_colors() {
|
|||||||
log_event_store(accent_colors_).as_slice().str());
|
log_event_store(accent_colors_).as_slice().str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThemeManager::save_profile_accent_colors() {
|
||||||
|
G()->td_db()->get_binlog_pmc()->set(get_profile_accent_colors_database_key(),
|
||||||
|
log_event_store(profile_accent_colors_).as_slice().str());
|
||||||
|
}
|
||||||
|
|
||||||
void ThemeManager::send_update_chat_themes() const {
|
void ThemeManager::send_update_chat_themes() const {
|
||||||
send_closure(G()->td(), &Td::send_update, get_update_chat_themes_object());
|
send_closure(G()->td(), &Td::send_update, get_update_chat_themes_object());
|
||||||
}
|
}
|
||||||
@ -517,6 +716,10 @@ void ThemeManager::send_update_accent_colors() const {
|
|||||||
send_closure(G()->td(), &Td::send_update, get_update_accent_colors_object());
|
send_closure(G()->td(), &Td::send_update, get_update_accent_colors_object());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThemeManager::send_update_profile_accent_colors() const {
|
||||||
|
send_closure(G()->td(), &Td::send_update, get_update_profile_accent_colors_object());
|
||||||
|
}
|
||||||
|
|
||||||
void ThemeManager::reload_chat_themes() {
|
void ThemeManager::reload_chat_themes() {
|
||||||
auto request_promise = PromiseCreator::lambda(
|
auto request_promise = PromiseCreator::lambda(
|
||||||
[actor_id = actor_id(this)](Result<telegram_api::object_ptr<telegram_api::account_Themes>> result) {
|
[actor_id = actor_id(this)](Result<telegram_api::object_ptr<telegram_api::account_Themes>> result) {
|
||||||
@ -643,6 +846,70 @@ void ThemeManager::on_get_accent_colors(Result<telegram_api::object_ptr<telegram
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThemeManager::reload_profile_accent_colors() {
|
||||||
|
auto request_promise = PromiseCreator::lambda(
|
||||||
|
[actor_id = actor_id(this)](Result<telegram_api::object_ptr<telegram_api::help_PeerColors>> result) {
|
||||||
|
send_closure(actor_id, &ThemeManager::on_get_profile_accent_colors, std::move(result));
|
||||||
|
});
|
||||||
|
|
||||||
|
td_->create_handler<GetPeerProfileColorsQuery>(std::move(request_promise))->send(profile_accent_colors_.hash_);
|
||||||
|
}
|
||||||
|
|
||||||
|
ThemeManager::ProfileAccentColor ThemeManager::get_profile_accent_color(
|
||||||
|
telegram_api::object_ptr<telegram_api::help_PeerColorSet> &&color_set) const {
|
||||||
|
CHECK(color_set != nullptr);
|
||||||
|
CHECK(color_set->get_id() == telegram_api::help_peerColorProfileSet::ID);
|
||||||
|
auto colors = telegram_api::move_object_as<telegram_api::help_peerColorProfileSet>(color_set);
|
||||||
|
ProfileAccentColor color;
|
||||||
|
color.palette_colors_ = std::move(colors->palette_colors_);
|
||||||
|
color.background_colors_ = std::move(colors->bg_colors_);
|
||||||
|
color.story_colors_ = std::move(colors->story_colors_);
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThemeManager::on_get_profile_accent_colors(
|
||||||
|
Result<telegram_api::object_ptr<telegram_api::help_PeerColors>> result) {
|
||||||
|
if (result.is_error()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto peer_colors_ptr = result.move_as_ok();
|
||||||
|
LOG(DEBUG) << "Receive " << to_string(peer_colors_ptr);
|
||||||
|
if (peer_colors_ptr->get_id() == telegram_api::help_peerColorsNotModified::ID) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CHECK(peer_colors_ptr->get_id() == telegram_api::help_peerColors::ID);
|
||||||
|
auto peer_colors = telegram_api::move_object_as<telegram_api::help_peerColors>(peer_colors_ptr);
|
||||||
|
FlatHashMap<AccentColorId, ProfileAccentColor, AccentColorIdHash> light_colors;
|
||||||
|
FlatHashMap<AccentColorId, ProfileAccentColor, AccentColorIdHash> dark_colors;
|
||||||
|
vector<AccentColorId> accent_color_ids;
|
||||||
|
for (auto &option : peer_colors->colors_) {
|
||||||
|
AccentColorId accent_color_id(option->color_id_);
|
||||||
|
if (option->colors_ == nullptr || option->colors_->get_id() != telegram_api::help_peerColorProfileSet::ID ||
|
||||||
|
option->dark_colors_ == nullptr ||
|
||||||
|
option->dark_colors_->get_id() != telegram_api::help_peerColorProfileSet::ID || !accent_color_id.is_valid() ||
|
||||||
|
td::contains(accent_color_ids, accent_color_id)) {
|
||||||
|
LOG(ERROR) << "Receive " << to_string(option);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!option->hidden_) {
|
||||||
|
accent_color_ids.push_back(accent_color_id);
|
||||||
|
}
|
||||||
|
light_colors[accent_color_id] = get_profile_accent_color(std::move(option->colors_));
|
||||||
|
dark_colors[accent_color_id] = get_profile_accent_color(std::move(option->dark_colors_));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_changed = false;
|
||||||
|
if (profile_accent_colors_.hash_ != peer_colors->hash_) {
|
||||||
|
profile_accent_colors_.hash_ = peer_colors->hash_;
|
||||||
|
is_changed = true;
|
||||||
|
}
|
||||||
|
if (!on_update_profile_accent_colors(std::move(light_colors), std::move(dark_colors), std::move(accent_color_ids)) &&
|
||||||
|
is_changed) {
|
||||||
|
save_profile_accent_colors();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ThemeManager::BaseTheme ThemeManager::get_base_theme(
|
ThemeManager::BaseTheme ThemeManager::get_base_theme(
|
||||||
const telegram_api::object_ptr<telegram_api::BaseTheme> &base_theme) {
|
const telegram_api::object_ptr<telegram_api::BaseTheme> &base_theme) {
|
||||||
CHECK(base_theme != nullptr);
|
CHECK(base_theme != nullptr);
|
||||||
@ -689,6 +956,9 @@ void ThemeManager::get_current_state(vector<td_api::object_ptr<td_api::Update>>
|
|||||||
if (!accent_colors_.accent_color_ids_.empty()) {
|
if (!accent_colors_.accent_color_ids_.empty()) {
|
||||||
updates.push_back(get_update_accent_colors_object());
|
updates.push_back(get_update_accent_colors_object());
|
||||||
}
|
}
|
||||||
|
if (!profile_accent_colors_.accent_color_ids_.empty()) {
|
||||||
|
updates.push_back(get_update_profile_accent_colors_object());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -34,12 +34,16 @@ class ThemeManager final : public Actor {
|
|||||||
|
|
||||||
void reload_accent_colors();
|
void reload_accent_colors();
|
||||||
|
|
||||||
|
void reload_profile_accent_colors();
|
||||||
|
|
||||||
static string get_theme_parameters_json_string(const td_api::object_ptr<td_api::themeParameters> &theme,
|
static string get_theme_parameters_json_string(const td_api::object_ptr<td_api::themeParameters> &theme,
|
||||||
bool for_web_view);
|
bool for_web_view);
|
||||||
|
|
||||||
int32 get_accent_color_id_object(AccentColorId accent_color_id,
|
int32 get_accent_color_id_object(AccentColorId accent_color_id,
|
||||||
AccentColorId fallback_accent_color_id = AccentColorId()) const;
|
AccentColorId fallback_accent_color_id = AccentColorId()) const;
|
||||||
|
|
||||||
|
int32 get_profile_accent_color_id_object(AccentColorId accent_color_id) const;
|
||||||
|
|
||||||
void get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const;
|
void get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -104,6 +108,39 @@ class ThemeManager final : public Actor {
|
|||||||
void parse(ParserT &parser);
|
void parse(ParserT &parser);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ProfileAccentColor {
|
||||||
|
vector<int32> palette_colors_;
|
||||||
|
vector<int32> background_colors_;
|
||||||
|
vector<int32> story_colors_;
|
||||||
|
|
||||||
|
td_api::object_ptr<td_api::profileAccentColors> get_profile_accent_colors_object() const;
|
||||||
|
|
||||||
|
template <class StorerT>
|
||||||
|
void store(StorerT &storer) const;
|
||||||
|
|
||||||
|
template <class ParserT>
|
||||||
|
void parse(ParserT &parser);
|
||||||
|
};
|
||||||
|
|
||||||
|
friend bool operator==(const ProfileAccentColor &lhs, const ProfileAccentColor &rhs);
|
||||||
|
|
||||||
|
friend bool operator!=(const ProfileAccentColor &lhs, const ProfileAccentColor &rhs);
|
||||||
|
|
||||||
|
struct ProfileAccentColors {
|
||||||
|
FlatHashMap<AccentColorId, ProfileAccentColor, AccentColorIdHash> light_colors_;
|
||||||
|
FlatHashMap<AccentColorId, ProfileAccentColor, AccentColorIdHash> dark_colors_;
|
||||||
|
vector<AccentColorId> accent_color_ids_;
|
||||||
|
int32 hash_ = 0;
|
||||||
|
|
||||||
|
td_api::object_ptr<td_api::updateProfileAccentColors> get_update_profile_accent_colors_object() const;
|
||||||
|
|
||||||
|
template <class StorerT>
|
||||||
|
void store(StorerT &storer) const;
|
||||||
|
|
||||||
|
template <class ParserT>
|
||||||
|
void parse(ParserT &parser);
|
||||||
|
};
|
||||||
|
|
||||||
void start_up() final;
|
void start_up() final;
|
||||||
|
|
||||||
void tear_down() final;
|
void tear_down() final;
|
||||||
@ -112,6 +149,8 @@ class ThemeManager final : public Actor {
|
|||||||
|
|
||||||
void load_accent_colors();
|
void load_accent_colors();
|
||||||
|
|
||||||
|
void load_profile_accent_colors();
|
||||||
|
|
||||||
static bool is_dark_base_theme(BaseTheme base_theme);
|
static bool is_dark_base_theme(BaseTheme base_theme);
|
||||||
|
|
||||||
void on_get_chat_themes(Result<telegram_api::object_ptr<telegram_api::account_Themes>> result);
|
void on_get_chat_themes(Result<telegram_api::object_ptr<telegram_api::account_Themes>> result);
|
||||||
@ -122,6 +161,15 @@ class ThemeManager final : public Actor {
|
|||||||
|
|
||||||
void on_get_accent_colors(Result<telegram_api::object_ptr<telegram_api::help_PeerColors>> result);
|
void on_get_accent_colors(Result<telegram_api::object_ptr<telegram_api::help_PeerColors>> result);
|
||||||
|
|
||||||
|
bool on_update_profile_accent_colors(FlatHashMap<AccentColorId, ProfileAccentColor, AccentColorIdHash> light_colors,
|
||||||
|
FlatHashMap<AccentColorId, ProfileAccentColor, AccentColorIdHash> dark_colors,
|
||||||
|
vector<AccentColorId> accent_color_ids);
|
||||||
|
|
||||||
|
ProfileAccentColor get_profile_accent_color(
|
||||||
|
telegram_api::object_ptr<telegram_api::help_PeerColorSet> &&color_set) const;
|
||||||
|
|
||||||
|
void on_get_profile_accent_colors(Result<telegram_api::object_ptr<telegram_api::help_PeerColors>> result);
|
||||||
|
|
||||||
td_api::object_ptr<td_api::themeSettings> get_theme_settings_object(const ThemeSettings &settings) const;
|
td_api::object_ptr<td_api::themeSettings> get_theme_settings_object(const ThemeSettings &settings) const;
|
||||||
|
|
||||||
td_api::object_ptr<td_api::chatTheme> get_chat_theme_object(const ChatTheme &theme) const;
|
td_api::object_ptr<td_api::chatTheme> get_chat_theme_object(const ChatTheme &theme) const;
|
||||||
@ -132,10 +180,14 @@ class ThemeManager final : public Actor {
|
|||||||
|
|
||||||
string get_accent_colors_database_key();
|
string get_accent_colors_database_key();
|
||||||
|
|
||||||
|
string get_profile_accent_colors_database_key();
|
||||||
|
|
||||||
void save_chat_themes();
|
void save_chat_themes();
|
||||||
|
|
||||||
void save_accent_colors();
|
void save_accent_colors();
|
||||||
|
|
||||||
|
void save_profile_accent_colors();
|
||||||
|
|
||||||
void send_update_chat_themes() const;
|
void send_update_chat_themes() const;
|
||||||
|
|
||||||
static BaseTheme get_base_theme(const telegram_api::object_ptr<telegram_api::BaseTheme> &base_theme);
|
static BaseTheme get_base_theme(const telegram_api::object_ptr<telegram_api::BaseTheme> &base_theme);
|
||||||
@ -144,12 +196,18 @@ class ThemeManager final : public Actor {
|
|||||||
|
|
||||||
td_api::object_ptr<td_api::updateAccentColors> get_update_accent_colors_object() const;
|
td_api::object_ptr<td_api::updateAccentColors> get_update_accent_colors_object() const;
|
||||||
|
|
||||||
|
td_api::object_ptr<td_api::updateProfileAccentColors> get_update_profile_accent_colors_object() const;
|
||||||
|
|
||||||
void send_update_accent_colors() const;
|
void send_update_accent_colors() const;
|
||||||
|
|
||||||
|
void send_update_profile_accent_colors() const;
|
||||||
|
|
||||||
ChatThemes chat_themes_;
|
ChatThemes chat_themes_;
|
||||||
|
|
||||||
AccentColors accent_colors_;
|
AccentColors accent_colors_;
|
||||||
|
|
||||||
|
ProfileAccentColors profile_accent_colors_;
|
||||||
|
|
||||||
Td *td_;
|
Td *td_;
|
||||||
ActorShared<> parent_;
|
ActorShared<> parent_;
|
||||||
};
|
};
|
||||||
|
@ -2263,6 +2263,7 @@ void UpdatesManager::try_reload_data() {
|
|||||||
td_->story_manager_->reload_all_read_stories();
|
td_->story_manager_->reload_all_read_stories();
|
||||||
td_->theme_manager_->reload_accent_colors();
|
td_->theme_manager_->reload_accent_colors();
|
||||||
td_->theme_manager_->reload_chat_themes();
|
td_->theme_manager_->reload_chat_themes();
|
||||||
|
td_->theme_manager_->reload_profile_accent_colors();
|
||||||
|
|
||||||
schedule_data_reload();
|
schedule_data_reload();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user