From 5146c05ec3c19afbfcdc4776d3fd9f09aecb388d Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 26 Jan 2026 14:37:42 +0300 Subject: [PATCH] Added ability to start outgoing call without user confirmation. --- .../SourceFiles/calls/calls_box_controller.cpp | 2 +- Telegram/SourceFiles/calls/calls_instance.cpp | 14 ++++++++------ Telegram/SourceFiles/calls/calls_instance.h | 12 ++++++++++-- .../calls/group/calls_group_invite_controller.cpp | 2 +- .../history/view/history_view_top_bar_widget.cpp | 6 +++--- .../history/view/history_view_top_bar_widget.h | 6 +++++- .../history/view/media/history_view_call.cpp | 2 +- Telegram/SourceFiles/info/info_wrap_widget.cpp | 2 +- .../info/profile/info_profile_top_bar.cpp | 2 +- 9 files changed, 31 insertions(+), 17 deletions(-) diff --git a/Telegram/SourceFiles/calls/calls_box_controller.cpp b/Telegram/SourceFiles/calls/calls_box_controller.cpp index db9a550624..d7062d5225 100644 --- a/Telegram/SourceFiles/calls/calls_box_controller.cpp +++ b/Telegram/SourceFiles/calls/calls_box_controller.cpp @@ -612,7 +612,7 @@ void BoxController::rowRightActionClicked(not_null row) { auto user = row->peer()->asUser(); Assert(user != nullptr); - Core::App().calls().startOutgoingCall(user, false); + Core::App().calls().startOutgoingCall(user, {}); } void BoxController::receivedCalls(const QVector &result) { diff --git a/Telegram/SourceFiles/calls/calls_instance.cpp b/Telegram/SourceFiles/calls/calls_instance.cpp index 6af96a3012..42c7806086 100644 --- a/Telegram/SourceFiles/calls/calls_instance.cpp +++ b/Telegram/SourceFiles/calls/calls_instance.cpp @@ -196,7 +196,9 @@ Instance::~Instance() { } } -void Instance::startOutgoingCall(not_null user, bool video) { +void Instance::startOutgoingCall( + not_null user, + StartOutgoingCallArgs args) { if (activateCurrentCall()) { return; } @@ -210,8 +212,8 @@ void Instance::startOutgoingCall(not_null user, bool video) { return; } requestPermissionsOrFail(crl::guard(this, [=] { - createCall(user, Call::Type::Outgoing, video); - }), video); + createCall(user, Call::Type::Outgoing, args); + }), args.video); } void Instance::startOrJoinGroupCall( @@ -413,7 +415,7 @@ void Instance::destroyCall(not_null call) { void Instance::createCall( not_null user, CallType type, - bool isVideo) { + StartOutgoingCallArgs args) { struct Performer final { explicit Performer(Fn callback) : callback(std::move(callback)) { @@ -455,7 +457,7 @@ void Instance::createCall( } _currentCallChanges.fire_copy(raw); }); - performer.callback(isVideo, false, performer); + performer.callback(args.video, args.isConfirmed, performer); } void Instance::destroyGroupCall(not_null call) { @@ -702,7 +704,7 @@ void Instance::handleCallUpdate( < base::unixtime::now()) { LOG(("Ignoring too old call.")); } else { - createCall(user, Call::Type::Incoming, phoneCall.is_video()); + createCall(user, Call::Type::Incoming, { phoneCall.is_video() }); _currentCall->handleUpdate(call); } } else if (!_currentCall diff --git a/Telegram/SourceFiles/calls/calls_instance.h b/Telegram/SourceFiles/calls/calls_instance.h index 651cdded99..4742827c69 100644 --- a/Telegram/SourceFiles/calls/calls_instance.h +++ b/Telegram/SourceFiles/calls/calls_instance.h @@ -55,6 +55,11 @@ struct DhConfig; struct InviteRequest; struct StartConferenceInfo; +struct StartOutgoingCallArgs { + bool video = false; + bool isConfirmed = false; +}; + struct StartGroupCallArgs { enum class JoinConfirm { None, @@ -80,7 +85,7 @@ public: Instance(); ~Instance(); - void startOutgoingCall(not_null user, bool video); + void startOutgoingCall(not_null user, StartOutgoingCallArgs); void startOrJoinGroupCall( std::shared_ptr show, not_null peer, @@ -159,7 +164,10 @@ private: not_null ensureSoundLoaded(const QString &key); void playSoundOnce(const QString &key); - void createCall(not_null user, CallType type, bool isVideo); + void createCall( + not_null user, + CallType type, + StartOutgoingCallArgs); void destroyCall(not_null call); void finishConferenceInvitations(const StartConferenceInfo &args); diff --git a/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp b/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp index 4b1c8b2fdf..5a81a58a20 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp @@ -1191,7 +1191,7 @@ object_ptr PrepareCreateCallBox( const auto &invite = selected.front(); Core::App().calls().startOutgoingCall( invite.user, - invite.video); + { invite.video }); } finished(true); }; diff --git a/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp b/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp index 02aed3ddc1..bc6dded67d 100644 --- a/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp @@ -154,7 +154,7 @@ TopBarWidget::TopBarWidget( _delete->setClickedCallback([=] { _deleteSelection.fire({}); }); _delete->setWidthChangedCallback([=] { updateControlsGeometry(); }); _clear->setClickedCallback([=] { _clearSelection.fire({}); }); - _call->setClickedCallback([=] { call(); }); + _call->setClickedCallback([=] { call({}); }); _groupCall->setClickedCallback([=] { groupCall(); }); _menuToggle->setClickedCallback([=] { showPeerMenu(); }); _infoToggle->setClickedCallback([=] { toggleInfoSection(); }); @@ -288,12 +288,12 @@ void TopBarWidget::refreshLang() { InvokeQueued(this, [this] { updateControlsGeometry(); }); } -void TopBarWidget::call() { +void TopBarWidget::call(Calls::StartOutgoingCallArgs args) { if (_controller->showFrozenError()) { return; } else if (const auto peer = _activeChat.key.peer()) { if (const auto user = peer->asUser()) { - Core::App().calls().startOutgoingCall(user, false); + Core::App().calls().startOutgoingCall(user, std::move(args)); } } } diff --git a/Telegram/SourceFiles/history/view/history_view_top_bar_widget.h b/Telegram/SourceFiles/history/view/history_view_top_bar_widget.h index 5bbd5182d5..e45ba8a22d 100644 --- a/Telegram/SourceFiles/history/view/history_view_top_bar_widget.h +++ b/Telegram/SourceFiles/history/view/history_view_top_bar_widget.h @@ -36,6 +36,10 @@ namespace Window { class SessionController; } // namespace Window +namespace Calls { +struct StartOutgoingCallArgs; +} // namespace Calls + namespace HistoryView { class SendActionPainter; @@ -141,7 +145,7 @@ private: void updateInfoToggleActive(); void setupDragOnBackButton(); - void call(); + void call(Calls::StartOutgoingCallArgs); void groupCall(); void showGroupCallMenu(not_null peer); void toggleInfoSection(); diff --git a/Telegram/SourceFiles/history/view/media/history_view_call.cpp b/Telegram/SourceFiles/history/view/media/history_view_call.cpp index 6cfd8c938b..0e58229f31 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_call.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_call.cpp @@ -76,7 +76,7 @@ QSize Call::countOptimalSize() { strong->resolveConferenceCall(id, contextId); } } else if (user) { - Core::App().calls().startOutgoingCall(user, video); + Core::App().calls().startOutgoingCall(user, { video }); } }); auto maxWidth = st::historyCallWidth; diff --git a/Telegram/SourceFiles/info/info_wrap_widget.cpp b/Telegram/SourceFiles/info/info_wrap_widget.cpp index 4a59252659..57bf5a15f3 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.cpp +++ b/Telegram/SourceFiles/info/info_wrap_widget.cpp @@ -549,7 +549,7 @@ void WrapWidget::addProfileCallsButton() { ? st::infoLayerTopBarCall : st::infoTopBarCall)) )->addClickHandler([=] { - Core::App().calls().startOutgoingCall(user, false); + Core::App().calls().startOutgoingCall(user, {}); }); }, _topBar->lifetime()); diff --git a/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp b/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp index beff2e6a29..846c721981 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp @@ -861,7 +861,7 @@ void TopBar::setupActions(not_null controller) { tr::lng_profile_action_short_call(tr::now), st::infoProfileTopBarActionCall); call->setClickedCallback([=] { - Core::App().calls().startOutgoingCall(user, false); + Core::App().calls().startOutgoingCall(user, {}); }); buttons.push_back(call); _actions->add(call);