Added ability to start outgoing call without user confirmation.

This commit is contained in:
23rd
2026-01-26 14:37:42 +03:00
parent b97322c198
commit 5146c05ec3
9 changed files with 31 additions and 17 deletions
@@ -612,7 +612,7 @@ void BoxController::rowRightActionClicked(not_null<PeerListRow*> 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<MTPMessage> &result) {
@@ -196,7 +196,9 @@ Instance::~Instance() {
}
}
void Instance::startOutgoingCall(not_null<UserData*> user, bool video) {
void Instance::startOutgoingCall(
not_null<UserData*> user,
StartOutgoingCallArgs args) {
if (activateCurrentCall()) {
return;
}
@@ -210,8 +212,8 @@ void Instance::startOutgoingCall(not_null<UserData*> 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*> call) {
void Instance::createCall(
not_null<UserData*> user,
CallType type,
bool isVideo) {
StartOutgoingCallArgs args) {
struct Performer final {
explicit Performer(Fn<void(bool, bool, const Performer &)> 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<GroupCall*> 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
+10 -2
View File
@@ -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<UserData*> user, bool video);
void startOutgoingCall(not_null<UserData*> user, StartOutgoingCallArgs);
void startOrJoinGroupCall(
std::shared_ptr<Ui::Show> show,
not_null<PeerData*> peer,
@@ -159,7 +164,10 @@ private:
not_null<Media::Audio::Track*> ensureSoundLoaded(const QString &key);
void playSoundOnce(const QString &key);
void createCall(not_null<UserData*> user, CallType type, bool isVideo);
void createCall(
not_null<UserData*> user,
CallType type,
StartOutgoingCallArgs);
void destroyCall(not_null<Call*> call);
void finishConferenceInvitations(const StartConferenceInfo &args);
@@ -1191,7 +1191,7 @@ object_ptr<Ui::BoxContent> PrepareCreateCallBox(
const auto &invite = selected.front();
Core::App().calls().startOutgoingCall(
invite.user,
invite.video);
{ invite.video });
}
finished(true);
};