From 67e698a37401ee6af89f737543f55acfb03f6f62 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 18 Apr 2018 19:42:02 +0400 Subject: [PATCH] Add support for requesting deep link info. Also update API scheme. Also remove auth.checkPhone requests. --- Telegram/Resources/scheme.tl | 4 +++ Telegram/SourceFiles/apiwrap.cpp | 16 ++++++++++ Telegram/SourceFiles/apiwrap.h | 5 +++ Telegram/SourceFiles/boxes/confirm_box.cpp | 27 ++++++++++++++++ Telegram/SourceFiles/boxes/confirm_box.h | 8 +++-- Telegram/SourceFiles/core/update_checker.cpp | 31 +++++++++++++++++++ Telegram/SourceFiles/core/update_checker.h | 1 + Telegram/SourceFiles/messenger.cpp | 24 +++++++++++++- .../settings/settings_general_widget.cpp | 8 +++++ .../settings/settings_general_widget.h | 2 ++ .../settings/settings_inner_widget.cpp | 16 +++++++++- .../settings/settings_inner_widget.h | 3 ++ .../SourceFiles/settings/settings_layer.cpp | 4 +++ .../SourceFiles/settings/settings_layer.h | 1 + .../SourceFiles/settings/settings_widget.cpp | 6 ++++ .../SourceFiles/settings/settings_widget.h | 1 + 16 files changed, 153 insertions(+), 4 deletions(-) diff --git a/Telegram/Resources/scheme.tl b/Telegram/Resources/scheme.tl index 62b9e7cc8..5fe56ee2b 100644 --- a/Telegram/Resources/scheme.tl +++ b/Telegram/Resources/scheme.tl @@ -1006,6 +1006,9 @@ account.authorizationForm#cb976d53 flags:# selfie_required:flags.1?true required account.sentEmailCode#811f854f email_pattern:string length:int = account.SentEmailCode; +help.deepLinkInfoEmpty#66afa166 = help.DeepLinkInfo; +help.deepLinkInfo#6a4ee832 flags:# update_app:flags.0?true message:string entities:flags.1?Vector = help.DeepLinkInfo; + ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; @@ -1219,6 +1222,7 @@ help.getRecentMeUrls#3dc0f114 referer:string = help.RecentMeUrls; help.getProxyData#3d7758e1 = help.ProxyData; help.getTermsOfServiceUpdate#2ca51fd1 = help.TermsOfServiceUpdate; help.acceptTermsOfService#ee72f79a id:DataJSON = Bool; +help.getDeepLinkInfo#3fedc75f path:string = help.DeepLinkInfo; channels.readHistory#cc104937 channel:InputChannel max_id:int = Bool; channels.deleteMessages#84c1fd4e channel:InputChannel id:Vector = messages.AffectedMessages; diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 8c1ee6db3..cb78db9d1 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -233,6 +233,22 @@ void ApiWrap::proxyPromotionDone(const MTPhelp_ProxyData &proxy) { } } +void ApiWrap::requestDeepLinkInfo( + const QString &path, + base::lambda callback) { + request(_deepLinkInfoRequestId).cancel(); + _deepLinkInfoRequestId = request(MTPhelp_GetDeepLinkInfo( + MTP_string(path) + )).done([=](const MTPhelp_DeepLinkInfo &result) { + _deepLinkInfoRequestId = 0; + if (result.type() == mtpc_help_deepLinkInfo) { + callback(result.c_help_deepLinkInfo()); + } + }).fail([=](const RPCError &error) { + _deepLinkInfoRequestId = 0; + }).send(); +} + void ApiWrap::applyUpdates( const MTPUpdates &updates, uint64 sentMessageRandomId) { diff --git a/Telegram/SourceFiles/apiwrap.h b/Telegram/SourceFiles/apiwrap.h index 4ba0c2507..a68b8b548 100644 --- a/Telegram/SourceFiles/apiwrap.h +++ b/Telegram/SourceFiles/apiwrap.h @@ -94,6 +94,9 @@ public: const QString &sinceVersion, base::lambda callback); void refreshProxyPromotion(); + void requestDeepLinkInfo( + const QString &path, + base::lambda callback); void requestChannelMembersForAdd( not_null channel, @@ -578,4 +581,6 @@ private: base::flat_set> _updateNotifySettingsPeers; base::Timer _updateNotifySettingsTimer; + mtpRequestId _deepLinkInfoRequestId = 0; + }; diff --git a/Telegram/SourceFiles/boxes/confirm_box.cpp b/Telegram/SourceFiles/boxes/confirm_box.cpp index dedbf6f1c..9770f20fb 100644 --- a/Telegram/SourceFiles/boxes/confirm_box.cpp +++ b/Telegram/SourceFiles/boxes/confirm_box.cpp @@ -53,6 +53,16 @@ ConfirmBox::ConfirmBox(QWidget*, const QString &text, const QString &confirmText init(text); } +ConfirmBox::ConfirmBox(QWidget*, const TextWithEntities &text, const QString &confirmText, base::lambda_once confirmedCallback, base::lambda_once cancelledCallback) +: _confirmText(confirmText) +, _cancelText(lang(lng_cancel)) +, _confirmStyle(st::defaultBoxButton) +, _text(st::boxWidth - st::boxPadding.left() - st::boxButtonPadding.right()) +, _confirmedCallback(std::move(confirmedCallback)) +, _cancelledCallback(std::move(cancelledCallback)) { + init(text); +} + ConfirmBox::ConfirmBox(QWidget*, const QString &text, const QString &confirmText, const style::RoundButton &confirmStyle, base::lambda_once confirmedCallback, base::lambda_once cancelledCallback) : _confirmText(confirmText) , _cancelText(lang(lng_cancel)) @@ -93,6 +103,16 @@ ConfirmBox::ConfirmBox(const InformBoxTag &, const QString &text, const QString init(text); } +ConfirmBox::ConfirmBox(const InformBoxTag &, const TextWithEntities &text, const QString &doneText, base::lambda closedCallback) +: _confirmText(doneText) +, _confirmStyle(st::defaultBoxButton) +, _informative(true) +, _text(st::boxWidth - st::boxPadding.left() - st::boxButtonPadding.right()) +, _confirmedCallback(generateInformCallback(closedCallback)) +, _cancelledCallback(generateInformCallback(closedCallback)) { + init(text); +} + base::lambda_once ConfirmBox::generateInformCallback(base::lambda closedCallback) { return base::lambda_guarded(this, [this, closedCallback] { closeBox(); @@ -106,6 +126,10 @@ void ConfirmBox::init(const QString &text) { _text.setText(st::boxLabelStyle, text, _informative ? _confirmBoxTextOptions : _textPlainOptions); } +void ConfirmBox::init(const TextWithEntities &text) { + _text.setMarkedText(st::boxLabelStyle, text, _confirmBoxTextOptions); +} + void ConfirmBox::prepare() { addButton([this] { return _confirmText; }, [this] { confirmed(); }, _confirmStyle); if (!_informative) { @@ -223,6 +247,9 @@ InformBox::InformBox(QWidget*, const QString &text, base::lambda closedC InformBox::InformBox(QWidget*, const QString &text, const QString &doneText, base::lambda closedCallback) : ConfirmBox(ConfirmBox::InformBoxTag(), text, doneText, std::move(closedCallback)) { } +InformBox::InformBox(QWidget*, const TextWithEntities &text, base::lambda closedCallback) : ConfirmBox(ConfirmBox::InformBoxTag(), text, lang(lng_box_ok), std::move(closedCallback)) { +} + MaxInviteBox::MaxInviteBox(QWidget*, not_null channel) : BoxContent() , _channel(channel) , _text(st::boxLabelStyle, lng_participant_invite_sorry(lt_count, Global::ChatSizeMax()), _confirmBoxTextOptions, st::boxWidth - st::boxPadding.left() - st::boxButtonPadding.right()) { diff --git a/Telegram/SourceFiles/boxes/confirm_box.h b/Telegram/SourceFiles/boxes/confirm_box.h index 1f5e21714..ec366c3ae 100644 --- a/Telegram/SourceFiles/boxes/confirm_box.h +++ b/Telegram/SourceFiles/boxes/confirm_box.h @@ -23,6 +23,7 @@ public: ConfirmBox(QWidget*, const QString &text, const QString &confirmText, const style::RoundButton &confirmStyle, base::lambda_once confirmedCallback = base::lambda_once(), base::lambda_once cancelledCallback = base::lambda_once()); ConfirmBox(QWidget*, const QString &text, const QString &confirmText, const QString &cancelText, base::lambda_once confirmedCallback = base::lambda_once(), base::lambda_once cancelledCallback = base::lambda_once()); ConfirmBox(QWidget*, const QString &text, const QString &confirmText, const style::RoundButton &confirmStyle, const QString &cancelText, base::lambda_once confirmedCallback = base::lambda_once(), base::lambda_once cancelledCallback = base::lambda_once()); + ConfirmBox(QWidget*, const TextWithEntities &text, const QString &confirmText, base::lambda_once confirmedCallback = nullptr, base::lambda_once cancelledCallback = nullptr); void updateLink(); @@ -51,11 +52,13 @@ private: struct InformBoxTag { }; ConfirmBox(const InformBoxTag &, const QString &text, const QString &doneText, base::lambda closedCallback); + ConfirmBox(const InformBoxTag &, const TextWithEntities &text, const QString &doneText, base::lambda closedCallback); base::lambda_once generateInformCallback(base::lambda closedCallback); friend class InformBox; void confirmed(); void init(const QString &text); + void init(const TextWithEntities &text); void textUpdated(); void updateHover(); @@ -81,8 +84,9 @@ private: class InformBox : public ConfirmBox { public: - InformBox(QWidget*, const QString &text, base::lambda closedCallback = base::lambda()); - InformBox(QWidget*, const QString &text, const QString &doneText, base::lambda closedCallback = base::lambda()); + InformBox(QWidget*, const QString &text, base::lambda closedCallback = nullptr); + InformBox(QWidget*, const QString &text, const QString &doneText, base::lambda closedCallback = nullptr); + InformBox(QWidget*, const TextWithEntities &text, base::lambda closedCallback = nullptr); }; diff --git a/Telegram/SourceFiles/core/update_checker.cpp b/Telegram/SourceFiles/core/update_checker.cpp index 3fe4779cc..108367a9c 100644 --- a/Telegram/SourceFiles/core/update_checker.cpp +++ b/Telegram/SourceFiles/core/update_checker.cpp @@ -14,6 +14,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "storage/localstorage.h" #include "messenger.h" #include "mtproto/session.h" +#include "mainwindow.h" +#include "core/click_handler_types.h" +#include "settings/settings_widget.h" #include #include @@ -2094,6 +2097,34 @@ bool checkReadyUpdate() { return true; } +void UpdateApplication() { + cSetLastUpdateCheck(0); + Core::UpdateChecker().start(); + if (const auto window = App::wnd()) { + auto settings = Box(); + const auto weak = make_weak(settings.data()); + window->showSpecialLayer(std::move(settings), anim::type::normal); + if (weak) { + weak->scrollToUpdateRow(); + } + } +} + +#else // !TDESKTOP_DISABLE_AUTOUPDATE + +void UpdateApplication() { + const auto url = [&] { +#ifdef OS_WIN_STORE + return "https://www.microsoft.com/en-us/store/p/telegram-desktop/9nztwsqntd0s"; +#elif defined OS_MAC_STORE // OS_WIN_STORE + return "https://itunes.apple.com/ae/app/telegram-desktop/id946399090"; +#else // OS_WIN_STORE || OS_MAC_STORE + return "https://desktop.telegram.org"; +#endif // OS_WIN_STORE || OS_MAC_STORE + }(); + UrlClickHandler::doOpen(url); +} + #endif // !TDESKTOP_DISABLE_AUTOUPDATE QString countBetaVersionSignature(uint64 version) { // duplicated in packer.cpp diff --git a/Telegram/SourceFiles/core/update_checker.h b/Telegram/SourceFiles/core/update_checker.h index 873d1aab0..656912ba8 100644 --- a/Telegram/SourceFiles/core/update_checker.h +++ b/Telegram/SourceFiles/core/update_checker.h @@ -60,6 +60,7 @@ class UpdateChecker { #endif // TDESKTOP_DISABLE_AUTOUPDATE +void UpdateApplication(); QString countBetaVersionSignature(uint64 version); } // namespace Core diff --git a/Telegram/SourceFiles/messenger.cpp b/Telegram/SourceFiles/messenger.cpp index 561203bfd..f1591bf46 100644 --- a/Telegram/SourceFiles/messenger.cpp +++ b/Telegram/SourceFiles/messenger.cpp @@ -7,11 +7,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "messenger.h" -#include #include "data/data_photo.h" #include "data/data_document.h" #include "data/data_session.h" #include "base/timer.h" +#include "core/update_checker.h" #include "storage/localstorage.h" #include "platform/platform_specific.h" #include "mainwindow.h" @@ -940,6 +940,28 @@ bool Messenger::openLocalUrl(const QString &url) { return showPassportForm(url_parse_params( authMatch->captured(1), UrlParamNameTransform::ToLower)); + } else if (auto unknownMatch = regex_match(qsl("^([^\\?]+)(\\?|#|$)"), command, matchOptions)) { + if (_authSession) { + const auto request = unknownMatch->captured(1); + const auto callback = [=](const MTPDhelp_deepLinkInfo &result) { + const auto text = TextWithEntities{ + qs(result.vmessage), + (result.has_entities() + ? TextUtilities::EntitiesFromMTP(result.ventities.v) + : EntitiesInText()) + }; + if (result.is_update_app()) { + const auto box = std::make_shared>(); + *box = Ui::show(Box( + text, + lang(lng_menu_update), + [=] { Core::UpdateApplication(); if (*box) (*box)->closeBox(); })); + } else { + Ui::show(Box(text)); + } + }; + _authSession->api().requestDeepLinkInfo(request, callback); + } } return false; } diff --git a/Telegram/SourceFiles/settings/settings_general_widget.cpp b/Telegram/SourceFiles/settings/settings_general_widget.cpp index 31df77273..d6e286418 100644 --- a/Telegram/SourceFiles/settings/settings_general_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_general_widget.cpp @@ -168,6 +168,14 @@ GeneralWidget::GeneralWidget(QWidget *parent, UserData *self) : BlockWidget(pare refreshControls(); } +int GeneralWidget::getUpdateTop() const { +#ifndef TDESKTOP_DISABLE_AUTOUPDATE + return 0; // _updateRow->y(); // Just scroll to the top of the whole General widget +#else // !TDESKTOP_DISABLE_AUTOUPDATE + return -1; +#endif // !TDESKTOP_DISABLE_AUTOUPDATE +} + int GeneralWidget::resizeGetHeight(int newWidth) { _changeLanguage->moveToRight(0, st::settingsBlockMarginTop + st::settingsBlockTitleTop + st::settingsBlockTitleFont->ascent - st::defaultLinkButton.font->ascent, newWidth); return BlockWidget::resizeGetHeight(newWidth); diff --git a/Telegram/SourceFiles/settings/settings_general_widget.h b/Telegram/SourceFiles/settings/settings_general_widget.h index 5fc9e08d6..a2a05e540 100644 --- a/Telegram/SourceFiles/settings/settings_general_widget.h +++ b/Telegram/SourceFiles/settings/settings_general_widget.h @@ -68,6 +68,8 @@ class GeneralWidget : public BlockWidget { public: GeneralWidget(QWidget *parent, UserData *self); + int getUpdateTop() const; + protected: int resizeGetHeight(int newWidth) override; diff --git a/Telegram/SourceFiles/settings/settings_inner_widget.cpp b/Telegram/SourceFiles/settings/settings_inner_widget.cpp index 8e39112c0..8a9db4693 100644 --- a/Telegram/SourceFiles/settings/settings_inner_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_inner_widget.cpp @@ -35,6 +35,10 @@ void InnerWidget::fullRebuild() { refreshBlocks(); } +int InnerWidget::getUpdateTop() const { + return _getUpdateTop ? _getUpdateTop() : -1; +} + void InnerWidget::refreshBlocks() { if (App::quitting()) { _cover.destroy(); @@ -51,7 +55,17 @@ void InnerWidget::refreshBlocks() { _blocks->add(object_ptr(this, _self)); _blocks->add(object_ptr(this, _self)); } - _blocks->add(object_ptr(this, _self)); + const auto general = make_weak(_blocks->add(object_ptr( + this, + _self))); + _getUpdateTop = [=] { + if (!general) { + return -1; + } else if (const auto top = general->getUpdateTop(); top >= 0) { + return _blocks->y() + general->y() + top; + } + return -1; + }; if (!cRetina()) { _blocks->add(object_ptr(this, _self)); } diff --git a/Telegram/SourceFiles/settings/settings_inner_widget.h b/Telegram/SourceFiles/settings/settings_inner_widget.h index 813e8390d..3094e9e4b 100644 --- a/Telegram/SourceFiles/settings/settings_inner_widget.h +++ b/Telegram/SourceFiles/settings/settings_inner_widget.h @@ -25,6 +25,8 @@ public: return TWidget::resizeToWidth(newWidth); } + int getUpdateTop() const; + protected: int resizeGetHeight(int newWidth) override; void visibleTopBottomUpdated( @@ -41,6 +43,7 @@ private: UserData *_self = nullptr; int _contentLeft = 0; + base::lambda _getUpdateTop; }; diff --git a/Telegram/SourceFiles/settings/settings_layer.cpp b/Telegram/SourceFiles/settings/settings_layer.cpp index b98b32443..92786629d 100644 --- a/Telegram/SourceFiles/settings/settings_layer.cpp +++ b/Telegram/SourceFiles/settings/settings_layer.cpp @@ -113,4 +113,8 @@ void Layer::setTitle(const QString &title) { _fixedBar->setText(title); } +void Layer::scrollToY(int y) { + _scroll->scrollToY(y); +} + } // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_layer.h b/Telegram/SourceFiles/settings/settings_layer.h index c19248ade..df4a4e847 100644 --- a/Telegram/SourceFiles/settings/settings_layer.h +++ b/Telegram/SourceFiles/settings/settings_layer.h @@ -52,6 +52,7 @@ protected: void setRoundedCorners(bool roundedCorners) { _roundedCorners = roundedCorners; } + void scrollToY(int y); private: void doSetInnerWidget(object_ptr widget); diff --git a/Telegram/SourceFiles/settings/settings_widget.cpp b/Telegram/SourceFiles/settings/settings_widget.cpp index fd19cc5a7..37d638cee 100644 --- a/Telegram/SourceFiles/settings/settings_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_widget.cpp @@ -208,6 +208,12 @@ void Widget::refreshLang() { update(); } +void Widget::scrollToUpdateRow() { + if (const auto top = _inner->getUpdateTop(); top >= 0) { + scrollToY(top); + } +} + void Widget::keyPressEvent(QKeyEvent *e) { codesFeedString(e->text()); return LayerWidget::keyPressEvent(e); diff --git a/Telegram/SourceFiles/settings/settings_widget.h b/Telegram/SourceFiles/settings/settings_widget.h index d9a99452b..beb2937f5 100644 --- a/Telegram/SourceFiles/settings/settings_widget.h +++ b/Telegram/SourceFiles/settings/settings_widget.h @@ -18,6 +18,7 @@ public: Widget(QWidget*); void refreshLang(); + void scrollToUpdateRow(); void parentResized() override;