From 092e0990e89d55b26437e4a0259dfe815f89b452 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 9 Dec 2020 17:11:42 +0400 Subject: [PATCH] Request mic permission only on unmute. --- .../SourceFiles/calls/calls_group_call.cpp | 21 ++++++++++++------- Telegram/SourceFiles/calls/calls_group_call.h | 3 ++- Telegram/SourceFiles/calls/calls_instance.cpp | 16 +++++++------- Telegram/SourceFiles/calls/calls_instance.h | 8 +++++-- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/Telegram/SourceFiles/calls/calls_group_call.cpp b/Telegram/SourceFiles/calls/calls_group_call.cpp index 8f3f51ca9f..466dae4bf5 100644 --- a/Telegram/SourceFiles/calls/calls_group_call.cpp +++ b/Telegram/SourceFiles/calls/calls_group_call.cpp @@ -354,13 +354,20 @@ void GroupCall::finish(FinishType type) { } void GroupCall::setMuted(MuteState mute) { - const auto wasMuted = (muted() == MuteState::Muted) - || (muted() == MuteState::PushToTalk); - _muted = mute; - const auto nowMuted = (muted() == MuteState::Muted) - || (muted() == MuteState::PushToTalk); - if (wasMuted != nowMuted) { - applySelfInCallLocally(); + const auto set = [=] { + const auto wasMuted = (muted() == MuteState::Muted) + || (muted() == MuteState::PushToTalk); + _muted = mute; + const auto nowMuted = (muted() == MuteState::Muted) + || (muted() == MuteState::PushToTalk); + if (wasMuted != nowMuted) { + applySelfInCallLocally(); + } + }; + if (mute == MuteState::Active || mute == MuteState::PushToTalk) { + _delegate->groupCallRequestPermissionsOrFail(crl::guard(this, set)); + } else { + set(); } } diff --git a/Telegram/SourceFiles/calls/calls_group_call.h b/Telegram/SourceFiles/calls/calls_group_call.h index 6f54d0100d..d2fcde07c6 100644 --- a/Telegram/SourceFiles/calls/calls_group_call.h +++ b/Telegram/SourceFiles/calls/calls_group_call.h @@ -53,7 +53,8 @@ public: virtual void groupCallFinished(not_null call) = 0; virtual void groupCallFailed(not_null call) = 0; - + virtual void groupCallRequestPermissionsOrFail( + Fn onSuccess) = 0; }; using GlobalShortcutManager = base::GlobalShortcutManager; diff --git a/Telegram/SourceFiles/calls/calls_instance.cpp b/Telegram/SourceFiles/calls/calls_instance.cpp index 80622d9d71..5e11aefcf7 100644 --- a/Telegram/SourceFiles/calls/calls_instance.cpp +++ b/Telegram/SourceFiles/calls/calls_instance.cpp @@ -60,12 +60,11 @@ void Instance::startOutgoingCall(not_null user, bool video) { void Instance::startOrJoinGroupCall(not_null channel) { destroyCurrentCall(); - requestPermissionsOrFail(crl::guard(this, [=] { - const auto call = channel->call(); - createGroupCall( - channel, - call ? call->input() : MTP_inputGroupCall(MTPlong(), MTPlong())); - }), false); + + const auto call = channel->call(); + createGroupCall( + channel, + call ? call->input() : MTP_inputGroupCall(MTPlong(), MTPlong())); } void Instance::callFinished(not_null call) { @@ -186,9 +185,8 @@ void Instance::destroyGroupCall(not_null call) { void Instance::createGroupCall( not_null channel, const MTPInputGroupCall &inputCall) { - if (_currentGroupCall) { - destroyGroupCall(_currentGroupCall.get()); - } + destroyCurrentCall(); + auto call = std::make_unique( getGroupCallDelegate(), channel, diff --git a/Telegram/SourceFiles/calls/calls_instance.h b/Telegram/SourceFiles/calls/calls_instance.h index 4fde646e14..e6e0a37312 100644 --- a/Telegram/SourceFiles/calls/calls_instance.h +++ b/Telegram/SourceFiles/calls/calls_instance.h @@ -55,7 +55,9 @@ public: [[nodiscard]] bool hasActivePanel( not_null session) const; bool activateCurrentCall(); - std::shared_ptr getVideoCapture() override; + auto getVideoCapture() + -> std::shared_ptr override; + void requestPermissionsOrFail(Fn onSuccess, bool video = true); void setCurrentAudioDevice(bool input, const QString &deviceId); @@ -82,6 +84,9 @@ private: void groupCallFinished(not_null call) override; void groupCallFailed(not_null call) override; + void groupCallRequestPermissionsOrFail(Fn onSuccess) override { + requestPermissionsOrFail(std::move(onSuccess), false); + } using Sound = Call::Delegate::Sound; void playSound(Sound sound) override; @@ -93,7 +98,6 @@ private: const MTPInputGroupCall &inputCall); void destroyGroupCall(not_null call); - void requestPermissionsOrFail(Fn onSuccess, bool video = true); void requestPermissionOrFail(Platform::PermissionType type, Fn onSuccess); void refreshDhConfig();