Support special video calls service messages.

This commit is contained in:
John Preston 2020-07-31 20:56:18 +04:00
parent aba8f72c36
commit 6f90e57523
6 changed files with 58 additions and 30 deletions

View file

@ -1736,10 +1736,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_call_box_status_group" = "({amount}) {status}"; "lng_call_box_status_group" = "({amount}) {status}";
"lng_call_outgoing" = "Outgoing call"; "lng_call_outgoing" = "Outgoing call";
"lng_call_video_outgoing" = "Outgoing video call";
"lng_call_incoming" = "Incoming call"; "lng_call_incoming" = "Incoming call";
"lng_call_video_incoming" = "Incoming video call";
"lng_call_missed" = "Missed call"; "lng_call_missed" = "Missed call";
"lng_call_video_missed" = "Missed video call";
"lng_call_cancelled" = "Cancelled call"; "lng_call_cancelled" = "Cancelled call";
"lng_call_video_cancelled" = "Cancelled video call";
"lng_call_declined" = "Declined call"; "lng_call_declined" = "Declined call";
"lng_call_video_declined" = "Declined video call";
"lng_call_duration_info" = "{time}, {duration}"; "lng_call_duration_info" = "{time}, {duration}";
"lng_call_type_and_duration" = "{type} ({duration})"; "lng_call_type_and_duration" = "{type} ({duration})";

View file

@ -974,8 +974,11 @@ void Call::finish(FinishType type, const MTPPhoneCallDiscardReason &reason) {
auto duration = getDurationMs() / 1000; auto duration = getDurationMs() / 1000;
auto connectionId = _instance ? _instance->getPreferredRelayId() : 0; auto connectionId = _instance ? _instance->getPreferredRelayId() : 0;
_finishByTimeoutTimer.call(kHangupTimeoutMs, [this, finalState] { setState(finalState); }); _finishByTimeoutTimer.call(kHangupTimeoutMs, [this, finalState] { setState(finalState); });
const auto flags = (_videoState.current() == VideoState::Enabled)
? MTPphone_DiscardCall::Flag::f_video
: MTPphone_DiscardCall::Flag(0);
_api.request(MTPphone_DiscardCall( _api.request(MTPphone_DiscardCall(
MTP_flags(0), MTP_flags(flags),
MTP_inputPhoneCall( MTP_inputPhoneCall(
MTP_long(_id), MTP_long(_id),
MTP_long(_accessHash)), MTP_long(_accessHash)),

View file

@ -67,6 +67,7 @@ constexpr auto kFastRevokeRestriction = 24 * 60 * TimeId(60);
return CallFinishReason::Hangup; return CallFinishReason::Hangup;
}(); }();
result.duration = call.vduration().value_or_empty(); result.duration = call.vduration().value_or_empty();
result.video = call.is_video();
return result; return result;
} }
@ -874,7 +875,7 @@ const Call *MediaCall::call() const {
} }
QString MediaCall::notificationText() const { QString MediaCall::notificationText() const {
auto result = Text(parent(), _call.finishReason); auto result = Text(parent(), _call.finishReason, _call.video);
if (_call.duration > 0) { if (_call.duration > 0) {
result = tr::lng_call_type_and_duration( result = tr::lng_call_type_and_duration(
tr::now, tr::now,
@ -916,17 +917,28 @@ std::unique_ptr<HistoryView::Media> MediaCall::createView(
QString MediaCall::Text( QString MediaCall::Text(
not_null<HistoryItem*> item, not_null<HistoryItem*> item,
CallFinishReason reason) { CallFinishReason reason,
bool video) {
if (item->out()) { if (item->out()) {
return (reason == CallFinishReason::Missed) return ((reason == CallFinishReason::Missed)
? tr::lng_call_cancelled(tr::now) ? (video
: tr::lng_call_outgoing(tr::now); ? tr::lng_call_video_cancelled
: tr::lng_call_cancelled)
: (video
? tr::lng_call_video_outgoing
: tr::lng_call_outgoing))(tr::now);
} else if (reason == CallFinishReason::Missed) { } else if (reason == CallFinishReason::Missed) {
return tr::lng_call_missed(tr::now); return (video
? tr::lng_call_video_missed
: tr::lng_call_missed)(tr::now);
} else if (reason == CallFinishReason::Busy) { } else if (reason == CallFinishReason::Busy) {
return tr::lng_call_declined(tr::now); return (video
? tr::lng_call_video_declined
: tr::lng_call_declined)(tr::now);
} }
return tr::lng_call_incoming(tr::now); return (video
? tr::lng_call_video_incoming
: tr::lng_call_incoming)(tr::now);
} }
MediaWebPage::MediaWebPage( MediaWebPage::MediaWebPage(

View file

@ -51,6 +51,7 @@ struct Call {
int duration = 0; int duration = 0;
FinishReason finishReason = FinishReason::Missed; FinishReason finishReason = FinishReason::Missed;
bool video = false;
}; };
struct Invoice { struct Invoice {
@ -287,7 +288,8 @@ public:
static QString Text( static QString Text(
not_null<HistoryItem*> item, not_null<HistoryItem*> item,
CallFinishReason reason); CallFinishReason reason,
bool video);
private: private:
Call _call; Call _call;

View file

@ -21,29 +21,36 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "styles/style_history.h" #include "styles/style_history.h"
namespace HistoryView { namespace HistoryView {
namespace {
using FinishReason = Data::CallFinishReason;
[[nodiscard]] int ComputeDuration(FinishReason reason, int duration) {
return (reason != FinishReason::Missed
&& reason != FinishReason::Busy)
? duration
: 0;
}
} // namespace
Call::Call( Call::Call(
not_null<Element*> parent, not_null<Element*> parent,
not_null<Data::Call*> call) not_null<Data::Call*> call)
: Media(parent) { : Media(parent)
_duration = call->duration; , _duration(ComputeDuration(call->finishReason, call->duration))
_reason = call->finishReason; , _reason(call->finishReason)
, _video(call->video) {
const auto item = parent->data(); const auto item = parent->data();
_text = Data::MediaCall::Text(item, _reason); _text = Data::MediaCall::Text(item, _reason, _video);
_status = parent->dateTime().time().toString(cTimeFormat()); _status = parent->dateTime().time().toString(cTimeFormat());
if (_duration) { if (_duration) {
if (_reason != FinishReason::Missed _status = tr::lng_call_duration_info(
&& _reason != FinishReason::Busy) { tr::now,
_status = tr::lng_call_duration_info( lt_time,
tr::now, _status,
lt_time, lt_duration,
_status, formatDurationWords(_duration));
lt_duration,
formatDurationWords(_duration));
} else {
_duration = 0;
}
} }
} }

View file

@ -39,15 +39,14 @@ public:
return true; return true;
} }
Data::CallFinishReason reason() const;
private: private:
using FinishReason = Data::CallFinishReason; using FinishReason = Data::CallFinishReason;
QSize countOptimalSize() override; QSize countOptimalSize() override;
FinishReason _reason; const int _duration = 0;
int _duration = 0; const FinishReason _reason;
const bool _video = false;
QString _text; QString _text;
QString _status; QString _status;