From 5efae020c3e421e6d0a6355988a67face4f62b1d Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 13 Jan 2021 21:07:30 +0100 Subject: [PATCH] Some cleanups. All good. --- src/librssguard/librssguard.pro | 5 +- src/librssguard/network-web/oauth2service.cpp | 2 +- .../abstract/gui/formaccountdetails.h | 16 ++ .../services/gmail/gmailentrypoint.cpp | 2 +- .../services/gmail/gmailserviceroot.cpp | 2 +- .../gmail/gui/formeditgmailaccount.cpp | 184 +++------------ .../services/gmail/gui/formeditgmailaccount.h | 35 +-- .../gmail/gui/gmailaccountdetails.cpp | 123 ++++++++++ .../services/gmail/gui/gmailaccountdetails.h | 37 +++ ...gmailaccount.ui => gmailaccountdetails.ui} | 122 ++++------ .../gui/formeditinoreaderaccount.cpp | 185 +++------------ .../inoreader/gui/formeditinoreaderaccount.h | 37 +-- .../inoreader/gui/formeditinoreaderaccount.ui | 216 ------------------ .../inoreader/gui/inoreaderaccountdetails.cpp | 122 +++++++++- .../inoreader/gui/inoreaderaccountdetails.h | 17 ++ .../inoreader/gui/inoreaderaccountdetails.ui | 37 +-- .../inoreader/inoreaderentrypoint.cpp | 2 +- .../inoreader/inoreaderserviceroot.cpp | 2 +- .../owncloud/gui/formeditowncloudaccount.cpp | 13 -- .../owncloud/gui/formeditowncloudaccount.h | 2 - .../owncloud/owncloudserviceentrypoint.cpp | 2 +- .../tt-rss/gui/formeditttrssaccount.cpp | 13 -- .../tt-rss/gui/formeditttrssaccount.h | 2 - .../tt-rss/ttrssserviceentrypoint.cpp | 2 +- 24 files changed, 475 insertions(+), 705 deletions(-) create mode 100644 src/librssguard/services/gmail/gui/gmailaccountdetails.cpp create mode 100644 src/librssguard/services/gmail/gui/gmailaccountdetails.h rename src/librssguard/services/gmail/gui/{formeditgmailaccount.ui => gmailaccountdetails.ui} (65%) delete mode 100644 src/librssguard/services/inoreader/gui/formeditinoreaderaccount.ui diff --git a/src/librssguard/librssguard.pro b/src/librssguard/librssguard.pro index 1c4843c55..daafbd2e4 100644 --- a/src/librssguard/librssguard.pro +++ b/src/librssguard/librssguard.pro @@ -147,6 +147,7 @@ HEADERS += core/feeddownloader.h \ services/gmail/gmailserviceroot.h \ services/gmail/gui/emailrecipientcontrol.h \ services/gmail/gui/formeditgmailaccount.h \ + services/gmail/gui/gmailaccountdetails.h \ services/gmail/network/gmailnetworkfactory.h \ services/inoreader/definitions.h \ services/inoreader/gui/formeditinoreaderaccount.h \ @@ -304,6 +305,7 @@ SOURCES += core/feeddownloader.cpp \ services/gmail/gmailserviceroot.cpp \ services/gmail/gui/emailrecipientcontrol.cpp \ services/gmail/gui/formeditgmailaccount.cpp \ + services/gmail/gui/gmailaccountdetails.cpp \ services/gmail/network/gmailnetworkfactory.cpp \ services/inoreader/gui/formeditinoreaderaccount.cpp \ services/inoreader/gui/inoreaderaccountdetails.cpp \ @@ -375,9 +377,8 @@ FORMS += gui/dialogs/formabout.ui \ network-web/downloadmanager.ui \ services/abstract/gui/formaccountdetails.ui \ services/abstract/gui/formfeeddetails.ui \ - services/gmail/gui/formeditgmailaccount.ui \ - services/inoreader/gui/formeditinoreaderaccount.ui \ services/abstract/gui/authenticationdetails.ui \ + services/gmail/gui/gmailaccountdetails.ui \ services/inoreader/gui/inoreaderaccountdetails.ui \ services/owncloud/gui/owncloudaccountdetails.ui \ services/standard/gui/formstandardcategorydetails.ui \ diff --git a/src/librssguard/network-web/oauth2service.cpp b/src/librssguard/network-web/oauth2service.cpp index 31d4291a4..9e87a2621 100644 --- a/src/librssguard/network-web/oauth2service.cpp +++ b/src/librssguard/network-web/oauth2service.cpp @@ -46,7 +46,7 @@ OAuth2Service::OAuth2Service(const QString& auth_url, const QString& token_url, const QString& client_secret, const QString& scope, QObject* parent) : QObject(parent), m_id(QString::number(QRandomGenerator::global()->generate())), m_timerId(-1), - m_redirectionHandler(new OAuthHttpHandler(tr("You can close this window now. Go back to %1").arg(APP_NAME), + m_redirectionHandler(new OAuthHttpHandler(tr("You can close this window now. Go back to %1.").arg(APP_NAME), this)) { m_tokenGrantType = QSL("authorization_code"); m_tokenUrl = QUrl(token_url); diff --git a/src/librssguard/services/abstract/gui/formaccountdetails.h b/src/librssguard/services/abstract/gui/formaccountdetails.h index 204e2e305..25b26ff4e 100644 --- a/src/librssguard/services/abstract/gui/formaccountdetails.h +++ b/src/librssguard/services/abstract/gui/formaccountdetails.h @@ -15,6 +15,9 @@ class FormAccountDetails : public QDialog { public: explicit FormAccountDetails(const QIcon& icon, QWidget* parent = nullptr); + template + T* addEditAccount(T* account_to_edit = nullptr); + template T* account() const; @@ -43,6 +46,19 @@ class FormAccountDetails : public QDialog { ServiceRoot* m_account; }; +template +inline T* FormAccountDetails::addEditAccount(T* account_to_edit) { + if (account_to_edit == nullptr) { + setWindowTitle(tr("Add new account")); + } + else { + setEditableAccount(static_cast(account_to_edit)); + } + + exec(); + return account(); +} + template inline T* FormAccountDetails::account() const { return qobject_cast(m_account); diff --git a/src/librssguard/services/gmail/gmailentrypoint.cpp b/src/librssguard/services/gmail/gmailentrypoint.cpp index a4156a4e9..99ad6e21b 100644 --- a/src/librssguard/services/gmail/gmailentrypoint.cpp +++ b/src/librssguard/services/gmail/gmailentrypoint.cpp @@ -15,7 +15,7 @@ ServiceRoot* GmailEntryPoint::createNewRoot() const { FormEditGmailAccount form_acc(qApp->mainFormWidget()); - return form_acc.execForCreate(); + return form_acc.addEditAccount(); } QList GmailEntryPoint::initializeSubtree() const { diff --git a/src/librssguard/services/gmail/gmailserviceroot.cpp b/src/librssguard/services/gmail/gmailserviceroot.cpp index c8c3ac8b1..50bba9e13 100644 --- a/src/librssguard/services/gmail/gmailserviceroot.cpp +++ b/src/librssguard/services/gmail/gmailserviceroot.cpp @@ -168,7 +168,7 @@ bool GmailServiceRoot::canBeEdited() const { bool GmailServiceRoot::editViaGui() { FormEditGmailAccount form_pointer(qApp->mainFormWidget()); - form_pointer.execForEdit(this); + form_pointer.addEditAccount(this); return true; } diff --git a/src/librssguard/services/gmail/gui/formeditgmailaccount.cpp b/src/librssguard/services/gmail/gui/formeditgmailaccount.cpp index d07ec1b9b..70199cda0 100644 --- a/src/librssguard/services/gmail/gui/formeditgmailaccount.cpp +++ b/src/librssguard/services/gmail/gui/formeditgmailaccount.cpp @@ -9,184 +9,64 @@ #include "network-web/webfactory.h" #include "services/gmail/definitions.h" #include "services/gmail/gmailserviceroot.h" +#include "services/gmail/gui/gmailaccountdetails.h" FormEditGmailAccount::FormEditGmailAccount(QWidget* parent) - : QDialog(parent), m_oauth(nullptr), m_editableRoot(nullptr) { - m_ui.setupUi(this); + : FormAccountDetails(qApp->icons()->miscIcon(QSL("gmail")), parent), m_details(new GmailAccountDetails(this)) { + insertCustomTab(m_details, tr("Server setup"), 0); + activateTab(0); - GuiUtilities::applyDialogProperties(*this, qApp->icons()->miscIcon(QSL("gmail"))); - GuiUtilities::setLabelAsNotice(*m_ui.m_lblInfo, true); - - m_ui.m_lblInfo->setText(tr("Specified redirect URL must start with \"http://localhost\" and " - "must be configured in your OAuth \"application\".")); - - m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Information, - tr("Not tested yet."), - tr("Not tested yet.")); - m_ui.m_lblTestResult->label()->setWordWrap(true); - m_ui.m_txtUsername->lineEdit()->setPlaceholderText(tr("User-visible username")); - - setTabOrder(m_ui.m_txtUsername->lineEdit(), m_ui.m_txtAppId); - setTabOrder(m_ui.m_txtAppId, m_ui.m_txtAppKey); - setTabOrder(m_ui.m_txtAppKey, m_ui.m_txtRedirectUrl); - setTabOrder(m_ui.m_txtRedirectUrl, m_ui.m_spinLimitMessages); - setTabOrder(m_ui.m_spinLimitMessages, m_ui.m_btnTestSetup); - setTabOrder(m_ui.m_btnTestSetup, m_ui.m_buttonBox); - - connect(m_ui.m_txtAppId->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditGmailAccount::checkOAuthValue); - connect(m_ui.m_txtAppKey->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditGmailAccount::checkOAuthValue); - connect(m_ui.m_txtRedirectUrl->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditGmailAccount::checkOAuthValue); - connect(m_ui.m_txtUsername->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditGmailAccount::checkUsername); - connect(m_ui.m_btnTestSetup, &QPushButton::clicked, this, &FormEditGmailAccount::testSetup); - connect(m_ui.m_buttonBox, &QDialogButtonBox::accepted, this, &FormEditGmailAccount::onClickedOk); - connect(m_ui.m_buttonBox, &QDialogButtonBox::rejected, this, &FormEditGmailAccount::onClickedCancel); - connect(m_ui.m_btnRegisterApi, &QPushButton::clicked, this, &FormEditGmailAccount::registerApi); - - m_ui.m_spinLimitMessages->setValue(GMAIL_DEFAULT_BATCH_SIZE); - m_ui.m_spinLimitMessages->setMinimum(GMAIL_MIN_BATCH_SIZE); - m_ui.m_spinLimitMessages->setMaximum(GMAIL_MAX_BATCH_SIZE); - - checkUsername(m_ui.m_txtUsername->lineEdit()->text()); + m_details->m_ui.m_txtUsername->setFocus(); } -FormEditGmailAccount::~FormEditGmailAccount() = default; +void FormEditGmailAccount::apply() { + FormAccountDetails::apply(); -void FormEditGmailAccount::testSetup() { - if (m_oauth->clientId() != m_ui.m_txtAppId->lineEdit()->text() || - m_oauth->clientSecret() != m_ui.m_txtAppKey->lineEdit()->text() || - m_oauth->redirectUrl() != m_ui.m_txtRedirectUrl->lineEdit()->text()) { - // User changed some important settings. Log out. - m_oauth->logout(); - } - - m_oauth->setClientId(m_ui.m_txtAppId->lineEdit()->text()); - m_oauth->setClientSecret(m_ui.m_txtAppKey->lineEdit()->text()); - m_oauth->setRedirectUrl(m_ui.m_txtRedirectUrl->lineEdit()->text()); - - if (m_oauth->login()) { - m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, - tr("You are already logged in."), - tr("Access granted.")); - } -} - -void FormEditGmailAccount::onClickedOk() { bool editing_account = true; - if (m_editableRoot == nullptr) { + if (m_account == nullptr) { // We want to confirm newly created account. // So save new account into DB, setup its properties. - m_editableRoot = new GmailServiceRoot(nullptr); + m_account = new GmailServiceRoot(nullptr); editing_account = false; } // We copy credentials from testing OAuth to live OAuth. - m_editableRoot->network()->oauth()->setAccessToken(m_oauth->accessToken()); - m_editableRoot->network()->oauth()->setRefreshToken(m_oauth->refreshToken()); - m_editableRoot->network()->oauth()->setTokensExpireIn(m_oauth->tokensExpireIn()); + account()->network()->oauth()->setAccessToken(m_details->m_oauth->accessToken()); + account()->network()->oauth()->setRefreshToken(m_details->m_oauth->refreshToken()); + account()->network()->oauth()->setTokensExpireIn(m_details->m_oauth->tokensExpireIn()); - m_editableRoot->network()->oauth()->setClientId(m_ui.m_txtAppId->lineEdit()->text()); - m_editableRoot->network()->oauth()->setClientSecret(m_ui.m_txtAppKey->lineEdit()->text()); - m_editableRoot->network()->oauth()->setRedirectUrl(m_ui.m_txtRedirectUrl->lineEdit()->text()); + account()->network()->oauth()->setClientId(m_details->m_ui.m_txtAppId->lineEdit()->text()); + account()->network()->oauth()->setClientSecret(m_details->m_ui.m_txtAppKey->lineEdit()->text()); + account()->network()->oauth()->setRedirectUrl(m_details->m_ui.m_txtRedirectUrl->lineEdit()->text()); - m_editableRoot->network()->setUsername(m_ui.m_txtUsername->lineEdit()->text()); - m_editableRoot->network()->setBatchSize(m_ui.m_spinLimitMessages->value()); - m_editableRoot->saveAccountDataToDatabase(); + account()->network()->setUsername(m_details->m_ui.m_txtUsername->lineEdit()->text()); + account()->network()->setBatchSize(m_details->m_ui.m_spinLimitMessages->value()); + account()->saveAccountDataToDatabase(); accept(); if (editing_account) { - m_editableRoot->completelyRemoveAllData(); - m_editableRoot->syncIn(); + account()->completelyRemoveAllData(); + account()->syncIn(); } } -void FormEditGmailAccount::onClickedCancel() { - reject(); -} +void FormEditGmailAccount::setEditableAccount(ServiceRoot* editable_account) { + FormAccountDetails::setEditableAccount(editable_account); -void FormEditGmailAccount::checkUsername(const QString& username) { - if (username.isEmpty()) { - m_ui.m_txtUsername->setStatus(WidgetWithStatus::StatusType::Error, tr("No username entered.")); + if (m_details->m_oauth != nullptr) { + m_details->m_oauth->logout(); + m_details->m_oauth->deleteLater(); } - else { - m_ui.m_txtUsername->setStatus(WidgetWithStatus::StatusType::Ok, tr("Some username entered.")); - } -} -void FormEditGmailAccount::onAuthFailed() { - m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("You did not grant access."), - tr("There was error during testing.")); -} - -void FormEditGmailAccount::onAuthError(const QString& error, const QString& detailed_description) { - Q_UNUSED(error) - - m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("There is error. %1 ").arg(detailed_description), - tr("There was error during testing.")); -} - -void FormEditGmailAccount::onAuthGranted() { - m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, - tr("Tested successfully. You may be prompted to login once more."), - tr("Your access was approved.")); -} - -void FormEditGmailAccount::hookNetwork() { - connect(m_oauth, &OAuth2Service::tokensReceived, this, &FormEditGmailAccount::onAuthGranted); - connect(m_oauth, &OAuth2Service::tokensRetrieveError, this, &FormEditGmailAccount::onAuthError); - connect(m_oauth, &OAuth2Service::authFailed, this, &FormEditGmailAccount::onAuthFailed); -} - -GmailServiceRoot* FormEditGmailAccount::execForCreate() { - setWindowTitle(tr("Add new Gmail account")); - - m_oauth = new OAuth2Service(GMAIL_OAUTH_AUTH_URL, GMAIL_OAUTH_TOKEN_URL, - QString(), QString(), GMAIL_OAUTH_SCOPE, this); - - hookNetwork(); - - m_ui.m_txtAppId->lineEdit()->clear(); - m_ui.m_txtAppKey->lineEdit()->clear(); - m_ui.m_txtRedirectUrl->lineEdit()->setText(m_oauth->redirectUrl()); - - exec(); - - return m_editableRoot; -} - -void FormEditGmailAccount::execForEdit(GmailServiceRoot* existing_root) { - setWindowTitle(tr("Edit existing Gmail account")); - m_editableRoot = existing_root; - - m_oauth = m_editableRoot->network()->oauth(); - hookNetwork(); + m_details->m_oauth = account()->network()->oauth(); + m_details->hookNetwork(); // Setup the GUI. - m_ui.m_txtAppId->lineEdit()->setText(m_oauth->clientId()); - m_ui.m_txtAppKey->lineEdit()->setText(m_oauth->clientSecret()); - m_ui.m_txtRedirectUrl->lineEdit()->setText(m_oauth->redirectUrl()); + m_details->m_ui.m_txtAppId->lineEdit()->setText(m_details->m_oauth->clientId()); + m_details->m_ui.m_txtAppKey->lineEdit()->setText(m_details->m_oauth->clientSecret()); + m_details->m_ui.m_txtRedirectUrl->lineEdit()->setText(m_details->m_oauth->redirectUrl()); - m_ui.m_txtUsername->lineEdit()->setText(existing_root->network()->username()); - m_ui.m_spinLimitMessages->setValue(existing_root->network()->batchSize()); - - exec(); -} - -void FormEditGmailAccount::registerApi() { - qApp->web()->openUrlInExternalBrowser(GMAIL_REG_API_URL); -} - -void FormEditGmailAccount::checkOAuthValue(const QString& value) { - auto* line_edit = qobject_cast(sender()->parent()); - - if (line_edit != nullptr) { - if (value.isEmpty()) { - line_edit->setStatus(WidgetWithStatus::StatusType::Error, tr("Empty value is entered.")); - } - else { - line_edit->setStatus(WidgetWithStatus::StatusType::Ok, tr("Some value is entered.")); - } - } + m_details->m_ui.m_txtUsername->lineEdit()->setText(account()->network()->username()); + m_details->m_ui.m_spinLimitMessages->setValue(account()->network()->batchSize()); } diff --git a/src/librssguard/services/gmail/gui/formeditgmailaccount.h b/src/librssguard/services/gmail/gui/formeditgmailaccount.h index dcfa04556..45f552ed8 100644 --- a/src/librssguard/services/gmail/gui/formeditgmailaccount.h +++ b/src/librssguard/services/gmail/gui/formeditgmailaccount.h @@ -3,46 +3,27 @@ #ifndef FORMEDITINOREADERACCOUNT_H #define FORMEDITINOREADERACCOUNT_H -#include - -#include "ui_formeditgmailaccount.h" +#include "services/abstract/gui/formaccountdetails.h" #include "services/gmail/network/gmailnetworkfactory.h" -namespace Ui { - class FormEditGmailAccount; -} - class GmailServiceRoot; +class GmailAccountDetails; -class FormEditGmailAccount : public QDialog { +class FormEditGmailAccount : public FormAccountDetails { Q_OBJECT public: explicit FormEditGmailAccount(QWidget* parent = nullptr); - virtual ~FormEditGmailAccount(); - GmailServiceRoot* execForCreate(); + protected slots: + virtual void apply(); - void execForEdit(GmailServiceRoot* existing_root); - - private slots: - void registerApi(); - void testSetup(); - void onClickedOk(); - void onClickedCancel(); - void checkOAuthValue(const QString& value); - void checkUsername(const QString& username); - void onAuthFailed(); - void onAuthError(const QString& error, const QString& detailed_description); - void onAuthGranted(); + protected: + virtual void setEditableAccount(ServiceRoot* editable_account); private: - void hookNetwork(); - - Ui::FormEditGmailAccount m_ui; - OAuth2Service* m_oauth; - GmailServiceRoot* m_editableRoot; + GmailAccountDetails* m_details; }; #endif // FORMEDITINOREADERACCOUNT_H diff --git a/src/librssguard/services/gmail/gui/gmailaccountdetails.cpp b/src/librssguard/services/gmail/gui/gmailaccountdetails.cpp new file mode 100644 index 000000000..0c3b03d45 --- /dev/null +++ b/src/librssguard/services/gmail/gui/gmailaccountdetails.cpp @@ -0,0 +1,123 @@ +// For license of this file, see /LICENSE.md. + +#include "services/gmail/gui/gmailaccountdetails.h" + +#include "gui/guiutilities.h" +#include "miscellaneous/application.h" +#include "network-web/oauth2service.h" +#include "network-web/webfactory.h" +#include "services/gmail/definitions.h" +#include "services/gmail/network/gmailnetworkfactory.h" + +GmailAccountDetails::GmailAccountDetails(QWidget* parent) + : QWidget(parent), m_oauth(new OAuth2Service(GMAIL_OAUTH_AUTH_URL, GMAIL_OAUTH_TOKEN_URL, + QString(), QString(), GMAIL_OAUTH_SCOPE, this)) { + m_ui.setupUi(this); + + GuiUtilities::setLabelAsNotice(*m_ui.m_lblInfo, true); + + m_ui.m_lblInfo->setText(tr("Specified redirect URL must start with \"http://localhost\" and " + "must be configured in your OAuth \"application\".")); + + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Information, + tr("Not tested yet."), + tr("Not tested yet.")); + m_ui.m_lblTestResult->label()->setWordWrap(true); + m_ui.m_txtUsername->lineEdit()->setPlaceholderText(tr("User-visible username")); + + setTabOrder(m_ui.m_txtUsername->lineEdit(), m_ui.m_txtAppId); + setTabOrder(m_ui.m_txtAppId, m_ui.m_txtAppKey); + setTabOrder(m_ui.m_txtAppKey, m_ui.m_txtRedirectUrl); + setTabOrder(m_ui.m_txtRedirectUrl, m_ui.m_spinLimitMessages); + setTabOrder(m_ui.m_spinLimitMessages, m_ui.m_btnTestSetup); + + connect(m_ui.m_txtAppId->lineEdit(), &BaseLineEdit::textChanged, this, &GmailAccountDetails::checkOAuthValue); + connect(m_ui.m_txtAppKey->lineEdit(), &BaseLineEdit::textChanged, this, &GmailAccountDetails::checkOAuthValue); + connect(m_ui.m_txtRedirectUrl->lineEdit(), &BaseLineEdit::textChanged, this, &GmailAccountDetails::checkOAuthValue); + connect(m_ui.m_txtUsername->lineEdit(), &BaseLineEdit::textChanged, this, &GmailAccountDetails::checkUsername); + connect(m_ui.m_btnTestSetup, &QPushButton::clicked, this, &GmailAccountDetails::testSetup); + connect(m_ui.m_btnRegisterApi, &QPushButton::clicked, this, &GmailAccountDetails::registerApi); + + m_ui.m_spinLimitMessages->setValue(GMAIL_DEFAULT_BATCH_SIZE); + m_ui.m_spinLimitMessages->setMinimum(GMAIL_MIN_BATCH_SIZE); + m_ui.m_spinLimitMessages->setMaximum(GMAIL_MAX_BATCH_SIZE); + + checkUsername(m_ui.m_txtUsername->lineEdit()->text()); + + m_ui.m_txtAppId->lineEdit()->clear(); + m_ui.m_txtAppKey->lineEdit()->clear(); + m_ui.m_txtRedirectUrl->lineEdit()->setText(m_oauth->redirectUrl()); + + hookNetwork(); +} + +void GmailAccountDetails::testSetup() { + if (m_oauth->clientId() != m_ui.m_txtAppId->lineEdit()->text() || + m_oauth->clientSecret() != m_ui.m_txtAppKey->lineEdit()->text() || + m_oauth->redirectUrl() != m_ui.m_txtRedirectUrl->lineEdit()->text()) { + // User changed some important settings. Log out. + m_oauth->logout(); + } + + m_oauth->setClientId(m_ui.m_txtAppId->lineEdit()->text()); + m_oauth->setClientSecret(m_ui.m_txtAppKey->lineEdit()->text()); + m_oauth->setRedirectUrl(m_ui.m_txtRedirectUrl->lineEdit()->text()); + + if (m_oauth->login()) { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, + tr("You are already logged in."), + tr("Access granted.")); + } +} + +void GmailAccountDetails::checkUsername(const QString& username) { + if (username.isEmpty()) { + m_ui.m_txtUsername->setStatus(WidgetWithStatus::StatusType::Error, tr("No username entered.")); + } + else { + m_ui.m_txtUsername->setStatus(WidgetWithStatus::StatusType::Ok, tr("Some username entered.")); + } +} + +void GmailAccountDetails::onAuthFailed() { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, + tr("You did not grant access."), + tr("There was error during testing.")); +} + +void GmailAccountDetails::onAuthError(const QString& error, const QString& detailed_description) { + Q_UNUSED(error) + + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, + tr("There is error. %1 ").arg(detailed_description), + tr("There was error during testing.")); +} + +void GmailAccountDetails::onAuthGranted() { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, + tr("Tested successfully. You may be prompted to login once more."), + tr("Your access was approved.")); +} + +void GmailAccountDetails::hookNetwork() { + connect(m_oauth, &OAuth2Service::tokensReceived, this, &GmailAccountDetails::onAuthGranted); + connect(m_oauth, &OAuth2Service::tokensRetrieveError, this, &GmailAccountDetails::onAuthError); + connect(m_oauth, &OAuth2Service::authFailed, this, &GmailAccountDetails::onAuthFailed); +} + +void GmailAccountDetails::registerApi() { + qApp->web()->openUrlInExternalBrowser(GMAIL_REG_API_URL); +} + +void GmailAccountDetails::checkOAuthValue(const QString& value) { + auto* line_edit = qobject_cast(sender()->parent()); + + if (line_edit != nullptr) { + if (value.isEmpty()) { + line_edit->setStatus(WidgetWithStatus::StatusType::Error, tr("Empty value is entered.")); + } + else { + line_edit->setStatus(WidgetWithStatus::StatusType::Ok, tr("Some value is entered.")); + } + } +} diff --git a/src/librssguard/services/gmail/gui/gmailaccountdetails.h b/src/librssguard/services/gmail/gui/gmailaccountdetails.h new file mode 100644 index 000000000..88158993b --- /dev/null +++ b/src/librssguard/services/gmail/gui/gmailaccountdetails.h @@ -0,0 +1,37 @@ +// For license of this file, see /LICENSE.md. + +#ifndef GMAILACCOUNTDETAILS_H +#define GMAILACCOUNTDETAILS_H + +#include + +#include "ui_gmailaccountdetails.h" + +class OAuth2Service; + +class GmailAccountDetails : public QWidget { + Q_OBJECT + + friend class FormEditGmailAccount; + + public: + explicit GmailAccountDetails(QWidget* parent = nullptr); + + private slots: + void registerApi(); + void testSetup(); + void checkOAuthValue(const QString& value); + void checkUsername(const QString& username); + void onAuthFailed(); + void onAuthError(const QString& error, const QString& detailed_description); + void onAuthGranted(); + + private: + void hookNetwork(); + + private: + Ui::GmailAccountDetails m_ui; + OAuth2Service* m_oauth; +}; + +#endif // GMAILACCOUNTDETAILS_H diff --git a/src/librssguard/services/gmail/gui/formeditgmailaccount.ui b/src/librssguard/services/gmail/gui/gmailaccountdetails.ui similarity index 65% rename from src/librssguard/services/gmail/gui/formeditgmailaccount.ui rename to src/librssguard/services/gmail/gui/gmailaccountdetails.ui index 0e87aef87..9203c80fc 100644 --- a/src/librssguard/services/gmail/gui/formeditgmailaccount.ui +++ b/src/librssguard/services/gmail/gui/gmailaccountdetails.ui @@ -1,16 +1,16 @@ - FormEditGmailAccount - + GmailAccountDetails + 0 0 - 542 - 363 + 431 + 258 - + @@ -23,14 +23,20 @@ + + + 0 + 1 + + OAuth 2.0 settings - + - Application ID + Client ID m_txtAppId @@ -43,7 +49,7 @@ - Application key + Client secret m_txtAppKey @@ -66,20 +72,46 @@ + + + + + + Get my credentials + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 1 + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + true - - - - Get my credentials - - - @@ -121,12 +153,6 @@ - - - 0 - 1 - - Qt::RightToLeft @@ -134,16 +160,6 @@ - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - @@ -151,8 +167,8 @@ - 20 - 40 + 410 + 0 @@ -173,44 +189,6 @@ 1 - - m_btnRegisterApi - m_spinLimitMessages - m_btnTestSetup - - - - m_buttonBox - accepted() - FormEditGmailAccount - accept() - - - 248 - 254 - - - 157 - 274 - - - - - m_buttonBox - rejected() - FormEditGmailAccount - reject() - - - 316 - 260 - - - 286 - 274 - - - - + diff --git a/src/librssguard/services/inoreader/gui/formeditinoreaderaccount.cpp b/src/librssguard/services/inoreader/gui/formeditinoreaderaccount.cpp index 8d83e3371..19b41b6c7 100644 --- a/src/librssguard/services/inoreader/gui/formeditinoreaderaccount.cpp +++ b/src/librssguard/services/inoreader/gui/formeditinoreaderaccount.cpp @@ -8,185 +8,66 @@ #include "network-web/oauth2service.h" #include "network-web/webfactory.h" #include "services/inoreader/definitions.h" +#include "services/inoreader/gui/inoreaderaccountdetails.h" #include "services/inoreader/inoreaderserviceroot.h" +#include "services/inoreader/network/inoreadernetworkfactory.h" FormEditInoreaderAccount::FormEditInoreaderAccount(QWidget* parent) - : QDialog(parent), m_oauth(nullptr), m_editableRoot(nullptr) { - m_ui.setupUi(this); + : FormAccountDetails(qApp->icons()->miscIcon(QSL("inoreader")), parent), m_details(new InoreaderAccountDetails(this)) { + insertCustomTab(m_details, tr("Server setup"), 0); + activateTab(0); - GuiUtilities::applyDialogProperties(*this, qApp->icons()->miscIcon(QSL("inoreader"))); - GuiUtilities::setLabelAsNotice(*m_ui.m_lblInfo, true); - - m_ui.m_lblInfo->setText(tr("Specified redirect URL must start with \"http://localhost\" and " - "must be configured in your OAuth \"application\".\n\n" - "It is highly recommended to create your own \"Application ID\".")); - - m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Information, - tr("Not tested yet."), - tr("Not tested yet.")); - m_ui.m_lblTestResult->label()->setWordWrap(true); - m_ui.m_txtUsername->lineEdit()->setPlaceholderText(tr("User-visible username")); - - setTabOrder(m_ui.m_txtUsername->lineEdit(), m_ui.m_txtAppId); - setTabOrder(m_ui.m_txtAppId, m_ui.m_txtAppKey); - setTabOrder(m_ui.m_txtAppKey, m_ui.m_txtRedirectUrl); - setTabOrder(m_ui.m_txtRedirectUrl, m_ui.m_spinLimitMessages); - setTabOrder(m_ui.m_spinLimitMessages, m_ui.m_btnTestSetup); - setTabOrder(m_ui.m_btnTestSetup, m_ui.m_buttonBox); - - connect(m_ui.m_txtAppId->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditInoreaderAccount::checkOAuthValue); - connect(m_ui.m_txtAppKey->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditInoreaderAccount::checkOAuthValue); - connect(m_ui.m_txtRedirectUrl->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditInoreaderAccount::checkOAuthValue); - connect(m_ui.m_txtUsername->lineEdit(), &BaseLineEdit::textChanged, this, &FormEditInoreaderAccount::checkUsername); - connect(m_ui.m_btnTestSetup, &QPushButton::clicked, this, &FormEditInoreaderAccount::testSetup); - connect(m_ui.m_buttonBox, &QDialogButtonBox::accepted, this, &FormEditInoreaderAccount::onClickedOk); - connect(m_ui.m_buttonBox, &QDialogButtonBox::rejected, this, &FormEditInoreaderAccount::onClickedCancel); - connect(m_ui.m_btnRegisterApi, &QPushButton::clicked, this, &FormEditInoreaderAccount::registerApi); - - m_ui.m_spinLimitMessages->setValue(INOREADER_DEFAULT_BATCH_SIZE); - m_ui.m_spinLimitMessages->setMinimum(INOREADER_MIN_BATCH_SIZE); - m_ui.m_spinLimitMessages->setMaximum(INOREADER_MAX_BATCH_SIZE); - - checkUsername(m_ui.m_txtUsername->lineEdit()->text()); + m_details->m_ui.m_txtUsername->setFocus(); } -FormEditInoreaderAccount::~FormEditInoreaderAccount() = default; +void FormEditInoreaderAccount::apply() { + FormAccountDetails::apply(); -void FormEditInoreaderAccount::testSetup() { - if (m_oauth->clientId() != m_ui.m_txtAppId->lineEdit()->text() || - m_oauth->clientSecret() != m_ui.m_txtAppKey->lineEdit()->text() || - m_oauth->redirectUrl() != m_ui.m_txtRedirectUrl->lineEdit()->text()) { - // User changed some important settings. Log out. - m_oauth->logout(); - } - - m_oauth->setClientId(m_ui.m_txtAppId->lineEdit()->text()); - m_oauth->setClientSecret(m_ui.m_txtAppKey->lineEdit()->text()); - m_oauth->setRedirectUrl(m_ui.m_txtRedirectUrl->lineEdit()->text()); - - if (m_oauth->login()) { - m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, - tr("You are already logged in."), - tr("Access granted.")); - } -} - -void FormEditInoreaderAccount::onClickedOk() { bool editing_account = true; - if (m_editableRoot == nullptr) { + if (m_account == nullptr) { // We want to confirm newly created account. // So save new account into DB, setup its properties. - m_editableRoot = new InoreaderServiceRoot(nullptr); + m_account = new InoreaderServiceRoot(nullptr); editing_account = false; } // We copy credentials from testing OAuth to live OAuth. - m_editableRoot->network()->oauth()->setAccessToken(m_oauth->accessToken()); - m_editableRoot->network()->oauth()->setRefreshToken(m_oauth->refreshToken()); - m_editableRoot->network()->oauth()->setTokensExpireIn(m_oauth->tokensExpireIn()); + account()->network()->oauth()->setAccessToken(m_details->m_oauth->accessToken()); + account()->network()->oauth()->setRefreshToken(m_details->m_oauth->refreshToken()); + account()->network()->oauth()->setTokensExpireIn(m_details->m_oauth->tokensExpireIn()); - m_editableRoot->network()->oauth()->setClientId(m_ui.m_txtAppId->lineEdit()->text()); - m_editableRoot->network()->oauth()->setClientSecret(m_ui.m_txtAppKey->lineEdit()->text()); - m_editableRoot->network()->oauth()->setRedirectUrl(m_ui.m_txtRedirectUrl->lineEdit()->text()); + account()->network()->oauth()->setClientId(m_details->m_ui.m_txtAppId->lineEdit()->text()); + account()->network()->oauth()->setClientSecret(m_details->m_ui.m_txtAppKey->lineEdit()->text()); + account()->network()->oauth()->setRedirectUrl(m_details->m_ui.m_txtRedirectUrl->lineEdit()->text()); - m_editableRoot->network()->setUsername(m_ui.m_txtUsername->lineEdit()->text()); - m_editableRoot->network()->setBatchSize(m_ui.m_spinLimitMessages->value()); - m_editableRoot->saveAccountDataToDatabase(); + account()->network()->setUsername(m_details->m_ui.m_txtUsername->lineEdit()->text()); + account()->network()->setBatchSize(m_details->m_ui.m_spinLimitMessages->value()); + account()->saveAccountDataToDatabase(); accept(); if (editing_account) { - m_editableRoot->completelyRemoveAllData(); - m_editableRoot->syncIn(); + account()->completelyRemoveAllData(); + account()->syncIn(); } } -void FormEditInoreaderAccount::onClickedCancel() { - reject(); -} +void FormEditInoreaderAccount::setEditableAccount(ServiceRoot* editable_account) { + FormAccountDetails::setEditableAccount(editable_account); -void FormEditInoreaderAccount::checkUsername(const QString& username) { - if (username.isEmpty()) { - m_ui.m_txtUsername->setStatus(WidgetWithStatus::StatusType::Error, tr("No username entered.")); + if (m_details->m_oauth != nullptr) { + m_details->m_oauth->logout(); + m_details->m_oauth->deleteLater(); } - else { - m_ui.m_txtUsername->setStatus(WidgetWithStatus::StatusType::Ok, tr("Some username entered.")); - } -} -void FormEditInoreaderAccount::onAuthFailed() { - m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("You did not grant access."), - tr("There was error during testing.")); -} - -void FormEditInoreaderAccount::onAuthError(const QString& error, const QString& detailed_description) { - Q_UNUSED(error) - - m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("There is error. %1").arg(detailed_description), - tr("There was error during testing.")); -} - -void FormEditInoreaderAccount::onAuthGranted() { - m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, - tr("Tested successfully. You may be prompted to login once more."), - tr("Your access was approved.")); -} - -void FormEditInoreaderAccount::hookNetwork() { - connect(m_oauth, &OAuth2Service::tokensReceived, this, &FormEditInoreaderAccount::onAuthGranted); - connect(m_oauth, &OAuth2Service::tokensRetrieveError, this, &FormEditInoreaderAccount::onAuthError); - connect(m_oauth, &OAuth2Service::authFailed, this, &FormEditInoreaderAccount::onAuthFailed); -} - -InoreaderServiceRoot* FormEditInoreaderAccount::execForCreate() { - setWindowTitle(tr("Add new Inoreader account")); - - m_oauth = new OAuth2Service(INOREADER_OAUTH_AUTH_URL, INOREADER_OAUTH_TOKEN_URL, - INOREADER_OAUTH_CLI_ID, INOREADER_OAUTH_CLI_KEY, INOREADER_OAUTH_SCOPE, this); - hookNetwork(); - - m_ui.m_txtAppId->lineEdit()->setText(INOREADER_OAUTH_CLI_ID); - m_ui.m_txtAppKey->lineEdit()->setText(INOREADER_OAUTH_CLI_KEY); - m_ui.m_txtRedirectUrl->lineEdit()->setText(OAUTH_REDIRECT_URI); - - exec(); - - return m_editableRoot; -} - -void FormEditInoreaderAccount::execForEdit(InoreaderServiceRoot* existing_root) { - setWindowTitle(tr("Edit existing Inoreader account")); - m_editableRoot = existing_root; - - m_oauth = m_editableRoot->network()->oauth(); - hookNetwork(); + m_details->m_oauth = account()->network()->oauth(); + m_details->hookNetwork(); // Setup the GUI. - m_ui.m_txtAppId->lineEdit()->setText(m_oauth->clientId()); - m_ui.m_txtAppKey->lineEdit()->setText(m_oauth->clientSecret()); - m_ui.m_txtRedirectUrl->lineEdit()->setText(m_oauth->redirectUrl()); + m_details->m_ui.m_txtAppId->lineEdit()->setText(m_details->m_oauth->clientId()); + m_details->m_ui.m_txtAppKey->lineEdit()->setText(m_details->m_oauth->clientSecret()); + m_details->m_ui.m_txtRedirectUrl->lineEdit()->setText(m_details->m_oauth->redirectUrl()); - m_ui.m_txtUsername->lineEdit()->setText(existing_root->network()->userName()); - m_ui.m_spinLimitMessages->setValue(existing_root->network()->batchSize()); - - exec(); -} - -void FormEditInoreaderAccount::registerApi() { - qApp->web()->openUrlInExternalBrowser(INOREADER_REG_API_URL); -} - -void FormEditInoreaderAccount::checkOAuthValue(const QString& value) { - auto* line_edit = qobject_cast(sender()->parent()); - - if (line_edit != nullptr) { - if (value.isEmpty()) { - line_edit->setStatus(WidgetWithStatus::StatusType::Error, tr("Empty value is entered.")); - } - else { - line_edit->setStatus(WidgetWithStatus::StatusType::Ok, tr("Some value is entered.")); - } - } + m_details->m_ui.m_txtUsername->lineEdit()->setText(account()->network()->userName()); + m_details->m_ui.m_spinLimitMessages->setValue(account()->network()->batchSize()); } diff --git a/src/librssguard/services/inoreader/gui/formeditinoreaderaccount.h b/src/librssguard/services/inoreader/gui/formeditinoreaderaccount.h index f64a6b1dd..8f4ed08dd 100644 --- a/src/librssguard/services/inoreader/gui/formeditinoreaderaccount.h +++ b/src/librssguard/services/inoreader/gui/formeditinoreaderaccount.h @@ -3,46 +3,25 @@ #ifndef FORMEDITINOREADERACCOUNT_H #define FORMEDITINOREADERACCOUNT_H -#include - -#include "ui_formeditinoreaderaccount.h" - -#include "services/inoreader/network/inoreadernetworkfactory.h" - -namespace Ui { - class FormEditInoreaderAccount; -} +#include "services/abstract/gui/formaccountdetails.h" class InoreaderServiceRoot; +class InoreaderAccountDetails; -class FormEditInoreaderAccount : public QDialog { +class FormEditInoreaderAccount : public FormAccountDetails { Q_OBJECT public: explicit FormEditInoreaderAccount(QWidget* parent = nullptr); - virtual ~FormEditInoreaderAccount(); - InoreaderServiceRoot* execForCreate(); + protected slots: + virtual void apply(); - void execForEdit(InoreaderServiceRoot* existing_root); - - private slots: - void registerApi(); - void testSetup(); - void onClickedOk(); - void onClickedCancel(); - void checkOAuthValue(const QString& value); - void checkUsername(const QString& username); - void onAuthFailed(); - void onAuthError(const QString& error, const QString& detailed_description); - void onAuthGranted(); + protected: + virtual void setEditableAccount(ServiceRoot* editable_account); private: - void hookNetwork(); - - Ui::FormEditInoreaderAccount m_ui; - OAuth2Service* m_oauth; - InoreaderServiceRoot* m_editableRoot; + InoreaderAccountDetails* m_details; }; #endif // FORMEDITINOREADERACCOUNT_H diff --git a/src/librssguard/services/inoreader/gui/formeditinoreaderaccount.ui b/src/librssguard/services/inoreader/gui/formeditinoreaderaccount.ui deleted file mode 100644 index 1f247c171..000000000 --- a/src/librssguard/services/inoreader/gui/formeditinoreaderaccount.ui +++ /dev/null @@ -1,216 +0,0 @@ - - - FormEditInoreaderAccount - - - - 0 - 0 - 542 - 363 - - - - - - - Username - - - - - - - - - - OAuth 2.0 settings - - - - - - Application ID - - - m_txtAppId - - - - - - - - - - Application key - - - m_txtAppKey - - - - - - - - - - Redirect URL - - - m_txtRedirectUrl - - - - - - - - - - true - - - - - - - Get my own Application ID - - - - - - - - - - - - Only download newest X messages per feed - - - m_spinLimitMessages - - - - - - - - 140 - 16777215 - - - - message(s) - - - - - - - - - - - &Login - - - - - - - - 0 - 1 - - - - Qt::RightToLeft - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - LineEditWithStatus - QWidget -
lineeditwithstatus.h
- 1 -
- - LabelWithStatus - QWidget -
labelwithstatus.h
- 1 -
-
- - m_btnRegisterApi - m_spinLimitMessages - m_btnTestSetup - - - - - m_buttonBox - accepted() - FormEditInoreaderAccount - accept() - - - 248 - 254 - - - 157 - 274 - - - - - m_buttonBox - rejected() - FormEditInoreaderAccount - reject() - - - 316 - 260 - - - 286 - 274 - - - - -
diff --git a/src/librssguard/services/inoreader/gui/inoreaderaccountdetails.cpp b/src/librssguard/services/inoreader/gui/inoreaderaccountdetails.cpp index 1d4e2347f..0bb1888b5 100755 --- a/src/librssguard/services/inoreader/gui/inoreaderaccountdetails.cpp +++ b/src/librssguard/services/inoreader/gui/inoreaderaccountdetails.cpp @@ -2,6 +2,126 @@ #include "services/inoreader/gui/inoreaderaccountdetails.h" -InoreaderAccountDetails::InoreaderAccountDetails(QWidget* parent) : QWidget(parent) { +#include "gui/guiutilities.h" +#include "miscellaneous/application.h" +#include "network-web/oauth2service.h" +#include "network-web/webfactory.h" +#include "services/inoreader/definitions.h" +#include "services/inoreader/network/inoreadernetworkfactory.h" + +InoreaderAccountDetails::InoreaderAccountDetails(QWidget* parent) + : QWidget(parent), m_oauth(new OAuth2Service(INOREADER_OAUTH_AUTH_URL, INOREADER_OAUTH_TOKEN_URL, + INOREADER_OAUTH_CLI_ID, INOREADER_OAUTH_CLI_KEY, + INOREADER_OAUTH_SCOPE, this)) { m_ui.setupUi(this); + + GuiUtilities::setLabelAsNotice(*m_ui.m_lblInfo, true); + + m_ui.m_lblInfo->setText(tr("Specified redirect URL must start with \"http://localhost\" and " + "must be configured in your OAuth \"application\".\n\n" + "It is highly recommended to create your own \"App ID\". " + "Because predefined one may be limited due to usage quotas if used by " + "too many users simultaneously.")); + + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Information, + tr("Not tested yet."), + tr("Not tested yet.")); + m_ui.m_lblTestResult->label()->setWordWrap(true); + m_ui.m_txtUsername->lineEdit()->setPlaceholderText(tr("User-visible username")); + + setTabOrder(m_ui.m_txtUsername->lineEdit(), m_ui.m_txtAppId); + setTabOrder(m_ui.m_txtAppId, m_ui.m_txtAppKey); + setTabOrder(m_ui.m_txtAppKey, m_ui.m_txtRedirectUrl); + setTabOrder(m_ui.m_txtRedirectUrl, m_ui.m_spinLimitMessages); + setTabOrder(m_ui.m_spinLimitMessages, m_ui.m_btnTestSetup); + + connect(m_ui.m_txtAppId->lineEdit(), &BaseLineEdit::textChanged, this, &InoreaderAccountDetails::checkOAuthValue); + connect(m_ui.m_txtAppKey->lineEdit(), &BaseLineEdit::textChanged, this, &InoreaderAccountDetails::checkOAuthValue); + connect(m_ui.m_txtRedirectUrl->lineEdit(), &BaseLineEdit::textChanged, this, &InoreaderAccountDetails::checkOAuthValue); + connect(m_ui.m_txtUsername->lineEdit(), &BaseLineEdit::textChanged, this, &InoreaderAccountDetails::checkUsername); + connect(m_ui.m_btnTestSetup, &QPushButton::clicked, this, &InoreaderAccountDetails::testSetup); + connect(m_ui.m_btnRegisterApi, &QPushButton::clicked, this, &InoreaderAccountDetails::registerApi); + + m_ui.m_spinLimitMessages->setValue(INOREADER_DEFAULT_BATCH_SIZE); + m_ui.m_spinLimitMessages->setMinimum(INOREADER_MIN_BATCH_SIZE); + m_ui.m_spinLimitMessages->setMaximum(INOREADER_MAX_BATCH_SIZE); + + checkUsername(m_ui.m_txtUsername->lineEdit()->text()); + + m_ui.m_txtAppId->lineEdit()->setText(INOREADER_OAUTH_CLI_ID); + m_ui.m_txtAppKey->lineEdit()->setText(INOREADER_OAUTH_CLI_KEY); + m_ui.m_txtRedirectUrl->lineEdit()->setText(OAUTH_REDIRECT_URI); + + hookNetwork(); +} + +void InoreaderAccountDetails::testSetup() { + if (m_oauth->clientId() != m_ui.m_txtAppId->lineEdit()->text() || + m_oauth->clientSecret() != m_ui.m_txtAppKey->lineEdit()->text() || + m_oauth->redirectUrl() != m_ui.m_txtRedirectUrl->lineEdit()->text()) { + // User changed some important settings. Log out. + m_oauth->logout(); + } + + m_oauth->setClientId(m_ui.m_txtAppId->lineEdit()->text()); + m_oauth->setClientSecret(m_ui.m_txtAppKey->lineEdit()->text()); + m_oauth->setRedirectUrl(m_ui.m_txtRedirectUrl->lineEdit()->text()); + + if (m_oauth->login()) { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, + tr("You are already logged in."), + tr("Access granted.")); + } +} + +void InoreaderAccountDetails::checkUsername(const QString& username) { + if (username.isEmpty()) { + m_ui.m_txtUsername->setStatus(WidgetWithStatus::StatusType::Error, tr("No username entered.")); + } + else { + m_ui.m_txtUsername->setStatus(WidgetWithStatus::StatusType::Ok, tr("Some username entered.")); + } +} + +void InoreaderAccountDetails::onAuthFailed() { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, + tr("You did not grant access."), + tr("There was error during testing.")); +} + +void InoreaderAccountDetails::onAuthError(const QString& error, const QString& detailed_description) { + Q_UNUSED(error) + + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, + tr("There is error. %1").arg(detailed_description), + tr("There was error during testing.")); +} + +void InoreaderAccountDetails::onAuthGranted() { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, + tr("Tested successfully. You may be prompted to login once more."), + tr("Your access was approved.")); +} + +void InoreaderAccountDetails::hookNetwork() { + connect(m_oauth, &OAuth2Service::tokensReceived, this, &InoreaderAccountDetails::onAuthGranted); + connect(m_oauth, &OAuth2Service::tokensRetrieveError, this, &InoreaderAccountDetails::onAuthError); + connect(m_oauth, &OAuth2Service::authFailed, this, &InoreaderAccountDetails::onAuthFailed); +} + +void InoreaderAccountDetails::registerApi() { + qApp->web()->openUrlInExternalBrowser(INOREADER_REG_API_URL); +} + +void InoreaderAccountDetails::checkOAuthValue(const QString& value) { + auto* line_edit = qobject_cast(sender()->parent()); + + if (line_edit != nullptr) { + if (value.isEmpty()) { + line_edit->setStatus(WidgetWithStatus::StatusType::Error, tr("Empty value is entered.")); + } + else { + line_edit->setStatus(WidgetWithStatus::StatusType::Ok, tr("Some value is entered.")); + } + } } diff --git a/src/librssguard/services/inoreader/gui/inoreaderaccountdetails.h b/src/librssguard/services/inoreader/gui/inoreaderaccountdetails.h index 2d8a8fdb0..70843e733 100755 --- a/src/librssguard/services/inoreader/gui/inoreaderaccountdetails.h +++ b/src/librssguard/services/inoreader/gui/inoreaderaccountdetails.h @@ -7,14 +7,31 @@ #include "ui_inoreaderaccountdetails.h" +class OAuth2Service; + class InoreaderAccountDetails : public QWidget { Q_OBJECT + friend class FormEditInoreaderAccount; + public: explicit InoreaderAccountDetails(QWidget* parent = nullptr); + private slots: + void registerApi(); + void testSetup();; + void checkOAuthValue(const QString& value); + void checkUsername(const QString& username); + void onAuthFailed(); + void onAuthError(const QString& error, const QString& detailed_description); + void onAuthGranted(); + + private: + void hookNetwork(); + private: Ui::InoreaderAccountDetails m_ui; + OAuth2Service* m_oauth; }; #endif // INOREADERACCOUNTDETAILS_H diff --git a/src/librssguard/services/inoreader/gui/inoreaderaccountdetails.ui b/src/librssguard/services/inoreader/gui/inoreaderaccountdetails.ui index a8268fde5..ec8c04f38 100755 --- a/src/librssguard/services/inoreader/gui/inoreaderaccountdetails.ui +++ b/src/librssguard/services/inoreader/gui/inoreaderaccountdetails.ui @@ -6,8 +6,8 @@ 0 0 - 469 - 437 + 427 + 265 @@ -23,6 +23,12 @@ + + + 0 + 1 + + OAuth 2.0 settings @@ -30,7 +36,7 @@ - Application ID + App ID m_txtAppId @@ -43,7 +49,7 @@ - Application key + App key m_txtAppKey @@ -71,7 +77,7 @@ - Get my own Application ID + Get my own App ID @@ -92,6 +98,15 @@ + + + 0 + 1 + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + true @@ -138,12 +153,6 @@ - - - 0 - 1 - - Qt::RightToLeft @@ -156,12 +165,6 @@ Qt::Vertical - - - 448 - 167 - - diff --git a/src/librssguard/services/inoreader/inoreaderentrypoint.cpp b/src/librssguard/services/inoreader/inoreaderentrypoint.cpp index 0713ad2db..9c8c8313a 100644 --- a/src/librssguard/services/inoreader/inoreaderentrypoint.cpp +++ b/src/librssguard/services/inoreader/inoreaderentrypoint.cpp @@ -16,7 +16,7 @@ ServiceRoot* InoreaderEntryPoint::createNewRoot() const { FormEditInoreaderAccount form_acc(qApp->mainFormWidget()); - return form_acc.execForCreate(); + return form_acc.addEditAccount(); } QList InoreaderEntryPoint::initializeSubtree() const { diff --git a/src/librssguard/services/inoreader/inoreaderserviceroot.cpp b/src/librssguard/services/inoreader/inoreaderserviceroot.cpp index 4d0f51217..c894b95f7 100644 --- a/src/librssguard/services/inoreader/inoreaderserviceroot.cpp +++ b/src/librssguard/services/inoreader/inoreaderserviceroot.cpp @@ -94,7 +94,7 @@ bool InoreaderServiceRoot::canBeEdited() const { bool InoreaderServiceRoot::editViaGui() { FormEditInoreaderAccount form_pointer(qApp->mainFormWidget()); - form_pointer.execForEdit(this); + form_pointer.addEditAccount(this); return true; } diff --git a/src/librssguard/services/owncloud/gui/formeditowncloudaccount.cpp b/src/librssguard/services/owncloud/gui/formeditowncloudaccount.cpp index 1e88523bc..23e64a8d1 100644 --- a/src/librssguard/services/owncloud/gui/formeditowncloudaccount.cpp +++ b/src/librssguard/services/owncloud/gui/formeditowncloudaccount.cpp @@ -18,19 +18,6 @@ FormEditOwnCloudAccount::FormEditOwnCloudAccount(QWidget* parent) m_details->m_ui.m_txtUrl->setFocus(); } -OwnCloudServiceRoot* FormEditOwnCloudAccount::addEditAccount(OwnCloudServiceRoot* account_to_edit) { - if (account_to_edit == nullptr) { - // User is adding new TT-RSS account. - setWindowTitle(tr("Add new Nextcloud News account")); - } - else { - setEditableAccount(account_to_edit); - } - - exec(); - return account(); -} - void FormEditOwnCloudAccount::apply() { FormAccountDetails::apply(); diff --git a/src/librssguard/services/owncloud/gui/formeditowncloudaccount.h b/src/librssguard/services/owncloud/gui/formeditowncloudaccount.h index 1772bb308..afbfc96e6 100644 --- a/src/librssguard/services/owncloud/gui/formeditowncloudaccount.h +++ b/src/librssguard/services/owncloud/gui/formeditowncloudaccount.h @@ -14,8 +14,6 @@ class FormEditOwnCloudAccount : public FormAccountDetails { public: explicit FormEditOwnCloudAccount(QWidget* parent = nullptr); - OwnCloudServiceRoot* addEditAccount(OwnCloudServiceRoot* account_to_edit = nullptr); - protected slots: virtual void apply(); diff --git a/src/librssguard/services/owncloud/owncloudserviceentrypoint.cpp b/src/librssguard/services/owncloud/owncloudserviceentrypoint.cpp index d579dacae..23d64f6dd 100644 --- a/src/librssguard/services/owncloud/owncloudserviceentrypoint.cpp +++ b/src/librssguard/services/owncloud/owncloudserviceentrypoint.cpp @@ -13,7 +13,7 @@ ServiceRoot* OwnCloudServiceEntryPoint::createNewRoot() const { FormEditOwnCloudAccount form_acc(qApp->mainFormWidget()); - return form_acc.addEditAccount(); + return form_acc.addEditAccount(); } QList OwnCloudServiceEntryPoint::initializeSubtree() const { diff --git a/src/librssguard/services/tt-rss/gui/formeditttrssaccount.cpp b/src/librssguard/services/tt-rss/gui/formeditttrssaccount.cpp index 2a9bb8edf..6bc2f8332 100644 --- a/src/librssguard/services/tt-rss/gui/formeditttrssaccount.cpp +++ b/src/librssguard/services/tt-rss/gui/formeditttrssaccount.cpp @@ -16,19 +16,6 @@ FormEditTtRssAccount::FormEditTtRssAccount(QWidget* parent) m_details->m_ui.m_txtUrl->setFocus(); } -TtRssServiceRoot* FormEditTtRssAccount::addEditAccount(TtRssServiceRoot* account_to_edit) { - if (account_to_edit == nullptr) { - // User is adding new TT-RSS account. - setWindowTitle(tr("Add new TT-RSS account")); - } - else { - setEditableAccount(account_to_edit); - } - - exec(); - return account(); -} - void FormEditTtRssAccount::apply() { FormAccountDetails::apply(); diff --git a/src/librssguard/services/tt-rss/gui/formeditttrssaccount.h b/src/librssguard/services/tt-rss/gui/formeditttrssaccount.h index 10efb4a8f..17e23a2c6 100644 --- a/src/librssguard/services/tt-rss/gui/formeditttrssaccount.h +++ b/src/librssguard/services/tt-rss/gui/formeditttrssaccount.h @@ -15,8 +15,6 @@ class FormEditTtRssAccount : public FormAccountDetails { public: explicit FormEditTtRssAccount(QWidget* parent = nullptr); - TtRssServiceRoot* addEditAccount(TtRssServiceRoot* account_to_edit = nullptr); - protected slots: virtual void apply(); diff --git a/src/librssguard/services/tt-rss/ttrssserviceentrypoint.cpp b/src/librssguard/services/tt-rss/ttrssserviceentrypoint.cpp index f4dc2c498..26b81bf4d 100644 --- a/src/librssguard/services/tt-rss/ttrssserviceentrypoint.cpp +++ b/src/librssguard/services/tt-rss/ttrssserviceentrypoint.cpp @@ -35,7 +35,7 @@ QString TtRssServiceEntryPoint::code() const { ServiceRoot* TtRssServiceEntryPoint::createNewRoot() const { FormEditTtRssAccount form_acc(qApp->mainFormWidget()); - return form_acc.addEditAccount(); + return form_acc.addEditAccount(); } QList TtRssServiceEntryPoint::initializeSubtree() const {