Support enabling/disabling messages.

This commit is contained in:
John Preston
2025-09-30 16:04:18 +04:00
parent d3da830ef8
commit 93b2a52f34
8 changed files with 141 additions and 53 deletions
+1
View File
@@ -5266,6 +5266,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_group_call_invite_search_results" = "Search results";
"lng_group_call_invite_limit" = "This is currently the maximum allowed number of participants.";
"lng_group_call_new_muted" = "Mute new participants";
"lng_group_call_enable_messages" = "Enable messages";
"lng_group_call_speakers" = "Speakers";
"lng_group_call_microphone" = "Microphone";
"lng_group_call_push_to_talk" = "Push-to-Talk Shortcut";
@@ -958,6 +958,10 @@ void GroupCall::setScheduledDate(TimeId date) {
}
}
void GroupCall::setMessagesEnabled(bool enabled) {
_messagesEnabled = enabled && !_rtmp;
}
void GroupCall::subscribeToReal(not_null<Data::GroupCall*> real) {
_listenersHidden = real->listenersHidden();
@@ -966,6 +970,11 @@ void GroupCall::subscribeToReal(not_null<Data::GroupCall*> real) {
setScheduledDate(date);
}, _lifetime);
real->messagesEnabledValue(
) | rpl::start_with_next([=](bool enabled) {
setMessagesEnabled(enabled);
}, _lifetime);
// Postpone creating video tracks, so that we know if Panel
// supports OpenGL and we don't need ARGB32 frames at all.
Ui::PostponeCall(this, [=] {
@@ -2305,6 +2314,7 @@ void GroupCall::handlePossibleCreateOrJoinResponse(
const auto rtmp = data.is_rtmp_stream();
_rtmp = rtmp;
setScheduledDate(scheduleDate);
setMessagesEnabled(data.is_messages_enabled());
if (const auto chat = _peer->asChat()) {
chat->setGroupCall(input, scheduleDate, rtmp);
} else if (const auto group = _peer->asChannel()) {
@@ -2320,6 +2330,7 @@ void GroupCall::handlePossibleCreateOrJoinResponse(
return;
}
setScheduledDate(data.vschedule_date().value_or_empty());
setMessagesEnabled(data.is_messages_enabled());
if (const auto streamDcId = data.vstream_dc_id()) {
_broadcastDcId = MTP::BareDcId(streamDcId->v);
}
@@ -422,6 +422,12 @@ public:
[[nodiscard]] rpl::producer<bool> videoIsWorkingValue() const {
return _videoIsWorking.value();
}
[[nodiscard]] bool messagesEnabled() const {
return _messagesEnabled.current();
}
[[nodiscard]] rpl::producer<bool> messagesEnabledValue() const {
return _messagesEnabled.value();
}
[[nodiscard]] bool isSharingScreen() const;
[[nodiscard]] rpl::producer<bool> isSharingScreenValue() const;
@@ -591,6 +597,7 @@ private:
void saveDefaultJoinAs(not_null<PeerData*> as);
void subscribeToReal(not_null<Data::GroupCall*> real);
void setScheduledDate(TimeId date);
void setMessagesEnabled(bool enabled);
void rejoinPresentation();
void leavePresentation();
void checkNextJoinAction();
@@ -711,6 +718,7 @@ private:
rpl::variable<bool> _canManage = false;
rpl::variable<bool> _videoIsWorking = false;
rpl::variable<bool> _emptyRtmp = false;
rpl::variable<bool> _messagesEnabled = false;
bool _initialMuteStateSent = false;
bool _acceptFields = false;
@@ -726,12 +726,12 @@ rpl::producer<Ui::CallButtonColors> Panel::toggleableOverrides(
void Panel::refreshVideoButtons(std::optional<bool> overrideWideMode) {
const auto create = overrideWideMode.value_or(mode() == PanelMode::Wide)
|| (!_call->scheduleDate() && _call->videoIsWorking());
const auto created = _video != nullptr/*&& _screenShare*/;
const auto created = _video && _screenShare;
if (created == create) {
return;
} else if (created) {
_video.destroy();
//_screenShare.destroy();
_screenShare.destroy();
if (!overrideWideMode) {
updateButtonsGeometry();
}
@@ -761,19 +761,19 @@ void Panel::refreshVideoButtons(std::optional<bool> overrideWideMode) {
_video->setProgress(sharing ? 1. : 0.);
}, _video->lifetime());
}
//if (!_screenShare) {
// _screenShare.create(widget(), st::groupCallScreenShareSmall);
// _screenShare->show();
// _screenShare->setClickedCallback([=] {
// chooseShareScreenSource();
// });
// _screenShare->setColorOverrides(
// toggleableOverrides(_call->isSharingScreenValue()));
// _call->isSharingScreenValue(
// ) | rpl::start_with_next([=](bool sharing) {
// _screenShare->setProgress(sharing ? 1. : 0.);
// }, _screenShare->lifetime());
//}
if (!_screenShare) {
_screenShare.create(widget(), st::groupCallScreenShareSmall);
_screenShare->show();
_screenShare->setClickedCallback([=] {
chooseShareScreenSource();
});
_screenShare->setColorOverrides(
toggleableOverrides(_call->isSharingScreenValue()));
_call->isSharingScreenValue(
) | rpl::start_with_next([=](bool sharing) {
_screenShare->setProgress(sharing ? 1. : 0.);
}, _screenShare->lifetime());
}
if (!_wideMenu) {
_wideMenu.create(widget(), st::groupCallMenuToggleSmall);
_wideMenu->show();
@@ -1142,7 +1142,7 @@ void Panel::raiseControls() {
const auto buttons = {
&_settings,
&_callShare,
//&_screenShare,
&_screenShare,
&_wideMenu,
&_video,
&_message,
@@ -1367,6 +1367,11 @@ void Panel::subscribeToChanges(not_null<Data::GroupCall*> real) {
showStickedTooltip();
}, lifetime());
_call->messagesEnabledValue() | rpl::start_with_next([=] {
updateButtonsGeometry();
raiseControls();
}, lifetime());
rpl::combine(
_call->videoIsWorkingValue(),
_call->isSharingScreenValue()
@@ -2177,12 +2182,12 @@ void Panel::showNiceTooltip(
not_null<Ui::RpWidget*> control,
NiceTooltipType type) {
auto text = [&]() -> rpl::producer<QString> {
/*if (control == _screenShare.data()) {
if (control == _screenShare.data()) {
if (_call->mutedByAdmin()) {
return nullptr;
}
return tr::lng_group_call_tooltip_screen(); #TODO remove lang key
} else */if (control == _video.data()) {
return tr::lng_group_call_tooltip_screen();
} else if (control == _video.data()) {
if (_call->mutedByAdmin()) {
return nullptr;
}
@@ -2337,7 +2342,7 @@ void Panel::trackControls(bool track, bool force) {
trackOne(_mute->outer());
trackOne(_video);
trackOne(_message);
//trackOne(_screenShare);
trackOne(_screenShare);
trackOne(_wideMenu);
trackOne(_settings);
trackOne(_hangup);
@@ -2394,11 +2399,12 @@ void Panel::updateButtonsGeometry() {
widget->setVisible(shown);
}
};
const auto messagesEnabled = _call->messagesEnabled();
auto messagesBottomSkip = 0;
if (mode() == PanelMode::Wide) {
Assert(_video != nullptr);
Assert(_message != nullptr);
//Assert(_screenShare != nullptr);
Assert(_screenShare != nullptr);
Assert(_wideMenu != nullptr);
Assert(_settings != nullptr);
Assert(_callShare == nullptr);
@@ -2464,39 +2470,41 @@ void Panel::updateButtonsGeometry() {
forMessagesWidth,
forMessagesHeight);
//toggle(_screenShare, !hidden && !rtmp);
toggle(_message, !hidden && !rtmp);
//if (!rtmp) {
// _screenShare->moveToLeft(left, buttonsTop);
// left += _screenShare->width() + skip;
//}
toggle(_screenShare, !hidden && !rtmp && !messagesEnabled);
toggle(_message, !hidden && !rtmp && messagesEnabled);
if (!rtmp && !messagesEnabled) {
_screenShare->moveToLeft(left, buttonsTop);
left += _screenShare->width() + skip;
} else if (!rtmp) {
_wideMenu->moveToLeft(left, buttonsTop);
_settings->moveToLeft(left, buttonsTop);
left += _settings->width() + skip;
}
_wideMenu->moveToLeft(left, buttonsTop);
_settings->moveToLeft(left, buttonsTop);
left += _settings->width() + skip;
const auto wideMenuShown = _call->canManage()
|| _call->showChooseJoinAs();
toggle(_settings, !hidden && !wideMenuShown);
toggle(_wideMenu, !hidden && wideMenuShown);
toggle(_video, !hidden && !rtmp);
if (!rtmp) {
_video->moveToLeft(left, buttonsTop);
left += _video->width() + skip;
//} else {
// _wideMenu->moveToLeft(left, buttonsTop);
// _settings->moveToLeft(left, buttonsTop);
// left += _settings->width() + skip;
} else {
_wideMenu->moveToLeft(left, buttonsTop);
_settings->moveToLeft(left, buttonsTop);
left += _settings->width() + skip;
}
toggle(_mute, !hidden);
_mute->moveInner({ left + addSkip, muteTop });
left += muteSize + skip;
const auto wideMenuShown = _call->canManage()
|| _call->showChooseJoinAs();
toggle(_settings, !hidden && !wideMenuShown);
toggle(_wideMenu, !hidden && wideMenuShown);
if (!rtmp) {
//_wideMenu->moveToLeft(left, buttonsTop);
//_settings->moveToLeft(left, buttonsTop);
//left += _settings->width() + skip;
if (!rtmp && messagesEnabled) {
_message->moveToLeft(left, buttonsTop);
left += _message->width() + skip;
} else if (!rtmp) {
_wideMenu->moveToLeft(left, buttonsTop);
_settings->moveToLeft(left, buttonsTop);
left += _settings->width() + skip;
}
toggle(_hangup, !hidden);
_hangup->moveToLeft(left, buttonsTop);
@@ -2518,8 +2526,8 @@ void Panel::updateButtonsGeometry() {
const auto muteSize = _mute->innerSize().width();
const auto single = (_settings ? _settings : _callShare)->width();
const auto showVideoButton = videoButtonInNarrowMode();
const auto four = !_callShare && !showVideoButton && _message;
const auto five = !four && !_callShare && _message;
const auto four = !_callShare && !showVideoButton && messagesEnabled;
const auto five = !four && !_callShare && messagesEnabled;
const auto buttonSkip = four
? (st::groupCallButtonSkip / 2)
: five
@@ -2577,7 +2585,7 @@ void Panel::updateButtonsGeometry() {
? (nextButtonLeft + addSkip)
: ((widget()->width() - muteSize) / 2);
_mute->moveInner({ muteButtonLeft, muteTop });
//toggle(_screenShare, false);
toggle(_screenShare, false);
toggle(_wideMenu, false);
toggle(_callShare, true);
if (_callShare) {
@@ -2594,7 +2602,7 @@ void Panel::updateButtonsGeometry() {
four ? leftButtonLeft : nextButtonLeft,
buttonsTop);
}
toggle(_message, !_callShare);
toggle(_message, !_callShare && messagesEnabled);
if (_message) {
_message->moveToRight(nextButtonLeft, buttonsTop);
}
@@ -251,7 +251,7 @@ private:
object_ptr<Ui::CallButton> _wideMenu = { nullptr };
object_ptr<Ui::CallButton> _callShare = { nullptr };
object_ptr<Ui::CallButton> _video = { nullptr };
//object_ptr<Ui::CallButton> _screenShare = { nullptr };
object_ptr<Ui::CallButton> _screenShare = { nullptr };
object_ptr<Ui::CallButton> _message = { nullptr };
std::unique_ptr<Ui::CallMuteButton> _mute;
object_ptr<Ui::CallButton> _hangup;
@@ -80,15 +80,38 @@ void SaveCallJoinMuted(
|| call->joinMuted() == joinMuted) {
return;
}
using Flag = MTPphone_ToggleGroupCallSettings::Flag;
call->setJoinMutedLocally(joinMuted);
peer->session().api().request(MTPphone_ToggleGroupCallSettings(
MTP_flags(MTPphone_ToggleGroupCallSettings::Flag::f_join_muted),
MTP_flags(Flag::f_join_muted),
call->input(),
MTP_bool(joinMuted),
MTPBool() // messages_enabled
)).send();
}
void SaveCallMessagesEnabled(
not_null<PeerData*> peer,
CallId callId,
bool messagesEnabled) {
const auto call = peer->groupCall();
if (!call
|| call->id() != callId
|| !peer->canManageGroupCall()
|| !call->canChangeJoinMuted()
|| call->messagesEnabled() == messagesEnabled) {
return;
}
using Flag = MTPphone_ToggleGroupCallSettings::Flag;
call->setMessagesEnabledLocally(messagesEnabled);
peer->session().api().request(MTPphone_ToggleGroupCallSettings(
MTP_flags(Flag::f_messages_enabled),
call->input(),
MTPBool(), // join_muted
MTP_bool(messagesEnabled)
)).send();
}
[[nodiscard]] crl::time DelayByIndex(int index) {
return index * crl::time(10);
}
@@ -243,10 +266,16 @@ void SettingsBox(
const auto &settings = Core::App().settings();
const auto joinMuted = goodReal ? real->joinMuted() : false;
const auto messagesEnabled = goodReal ? real->messagesEnabled() : false;
const auto canChangeJoinMuted = !rtmp
&& goodReal
&& real->canChangeJoinMuted();
const auto addCheck = (peer->canManageGroupCall() && canChangeJoinMuted);
const auto canChangeMessagesEnabled = !rtmp
&& goodReal
&& real->canChangeMessagesEnabled();
const auto addCheck = peer->canManageGroupCall() && canChangeJoinMuted;
const auto addMessages = peer->canManageGroupCall()
&& canChangeMessagesEnabled;
const auto addDivider = [&] {
layout->add(object_ptr<Ui::BoxContentDivider>(
@@ -255,7 +284,7 @@ void SettingsBox(
st::groupCallDividerBg));
};
if (addCheck) {
if (addCheck || addMessages) {
Ui::AddSkip(layout);
}
const auto muteJoined = addCheck
@@ -264,7 +293,14 @@ void SettingsBox(
tr::lng_group_call_new_muted(),
st::groupCallSettingsButton))->toggleOn(rpl::single(joinMuted))
: nullptr;
if (addCheck) {
const auto enableMessages = addMessages
? layout->add(object_ptr<Ui::SettingsButton>(
layout,
tr::lng_group_call_enable_messages(),
st::groupCallSettingsButton))->toggleOn(
rpl::single(messagesEnabled))
: nullptr;
if (addCheck || addMessages) {
Ui::AddSkip(layout);
}
@@ -811,6 +847,11 @@ void SettingsBox(
&& muteJoined->toggled() != joinMuted) {
SaveCallJoinMuted(peer, id, muteJoined->toggled());
}
if (canChangeMessagesEnabled
&& enableMessages
&& enableMessages->toggled() != messagesEnabled) {
SaveCallMessagesEnabled(peer, id, enableMessages->toggled());
}
}, box->lifetime());
box->addButton(tr::lng_box_done(), [=] {
box->closeBox();
@@ -522,6 +522,8 @@ void GroupCall::applyCallFields(const MTPDgroupCall &data) {
_scheduleDate = data.vschedule_date().value_or_empty();
_scheduleStartSubscribed = data.is_schedule_start_subscribed();
_unmutedVideoLimit = data.vunmuted_video_limit().v;
_messagesEnabled = data.is_messages_enabled();
_canChangeMessagesEnabled = data.is_can_change_messages_enabled();
_allParticipantsLoaded
= (_serverParticipantsCount == _participants.size());
_conferenceInviteLink = qs(data.vinvite_link().value_or_empty());
@@ -1098,6 +1100,10 @@ bool GroupCall::joinedToTop() const {
return _joinedToTop;
}
void GroupCall::setMessagesEnabledLocally(bool enabled) {
_messagesEnabled = enabled;
}
ApiWrap &GroupCall::api() const {
return session().api();
}
+15 -2
View File
@@ -118,7 +118,7 @@ public:
return _unmutedVideoLimit.current();
}
[[nodiscard]] bool recordVideo() const {
return _recordVideo.current();
return _recordVideo;
}
void setPeer(not_null<PeerData*> peer);
@@ -189,6 +189,17 @@ public:
[[nodiscard]] bool canChangeJoinMuted() const;
[[nodiscard]] bool joinedToTop() const;
void setMessagesEnabledLocally(bool enabled);
[[nodiscard]] bool canChangeMessagesEnabled() const {
return _canChangeMessagesEnabled;
}
[[nodiscard]] bool messagesEnabled() const {
return _messagesEnabled.current();
}
[[nodiscard]] rpl::producer<bool> messagesEnabledValue() const {
return _messagesEnabled.value();
}
private:
enum class ApplySliceSource {
FullReloaded,
@@ -250,7 +261,7 @@ private:
int _serverParticipantsCount = 0;
rpl::variable<int> _fullCount = 0;
rpl::variable<int> _unmutedVideoLimit = 0;
rpl::variable<bool> _recordVideo = 0;
rpl::variable<bool> _messagesEnabled = false;
rpl::variable<TimeId> _recordStartDate = 0;
rpl::variable<TimeId> _scheduleDate = 0;
rpl::variable<bool> _scheduleStartSubscribed = false;
@@ -273,7 +284,9 @@ private:
bool _creator : 1 = false;
bool _joinMuted : 1 = false;
bool _recordVideo : 1 = false;
bool _canChangeJoinMuted : 1 = true;
bool _canChangeMessagesEnabled : 1 = true;
bool _allParticipantsLoaded : 1 = false;
bool _joinedToTop : 1 = false;
bool _applyingQueuedUpdates : 1 = false;