Show chats list badge only for non-empty calls.

This commit is contained in:
John Preston 2020-12-06 17:28:27 +04:00
parent fa55fd7dd7
commit 732bc38e8e
8 changed files with 38 additions and 12 deletions

View file

@ -67,7 +67,7 @@ ChannelData::ChannelData(not_null<Data::Session*> owner, PeerId id)
mgInfo = nullptr; 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)) { if (const auto history = this->owner().historyLoaded(this)) {
history->updateChatListEntry(); history->updateChatListEntry();
} }
@ -708,7 +708,8 @@ void ChannelData::clearCall() {
owner().unregisterGroupCall(_call.get()); owner().unregisterGroupCall(_call.get());
_call = nullptr; _call = nullptr;
session().changes().peerUpdated(this, UpdateFlag::GroupCall); 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 { namespace Data {

View file

@ -102,7 +102,7 @@ public:
| MTPDchannel::Flag::f_restricted | MTPDchannel::Flag::f_restricted
| MTPDchannel::Flag::f_signatures | MTPDchannel::Flag::f_signatures
| MTPDchannel::Flag::f_username | MTPDchannel::Flag::f_username
| MTPDchannel::Flag::f_call_active | MTPDchannel::Flag::f_call_not_empty
| MTPDchannel::Flag::f_slowmode_enabled; | MTPDchannel::Flag::f_slowmode_enabled;
using Flags = Data::Flags< using Flags = Data::Flags<
MTPDchannel::Flags, MTPDchannel::Flags,

View file

@ -85,13 +85,34 @@ void GroupCall::requestParticipants() {
}); });
_participantsSliceAdded.fire({}); _participantsSliceAdded.fire({});
_participantsRequestId = 0; _participantsRequestId = 0;
changeChannelEmptyCallFlag();
}).fail([=](const RPCError &error) { }).fail([=](const RPCError &error) {
_fullCount = _participants.size(); _fullCount = _participants.size();
_allReceived = true; _allReceived = true;
_participantsRequestId = 0; _participantsRequestId = 0;
changeChannelEmptyCallFlag();
}).send(); }).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 { int GroupCall::fullCount() const {
return _fullCount.current(); return _fullCount.current();
} }
@ -138,6 +159,7 @@ void GroupCall::applyCall(const MTPGroupCall &call, bool force) {
_canChangeJoinMuted = data.is_can_change_join_muted(); _canChangeJoinMuted = data.is_can_change_join_muted();
_version = data.vversion().v; _version = data.vversion().v;
_fullCount = data.vparticipants_count().v; _fullCount = data.vparticipants_count().v;
changeChannelEmptyCallFlag();
}, [&](const MTPDgroupCallDiscarded &data) { }, [&](const MTPDgroupCallDiscarded &data) {
const auto id = _id; const auto id = _id;
const auto channel = _channel; const auto channel = _channel;
@ -240,6 +262,7 @@ void GroupCall::applyParticipantsSlice(
} }
if (sliceSource == ApplySliceSource::UpdateReceived) { if (sliceSource == ApplySliceSource::UpdateReceived) {
_fullCount = changedCount; _fullCount = changedCount;
changeChannelEmptyCallFlag();
} }
} }

View file

@ -78,6 +78,7 @@ private:
void applyParticipantsMutes( void applyParticipantsMutes(
const MTPDupdateGroupCallParticipants &update); const MTPDupdateGroupCallParticipants &update);
void requestUnknownSsrcs(); void requestUnknownSsrcs();
void changeChannelEmptyCallFlag();
const not_null<ChannelData*> _channel; const not_null<ChannelData*> _channel;
const uint64 _id = 0; const uint64 _id = 0;

View file

@ -443,7 +443,7 @@ bool IsUserOnline(not_null<UserData*> user) {
} }
bool ChannelHasActiveCall(not_null<ChannelData*> channel) { bool ChannelHasActiveCall(not_null<ChannelData*> channel) {
return (channel->flags() & MTPDchannel::Flag::f_call_active); return (channel->flags() & MTPDchannel::Flag::f_call_not_empty);
} }
} // namespace Data } // namespace Data

View file

@ -686,7 +686,11 @@ not_null<PeerData*> Session::processChat(const MTPChat &data) {
} else { } else {
channel->setUnavailableReasons({}); 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 //if (const auto feedId = data.vfeed_id()) { // #feed
// channel->setFeed(feed(feedId->v)); // channel->setFeed(feed(feedId->v));
//} else { //} else {

View file

@ -3010,9 +3010,7 @@ void InnerWidget::userOnlineUpdated(not_null<PeerData*> peer) {
if (!history) { if (!history) {
return; return;
} }
updateRowCornerStatusShown( updateRowCornerStatusShown(history, Data::IsUserOnline(user));
history,
Data::OnlineTextActive(user, base::unixtime::now()));
} }
void InnerWidget::groupHasCallUpdated(not_null<PeerData*> peer) { void InnerWidget::groupHasCallUpdated(not_null<PeerData*> peer) {
@ -3024,9 +3022,7 @@ void InnerWidget::groupHasCallUpdated(not_null<PeerData*> peer) {
if (!history) { if (!history) {
return; return;
} }
updateRowCornerStatusShown( updateRowCornerStatusShown(history, Data::ChannelHasActiveCall(group));
history,
group->flags() & MTPDchannel::Flag::f_call_active);
} }
void InnerWidget::updateRowCornerStatusShown( void InnerWidget::updateRowCornerStatusShown(

View file

@ -238,13 +238,13 @@ void BasicRow::paintUserpic(
if (historyForCornerBadge->peer->isUser()) { if (historyForCornerBadge->peer->isUser()) {
return; return;
} }
p.setOpacity(shown);
const auto actionPainter = historyForCornerBadge->sendActionPainter(); const auto actionPainter = historyForCornerBadge->sendActionPainter();
const auto bg = active const auto bg = active
? st::dialogsBgActive ? st::dialogsBgActive
: st::dialogsBg; : st::dialogsBg;
const auto size = st::dialogsCallBadgeSize; const auto size = st::dialogsCallBadgeSize;
const auto skip = st::dialogsCallBadgeSkip; const auto skip = st::dialogsCallBadgeSkip;
p.setOpacity(shown);
p.translate(st::dialogsPadding); p.translate(st::dialogsPadding);
actionPainter->paintSpeaking( actionPainter->paintSpeaking(
p, p,
@ -254,6 +254,7 @@ void BasicRow::paintUserpic(
bg, bg,
now); now);
p.translate(-st::dialogsPadding); p.translate(-st::dialogsPadding);
p.setOpacity(1.);
} }
Row::Row(Key key, int pos) : _id(key), _pos(pos) { Row::Row(Key key, int pos) : _id(key), _pos(pos) {