diff --git a/Telegram/SourceFiles/data/data_channel.cpp b/Telegram/SourceFiles/data/data_channel.cpp index e972e4388c..4a766585e3 100644 --- a/Telegram/SourceFiles/data/data_channel.cpp +++ b/Telegram/SourceFiles/data/data_channel.cpp @@ -67,7 +67,7 @@ ChannelData::ChannelData(not_null owner, PeerId id) mgInfo = nullptr; } } - if (change.diff & MTPDchannel::Flag::f_call_active) { + if (change.diff & MTPDchannel::Flag::f_call_not_empty) { if (const auto history = this->owner().historyLoaded(this)) { history->updateChatListEntry(); } @@ -708,7 +708,8 @@ void ChannelData::clearCall() { owner().unregisterGroupCall(_call.get()); _call = nullptr; session().changes().peerUpdated(this, UpdateFlag::GroupCall); - removeFlags(MTPDchannel::Flag::f_call_active); + removeFlags(MTPDchannel::Flag::f_call_active + | MTPDchannel::Flag::f_call_not_empty); } namespace Data { diff --git a/Telegram/SourceFiles/data/data_channel.h b/Telegram/SourceFiles/data/data_channel.h index b98dec3f4b..2787991969 100644 --- a/Telegram/SourceFiles/data/data_channel.h +++ b/Telegram/SourceFiles/data/data_channel.h @@ -102,7 +102,7 @@ public: | MTPDchannel::Flag::f_restricted | MTPDchannel::Flag::f_signatures | MTPDchannel::Flag::f_username - | MTPDchannel::Flag::f_call_active + | MTPDchannel::Flag::f_call_not_empty | MTPDchannel::Flag::f_slowmode_enabled; using Flags = Data::Flags< MTPDchannel::Flags, diff --git a/Telegram/SourceFiles/data/data_group_call.cpp b/Telegram/SourceFiles/data/data_group_call.cpp index a5df582cfc..6e03813310 100644 --- a/Telegram/SourceFiles/data/data_group_call.cpp +++ b/Telegram/SourceFiles/data/data_group_call.cpp @@ -85,13 +85,34 @@ void GroupCall::requestParticipants() { }); _participantsSliceAdded.fire({}); _participantsRequestId = 0; + changeChannelEmptyCallFlag(); }).fail([=](const RPCError &error) { _fullCount = _participants.size(); _allReceived = true; _participantsRequestId = 0; + changeChannelEmptyCallFlag(); }).send(); } +void GroupCall::changeChannelEmptyCallFlag() { + constexpr auto flag = MTPDchannel::Flag::f_call_not_empty; + if (_channel->call() != this) { + return; + } else if (fullCount() > 0) { + if (!(_channel->flags() & flag)) { + _channel->addFlags(flag); + _channel->session().changes().peerUpdated( + _channel, + Data::PeerUpdate::Flag::GroupCall); + } + } else if (_channel->flags() & flag) { + _channel->removeFlags(flag); + _channel->session().changes().peerUpdated( + _channel, + Data::PeerUpdate::Flag::GroupCall); + } +} + int GroupCall::fullCount() const { return _fullCount.current(); } @@ -138,6 +159,7 @@ void GroupCall::applyCall(const MTPGroupCall &call, bool force) { _canChangeJoinMuted = data.is_can_change_join_muted(); _version = data.vversion().v; _fullCount = data.vparticipants_count().v; + changeChannelEmptyCallFlag(); }, [&](const MTPDgroupCallDiscarded &data) { const auto id = _id; const auto channel = _channel; @@ -240,6 +262,7 @@ void GroupCall::applyParticipantsSlice( } if (sliceSource == ApplySliceSource::UpdateReceived) { _fullCount = changedCount; + changeChannelEmptyCallFlag(); } } diff --git a/Telegram/SourceFiles/data/data_group_call.h b/Telegram/SourceFiles/data/data_group_call.h index 56d4802976..947fed4d90 100644 --- a/Telegram/SourceFiles/data/data_group_call.h +++ b/Telegram/SourceFiles/data/data_group_call.h @@ -78,6 +78,7 @@ private: void applyParticipantsMutes( const MTPDupdateGroupCallParticipants &update); void requestUnknownSsrcs(); + void changeChannelEmptyCallFlag(); const not_null _channel; const uint64 _id = 0; diff --git a/Telegram/SourceFiles/data/data_peer_values.cpp b/Telegram/SourceFiles/data/data_peer_values.cpp index 74eb650bf3..85f28a3018 100644 --- a/Telegram/SourceFiles/data/data_peer_values.cpp +++ b/Telegram/SourceFiles/data/data_peer_values.cpp @@ -443,7 +443,7 @@ bool IsUserOnline(not_null user) { } bool ChannelHasActiveCall(not_null channel) { - return (channel->flags() & MTPDchannel::Flag::f_call_active); + return (channel->flags() & MTPDchannel::Flag::f_call_not_empty); } } // namespace Data diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index bf914276ca..ca9ee4f564 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -686,7 +686,11 @@ not_null Session::processChat(const MTPChat &data) { } else { channel->setUnavailableReasons({}); } - channel->setFlags(data.vflags().v); + const auto callFlag = MTPDchannel::Flag::f_call_not_empty; + const auto callNotEmpty = (data.vflags().v & callFlag) + || (channel->call() && channel->call()->fullCount() > 0); + channel->setFlags(data.vflags().v + | (callNotEmpty ? callFlag : MTPDchannel::Flag(0))); //if (const auto feedId = data.vfeed_id()) { // #feed // channel->setFeed(feed(feedId->v)); //} else { diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 63ca470220..67adfa4f3e 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -3010,9 +3010,7 @@ void InnerWidget::userOnlineUpdated(not_null peer) { if (!history) { return; } - updateRowCornerStatusShown( - history, - Data::OnlineTextActive(user, base::unixtime::now())); + updateRowCornerStatusShown(history, Data::IsUserOnline(user)); } void InnerWidget::groupHasCallUpdated(not_null peer) { @@ -3024,9 +3022,7 @@ void InnerWidget::groupHasCallUpdated(not_null peer) { if (!history) { return; } - updateRowCornerStatusShown( - history, - group->flags() & MTPDchannel::Flag::f_call_active); + updateRowCornerStatusShown(history, Data::ChannelHasActiveCall(group)); } void InnerWidget::updateRowCornerStatusShown( diff --git a/Telegram/SourceFiles/dialogs/dialogs_row.cpp b/Telegram/SourceFiles/dialogs/dialogs_row.cpp index ba46161dd2..0159eee80d 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_row.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_row.cpp @@ -238,13 +238,13 @@ void BasicRow::paintUserpic( if (historyForCornerBadge->peer->isUser()) { return; } - p.setOpacity(shown); const auto actionPainter = historyForCornerBadge->sendActionPainter(); const auto bg = active ? st::dialogsBgActive : st::dialogsBg; const auto size = st::dialogsCallBadgeSize; const auto skip = st::dialogsCallBadgeSkip; + p.setOpacity(shown); p.translate(st::dialogsPadding); actionPainter->paintSpeaking( p, @@ -254,6 +254,7 @@ void BasicRow::paintUserpic( bg, now); p.translate(-st::dialogsPadding); + p.setOpacity(1.); } Row::Row(Key key, int pos) : _id(key), _pos(pos) {