From 65dd9b82c0147a6550782f516f5e396fbf28496a Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 7 Apr 2021 14:56:53 +0400 Subject: [PATCH] Share instead of Settings for scheduled voice chats. --- .../icons/calls/group_calls_share.png | Bin 0 -> 566 bytes .../icons/calls/group_calls_share@2x.png | Bin 0 -> 1027 bytes .../icons/calls/group_calls_share@3x.png | Bin 0 -> 1444 bytes Telegram/Resources/langs/lang.strings | 1 + Telegram/SourceFiles/calls/calls.style | 18 ++- .../SourceFiles/calls/calls_group_call.cpp | 17 ++- Telegram/SourceFiles/calls/calls_group_call.h | 1 + .../SourceFiles/calls/calls_group_panel.cpp | 117 +++++++++++++----- .../SourceFiles/calls/calls_group_panel.h | 6 +- .../calls/calls_group_settings.cpp | 8 +- 10 files changed, 118 insertions(+), 50 deletions(-) create mode 100644 Telegram/Resources/icons/calls/group_calls_share.png create mode 100644 Telegram/Resources/icons/calls/group_calls_share@2x.png create mode 100644 Telegram/Resources/icons/calls/group_calls_share@3x.png diff --git a/Telegram/Resources/icons/calls/group_calls_share.png b/Telegram/Resources/icons/calls/group_calls_share.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2dc5b2cb352f0642e26d8ee9798c044deb762e GIT binary patch literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfY=NhXV~7Xu z(-6b1Lk=QyRkS84#qJ8Z)zLb&b%}t!fTK;r(((;kHc#FXbt58zQ*muX7yAbWMpqrC zCZ!uc%G4z0yzvtX-x%@jaLfFY_3uC4pWoxc!5Ayg{WJMY`J;L*0~x-PHFoMdW8P`D z-<(jtHRd`i_wm9BXVZi?=AS*VNyljRSr4_zoo}D$G9J5?we>`am1@_bBV8)nJOU4v zhlXCvF}wKw`^LL@%-uiOMH_WaE3HfU&)v$THktF>bK~>sXCmi1xacT&3RUfuTX%i+ z1f9HM8@cAh!{=t^|M8v>Z131EethDt`!7o>&dq09d{JYn%DMxeZ6w+R^$)Q9%z9I1 zEz<2eZ_d+;d}gzKmHxji6RxwD;nSGvb^qjIrmt1DOlij_-n^Q(Jy37@!q-&=USi#@ zOU`|-4bc)6tPDvokYG9Rx2`{LJNK`4F2{$V2fO-@E3dk`YQwvC=MFErn$`NWh|~A- zBnA#vzvaR{mwndso;k2B_sQpJ2DAQMK2vb&tw~ mQ>R4t)Xpx7IrQZ{cMYQ?YkyA4my7(MIP-M%b6Mw<&;$Ur3f*r2 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/calls/group_calls_share@2x.png b/Telegram/Resources/icons/calls/group_calls_share@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce9df041375f34f9dfa919bc6ea0cb90a92a8fc GIT binary patch literal 1027 zcmV+e1pNDnP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFZAnByRA>e5SUpJdKp1{o>Q7Zv z>K{dvLZKiCLZL2>1w}-6I|$ue6&$4qE*)GPij!c6uBC$FUlo;3BG{pex(LM%1qDUK zL0|8J$=8-#a!u0YE94;La`)!B=XvkFUk3mnd73sko0j<>aa(}ZJ!toU-2*y3V22Q| z1N-{=;P&vFgQ3^TUFP$WdbP6v9U2hM1OyOU8F0GEfqkCjE|4Q+1VL* zJf2Ek+b za&i)mj*g(Kt4qzas@{^0xB(8B|V*?2pESJmT^w0giy1K&7&Q1xh5?dz!uVI-= zUJx7_8p5@;HN3mK<0h(PNY)8-yWKqP>l4t?(Shsh>-hfuuEa-E-O0%bwzs#diO?=! zad8og#iAy1ygwZt9%5^2tCEQN1-M);+}_^i<)GVce}5laT3T2l>JvbAl}O{$?6kA9 zqhCNzPY>qvd9%3-?a@$WOfq~uKnD|@-mFS1D=Yd0B$G+2xZ~#LCW|~RSMPz@*;&iT zZ*6TUkyjT$mUVo3da^`7B9TxduP%TtQdXqh-CcAz9Qp*%fvaUNQ!DuE>kGfXziW$` z->FmzolYkYd34c1z)A}X3&3+)`uX`0ZXC$c4-XFyKtxwPA0Hn;Vi{IfS6NL-<>_=9 zmX?-)V)7=Y(o819^wP`A3-0ahVI&ekB9e(gNC~!1oSx*sm}P1L$N`^c<0gkMFCZKaOQdOr#xV6bIh@FWsFo=SxW2xw zXa8T-7IO?tO-)H5`1<+^^YinN%jKjpqcS%)H!wFh2XvfhNlXEuP)NXgetw4O>1ikw z3R>_L{~?DTn3naA07-2yFQ= z5R1i-+?pBDfPhhXH%c8tt`&{KmKVV5SzbFj)sow3ytuf~JQ2vX<@hTkujWjq+zU0* xHMW38dY1>=?g1VzHPXiJfkt|l2fOKe;1?+k<>gNe+f@Jn002ovPDHLkV1l@Fz-|Bl literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/calls/group_calls_share@3x.png b/Telegram/Resources/icons/calls/group_calls_share@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..76abb0e887b18bfa481e92f9c113139d8f04369f GIT binary patch literal 1444 zcmZ`(X;hL46#ZC2#U(7aT&4^)*K#SBV;bTDn1+?sh;z_!8%@ilMI3cPC0kW6%TyfD zXpTl^SZ12yhInjIF>^0%z=}o1tqnO1{+XFG=gg1$?tSmw_w(J$A%`&9aAPR05<91{Cq-5p!te});W07&OR4P+m=kx;TloZg-wl| zsF-&&mOT${*FSLcLLtlAGCa!MWCHOl#yqee=})6(5HqvSuXrh^*Od$HGaetNTh3!# z&bBsx9mxKmP|`hIR;spb<{QZ|mTJ)bW+Jw%1FE;9#?BfANBEEt>>pTwE>xW(@%c}C zOf57lthcDRcw%5c$8Ps-t7#gNAGL<@=5o1mxg21KmzHz`0|Tc|N(U+VdmLO{KV2`J zH_X*HFlgOc(gc{-DHK`O*4C+p7E%xz+uYntWiS?Xu%l24^?pNxxtrT@R|_c^jV&uH zqu#h-sk#A~v#ws%#NzQ~oBF?z5yKM`+gNw*^pjUT0dv-?S4XipT$&9lQvZaXzdxs? z#p5QOE^D-0YXDP1qobq8*Vp$S#9~u5SdnV#b-do*MCzYHVX*J=tg*aOscU0nb9qiA zO4uAZlhC27t6Ol=)7?GF-``&*67e4B-1|7}6I{$ClY!d0x?Hh1@kwiIciQM&Vn&8x z&F$MSzkDR3h(uxtfdEG$k%XYR^quGQPNk&y#>TP^V;4Xop%CKW;4m4Q+@~fEkBErq zJa8OI6+!OS){@)Xy~K!Gn5&zcxxIbR9*az}<0O$lsF9sxXXoUYq0#77R0*WEz1{5X z%*-1}TS81yQWC<{)E?g7L|#`ae@;#g8X5gwKfS!{428k2pwi8Da2+AC?qfJjO-=H3 zHO}5NZKh0?>`?O)neNTEZmlpGXATrNL{D#%z3uQ+0IAP-odH zV-N30heDx1=;?_@4zMu#sn&hvz?i|YAPfdWj`@T9oewH3E{>pS%V+h!JlFwNdu{|7 z85)Yhxj)%gSy5pN?=xb`<*A8+<{$|PTtcH&s}(t+AP|VNl3Js9{~oryyu8{i*nBDF zMAy_*rQWVsn|+y~^(k7C#l^C@i+b%OBqg%aY526a^b(|-^Fb`eT|q|P;I_4OzIkKT z#^wI@a#Xo}ZT3A~a9LfNDcoySahJ_5XD}EEX;0?{1_vi35?f(JwM;G_`XmRHE;ZMC zWgDW{Q=_B&U$e62CDqPf9XoC9>?UL~`>@hd&8@`naDmcbDX&W|cN}^BS{$C0;5zYi zyG1lmL|c!qco0daK5RU6;qjGqI*#XB|6*muMTIDF=6cC?q5SK~Z0YiM?ssf}2;{qb6XwkHZCkxE_e zMTnk%jVORU;&7@#!!5audioInputId( ) | rpl::start_with_next([=](QString id) { @@ -465,6 +468,14 @@ void GroupCall::setJoinAs(not_null as) { } } +void GroupCall::saveDefaultJoinAs(not_null as) { + setJoinAs(as); + _api.request(MTPphone_SaveDefaultGroupCallJoinAs( + _peer->input, + _joinAs->input + )).send(); +} + void GroupCall::rejoin(not_null as) { if (state() != State::Joining && state() != State::Joined @@ -695,11 +706,7 @@ void GroupCall::rejoinAs(Group::JoinInfo info) { .nowJoinAs = info.joinAs, }; if (_scheduleDate) { - setJoinAs(info.joinAs); - _api.request(MTPphone_SaveDefaultGroupCallJoinAs( - _peer->input, - _joinAs->input - )).send(); + saveDefaultJoinAs(info.joinAs); } else { setState(State::Joining); rejoin(info.joinAs); diff --git a/Telegram/SourceFiles/calls/calls_group_call.h b/Telegram/SourceFiles/calls/calls_group_call.h index b070e5cdb..6792f7a31 100644 --- a/Telegram/SourceFiles/calls/calls_group_call.h +++ b/Telegram/SourceFiles/calls/calls_group_call.h @@ -256,6 +256,7 @@ private: void rejoin(); void rejoin(not_null as); void setJoinAs(not_null as); + void saveDefaultJoinAs(not_null as); void subscribeToReal(not_null real); void audioLevelsUpdated(const tgcalls::GroupLevelsUpdate &data); diff --git a/Telegram/SourceFiles/calls/calls_group_panel.cpp b/Telegram/SourceFiles/calls/calls_group_panel.cpp index 932de26a1..c0f29e4f4 100644 --- a/Telegram/SourceFiles/calls/calls_group_panel.cpp +++ b/Telegram/SourceFiles/calls/calls_group_panel.cpp @@ -175,13 +175,13 @@ private: })) | rpl::flatten_latest(); if (tillTomorrow > 0) { - return std::move(full); + return full; } else if (tillToday > 0) { - return std::move(tomorrowAndAfter); + return tomorrowAndAfter; } else if (tillAfter > 0) { - return std::move(todayAndAfter); + return todayAndAfter; } else { - return std::move(exact); + return exact; } }) | rpl::flatten_latest(); } @@ -381,7 +381,6 @@ Panel::Panel(not_null call) _window->body(), st::groupCallTitle)) #endif // !Q_OS_MAC -, _settings(widget(), st::groupCallSettings) , _mute(std::make_unique( widget(), Core::App().appDeactivatedValue(), @@ -395,7 +394,6 @@ Panel::Panel(not_null call) })) , _hangup(widget(), st::groupCallHangup) { _layerBg->setStyleOverrides(&st::groupCallBox, &st::groupCallLayerBox); - _settings->setColorOverrides(_mute->colorOverrides()); _layerBg->setHideByBackgroundClick(true); SubscribeToMigration( @@ -591,12 +589,11 @@ void Panel::initControls() { _call->setMutedAndUpdate(newState); }, _mute->lifetime()); - _hangup->setClickedCallback([=] { endCall(); }); - _settings->setClickedCallback([=] { - _layerBg->showBox(Box(SettingsBox, _call)); - }); + initShareAction(); + refreshLeftButton(); + + _hangup->setClickedCallback([=] { endCall(); }); - _settings->setText(tr::lng_group_call_settings()); const auto scheduleDate = _call->scheduleDate(); _hangup->setText(scheduleDate ? tr::lng_group_call_close() @@ -606,12 +603,27 @@ void Panel::initControls() { ) | rpl::map([=](not_null real) { return real->scheduleDateValue(); }) | rpl::flatten_latest(); + setupScheduledLabels(rpl::single( scheduleDate ) | rpl::then(rpl::duplicate(changes))); - std::move(changes) | rpl::filter([](TimeId date) { + + auto started = std::move(changes) | rpl::filter([](TimeId date) { return (date == 0); - }) | rpl::take(1) | rpl::start_with_next([=] { + }) | rpl::take(1); + + rpl::merge( + rpl::duplicate(started) | rpl::to_empty, + _peer->session().changes().peerFlagsValue( + _peer, + Data::PeerUpdate::Flag::Username + ) | rpl::skip(1) | rpl::to_empty + ) | rpl::start_with_next([=] { + refreshLeftButton(); + updateControlsGeometry(); + }, _callLifetime); + + std::move(started) | rpl::start_with_next([=] { _hangup->setText(tr::lng_group_call_leave()); setupMembers(); }, _callLifetime); @@ -640,6 +652,53 @@ void Panel::initControls() { }, _callLifetime); } +void Panel::refreshLeftButton() { + const auto share = _call->scheduleDate() + && _peer->isBroadcast() + && _peer->asChannel()->hasUsername(); + if ((share && _share) || (!share && _settings)) { + return; + } + if (share) { + _settings.destroy(); + _share.create(widget(), st::groupCallShare); + _share->setClickedCallback(_shareLinkCallback); + _share->setText(tr::lng_group_call_share_button()); + } else { + _share.destroy(); + _settings.create(widget(), st::groupCallSettings); + _settings->setClickedCallback([=] { + _layerBg->showBox(Box(SettingsBox, _call)); + }); + _settings->setText(tr::lng_group_call_settings()); + } + const auto raw = _share ? _share.data() : _settings.data(); + raw->show(); + raw->setColorOverrides(_mute->colorOverrides()); +} + +void Panel::initShareAction() { + const auto showBox = [=](object_ptr next) { + _layerBg->showBox(std::move(next)); + }; + const auto showToast = [=](QString text) { + Ui::ShowMultilineToast({ + .parentOverride = widget(), + .text = { text }, + }); + }; + auto [shareLinkCallback, shareLinkLifetime] = ShareInviteLinkAction( + _peer, + showBox, + showToast); + _shareLinkCallback = [=, callback = std::move(shareLinkCallback)] { + if (_call->lookupReal()) { + callback(); + } + }; + widget()->lifetime().add(std::move(shareLinkLifetime)); +} + void Panel::setupRealMuteButtonState(not_null real) { using namespace rpl::mappers; rpl::combine( @@ -792,26 +851,10 @@ void Panel::setupMembers() { kickParticipant(participantPeer); }, _callLifetime); - const auto showBox = [=](object_ptr next) { - _layerBg->showBox(std::move(next)); - }; - const auto showToast = [=](QString text) { - Ui::ShowMultilineToast({ - .parentOverride = widget(), - .text = { text }, - }); - }; - auto [shareLinkCallback, shareLinkLifetime] = ShareInviteLinkAction( - _peer, - showBox, - showToast); - auto shareLink = std::move(shareLinkCallback); - _members->lifetime().add(std::move(shareLinkLifetime)); - _members->addMembersRequests( ) | rpl::start_with_next([=] { if (_peer->isBroadcast() && _peer->asChannel()->hasUsername()) { - shareLink(); + _shareLinkCallback(); } else { addMembers(); } @@ -1304,18 +1347,24 @@ QRect Panel::computeTitleRect() const { } void Panel::updateControlsGeometry() { - if (widget()->size().isEmpty()) { + if (widget()->size().isEmpty() || (!_settings && !_share)) { return; } const auto muteTop = widget()->height() - st::groupCallMuteBottomSkip; const auto buttonsTop = widget()->height() - st::groupCallButtonBottomSkip; const auto muteSize = _mute->innerSize().width(); const auto fullWidth = muteSize - + 2 * _settings->width() + + 2 * (_settings ? _settings : _share)->width() + 2 * st::groupCallButtonSkip; _mute->moveInner({ (widget()->width() - muteSize) / 2, muteTop }); - _settings->moveToLeft((widget()->width() - fullWidth) / 2, buttonsTop); - _hangup->moveToRight((widget()->width() - fullWidth) / 2, buttonsTop); + const auto leftButtonLeft = (widget()->width() - fullWidth) / 2; + if (_settings) { + _settings->moveToLeft(leftButtonLeft, buttonsTop); + } + if (_share) { + _share->moveToLeft(leftButtonLeft, buttonsTop); + } + _hangup->moveToRight(leftButtonLeft, buttonsTop); updateMembersGeometry(); refreshTitle(); diff --git a/Telegram/SourceFiles/calls/calls_group_panel.h b/Telegram/SourceFiles/calls/calls_group_panel.h index c05ba7be9..71d68042c 100644 --- a/Telegram/SourceFiles/calls/calls_group_panel.h +++ b/Telegram/SourceFiles/calls/calls_group_panel.h @@ -74,6 +74,7 @@ private: void initWindow(); void initWidget(); void initControls(); + void initShareAction(); void initLayout(); void initGeometry(); void setupScheduledLabels(rpl::producer date); @@ -89,6 +90,7 @@ private: void updateControlsGeometry(); void updateMembersGeometry(); void showControls(); + void refreshLeftButton(); void endCall(); @@ -131,9 +133,11 @@ private: object_ptr _startsWhen = { nullptr }; ChooseJoinAsProcess _joinAsProcess; - object_ptr _settings; + object_ptr _settings = { nullptr }; + object_ptr _share = { nullptr }; std::unique_ptr _mute; object_ptr _hangup; + Fn _shareLinkCallback; rpl::lifetime _peerLifetime; diff --git a/Telegram/SourceFiles/calls/calls_group_settings.cpp b/Telegram/SourceFiles/calls/calls_group_settings.cpp index 79e0bfdc1..9ae8bbcae 100644 --- a/Telegram/SourceFiles/calls/calls_group_settings.cpp +++ b/Telegram/SourceFiles/calls/calls_group_settings.cpp @@ -676,7 +676,7 @@ std::pair, rpl::lifetime> ShareInviteLinkAction( return true; }; auto callback = [=] { - const auto real = peer->groupCall(); + const auto real = peer->migrateToOrMe()->groupCall(); if (shareReady() || state->generatingLink || !real) { return; } @@ -701,11 +701,11 @@ std::pair, rpl::lifetime> ShareInviteLinkAction( state->linkSpeakerRequestId = peer->session().api().request( MTPphone_ExportGroupCallInvite( MTP_flags(Flag::f_can_self_unmute), - real->input() - )).done([=](const MTPphone_ExportedGroupCallInvite &result) { + real->input()) + ).done([=](const MTPphone_ExportedGroupCallInvite &result) { state->linkSpeakerRequestId = 0; result.match([&]( - const MTPDphone_exportedGroupCallInvite &data) { + const MTPDphone_exportedGroupCallInvite &data) { state->linkSpeaker = qs(data.vlink()); shareReady(); });