Skip to content

Commit d418e69

Browse files
committed
Hide statuses and keep messages unread under the spam bar
Task: 2026/10/29/hide-emoji-statuses-and-keep-messages-unread-while-the-report-spam-bar-is-shown
1 parent f9c3be5 commit d418e69

20 files changed

Lines changed: 139 additions & 18 deletions

‎Telegram/SourceFiles/boxes/peer_list_box.cpp‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1197,7 +1197,10 @@ PeerListContent::PeerListContent(
11971197

11981198
using UpdateFlag = Data::PeerUpdate::Flag;
11991199
_controller->session().changes().peerUpdates(
1200-
UpdateFlag::Name | UpdateFlag::Photo | UpdateFlag::EmojiStatus
1200+
UpdateFlag::Name
1201+
| UpdateFlag::Photo
1202+
| UpdateFlag::EmojiStatus
1203+
| UpdateFlag::BarSettings
12011204
) | rpl::on_next([=](const Data::PeerUpdate &update) {
12021205
if (update.flags & UpdateFlag::Name) {
12031206
handleNameChanged(update.peer);
@@ -1206,6 +1209,15 @@ PeerListContent::PeerListContent(
12061209
invalidateLoadedUserpics();
12071210
this->update();
12081211
}
1212+
if (update.flags & UpdateFlag::BarSettings) {
1213+
const auto byPeer = _rowsByPeer.find(update.peer);
1214+
if (byPeer != _rowsByPeer.cend()) {
1215+
for (const auto row : byPeer->second) {
1216+
_rowsScrollCache.invalidate(row->id());
1217+
updateRow(row);
1218+
}
1219+
}
1220+
}
12091221
}, lifetime());
12101222

12111223
style::PaletteChanged(

‎Telegram/SourceFiles/data/data_changes.h‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,10 @@ struct PeerUpdate {
126126

127127
MainProfileTab = (1ULL << 57),
128128
WalletCard = (1ULL << 58),
129+
BarSettings = (1ULL << 59),
129130

130131
// For iteration
131-
LastUsedBit = (1ULL << 58),
132+
LastUsedBit = (1ULL << 59),
132133
};
133134
using Flags = base::flags<Flag>;
134135
friend inline constexpr auto is_flag_type(Flag) { return true; }

‎Telegram/SourceFiles/data/data_peer.cpp‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,7 @@ void PeerData::setBarSettings(const MTPPeerSettings &data) {
931931
}
932932

933933
void PeerData::setBarSettings(PeerBarSettings which) {
934+
const auto wasSettings = _barSettings.current();
934935
const auto was = hideLinks();
935936
_barSettings.set(which);
936937
if (was && !hideLinks()) {
@@ -947,6 +948,9 @@ void PeerData::setBarSettings(PeerBarSettings which) {
947948
}
948949
}
949950
}
951+
if (_barSettings.current() != wasSettings) {
952+
session().changes().peerUpdated(this, UpdateFlag::BarSettings);
953+
}
950954
}
951955

952956
int PeerData::paysPerMessage() const {
@@ -981,6 +985,24 @@ bool PeerData::hideLinks() const {
981985
return !settings || (*settings & PeerBarSetting::ReportSpam);
982986
}
983987

988+
bool PeerData::hideEmojiStatus() const {
989+
if (const auto to = migrateTo()) {
990+
return to->hideEmojiStatus();
991+
}
992+
const auto settings = barSettings();
993+
return settings && (*settings & PeerBarSetting::ReportSpam);
994+
}
995+
996+
bool PeerData::keepIncomingUnread() const {
997+
if (const auto to = migrateTo()) {
998+
return to->keepIncomingUnread();
999+
}
1000+
// WHY: unknown settings hold too, as every reading host requests them
1001+
// and requestPeerSettings() always ends with known settings.
1002+
const auto settings = barSettings();
1003+
return !settings || (*settings & PeerBarSetting::ReportSpam);
1004+
}
1005+
9841006
QString PeerData::requestChatTitle() const {
9851007
return _barDetails ? _barDetails->requestChatTitle : QString();
9861008
}

‎Telegram/SourceFiles/data/data_peer.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,8 @@ class PeerData {
507507
[[nodiscard]] int paysPerMessage() const;
508508
void clearPaysPerMessage();
509509
[[nodiscard]] bool hideLinks() const;
510+
[[nodiscard]] bool hideEmojiStatus() const;
511+
[[nodiscard]] bool keepIncomingUnread() const;
510512
[[nodiscard]] QString requestChatTitle() const;
511513
[[nodiscard]] TimeId requestChatDate() const;
512514
[[nodiscard]] UserData *businessBot() const;

‎Telegram/SourceFiles/data/data_session.cpp‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6023,7 +6023,13 @@ auto Session::joinChatWebViewDecision() const
60236023
}
60246024

60256025
rpl::producer<not_null<PeerData*>> Session::peerDecorationsUpdated() const {
6026-
return _peerDecorationsUpdated.events();
6026+
return rpl::merge(
6027+
_peerDecorationsUpdated.events(),
6028+
session().changes().peerUpdates(
6029+
PeerUpdate::Flag::BarSettings
6030+
) | rpl::map([](const PeerUpdate &update) {
6031+
return update.peer;
6032+
}));
60276033
}
60286034

60296035
void Session::viewTagsChanged(

‎Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,17 +507,30 @@ InnerWidget::InnerWidget(
507507
| UpdateFlag::IsContact
508508
| UpdateFlag::FullInfo
509509
| UpdateFlag::EmojiStatus
510+
| UpdateFlag::BarSettings
510511
) | rpl::on_next([=](const Data::PeerUpdate &update) {
511512
if (update.flags
512513
& (UpdateFlag::Name
513514
| UpdateFlag::Photo
514515
| UpdateFlag::FullInfo
515-
| UpdateFlag::EmojiStatus)) {
516+
| UpdateFlag::EmojiStatus
517+
| UpdateFlag::BarSettings)) {
516518
if (update.flags & UpdateFlag::Photo) {
517519
invalidateLoadedUserpics();
518520
}
519521
const auto peer = update.peer;
520522
const auto history = peer->owner().historyLoaded(peer);
523+
if (update.flags & UpdateFlag::BarSettings) {
524+
if (history) {
525+
invalidateCachedRow(RowsCacheKey(history));
526+
}
527+
const auto sublist = _savedSublists
528+
? _savedSublists->sublistLoaded(peer)
529+
: nullptr;
530+
if (sublist) {
531+
refreshDialogRow({ sublist, FullMsgId() });
532+
}
533+
}
521534
if (_state == WidgetState::Default) {
522535
if (history) {
523536
updateDialogRow({ history, FullMsgId() });

‎Telegram/SourceFiles/history/history_inner_widget.cpp‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1555,7 +1555,9 @@ void HistoryInner::paintEvent(QPaintEvent *e) {
15551555
} else if (item->isUnreadMention()
15561556
&& !item->isUnreadMedia()) {
15571557
readContents.insert(item);
1558-
_widget->enqueueMessageHighlight({ item });
1558+
if (markingAsViewed) {
1559+
_widget->enqueueMessageHighlight({ item });
1560+
}
15591561
}
15601562
if (item->hasUnreadPollVote()) {
15611563
readContents.insert(item);

‎Telegram/SourceFiles/history/history_widget.cpp‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,7 @@ HistoryWidget::HistoryWidget(
984984
| PeerUpdateFlag::ManagedBot
985985
| PeerUpdateFlag::StarsPerMessage
986986
| PeerUpdateFlag::GiftSettings
987+
| PeerUpdateFlag::BarSettings
987988
) | rpl::filter([=](const Data::PeerUpdate &update) {
988989
if (update.peer.get() == _peer) {
989990
return true;
@@ -1090,6 +1091,12 @@ HistoryWidget::HistoryWidget(
10901091
}
10911092
}
10921093
}
1094+
if (flags & PeerUpdateFlag::BarSettings) {
1095+
checkActivation();
1096+
if (_list) {
1097+
_list->update();
1098+
}
1099+
}
10931100
}, lifetime());
10941101

10951102
using Type = Data::DefaultNotify;
@@ -3445,6 +3452,10 @@ void HistoryWidget::showHistory(
34453452
) | rpl::on_next([=] {
34463453
updateControlsGeometry();
34473454
}, _contactStatus->bar().lifetime());
3455+
const auto settingsPeer = _peer->migrateToOrMe();
3456+
if (!settingsPeer->barSettings()) {
3457+
session().api().requestPeerSettings(settingsPeer);
3458+
}
34483459

34493460
refreshGiftToChannelShown();
34503461
refreshDirectMessageShown();
@@ -4998,6 +5009,7 @@ bool HistoryWidget::markingMessagesRead() const {
49985009

49995010
bool HistoryWidget::markingContentsRead() const {
50005011
return _history
5012+
&& !_history->peer->keepIncomingUnread()
50015013
&& _list
50025014
&& _historyInited
50035015
&& !_firstLoadRequest

‎Telegram/SourceFiles/history/view/history_view_chat_section.cpp‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,10 @@ ChatWidget::ChatWidget(
483483
setupRoot();
484484

485485
_peer->updateFull();
486+
const auto settingsPeer = _peer->migrateToOrMe();
487+
if (!settingsPeer->barSettings()) {
488+
session().api().requestPeerSettings(settingsPeer);
489+
}
486490
if (const auto channel = _peer->asMegagroup()) {
487491
if (!channel->mgInfo->adminsLoaded) {
488492
session().api().chatParticipants().requestAdmins(channel);
@@ -933,6 +937,14 @@ ChatWidget::ChatWidget(
933937
updateControlsVisibility();
934938
}, lifetime());
935939

940+
session().changes().peerUpdates(
941+
_peer,
942+
PeerUpdateFlag::BarSettings
943+
) | rpl::on_next([=] {
944+
checkActivation();
945+
_inner->update();
946+
}, lifetime());
947+
936948
session().data().historyAccessLost(
937949
) | rpl::filter([=](not_null<History*> history) {
938950
return (history == _history);
@@ -6002,6 +6014,11 @@ Ui::ChatPaintContext ChatWidget::listPreparePaintContext(
60026014
return context;
60036015
}
60046016

6017+
bool ChatWidget::listMarkingContentRead() {
6018+
return WindowListDelegate::listMarkingContentRead()
6019+
&& !_peer->keepIncomingUnread();
6020+
}
6021+
60056022
base::unique_qptr<Ui::PopupMenu> ChatWidget::listFillSenderUserpicMenu(
60066023
PeerId userpicPeerId) {
60076024
const auto searchInEntry = _topic

‎Telegram/SourceFiles/history/view/history_view_chat_section.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ class ChatWidget final
253253
not_null<TranslateTracker*> tracker) override;
254254
Ui::ChatPaintContext listPreparePaintContext(
255255
Ui::ChatPaintContextArgs &&args) override;
256+
bool listMarkingContentRead() override;
256257
base::unique_qptr<Ui::PopupMenu> listFillSenderUserpicMenu(
257258
PeerId userpicPeerId) override;
258259
Ui::ElasticScroll *listScrollArea() const override;

0 commit comments

Comments
 (0)