diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_check.png b/Telegram/Resources/icons/dialogs/dialogs_verified_check.png index 27b8ca7e9..dc9c4b0da 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_check.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_check.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_check@2x.png b/Telegram/Resources/icons/dialogs/dialogs_verified_check@2x.png index e360526c7..677770111 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_check@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_check@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_check@3x.png b/Telegram/Resources/icons/dialogs/dialogs_verified_check@3x.png index 461255463..ceffe4197 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_check@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_check@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_star.png b/Telegram/Resources/icons/dialogs/dialogs_verified_star.png index e5a02de92..24adac8ca 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_star.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_star.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_star@2x.png b/Telegram/Resources/icons/dialogs/dialogs_verified_star@2x.png index 813641ebb..98d33bd22 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_star@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_star@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_star@3x.png b/Telegram/Resources/icons/dialogs/dialogs_verified_star@3x.png index 699f94d8b..55734f48e 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_star@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_star@3x.png differ diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 6bc6116e3..686d9961e 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1641,28 +1641,24 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_bot_verify_bot_submit" = "Verify Bot"; "lng_bot_verify_bot_sent" = "{name} has been notified and will receive your verification mark and description upon accepting."; "lng_bot_verify_bot_remove" = "This bot is already verified by you. Do you want to remove verification?"; -"lng_bot_verify_bot_telegram" = "This bot is verified as official by the representatives of Telegram."; "lng_bot_verify_user_title" = "Verify User"; "lng_bot_verify_user_text" = "Do you want to verify {name} with your verification mark and description?"; "lng_bot_verify_user_about" = "You can customize your description for each account."; "lng_bot_verify_user_submit" = "Verify User"; "lng_bot_verify_user_sent" = "{name} has been notified and will receive your verification mark and description upon accepting."; "lng_bot_verify_user_remove" = "This account is already verified by you. Do you want to remove verification?"; -"lng_bot_verify_user_telegram" = "This account is verified as official by the representatives of Telegram."; "lng_bot_verify_channel_title" = "Verify Channel"; "lng_bot_verify_channel_text" = "Do you want to verify {name} with your verification mark and description?"; "lng_bot_verify_channel_about" = "You can customize your description for each channel."; "lng_bot_verify_channel_submit" = "Verify Channel"; "lng_bot_verify_channel_sent" = "{name} has been notified and will receive your verification mark and description upon accepting."; "lng_bot_verify_channel_remove" = "This channel is already verified by you. Do you want to remove verification?"; -"lng_bot_verify_channel_telegram" = "This channel is verified as official by the representatives of Telegram."; "lng_bot_verify_group_title" = "Verify Group"; "lng_bot_verify_group_text" = "Do you want to verify {name} with your verification mark and description?"; "lng_bot_verify_group_about" = "You can customize your description for each group."; "lng_bot_verify_group_submit" = "Verify Group"; "lng_bot_verify_group_sent" = "{name} has been notified and will receive your verification mark and description upon accepting."; "lng_bot_verify_group_remove" = "This group is already verified by you. Do you want to remove verification?"; -"lng_bot_verify_group_telegram" = "This community is verified as official by the representatives of Telegram."; "lng_bot_verify_description_label" = "Description"; "lng_bot_verify_remove_title" = "Remove verification"; "lng_bot_verify_remove_submit" = "Remove"; diff --git a/Telegram/Resources/qrc/telegram/telegram.qrc b/Telegram/Resources/qrc/telegram/telegram.qrc index 232d074a4..a5459ef75 100644 --- a/Telegram/Resources/qrc/telegram/telegram.qrc +++ b/Telegram/Resources/qrc/telegram/telegram.qrc @@ -34,8 +34,6 @@ ../../art/topic_icons/general.svg ../../icons/info/edit/links_subscription.svg ../../icons/plane_white.svg - ../../art/verified_bg.webp - ../../art/verified_fg.webp ../../icons/calls/hands.lottie diff --git a/Telegram/SourceFiles/api/api_chat_invite.cpp b/Telegram/SourceFiles/api/api_chat_invite.cpp index 77b9872bf..18cab335e 100644 --- a/Telegram/SourceFiles/api/api_chat_invite.cpp +++ b/Telegram/SourceFiles/api/api_chat_invite.cpp @@ -570,7 +570,9 @@ ConfirmInviteBox::ChatInvite ConfirmInviteBox::Parse( [[nodiscard]] Info::Profile::BadgeType ConfirmInviteBox::BadgeForInvite( const ChatInvite &invite) { using Type = Info::Profile::BadgeType; - return invite.isScam + return invite.isVerified + ? Type::Verified + : invite.isScam ? Type::Scam : invite.isFake ? Type::Fake diff --git a/Telegram/SourceFiles/boxes/peer_list_box.cpp b/Telegram/SourceFiles/boxes/peer_list_box.cpp index 72d257d99..c72c392a0 100644 --- a/Telegram/SourceFiles/boxes/peer_list_box.cpp +++ b/Telegram/SourceFiles/boxes/peer_list_box.cpp @@ -799,6 +799,9 @@ int PeerListRow::paintNameIconGetWidth( outerWidth, { .peer = peer(), + .verified = &(selected + ? st::dialogsVerifiedIconOver + : st::dialogsVerifiedIcon), .premium = &(selected ? st::dialogsPremiumIcon.over : st::dialogsPremiumIcon.icon), diff --git a/Telegram/SourceFiles/boxes/peers/verify_peers_box.cpp b/Telegram/SourceFiles/boxes/peers/verify_peers_box.cpp index df4c4d09a..b368f5dc3 100644 --- a/Telegram/SourceFiles/boxes/peers/verify_peers_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/verify_peers_box.cpp @@ -90,7 +90,7 @@ Main::Session &Controller::session() const { void Controller::rowClicked(gsl::not_null row) { const auto peer = row->peer(); - const auto details = peer->verifyDetails(); + const auto details = peer->botVerifyDetails(); const auto already = details && (details->botId == peerToUser(_bot->id)); if (already) { confirmRemove(peer); @@ -141,7 +141,7 @@ void Controller::confirmAdd(not_null peer) { Ui::Text::Bold(peer->shortName()), Ui::Text::WithEntities), .duration = kSetupVerificationToastDuration, - }); + }); } else { state->sent = false; show->showToast(error); @@ -253,7 +253,7 @@ object_ptr MakeVerifyPeersBox( return Box(std::move(controller), std::move(init)); } -VerifyPhrases PeerVerifyPhrases(not_null peer) { +BotVerifyPhrases PeerVerifyPhrases(not_null peer) { if (const auto user = peer->asUser()) { if (user->isBot()) { return { @@ -263,7 +263,6 @@ VerifyPhrases PeerVerifyPhrases(not_null peer) { .submit = tr::lng_bot_verify_bot_submit, .sent = tr::lng_bot_verify_bot_sent, .remove = tr::lng_bot_verify_bot_remove, - .telegram = tr::lng_bot_verify_bot_telegram, }; } else { return { @@ -273,7 +272,6 @@ VerifyPhrases PeerVerifyPhrases(not_null peer) { .submit = tr::lng_bot_verify_user_submit, .sent = tr::lng_bot_verify_user_sent, .remove = tr::lng_bot_verify_user_remove, - .telegram = tr::lng_bot_verify_user_telegram, }; } } else if (peer->isBroadcast()) { @@ -284,7 +282,6 @@ VerifyPhrases PeerVerifyPhrases(not_null peer) { .submit = tr::lng_bot_verify_channel_submit, .sent = tr::lng_bot_verify_channel_sent, .remove = tr::lng_bot_verify_channel_remove, - .telegram = tr::lng_bot_verify_channel_telegram, }; } return { @@ -294,6 +291,5 @@ VerifyPhrases PeerVerifyPhrases(not_null peer) { .submit = tr::lng_bot_verify_group_submit, .sent = tr::lng_bot_verify_group_sent, .remove = tr::lng_bot_verify_group_remove, - .telegram = tr::lng_bot_verify_group_telegram, }; } diff --git a/Telegram/SourceFiles/boxes/peers/verify_peers_box.h b/Telegram/SourceFiles/boxes/peers/verify_peers_box.h index 32897cb86..6383255ee 100644 --- a/Telegram/SourceFiles/boxes/peers/verify_peers_box.h +++ b/Telegram/SourceFiles/boxes/peers/verify_peers_box.h @@ -25,13 +25,12 @@ class SessionController; not_null window, not_null bot); -struct VerifyPhrases { +struct BotVerifyPhrases { tr::phrase<> title; tr::phrase text; tr::phrase<> about; tr::phrase<> submit; tr::phrase sent; tr::phrase<> remove; - tr::phrase<> telegram; }; -[[nodiscard]] VerifyPhrases PeerVerifyPhrases(not_null peer); +[[nodiscard]] BotVerifyPhrases PeerVerifyPhrases(not_null peer); diff --git a/Telegram/SourceFiles/data/data_channel.cpp b/Telegram/SourceFiles/data/data_channel.cpp index fb44f769a..436272664 100644 --- a/Telegram/SourceFiles/data/data_channel.cpp +++ b/Telegram/SourceFiles/data/data_channel.cpp @@ -714,28 +714,30 @@ bool ChannelData::canRestrictParticipant( return adminRights() & AdminRight::BanUsers; } -void ChannelData::setVerifyDetails(Ui::VerifyDetails details) { +void ChannelData::setBotVerifyDetails(Ui::BotVerifyDetails details) { if (!details) { - if (_verifyDetails) { - _verifyDetails = nullptr; + if (_botVerifyDetails) { + _botVerifyDetails = nullptr; session().changes().peerUpdated(this, UpdateFlag::VerifyInfo); } - } else if (!_verifyDetails) { - _verifyDetails = std::make_unique(details); + } else if (!_botVerifyDetails) { + _botVerifyDetails = std::make_unique(details); session().changes().peerUpdated(this, UpdateFlag::VerifyInfo); - } else if (*_verifyDetails != details) { - *_verifyDetails = details; + } else if (*_botVerifyDetails != details) { + *_botVerifyDetails = details; session().changes().peerUpdated(this, UpdateFlag::VerifyInfo); } } -void ChannelData::setVerifyDetailsIcon(DocumentId iconId) { +void ChannelData::setBotVerifyDetailsIcon(DocumentId iconId) { if (!iconId) { - setVerifyDetails({}); + setBotVerifyDetails({}); } else { - auto info = _verifyDetails ? *_verifyDetails : Ui::VerifyDetails(); - info.iconBgId = iconId; - setVerifyDetails(info); + auto info = _botVerifyDetails + ? *_botVerifyDetails + : Ui::BotVerifyDetails(); + info.iconId = iconId; + setBotVerifyDetails(info); } } @@ -1277,7 +1279,8 @@ void ApplyChannelUpdate( .paidEnabled = update.is_paid_reactions_available(), }); } - channel->setVerifyDetails(ParseVerifyDetails(update.vbot_verification())); + channel->setBotVerifyDetails( + ParseBotVerifyDetails(update.vbot_verification())); channel->owner().stories().apply(channel, update.vstories()); channel->fullUpdated(); channel->setPendingRequestsCount( diff --git a/Telegram/SourceFiles/data/data_channel.h b/Telegram/SourceFiles/data/data_channel.h index 8604360d2..4c40c61db 100644 --- a/Telegram/SourceFiles/data/data_channel.h +++ b/Telegram/SourceFiles/data/data_channel.h @@ -376,10 +376,10 @@ public: [[nodiscard]] bool canRestrictParticipant( not_null participant) const; - void setVerifyDetails(Ui::VerifyDetails details); - void setVerifyDetailsIcon(DocumentId iconId); - [[nodiscard]] Ui::VerifyDetails *verifyDetails() const { - return _verifyDetails.get(); + void setBotVerifyDetails(Ui::BotVerifyDetails details); + void setBotVerifyDetailsIcon(DocumentId iconId); + [[nodiscard]] Ui::BotVerifyDetails *botVerifyDetails() const { + return _botVerifyDetails.get(); } void setInviteLink(const QString &newInviteLink); @@ -552,7 +552,7 @@ private: std::unique_ptr _call; PeerId _callDefaultJoinAs = 0; - std::unique_ptr _verifyDetails; + std::unique_ptr _botVerifyDetails; }; diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index 00827d6ef..901d7b7c8 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -1247,22 +1247,15 @@ void PeerData::setStoriesHidden(bool hidden) { } } -Ui::VerifyDetails *PeerData::verifyDetails() const { +Ui::BotVerifyDetails *PeerData::botVerifyDetails() const { if (const auto user = asUser()) { - return user->verifyDetails(); + return user->botVerifyDetails(); } else if (const auto channel = asChannel()) { - return channel->verifyDetails(); + return channel->botVerifyDetails(); } return nullptr; } -bool PeerData::verifiedByTelegram() const { - if (const auto details = verifyDetails()) { - return (details->iconBgId == owner().verifiedByTelegram().iconBgId); - } - return false; -} - Data::Forum *PeerData::forum() const { if (const auto channel = asChannel()) { return channel->forum(); diff --git a/Telegram/SourceFiles/data/data_peer.h b/Telegram/SourceFiles/data/data_peer.h index 7eff528f0..8c3bf4b2a 100644 --- a/Telegram/SourceFiles/data/data_peer.h +++ b/Telegram/SourceFiles/data/data_peer.h @@ -23,7 +23,7 @@ enum class ChatRestriction; namespace Ui { class EmptyUserpic; -struct VerifyDetails; +struct BotVerifyDetails; } // namespace Ui namespace Main { @@ -234,8 +234,7 @@ public: [[nodiscard]] bool hasStoriesHidden() const; void setStoriesHidden(bool hidden); - [[nodiscard]] Ui::VerifyDetails *verifyDetails() const; - [[nodiscard]] bool verifiedByTelegram() const; + [[nodiscard]] Ui::BotVerifyDetails *botVerifyDetails() const; [[nodiscard]] bool isNotificationsUser() const { return (id == peerFromUser(333000)) diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 358ca95e5..4927e271d 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -30,7 +30,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/media/history_view_media.h" #include "history/view/history_view_element.h" #include "inline_bots/inline_bot_layout_item.h" -#include "storage/localimageloader.h" #include "storage/storage_account.h" #include "storage/storage_encrypted_file.h" #include "media/player/media_player_instance.h" // instance()->play() @@ -81,11 +80,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/random.h" #include "spellcheck/spellcheck_highlight_syntax.h" -#include "ui/chat/attach/attach_prepare.h" -#include "ui/unread_badge.h" -#include "styles/style_dialogs.h" -#include - namespace Data { namespace { @@ -336,26 +330,6 @@ Session::Session(not_null session) }, _lifetime); } - -Ui::VerifyDetails Session::verifiedByTelegram() { - if (!_verifiedByTelegramIconBgId) { - const auto bg = ChatHelpers::GenerateLocalSticker( - _session, - u":/gui/art/verified_bg.webp"_q); - bg->overrideEmojiUsesTextColor(true); - const auto fg = ChatHelpers::GenerateLocalSticker( - _session, - u":/gui/art/verified_fg.webp"_q); - fg->overrideEmojiUsesTextColor(true); - _verifiedByTelegramIconBgId = bg->id; - _verifiedByTelegramIconFgId = fg->id; - } - return { - .iconBgId = _verifiedByTelegramIconBgId, - .iconFgId = _verifiedByTelegramIconFgId, - }; -} - void Session::subscribeForTopicRepliesLists() { repliesReadTillUpdates( ) | rpl::start_with_next([=](const RepliesReadTillUpdate &update) { @@ -596,11 +570,8 @@ not_null Session::processUser(const MTPUser &data) { | (data.is_stories_hidden() ? Flag::StoriesHidden : Flag()) : Flag()); result->setFlags((result->flags() & ~flagsMask) | flagsSet); - if (data.is_verified()) { - result->setVerifyDetails(verifiedByTelegram()); - } else { - result->setVerifyDetailsIcon(data.vbot_verification_icon().value_or_empty()); - } + result->setBotVerifyDetailsIcon( + data.vbot_verification_icon().value_or_empty()); if (minimal) { if (result->input.type() == mtpc_inputPeerEmpty) { result->input = MTP_inputPeerUser( @@ -1016,12 +987,8 @@ not_null Session::processChat(const MTPChat &data) { ? Flag::StoriesHidden : Flag()); channel->setFlags((channel->flags() & ~flagsMask) | flagsSet); - if (data.is_verified()) { - channel->setVerifyDetails(verifiedByTelegram()); - } else { - channel->setVerifyDetailsIcon( - data.vbot_verification_icon().value_or_empty()); - } + channel->setBotVerifyDetailsIcon( + data.vbot_verification_icon().value_or_empty()); if (!minimal && storiesState) { result->setStoriesState(!storiesState->maxId ? UserData::StoriesState::None diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index f0aaed6a4..eba5d0e8f 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -177,8 +177,6 @@ public: return ++_nonHistoryEntryId; } - [[nodiscard]] Ui::VerifyDetails verifiedByTelegram(); - void subscribeForTopicRepliesLists(); void clear(); @@ -1142,9 +1140,6 @@ private: const std::unique_ptr _businessInfo; std::unique_ptr _shortcutMessages; - DocumentId _verifiedByTelegramIconBgId = 0; - DocumentId _verifiedByTelegramIconFgId = 0; - MsgId _nonHistoryEntryId = ShortcutMaxMsgId; rpl::lifetime _lifetime; diff --git a/Telegram/SourceFiles/data/data_user.cpp b/Telegram/SourceFiles/data/data_user.cpp index 9ba6e5994..7b53de283 100644 --- a/Telegram/SourceFiles/data/data_user.cpp +++ b/Telegram/SourceFiles/data/data_user.cpp @@ -556,28 +556,30 @@ bool UserData::isUsernameEditable(QString username) const { return _username.isEditable(username); } -void UserData::setVerifyDetails(Ui::VerifyDetails details) { +void UserData::setBotVerifyDetails(Ui::BotVerifyDetails details) { if (!details) { - if (_verifyDetails) { - _verifyDetails = nullptr; + if (_botVerifyDetails) { + _botVerifyDetails = nullptr; session().changes().peerUpdated(this, UpdateFlag::VerifyInfo); } - } else if (!_verifyDetails) { - _verifyDetails = std::make_unique(details); + } else if (!_botVerifyDetails) { + _botVerifyDetails = std::make_unique(details); session().changes().peerUpdated(this, UpdateFlag::VerifyInfo); - } else if (*_verifyDetails != details) { - *_verifyDetails = details; + } else if (*_botVerifyDetails != details) { + *_botVerifyDetails = details; session().changes().peerUpdated(this, UpdateFlag::VerifyInfo); } } -void UserData::setVerifyDetailsIcon(DocumentId iconId) { +void UserData::setBotVerifyDetailsIcon(DocumentId iconId) { if (!iconId) { - setVerifyDetails({}); + setBotVerifyDetails({}); } else { - auto info = _verifyDetails ? *_verifyDetails : Ui::VerifyDetails(); - info.iconBgId = iconId; - setVerifyDetails(info); + auto info = _botVerifyDetails + ? *_botVerifyDetails + : Ui::BotVerifyDetails(); + info.iconId = iconId; + setBotVerifyDetails(info); } } @@ -792,7 +794,8 @@ void ApplyUserUpdate(not_null user, const MTPDuserFull &update) { user->owner().businessInfo().applyGreetingSettings( FromMTP(&user->owner(), update.vbusiness_greeting_message())); } - user->setVerifyDetails(ParseVerifyDetails(update.vbot_verification())); + user->setBotVerifyDetails( + ParseBotVerifyDetails(update.vbot_verification())); user->owner().stories().apply(user, update.vstories()); @@ -814,7 +817,7 @@ StarRefProgram ParseStarRefProgram(const MTPStarRefProgram *program) { return result; } -Ui::VerifyDetails ParseVerifyDetails(const MTPBotVerification *info) { +Ui::BotVerifyDetails ParseBotVerifyDetails(const MTPBotVerification *info) { if (!info) { return {}; } @@ -823,7 +826,7 @@ Ui::VerifyDetails ParseVerifyDetails(const MTPBotVerification *info) { const auto flags = TextParseLinks; return { .botId = UserId(data.vbot_id().v), - .iconBgId = DocumentId(data.vicon().v), + .iconId = DocumentId(data.vicon().v), .description = TextUtilities::ParseEntities(description, flags), }; } diff --git a/Telegram/SourceFiles/data/data_user.h b/Telegram/SourceFiles/data/data_user.h index 1503a4fe6..c7a200e33 100644 --- a/Telegram/SourceFiles/data/data_user.h +++ b/Telegram/SourceFiles/data/data_user.h @@ -193,10 +193,10 @@ public: [[nodiscard]] const std::vector &usernames() const; [[nodiscard]] bool isUsernameEditable(QString username) const; - void setVerifyDetails(Ui::VerifyDetails details); - void setVerifyDetailsIcon(DocumentId iconId); - [[nodiscard]] Ui::VerifyDetails *verifyDetails() const { - return _verifyDetails.get(); + void setBotVerifyDetails(Ui::BotVerifyDetails details); + void setBotVerifyDetailsIcon(DocumentId iconId); + [[nodiscard]] Ui::BotVerifyDetails *botVerifyDetails() const { + return _botVerifyDetails.get(); } enum class ContactStatus : char { @@ -277,7 +277,7 @@ private: std::vector _unavailableReasons; QString _phone; QString _privateForwardName; - std::unique_ptr _verifyDetails; + std::unique_ptr _botVerifyDetails; ChannelId _personalChannelId = 0; MsgId _personalChannelMessageId = 0; @@ -295,7 +295,7 @@ void ApplyUserUpdate(not_null user, const MTPDuserFull &update); [[nodiscard]] StarRefProgram ParseStarRefProgram( const MTPStarRefProgram *program); -[[nodiscard]] Ui::VerifyDetails ParseVerifyDetails( +[[nodiscard]] Ui::BotVerifyDetails ParseBotVerifyDetails( const MTPBotVerification *info); } // namespace Data diff --git a/Telegram/SourceFiles/dialogs/dialogs.style b/Telegram/SourceFiles/dialogs/dialogs.style index 904c180c0..f2ff4723c 100644 --- a/Telegram/SourceFiles/dialogs/dialogs.style +++ b/Telegram/SourceFiles/dialogs/dialogs.style @@ -32,8 +32,7 @@ ThreeStateIcon { } VerifiedBadge { - bg: color; - fg: color; + color: color; height: pixels; } @@ -411,18 +410,27 @@ dialogsLockIcon: ThreeStateIcon { dialogsVerifiedColors: VerifiedBadge { height: 20px; - bg: dialogsVerifiedIconBg; - fg: dialogsVerifiedIconFg; + color: dialogsVerifiedIconBg; } dialogsVerifiedColorsOver: VerifiedBadge(dialogsVerifiedColors) { - bg: dialogsVerifiedIconBgOver; - fg: dialogsVerifiedIconFgOver; + color: dialogsVerifiedIconBgOver; } dialogsVerifiedColorsActive: VerifiedBadge(dialogsVerifiedColors) { - bg: dialogsVerifiedIconBgActive; - fg: dialogsVerifiedIconFgActive; + color: dialogsVerifiedIconBgActive; } +dialogsVerifiedIcon: icon { + { "dialogs/dialogs_verified_star", dialogsVerifiedIconBg }, + { "dialogs/dialogs_verified_check", dialogsVerifiedIconFg }, +}; +dialogsVerifiedIconOver: icon { + { "dialogs/dialogs_verified_star", dialogsVerifiedIconBgOver }, + { "dialogs/dialogs_verified_check", dialogsVerifiedIconFgOver }, +}; +dialogsVerifiedIconActive: icon { + { "dialogs/dialogs_verified_star", dialogsVerifiedIconBgActive }, + { "dialogs/dialogs_verified_check", dialogsVerifiedIconFgActive }, +}; dialogsPremiumIcon: ThreeStateIcon { icon: icon {{ "dialogs/dialogs_premium", dialogsVerifiedIconBg }}; over: icon {{ "dialogs/dialogs_premium", dialogsVerifiedIconBgOver }}; diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index a77d0651f..cb6bd28a1 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -1385,10 +1385,10 @@ void InnerWidget::paintPeerSearchResult( Ui::NameTextOptions()); } - if (const auto details = peer->verifyDetails()) { - if (!result->badge.ready(details)) { + if (const auto info = peer->botVerifyDetails()) { + if (!result->badge.ready(info)) { result->badge.set( - details, + info, peer->owner().customEmojiManager().factory(), [=] { updateSearchResult(peer); }); } @@ -1409,6 +1409,11 @@ void InnerWidget::paintPeerSearchResult( context.width, { .peer = peer, + .verified = (context.active + ? &st::dialogsVerifiedIconActive + : context.selected + ? &st::dialogsVerifiedIconOver + : &st::dialogsVerifiedIcon), .premium = &ThreeStateIcon( st::dialogsPremiumIcon, context.active, diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp index 05d4b417d..e5b80ef19 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp @@ -449,10 +449,10 @@ void PaintRow( ? tr::lng_badge_psa_default(tr::now) : custom; PaintRowTopRight(p, text, rectForName, context); - } else if (const auto details = from ? from->verifyDetails() : nullptr) { - if (!rowBadge.ready(details)) { + } else if (const auto info = from ? from->botVerifyDetails() : nullptr) { + if (!rowBadge.ready(info)) { rowBadge.set( - details, + info, from->owner().customEmojiManager().factory(), customEmojiRepaint); } @@ -739,6 +739,11 @@ void PaintRow( context.width, { .peer = from, + .verified = (context.active + ? &st::dialogsVerifiedIconActive + : context.selected + ? &st::dialogsVerifiedIconOver + : &st::dialogsVerifiedIcon), .premium = &ThreeStateIcon( st::dialogsPremiumIcon, context.active, diff --git a/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp b/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp index 4d89cd300..cbb94bbce 100644 --- a/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp @@ -566,10 +566,10 @@ void TopBarWidget::paintTopBar(Painter &p) { TopBarNameText(namePeer, _activeChat.section), Ui::NameTextOptions()); } - if (const auto details = namePeer->verifyDetails()) { - if (!_titleBadge.ready(details)) { + if (const auto info = namePeer->botVerifyDetails()) { + if (!_titleBadge.ready(info)) { _titleBadge.set( - details, + info, namePeer->owner().customEmojiManager().factory(), [=] { update(); }); } @@ -589,6 +589,7 @@ void TopBarWidget::paintTopBar(Painter &p) { width(), { .peer = namePeer, + .verified = &st::dialogsVerifiedIcon, .premium = &st::dialogsPremiumIcon.icon, .scam = &st::attentionButtonFg, .premiumFg = &st::dialogsVerifiedIconBg, diff --git a/Telegram/SourceFiles/info/info.style b/Telegram/SourceFiles/info/info.style index ffcd02f46..c0b63fe9e 100644 --- a/Telegram/SourceFiles/info/info.style +++ b/Telegram/SourceFiles/info/info.style @@ -22,9 +22,9 @@ InfoToggle { } InfoPeerBadge { + verified: icon; premium: icon; premiumFg: color; - premiumInnerFg: color; position: point; sizeTag: int; } @@ -436,9 +436,9 @@ infoVerifiedCheck: icon { infoPremiumStar: icon {{ "profile_premium", profileVerifiedCheckBg }}; infoPeerBadge: InfoPeerBadge { + verified: infoVerifiedCheck; premium: infoPremiumStar; premiumFg: profileVerifiedCheckBg; - premiumInnerFg: profileVerifiedCheckFg; position: infoVerifiedCheckPosition; sizeTag: 1; // Large } diff --git a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp index b751ab036..253c5979a 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp @@ -1845,7 +1845,7 @@ void DetailsFiller::setupAboutVerification() { peer, Data::PeerUpdate::Flag::VerifyInfo ) | rpl::start_with_next([=] { - const auto info = peer->verifyDetails(); + const auto info = peer->botVerifyDetails(); while (inner->count()) { delete inner->widgetAt(0); } @@ -1853,9 +1853,6 @@ void DetailsFiller::setupAboutVerification() { Ui::AddDivider(inner); } else if (!info->description.empty()) { Ui::AddDividerText(inner, rpl::single(info->description)); - } else if (peer->verifiedByTelegram()) { - const auto phrases = PeerVerifyPhrases(peer); - Ui::AddDividerText(inner, phrases.telegram()); } inner->resizeToWidth(inner->width()); }, inner->lifetime()); diff --git a/Telegram/SourceFiles/info/profile/info_profile_badge.cpp b/Telegram/SourceFiles/info/profile/info_profile_badge.cpp index b8c74f4c1..07f63b2fe 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_badge.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_badge.cpp @@ -35,10 +35,7 @@ namespace { } else if (emojiStatusId && badge == BadgeType::None) { badge = BadgeType::Premium; } - return Badge::Content{ - badge, - emojiStatusId ? emojiStatusId : DocumentId(), - }; + return Badge::Content{ badge, emojiStatusId }; }); } @@ -117,30 +114,16 @@ void Badge::setContent(Content content) { case BadgeType::Verified: case BadgeType::Premium: { const auto id = _content.emojiStatusId; - const auto innerId = _content.emojiStatusInnerId; - if (id || innerId) { - _emojiStatus = id - ? _session->data().customEmojiManager().create( - id, - [raw = _view.data()] { raw->update(); }, - sizeTag()) - : nullptr; - _statusInner = innerId - ? _session->data().customEmojiManager().create( - innerId, - [raw = _view.data()] { raw->update(); }, - sizeTag()) - : nullptr; - if (_emojiStatus && _customStatusLoopsLimit > 0) { + if (id) { + _emojiStatus = _session->data().customEmojiManager().create( + id, + [raw = _view.data()] { raw->update(); }, + sizeTag()); + if (_customStatusLoopsLimit > 0) { _emojiStatus = std::make_unique( std::move(_emojiStatus), _customStatusLoopsLimit); } - if (_statusInner && _customStatusLoopsLimit > 0) { - _statusInner = std::make_unique( - std::move(_statusInner), - _customStatusLoopsLimit); - } const auto emoji = Data::FrameSizeFromTag(sizeTag()) / style::DevicePixelRatio(); _view->resize(emoji, emoji); @@ -155,17 +138,13 @@ void Badge::setContent(Content content) { if (!_emojiStatusPanel || !_emojiStatusPanel->paintBadgeFrame(check)) { Painter p(check); - if (_emojiStatus) { - _emojiStatus->paint(p, args); - } - if (_statusInner) { - args.textColor = _st.premiumInnerFg->c; - _statusInner->paint(p, args); - } + _emojiStatus->paint(p, args); } }, _view->lifetime()); } else { - const auto icon = &_st.premium; + const auto icon = (_content.badge == BadgeType::Verified) + ? &_st.verified + : &_st.premium; _view->resize(icon->size()); _view->paintRequest( ) | rpl::start_with_next([=, check = _view.data()]{ @@ -225,9 +204,9 @@ void Badge::move(int left, int top, int bottom) { return; } const auto star = !_emojiStatus - && (_content.badge == BadgeType::Premium); - const auto fake = (!_emojiStatus && !star) - || (_content.badge == BadgeType::Verified); + && (_content.badge == BadgeType::Premium + || _content.badge == BadgeType::Verified); + const auto fake = !_emojiStatus && !star; const auto skip = fake ? 0 : _st.position.x(); const auto badgeLeft = left + skip; const auto badgeTop = top diff --git a/Telegram/SourceFiles/info/profile/info_profile_badge.h b/Telegram/SourceFiles/info/profile/info_profile_badge.h index efff823cb..f0e770d3f 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_badge.h +++ b/Telegram/SourceFiles/info/profile/info_profile_badge.h @@ -59,7 +59,6 @@ public: struct Content { BadgeType badge = BadgeType::None; DocumentId emojiStatusId = 0; - DocumentId emojiStatusInnerId = 0; friend inline constexpr bool operator==(Content, Content) = default; }; @@ -93,7 +92,6 @@ private: EmojiStatusPanel *_emojiStatusPanel = nullptr; const int _customStatusLoopsLimit = 0; std::unique_ptr _emojiStatus; - std::unique_ptr _statusInner; base::flags _allowed; Content _content; Fn _premiumClickCallback; diff --git a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp index 3934cbb7b..b6eedec12 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp @@ -309,11 +309,10 @@ Cover::Cover( peer, Data::PeerUpdate::Flag::VerifyInfo ) | rpl::map([=] { - const auto details = peer->verifyDetails(); + const auto info = peer->botVerifyDetails(); return Badge::Content{ - .badge = details ? BadgeType::Verified : BadgeType::None, - .emojiStatusId = details ? details->iconBgId : DocumentId(), - .emojiStatusInnerId = details ? details->iconFgId : DocumentId(), + .badge = info ? BadgeType::Verified : BadgeType::None, + .emojiStatusId = info ? info->iconId : DocumentId(), }; }); } diff --git a/Telegram/SourceFiles/info/profile/info_profile_values.cpp b/Telegram/SourceFiles/info/profile/info_profile_values.cpp index 0f04feee2..fba586e0d 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_values.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_values.cpp @@ -659,6 +659,8 @@ rpl::producer BadgeValueFromFlags(Peer peer) { ? BadgeType::Scam : (value & Flag::Fake) ? BadgeType::Fake + : (value & Flag::Verified) + ? BadgeType::Verified : premium ? BadgeType::Premium : BadgeType::None; diff --git a/Telegram/SourceFiles/settings/settings.style b/Telegram/SourceFiles/settings/settings.style index 4e472b96a..a64cc6e92 100644 --- a/Telegram/SourceFiles/settings/settings.style +++ b/Telegram/SourceFiles/settings/settings.style @@ -197,9 +197,12 @@ settingsInfoPhotoSkip: 7px; settingsInfoNameSkip: -1px; settingsInfoUploadLeft: 6px; settingsInfoPeerBadge: InfoPeerBadge { + verified: icon { + { "dialogs/dialogs_verified_star", dialogsVerifiedIconBg }, + { "dialogs/dialogs_verified_check", dialogsVerifiedIconFg }, + }; premium: icon {{ "dialogs/dialogs_premium", dialogsVerifiedIconBg }}; premiumFg: dialogsVerifiedIconBg; - premiumInnerFg: dialogsVerifiedIconFg; sizeTag: 0; // Normal } diff --git a/Telegram/SourceFiles/ui/unread_badge.cpp b/Telegram/SourceFiles/ui/unread_badge.cpp index 30956a01e..4448d57db 100644 --- a/Telegram/SourceFiles/ui/unread_badge.cpp +++ b/Telegram/SourceFiles/ui/unread_badge.cpp @@ -31,11 +31,9 @@ struct PeerBadge::EmojiStatus { int skip = 0; }; -struct PeerBadge::VerifiedData { +struct PeerBadge::BotVerifiedData { QImage cache; - QImage cacheFg; - std::unique_ptr bg; - std::unique_ptr fg; + std::unique_ptr icon; }; void UnreadBadge::setText(const QString &text, bool active) { @@ -200,6 +198,14 @@ int PeerBadge::drawGetWidth( .paused = descriptor.paused || On(PowerSaving::kEmojiStatus), }); return iconw - 4 * _emojiStatus->skip; + } else if (descriptor.verified && peer->isVerified()) { + const auto iconw = descriptor.verified->width(); + descriptor.verified->paint( + p, + rectForName.x() + qMin(nameWidth, rectForName.width() - iconw), + rectForName.y(), + outerWidth); + return iconw; } else if (descriptor.premium && peer->isPremium() && peer->session().premiumBadgesShown()) { @@ -218,45 +224,33 @@ void PeerBadge::unload() { _emojiStatus = nullptr; } -bool PeerBadge::ready(const VerifyDetails *details) const { +bool PeerBadge::ready(const BotVerifyDetails *details) const { if (!details || !*details) { - _verifiedData = nullptr; + _botVerifiedData = nullptr; return true; - } else if (!_verifiedData) { + } else if (!_botVerifiedData) { return false; } - if (!details->iconBgId) { - _verifiedData->bg = nullptr; - } else if (!_verifiedData->bg - || (_verifiedData->bg->entityData() - != Data::SerializeCustomEmojiId(details->iconBgId))) { - return false; - } - if (!details->iconFgId) { - _verifiedData->fg = nullptr; - } else if (!_verifiedData->fg - || (_verifiedData->fg->entityData() - != Data::SerializeCustomEmojiId(details->iconFgId))) { + if (!details->iconId) { + _botVerifiedData->icon = nullptr; + } else if (!_botVerifiedData->icon + || (_botVerifiedData->icon->entityData() + != Data::SerializeCustomEmojiId(details->iconId))) { return false; } return true; } void PeerBadge::set( - not_null details, + not_null details, Ui::Text::CustomEmojiFactory factory, Fn repaint) { - if (!_verifiedData) { - _verifiedData = std::make_unique(); + if (!_botVerifiedData) { + _botVerifiedData = std::make_unique(); } - if (details->iconBgId) { - _verifiedData->bg = factory( - Data::SerializeCustomEmojiId(details->iconBgId), - repaint); - } - if (details->iconFgId) { - _verifiedData->fg = factory( - Data::SerializeCustomEmojiId(details->iconFgId), + if (details->iconId) { + _botVerifiedData->icon = factory( + Data::SerializeCustomEmojiId(details->iconId), repaint); } } @@ -265,29 +259,19 @@ int PeerBadge::drawVerified( QPainter &p, QPoint position, const style::VerifiedBadge &st) { - const auto data = _verifiedData.get(); + const auto data = _botVerifiedData.get(); if (!data) { return 0; } - const auto now = crl::now(); - auto result = 0; - if (const auto bg = data->bg.get()) { - bg->paint(p, { - .textColor = st.bg->c, - .now = now, + if (const auto icon = data->icon.get()) { + icon->paint(p, { + .textColor = st.color->c, + .now = crl::now(), .position = position, }); - result = bg->width(); + return icon->width(); } - if (const auto fg = data->fg.get()) { - fg->paint(p, { - .textColor = st.fg->c, - .now = now, - .position = position, - }); - result = std::max(result, fg->width()); - } - return result; + return 0; } } // namespace Ui diff --git a/Telegram/SourceFiles/ui/unread_badge.h b/Telegram/SourceFiles/ui/unread_badge.h index e85b20a17..84fb5f9e9 100644 --- a/Telegram/SourceFiles/ui/unread_badge.h +++ b/Telegram/SourceFiles/ui/unread_badge.h @@ -32,18 +32,17 @@ private: }; -struct VerifyDetails { +struct BotVerifyDetails { UserId botId = 0; - DocumentId iconBgId = 0; - DocumentId iconFgId = 0; + DocumentId iconId = 0; TextWithEntities description; explicit operator bool() const { - return iconBgId || iconFgId; + return iconId != 0; } friend inline bool operator==( - const VerifyDetails &, - const VerifyDetails &) = default; + const BotVerifyDetails &, + const BotVerifyDetails &) = default; }; class PeerBadge { @@ -69,9 +68,9 @@ public: const Descriptor &descriptor); void unload(); - [[nodiscard]] bool ready(const VerifyDetails *details) const; + [[nodiscard]] bool ready(const BotVerifyDetails *details) const; void set( - not_null details, + not_null details, Text::CustomEmojiFactory factory, Fn repaint); @@ -83,10 +82,10 @@ public: private: struct EmojiStatus; - struct VerifiedData; + struct BotVerifiedData; std::unique_ptr _emojiStatus; - mutable std::unique_ptr _verifiedData; + mutable std::unique_ptr _botVerifiedData; };