1303 lines
46 KiB
Diff
1303 lines
46 KiB
Diff
From fb0d78fb3bcfce5bd4ff7f51e4cd1405693e0275 Mon Sep 17 00:00:00 2001
|
|
From: Carl Schwan <carl@carlschwan.eu>
|
|
Date: Tue, 19 Sep 2023 17:04:13 +0200
|
|
Subject: [PATCH] Revert "Revert "Use config plugin instead of out of process
|
|
config dialog""
|
|
|
|
This reverts commit f33496a346f49e95caaf7f664ef2f91e4b7f3ddb.
|
|
|
|
(cherry picked from commit a17ef55dbe31e2020e96f66cd7021578ed8b5444)
|
|
---
|
|
resources/google-groupware/CMakeLists.txt | 93 ++++--
|
|
resources/google-groupware/googleconfig.cpp | 43 +++
|
|
resources/google-groupware/googleconfig.json | 5 +
|
|
resources/google-groupware/googleresource.cpp | 95 ++----
|
|
resources/google-groupware/googleresource.h | 4 +-
|
|
resources/google-groupware/googlescopes.cpp | 19 ++
|
|
resources/google-groupware/googlescopes.h | 10 +
|
|
resources/google-groupware/googlesettings.cpp | 22 +-
|
|
resources/google-groupware/googlesettings.h | 11 +-
|
|
.../google-groupware/googlesettingsdialog.cpp | 305 ------------------
|
|
.../google-groupware/googlesettingswidget.cpp | 288 +++++++++++++++++
|
|
...ettingsdialog.h => googlesettingswidget.h} | 29 +-
|
|
...tingsdialog.ui => googlesettingswidget.ui} | 2 +-
|
|
resources/google-groupware/settingsbase.kcfg | 2 +-
|
|
14 files changed, 505 insertions(+), 423 deletions(-)
|
|
create mode 100644 resources/google-groupware/googleconfig.cpp
|
|
create mode 100644 resources/google-groupware/googleconfig.json
|
|
create mode 100644 resources/google-groupware/googlescopes.cpp
|
|
create mode 100644 resources/google-groupware/googlescopes.h
|
|
delete mode 100644 resources/google-groupware/googlesettingsdialog.cpp
|
|
create mode 100644 resources/google-groupware/googlesettingswidget.cpp
|
|
rename resources/google-groupware/{googlesettingsdialog.h => googlesettingswidget.h} (53%)
|
|
rename resources/google-groupware/{googlesettingsdialog.ui => googlesettingswidget.ui} (99%)
|
|
|
|
diff --git a/resources/google-groupware/CMakeLists.txt b/resources/google-groupware/CMakeLists.txt
|
|
index babf58a953..2f2b46aded 100644
|
|
--- a/resources/google-groupware/CMakeLists.txt
|
|
+++ b/resources/google-groupware/CMakeLists.txt
|
|
@@ -1,67 +1,75 @@
|
|
add_definitions(-DTRANSLATION_DOMAIN=\"akonadi_google_resource\")
|
|
|
|
-set(googleresource_SRCS
|
|
- googleresource.cpp
|
|
+set(googleresource_common_SRCS
|
|
googlesettings.cpp
|
|
- googlesettingsdialog.cpp
|
|
- defaultreminderattribute.cpp
|
|
- googleresourcestate.cpp
|
|
- generichandler.cpp
|
|
- calendarhandler.cpp
|
|
- taskhandler.cpp
|
|
- peopleconversionjob.cpp
|
|
- personhandler.cpp
|
|
- googleresource.h
|
|
googlesettings.h
|
|
- googlesettingsdialog.h
|
|
- defaultreminderattribute.h
|
|
- googleresourcestate.h
|
|
- generichandler.h
|
|
- calendarhandler.h
|
|
- taskhandler.h
|
|
- peopleconversionjob.h
|
|
- personhandler.h
|
|
- )
|
|
+ googlescopes.h
|
|
+ googlescopes.cpp
|
|
+)
|
|
|
|
-ecm_qt_declare_logging_category(googleresource_SRCS
|
|
+ecm_qt_declare_logging_category(googleresource_common_SRCS
|
|
HEADER googleresource_debug.h
|
|
IDENTIFIER GOOGLE_LOG
|
|
CATEGORY_NAME org.kde.pim.google
|
|
DESCRIPTION "resource google (kdepim-runtime)"
|
|
EXPORT KDEPIMRUNTIME)
|
|
-ecm_qt_declare_logging_category(googleresource_SRCS
|
|
+ecm_qt_declare_logging_category(googleresource_common_SRCS
|
|
HEADER googlecalendar_debug.h
|
|
IDENTIFIER GOOGLE_CALENDAR_LOG
|
|
CATEGORY_NAME org.kde.pim.google.calendar
|
|
DESCRIPTION "resource google calendar (kdepim-runtime)"
|
|
EXPORT KDEPIMRUNTIME)
|
|
-ecm_qt_declare_logging_category(googleresource_SRCS
|
|
+ecm_qt_declare_logging_category(googleresource_common_SRCS
|
|
HEADER googletasks_debug.h
|
|
IDENTIFIER GOOGLE_TASKS_LOG
|
|
CATEGORY_NAME org.kde.pim.google.tasks
|
|
DESCRIPTION "resource google tasks (kdepim-runtime)"
|
|
EXPORT KDEPIMRUNTIME)
|
|
-ecm_qt_declare_logging_category(googleresource_SRCS
|
|
+ecm_qt_declare_logging_category(googleresource_common_SRCS
|
|
HEADER googlepeople_debug.h
|
|
IDENTIFIER GOOGLE_PEOPLE_LOG
|
|
CATEGORY_NAME org.kde.pim.google.people
|
|
DESCRIPTION "resource google people (kdepim-runtime)"
|
|
EXPORT KDEPIMRUNTIME)
|
|
|
|
-ki18n_wrap_ui(googleresource_SRCS googlesettingsdialog.ui)
|
|
|
|
-kconfig_add_kcfg_files(googleresource_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/settingsbase.kcfgc)
|
|
+kconfig_add_kcfg_files(googleresource_common_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/settingsbase.kcfgc)
|
|
|
|
kcfg_generate_dbus_interface(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/settingsbase.kcfg
|
|
org.kde.Akonadi.Google.Settings
|
|
)
|
|
|
|
-qt_add_dbus_adaptor(googleresource_SRCS
|
|
+qt_add_dbus_adaptor(googleresource_common_SRCS
|
|
${CMAKE_CURRENT_BINARY_DIR}/org.kde.Akonadi.Google.Settings.xml
|
|
${CMAKE_CURRENT_SOURCE_DIR}/googlesettings.h GoogleSettings
|
|
)
|
|
|
|
+############################# Resource #################################
|
|
+set(googleresource_SRCS
|
|
+ googleresource.cpp
|
|
+ defaultreminderattribute.cpp
|
|
+ googleresourcestate.cpp
|
|
+ generichandler.cpp
|
|
+ calendarhandler.cpp
|
|
+ taskhandler.cpp
|
|
+ peopleconversionjob.cpp
|
|
+ personhandler.cpp
|
|
+ googleresource.h
|
|
+ googlesettings.h
|
|
+ defaultreminderattribute.h
|
|
+ googleresourcestate.h
|
|
+ generichandler.h
|
|
+ calendarhandler.h
|
|
+ taskhandler.h
|
|
+ peopleconversionjob.h
|
|
+ personhandler.h
|
|
+ ${googleresource_common_SRCS}
|
|
+)
|
|
+
|
|
+ki18n_wrap_ui(googleresource_SRCS googlesettingswidget.ui)
|
|
+
|
|
+
|
|
add_executable(akonadi_google_resource ${googleresource_SRCS})
|
|
if (COMPILE_WITH_UNITY_CMAKE_SUPPORT)
|
|
set_target_properties(akonadi_google_resource PROPERTIES UNITY_BUILD ON)
|
|
@@ -112,3 +120,34 @@ install(
|
|
FILES akonadi_google_resource.notifyrc
|
|
DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR}
|
|
)
|
|
+
|
|
+################################ Config plugin ###############################
|
|
+
|
|
+kcoreaddons_add_plugin(googleconfig
|
|
+ INSTALL_NAMESPACE "pim${QT_MAJOR_VERSION}/akonadi/config"
|
|
+)
|
|
+target_sources(googleconfig
|
|
+PRIVATE
|
|
+ googleconfig.cpp
|
|
+ googlesettingswidget.cpp
|
|
+ googlesettingswidget.h
|
|
+ ${googleresource_common_SRCS}
|
|
+)
|
|
+target_link_libraries(googleconfig
|
|
+ KPim${KF_MAJOR_VERSION}::AkonadiCore
|
|
+ KPim${KF_MAJOR_VERSION}::AkonadiCalendar
|
|
+ KPim${KF_MAJOR_VERSION}::AkonadiCore
|
|
+ KPim${KF_MAJOR_VERSION}::AkonadiAgentBase
|
|
+ KF${KF_MAJOR_VERSION}::CalendarCore
|
|
+ KF${KF_MAJOR_VERSION}::Contacts
|
|
+ KF${KF_MAJOR_VERSION}::Wallet
|
|
+ KF${KF_MAJOR_VERSION}::I18n
|
|
+ KF${KF_MAJOR_VERSION}::WindowSystem
|
|
+ KF${KF_MAJOR_VERSION}::TextWidgets
|
|
+ KF${KF_MAJOR_VERSION}::Notifications
|
|
+ KPim${KF_MAJOR_VERSION}::GAPICalendar
|
|
+ KPim${KF_MAJOR_VERSION}::GAPIPeople
|
|
+ KPim${KF_MAJOR_VERSION}::GAPICore
|
|
+ KPim${KF_MAJOR_VERSION}::GAPITasks
|
|
+ qt${KF_MAJOR_VERSION}keychain
|
|
+)
|
|
diff --git a/resources/google-groupware/googleconfig.cpp b/resources/google-groupware/googleconfig.cpp
|
|
new file mode 100644
|
|
index 0000000000..2eb6ab2efa
|
|
--- /dev/null
|
|
+++ b/resources/google-groupware/googleconfig.cpp
|
|
@@ -0,0 +1,43 @@
|
|
+/*
|
|
+ SPDX-FileCopyrightText: 2018 Daniel Vrátil <dvratil@kde.org>
|
|
+
|
|
+ SPDX-License-Identifier: LGPL-2.0-or-later
|
|
+*/
|
|
+
|
|
+#include <Akonadi/AgentConfigurationBase>
|
|
+
|
|
+#include "googlesettings.h"
|
|
+#include "googlesettingswidget.h"
|
|
+
|
|
+class GoogleConfig : public Akonadi::AgentConfigurationBase
|
|
+{
|
|
+ Q_OBJECT
|
|
+
|
|
+public:
|
|
+ explicit GoogleConfig(const KSharedConfigPtr &config, QWidget *parent, const QVariantList &list)
|
|
+ : Akonadi::AgentConfigurationBase(config, parent, list)
|
|
+ , mSettings(config, GoogleSettings::Option::NoOption)
|
|
+ , mWidget(mSettings, identifier(), parent)
|
|
+ {
|
|
+ connect(&mWidget, &GoogleSettingsWidget::okEnabled, this, &Akonadi::AgentConfigurationBase::enableOkButton);
|
|
+ }
|
|
+
|
|
+ void load() override
|
|
+ {
|
|
+ Akonadi::AgentConfigurationBase::load();
|
|
+ mWidget.loadSettings();
|
|
+ }
|
|
+
|
|
+ Q_REQUIRED_RESULT bool save() const override
|
|
+ {
|
|
+ const_cast<GoogleConfig *>(this)->mWidget.saveSettings();
|
|
+ return Akonadi::AgentConfigurationBase::save();
|
|
+ }
|
|
+
|
|
+ GoogleSettings mSettings;
|
|
+ GoogleSettingsWidget mWidget;
|
|
+};
|
|
+
|
|
+AKONADI_AGENTCONFIG_FACTORY(GoogleConfigFactory, "googleconfig.json", GoogleConfig)
|
|
+
|
|
+#include "googleconfig.moc"
|
|
diff --git a/resources/google-groupware/googleconfig.json b/resources/google-groupware/googleconfig.json
|
|
new file mode 100644
|
|
index 0000000000..69c76f583f
|
|
--- /dev/null
|
|
+++ b/resources/google-groupware/googleconfig.json
|
|
@@ -0,0 +1,5 @@
|
|
+{
|
|
+ "X-Akonadi-PluginType": "AgentConfig",
|
|
+ "X-Akonadi-Library": "googleconfig",
|
|
+ "X-Akonadi-AgentConfig-Type": "akonadi_google_resource"
|
|
+}
|
|
\ No newline at end of file
|
|
diff --git a/resources/google-groupware/googleresource.cpp b/resources/google-groupware/googleresource.cpp
|
|
index b40f093dde..47a7e0c8d5 100644
|
|
--- a/resources/google-groupware/googleresource.cpp
|
|
+++ b/resources/google-groupware/googleresource.cpp
|
|
@@ -9,8 +9,9 @@
|
|
#include "googleresource.h"
|
|
#include "googleresource_debug.h"
|
|
#include "googleresourcestate.h"
|
|
+#include "googlescopes.h"
|
|
#include "googlesettings.h"
|
|
-#include "googlesettingsdialog.h"
|
|
+#include "googlesettingswidget.h"
|
|
#include "settingsadaptor.h"
|
|
|
|
#include "personhandler.h"
|
|
@@ -67,8 +68,11 @@ bool accountIsValid(const KGAPI2::AccountPtr &account)
|
|
GoogleResource::GoogleResource(const QString &id)
|
|
: ResourceBase(id)
|
|
, AgentBase::ObserverV3()
|
|
+ , m_settings(KSharedConfig::openConfig())
|
|
, m_iface(new GoogleResourceState(this))
|
|
{
|
|
+ m_settings.setResourceId(identifier());
|
|
+
|
|
AttributeFactory::registerAttribute<DefaultReminderAttribute>();
|
|
|
|
connect(this, &GoogleResource::reloadConfiguration, this, &GoogleResource::reloadConfig);
|
|
@@ -83,9 +87,7 @@ GoogleResource::GoogleResource(const QString &id)
|
|
|
|
Q_EMIT status(NotConfigured, i18n("Fetching password..."));
|
|
|
|
- m_settings = new GoogleSettings();
|
|
- m_settings->setWindowId(winIdForDialogs());
|
|
- connect(m_settings, &GoogleSettings::accountReady, this, [this](bool ready) {
|
|
+ connect(&m_settings, &GoogleSettings::accountReady, this, [this](bool ready) {
|
|
if (accountId() > 0) {
|
|
return;
|
|
}
|
|
@@ -94,7 +96,7 @@ GoogleResource::GoogleResource(const QString &id)
|
|
return;
|
|
}
|
|
|
|
- const auto account = m_settings->accountPtr();
|
|
+ const auto account = m_settings.accountPtr();
|
|
if (account.isNull()) {
|
|
Q_EMIT status(NotConfigured);
|
|
return;
|
|
@@ -107,18 +109,15 @@ GoogleResource::GoogleResource(const QString &id)
|
|
synchronize();
|
|
}
|
|
});
|
|
- m_settings->init();
|
|
+ m_settings.init();
|
|
|
|
updateResourceName();
|
|
|
|
- m_freeBusyHandler = std::make_unique<FreeBusyHandler>(m_iface, m_settings);
|
|
+ m_freeBusyHandler = std::make_unique<FreeBusyHandler>(m_iface, &m_settings);
|
|
m_handlers.clear();
|
|
- m_handlers.push_back(GenericHandler::Ptr(new CalendarHandler(m_iface, m_settings)));
|
|
- m_handlers.push_back(GenericHandler::Ptr(new PersonHandler(m_iface, m_settings)));
|
|
- m_handlers.push_back(GenericHandler::Ptr(new TaskHandler(m_iface, m_settings)));
|
|
-
|
|
- new SettingsAdaptor(m_settings);
|
|
- QDBusConnection::sessionBus().registerObject(QStringLiteral("/Settings"), m_settings, QDBusConnection::ExportAdaptors);
|
|
+ m_handlers.push_back(GenericHandler::Ptr(new CalendarHandler(m_iface, &m_settings)));
|
|
+ m_handlers.push_back(GenericHandler::Ptr(new PersonHandler(m_iface, &m_settings)));
|
|
+ m_handlers.push_back(GenericHandler::Ptr(new TaskHandler(m_iface, &m_settings)));
|
|
}
|
|
|
|
GoogleResource::~GoogleResource()
|
|
@@ -128,7 +127,7 @@ GoogleResource::~GoogleResource()
|
|
|
|
void GoogleResource::cleanup()
|
|
{
|
|
- m_settings->cleanup();
|
|
+ m_settings.cleanup();
|
|
ResourceBase::cleanup();
|
|
}
|
|
|
|
@@ -137,65 +136,30 @@ void GoogleResource::emitReadyStatus()
|
|
Q_EMIT status(Idle, i18nc("@info:status", "Ready"));
|
|
}
|
|
|
|
-void GoogleResource::configure(WId windowId)
|
|
-{
|
|
- if (!m_settings->isReady() || m_isConfiguring) {
|
|
- Q_EMIT configurationDialogAccepted();
|
|
- return;
|
|
- }
|
|
-
|
|
- m_isConfiguring = true;
|
|
-
|
|
- QScopedPointer<GoogleSettingsDialog> settingsDialog(new GoogleSettingsDialog(this, m_settings, windowId));
|
|
- settingsDialog->setWindowIcon(QIcon::fromTheme(QStringLiteral("im-google")));
|
|
- if (settingsDialog->exec() == QDialog::Accepted) {
|
|
- updateResourceName();
|
|
-
|
|
- Q_EMIT configurationDialogAccepted();
|
|
-
|
|
- if (m_settings->accountPtr().isNull()) {
|
|
- Q_EMIT status(NotConfigured, i18n("Configured account does not exist"));
|
|
- m_isConfiguring = false;
|
|
- return;
|
|
- }
|
|
-
|
|
- emitReadyStatus();
|
|
- synchronize();
|
|
- } else {
|
|
- updateResourceName();
|
|
-
|
|
- Q_EMIT configurationDialogRejected();
|
|
- }
|
|
-
|
|
- m_isConfiguring = false;
|
|
-}
|
|
-
|
|
QList<QUrl> GoogleResource::scopes() const
|
|
{
|
|
// TODO: determine it based on what user wants?
|
|
- const QList<QUrl> scopes = {
|
|
- Account::accountInfoScopeUrl(),
|
|
- Account::calendarScopeUrl(),
|
|
- Account::peopleScopeUrl(),
|
|
- Account::tasksScopeUrl(),
|
|
- };
|
|
- return scopes;
|
|
+ return googleScopes();
|
|
}
|
|
|
|
void GoogleResource::updateResourceName()
|
|
{
|
|
- const QString accountName = m_settings->account();
|
|
+ const QString accountName = m_settings.account();
|
|
setName(i18nc("%1 is account name (user@gmail.com)", "Google Groupware (%1)", accountName.isEmpty() ? i18n("not configured") : accountName));
|
|
}
|
|
|
|
void GoogleResource::reloadConfig()
|
|
{
|
|
- const AccountPtr account = m_settings->accountPtr();
|
|
+ updateResourceName();
|
|
+
|
|
+ const AccountPtr account = m_settings.accountPtr();
|
|
if (account.isNull() || account->accountName().isEmpty()) {
|
|
Q_EMIT status(NotConfigured, i18n("Configured account does not exist"));
|
|
- } else {
|
|
- emitReadyStatus();
|
|
+ return;
|
|
}
|
|
+
|
|
+ emitReadyStatus();
|
|
+ synchronize();
|
|
}
|
|
|
|
bool GoogleResource::handleError(KGAPI2::Job *job, bool _cancelTask)
|
|
@@ -231,7 +195,7 @@ bool GoogleResource::handleError(KGAPI2::Job *job, bool _cancelTask)
|
|
|
|
void GoogleResource::runAuthJob(const KGAPI2::AccountPtr &account, const QVariant &args)
|
|
{
|
|
- auto authJob = new AuthJob(account, m_settings->clientId(), m_settings->clientSecret(), this);
|
|
+ auto authJob = new AuthJob(account, m_settings.clientId(), m_settings.clientSecret(), this);
|
|
authJob->setProperty(JOB_PROPERTY, args);
|
|
connect(authJob, &AuthJob::finished, this, &GoogleResource::slotAuthJobFinished);
|
|
}
|
|
@@ -264,7 +228,7 @@ void GoogleResource::requestAuthenticationFromUser(const KGAPI2::AccountPtr &acc
|
|
|
|
bool GoogleResource::canPerformTask()
|
|
{
|
|
- if (!m_settings->accountPtr() && accountId() == 0) {
|
|
+ if (!m_settings.accountPtr() && accountId() == 0) {
|
|
cancelTask(i18nc("@info:status", "Resource is not configured"));
|
|
Q_EMIT status(NotConfigured, i18nc("@info:status", "Resource is not configured"));
|
|
return false;
|
|
@@ -289,10 +253,11 @@ void GoogleResource::slotAuthJobFinished(KGAPI2::Job *job)
|
|
|
|
auto authJob = qobject_cast<AuthJob *>(job);
|
|
AccountPtr account = authJob->account();
|
|
- auto writeJob = m_settings->storeAccount(account);
|
|
+ auto writeJob = m_settings.storeAccount(account);
|
|
connect(writeJob, &WritePasswordJob::finished, this, [job, account, writeJob]() {
|
|
if (writeJob->error()) {
|
|
qCWarning(GOOGLE_LOG) << "Failed to store account's password in secret storage" << writeJob->errorString();
|
|
+ return;
|
|
}
|
|
|
|
auto otherJob = job->property(JOB_PROPERTY).value<KGAPI2::Job *>();
|
|
@@ -375,22 +340,22 @@ void GoogleResource::retrieveCollections()
|
|
|
|
setCollectionStreamingEnabled(true);
|
|
CachePolicy cachePolicy;
|
|
- if (m_settings->enableIntervalCheck()) {
|
|
+ if (m_settings.enableIntervalCheck()) {
|
|
cachePolicy.setInheritFromParent(false);
|
|
- cachePolicy.setIntervalCheckTime(m_settings->intervalCheckTime());
|
|
+ cachePolicy.setIntervalCheckTime(m_settings.intervalCheckTime());
|
|
}
|
|
|
|
// Setting up root collection
|
|
m_rootCollection = Collection();
|
|
m_rootCollection.setContentMimeTypes({Collection::mimeType(), Collection::virtualMimeType()});
|
|
m_rootCollection.setRemoteId(ROOT_COLLECTION_REMOTEID);
|
|
- m_rootCollection.setName(m_settings->accountPtr()->accountName());
|
|
+ m_rootCollection.setName(m_settings.accountPtr()->accountName());
|
|
m_rootCollection.setParentCollection(Collection::root());
|
|
m_rootCollection.setRights(Collection::CanCreateCollection);
|
|
m_rootCollection.setCachePolicy(cachePolicy);
|
|
|
|
auto attr = m_rootCollection.attribute<EntityDisplayAttribute>(Collection::AddIfMissing);
|
|
- attr->setDisplayName(m_settings->accountPtr()->accountName());
|
|
+ attr->setDisplayName(m_settings.accountPtr()->accountName());
|
|
attr->setIconName(QStringLiteral("im-google"));
|
|
|
|
collectionsRetrieved({m_rootCollection});
|
|
diff --git a/resources/google-groupware/googleresource.h b/resources/google-groupware/googleresource.h
|
|
index 4609572756..75708afca4 100644
|
|
--- a/resources/google-groupware/googleresource.h
|
|
+++ b/resources/google-groupware/googleresource.h
|
|
@@ -14,6 +14,7 @@
|
|
|
|
#include "calendarhandler.h"
|
|
#include "generichandler.h"
|
|
+#include "googlesettings.h"
|
|
|
|
#define JOB_PROPERTY "_KGAPI2Job"
|
|
|
|
@@ -37,7 +38,6 @@ public:
|
|
|
|
void cleanup() override;
|
|
public Q_SLOTS:
|
|
- void configure(WId windowId) override;
|
|
void reloadConfig();
|
|
|
|
protected:
|
|
@@ -83,7 +83,7 @@ protected Q_SLOTS:
|
|
|
|
private:
|
|
bool m_isConfiguring = false;
|
|
- GoogleSettings *m_settings = nullptr;
|
|
+ GoogleSettings m_settings;
|
|
Akonadi::Collection m_rootCollection;
|
|
|
|
GoogleResourceState *const m_iface;
|
|
diff --git a/resources/google-groupware/googlescopes.cpp b/resources/google-groupware/googlescopes.cpp
|
|
new file mode 100644
|
|
index 0000000000..9e565f7e33
|
|
--- /dev/null
|
|
+++ b/resources/google-groupware/googlescopes.cpp
|
|
@@ -0,0 +1,19 @@
|
|
+// SPDX-FileCopyrightText: 2011 Daniel Vrátil <dvratil@redhat.com>
|
|
+// SPDX-FileCopyrightText: 2023 Carl Schwan <carl@carlschwan.eu>
|
|
+// SPDX-License-Identifier: GPL-3.0-or-later
|
|
+
|
|
+#include "googlescopes.h"
|
|
+#include <KGAPI/Account>
|
|
+
|
|
+using namespace KGAPI2;
|
|
+
|
|
+QList<QUrl> googleScopes()
|
|
+{
|
|
+ // TODO: determine it based on what user wants?
|
|
+ return {
|
|
+ Account::accountInfoScopeUrl(),
|
|
+ Account::calendarScopeUrl(),
|
|
+ Account::peopleScopeUrl(),
|
|
+ Account::tasksScopeUrl(),
|
|
+ };
|
|
+}
|
|
diff --git a/resources/google-groupware/googlescopes.h b/resources/google-groupware/googlescopes.h
|
|
new file mode 100644
|
|
index 0000000000..33bf579a89
|
|
--- /dev/null
|
|
+++ b/resources/google-groupware/googlescopes.h
|
|
@@ -0,0 +1,10 @@
|
|
+/*
|
|
+ SPDX-FileCopyrightText: 2011 Daniel Vrátil <dvratil@redhat.com>
|
|
+ SPDX-FileCopyrightText: 2023 Carl Schwan <carl@carlschwan.eu>
|
|
+ SPDX-License-Identifier: GPL-3.0-or-later
|
|
+*/
|
|
+
|
|
+#include <QList>
|
|
+#include <QUrl>
|
|
+
|
|
+QList<QUrl> googleScopes();
|
|
diff --git a/resources/google-groupware/googlesettings.cpp b/resources/google-groupware/googlesettings.cpp
|
|
index 6a1785fcf9..aa94cad1ab 100644
|
|
--- a/resources/google-groupware/googlesettings.cpp
|
|
+++ b/resources/google-groupware/googlesettings.cpp
|
|
@@ -8,6 +8,8 @@
|
|
|
|
#include "googlesettings.h"
|
|
#include "googleresource_debug.h"
|
|
+#include "googlescopes.h"
|
|
+#include "settingsadaptor.h"
|
|
|
|
#include <KGAPI/Account>
|
|
#include <KLocalizedString>
|
|
@@ -27,8 +29,16 @@ using namespace KGAPI2;
|
|
|
|
static const QString googleWalletFolder = QStringLiteral("Akonadi Google");
|
|
|
|
-GoogleSettings::GoogleSettings()
|
|
+GoogleSettings::GoogleSettings(const KSharedConfigPtr &config, Options options)
|
|
+ : SettingsBase(config)
|
|
{
|
|
+ qDebug() << config;
|
|
+ if (options & Option::ExportToDBus) {
|
|
+ new SettingsAdaptor(this);
|
|
+ QDBusConnection::sessionBus().registerObject(QStringLiteral("/Settings"),
|
|
+ this,
|
|
+ QDBusConnection::ExportAdaptors | QDBusConnection::ExportScriptableContents);
|
|
+ }
|
|
}
|
|
|
|
void GoogleSettings::init()
|
|
@@ -82,15 +92,17 @@ WritePasswordJob *GoogleSettings::storeAccount(AccountPtr account)
|
|
m_account = account;
|
|
|
|
QStringList scopes;
|
|
- const QList<QUrl> urlScopes = m_account->scopes();
|
|
+ const QList<QUrl> urlScopes = googleScopes();
|
|
scopes.reserve(urlScopes.count());
|
|
for (const QUrl &url : urlScopes) {
|
|
scopes << url.toString();
|
|
}
|
|
|
|
- const QMap<QString, QString> map = {{QStringLiteral("accessToken"), m_account->accessToken()},
|
|
- {QStringLiteral("refreshToken"), m_account->refreshToken()},
|
|
- {QStringLiteral("scopes"), scopes.join(QLatin1Char(','))}};
|
|
+ const QMap<QString, QString> map = {
|
|
+ {QStringLiteral("accessToken"), m_account->accessToken()},
|
|
+ {QStringLiteral("refreshToken"), m_account->refreshToken()},
|
|
+ {QStringLiteral("scopes"), scopes.join(QLatin1Char(','))},
|
|
+ };
|
|
|
|
// Legacy: store the map exactly like kwallet is doing it
|
|
QByteArray mapData;
|
|
diff --git a/resources/google-groupware/googlesettings.h b/resources/google-groupware/googlesettings.h
|
|
index f689dc7748..0ec4c3c34e 100644
|
|
--- a/resources/google-groupware/googlesettings.h
|
|
+++ b/resources/google-groupware/googlesettings.h
|
|
@@ -33,7 +33,14 @@ class GoogleSettings : public SettingsBase
|
|
Q_CLASSINFO("D-Bus Interface", "org.kde.Akonadi.Google.ExtendedSettings")
|
|
|
|
public:
|
|
- GoogleSettings();
|
|
+ enum class Option {
|
|
+ NoOption = 0,
|
|
+ ExportToDBus = 1,
|
|
+ };
|
|
+ Q_DECLARE_FLAGS(Options, Option)
|
|
+
|
|
+ explicit GoogleSettings(const KSharedConfigPtr &config, Options options = Option::ExportToDBus);
|
|
+
|
|
void init();
|
|
void setWindowId(WId id);
|
|
void setResourceId(const QString &resourceIdentifier);
|
|
@@ -50,9 +57,11 @@ public:
|
|
bool isReady() const;
|
|
QKeychain::WritePasswordJob *storeAccount(KGAPI2::AccountPtr account);
|
|
void cleanup();
|
|
+
|
|
Q_SIGNALS:
|
|
void accountReady(bool ready);
|
|
void accountChanged();
|
|
+ void okEnabled(bool enabled);
|
|
|
|
private:
|
|
void slotWalletOpened(bool success);
|
|
diff --git a/resources/google-groupware/googlesettingsdialog.cpp b/resources/google-groupware/googlesettingsdialog.cpp
|
|
deleted file mode 100644
|
|
index d418652d6f..0000000000
|
|
--- a/resources/google-groupware/googlesettingsdialog.cpp
|
|
+++ /dev/null
|
|
@@ -1,305 +0,0 @@
|
|
-/*
|
|
- SPDX-FileCopyrightText: 2013 Daniel Vrátil <dvratil@redhat.com>
|
|
- SPDX-FileCopyrightText: 2020 Igor Poboiko <igor.poboiko@gmail.com>
|
|
-
|
|
- SPDX-License-Identifier: GPL-3.0-or-later
|
|
-*/
|
|
-
|
|
-#include "googlesettingsdialog.h"
|
|
-#include "googleresource.h"
|
|
-#include "googleresource_debug.h"
|
|
-#include "googlesettings.h"
|
|
-#include "ui_googlesettingsdialog.h"
|
|
-
|
|
-#include <QDialogButtonBox>
|
|
-
|
|
-#include <KGAPI/Account>
|
|
-#include <KGAPI/AuthJob>
|
|
-#include <KGAPI/Calendar/Calendar>
|
|
-#include <KGAPI/Calendar/CalendarFetchJob>
|
|
-#include <KGAPI/Tasks/TaskList>
|
|
-#include <KGAPI/Tasks/TaskListFetchJob>
|
|
-#include <KMessageBox>
|
|
-#include <kwindowsystem>
|
|
-
|
|
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
|
-#include <qt5keychain/keychain.h>
|
|
-#else
|
|
-#include <qt6keychain/keychain.h>
|
|
-#endif
|
|
-
|
|
-using namespace QKeychain;
|
|
-using namespace KGAPI2;
|
|
-
|
|
-GoogleSettingsDialog::GoogleSettingsDialog(GoogleResource *resource, GoogleSettings *settings, WId wId)
|
|
- : QDialog()
|
|
- , m_resource(resource)
|
|
- , m_settings(settings)
|
|
- , m_ui(new Ui::GoogleSettingsDialog)
|
|
-{
|
|
- if (wId) {
|
|
- setAttribute(Qt::WA_NativeWindow, true);
|
|
- kwindowsystem::setMainWindow(windowHandle(), wId);
|
|
- }
|
|
- auto mainLayout = new QVBoxLayout(this);
|
|
-
|
|
- auto mainWidget = new QWidget(this);
|
|
- mainLayout->addWidget(mainWidget);
|
|
-
|
|
- auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
|
|
- QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
|
|
- okButton->setDefault(true);
|
|
- okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
|
|
- mainLayout->addWidget(buttonBox);
|
|
-
|
|
- m_ui->setupUi(mainWidget);
|
|
-
|
|
- m_ui->refreshSpinBox->setSuffix(ki18np(" minute", " minutes"));
|
|
- m_ui->enableRefresh->setChecked(m_settings->enableIntervalCheck());
|
|
- m_ui->refreshSpinBox->setEnabled(m_settings->enableIntervalCheck());
|
|
- m_ui->refreshSpinBox->setValue(m_settings->intervalCheckTime());
|
|
-
|
|
- m_ui->eventsLimitCombo->setMaximumDate(QDate::currentDate());
|
|
- m_ui->eventsLimitCombo->setMinimumDate(QDate::fromString(QStringLiteral("2000-01-01"), Qt::ISODate));
|
|
- m_ui->eventsLimitCombo->setOptions(KDateComboBox::EditDate | KDateComboBox::SelectDate | KDateComboBox::DatePicker | KDateComboBox::WarnOnInvalid);
|
|
- if (m_settings->eventsSince().isEmpty()) {
|
|
- const QString ds = QStringLiteral("%1-01-01").arg(QString::number(QDate::currentDate().year() - 3));
|
|
- m_ui->eventsLimitCombo->setDate(QDate::fromString(ds, Qt::ISODate));
|
|
- } else {
|
|
- m_ui->eventsLimitCombo->setDate(QDate::fromString(m_settings->eventsSince(), Qt::ISODate));
|
|
- }
|
|
-
|
|
- connect(buttonBox, &QDialogButtonBox::accepted, this, &GoogleSettingsDialog::slotSaveSettings);
|
|
- connect(buttonBox, &QDialogButtonBox::rejected, this, &GoogleSettingsDialog::reject);
|
|
- connect(m_ui->reloadCalendarsBtn, &QPushButton::clicked, this, &GoogleSettingsDialog::slotReloadCalendars);
|
|
- connect(m_ui->reloadTaskListsBtn, &QPushButton::clicked, this, &GoogleSettingsDialog::slotReloadTaskLists);
|
|
- connect(m_ui->configureBtn, &QPushButton::clicked, this, &GoogleSettingsDialog::slotConfigure);
|
|
- if (m_settings->isReady()) {
|
|
- m_account = m_settings->accountPtr();
|
|
- }
|
|
- connect(m_settings, &GoogleSettings::accountReady, this, [this](bool ready) {
|
|
- if (ready) {
|
|
- m_account = m_settings->accountPtr();
|
|
- accountChanged();
|
|
- }
|
|
- });
|
|
- QMetaObject::invokeMethod(this, &GoogleSettingsDialog::accountChanged, Qt::QueuedConnection);
|
|
-}
|
|
-
|
|
-GoogleSettingsDialog::~GoogleSettingsDialog()
|
|
-{
|
|
- delete m_ui;
|
|
-}
|
|
-
|
|
-bool GoogleSettingsDialog::handleError(KGAPI2::Job *job)
|
|
-{
|
|
- if ((job->error() == KGAPI2::NoError) || (job->error() == KGAPI2::OK)) {
|
|
- return true;
|
|
- }
|
|
-
|
|
- if (job->error() == KGAPI2::Unauthorized) {
|
|
- qCDebug(GOOGLE_LOG) << job << job->errorString();
|
|
- const QList<QUrl> resourceScopes = m_resource->scopes();
|
|
- for (const QUrl &scope : resourceScopes) {
|
|
- if (!m_account->scopes().contains(scope)) {
|
|
- m_account->addScope(scope);
|
|
- }
|
|
- }
|
|
-
|
|
- auto authJob = new AuthJob(m_account, m_settings->clientId(), m_settings->clientSecret(), this);
|
|
- authJob->setProperty(JOB_PROPERTY, QVariant::fromValue(job));
|
|
- connect(authJob, &AuthJob::finished, this, &GoogleSettingsDialog::slotAuthJobFinished);
|
|
-
|
|
- return false;
|
|
- }
|
|
-
|
|
- KMessageBox::error(this, job->errorString());
|
|
- return false;
|
|
-}
|
|
-
|
|
-void GoogleSettingsDialog::accountChanged()
|
|
-{
|
|
- if (!m_account) {
|
|
- m_ui->accountLabel->setText(i18n("<b>not configured</b>"));
|
|
- m_ui->calendarsList->setDisabled(true);
|
|
- m_ui->reloadCalendarsBtn->setDisabled(true);
|
|
- m_ui->calendarsList->clear();
|
|
- m_ui->taskListsList->setDisabled(true);
|
|
- m_ui->reloadTaskListsBtn->setDisabled(true);
|
|
- m_ui->taskListsList->clear();
|
|
- return;
|
|
- }
|
|
- m_ui->accountLabel->setText(QStringLiteral("<b>%1</b>").arg(m_account->accountName()));
|
|
- slotReloadCalendars();
|
|
- slotReloadTaskLists();
|
|
-}
|
|
-
|
|
-void GoogleSettingsDialog::slotConfigure()
|
|
-{
|
|
- const QString username = m_account && !m_account->accountName().isEmpty() ? m_account->accountName() : QString();
|
|
- m_account = AccountPtr(new Account());
|
|
- const QList<QUrl> resourceScopes = m_resource->scopes();
|
|
- for (const QUrl &scope : resourceScopes) {
|
|
- if (!m_account->scopes().contains(scope)) {
|
|
- m_account->addScope(scope);
|
|
- }
|
|
- }
|
|
- auto authJob = new AuthJob(m_account, m_settings->clientId(), m_settings->clientSecret());
|
|
- authJob->setUsername(username);
|
|
- connect(authJob, &AuthJob::finished, this, &GoogleSettingsDialog::slotAuthJobFinished);
|
|
-}
|
|
-
|
|
-void GoogleSettingsDialog::slotAuthJobFinished(KGAPI2::Job *job)
|
|
-{
|
|
- auto authJob = qobject_cast<AuthJob *>(job);
|
|
- m_account = authJob->account();
|
|
- if (authJob->error() != KGAPI2::NoError) {
|
|
- KMessageBox::error(this, authJob->errorString());
|
|
- return;
|
|
- }
|
|
- accountChanged();
|
|
-
|
|
- auto otherJob = job->property(JOB_PROPERTY).value<KGAPI2::Job *>();
|
|
- if (otherJob) {
|
|
- otherJob->setAccount(m_account);
|
|
- otherJob->restart();
|
|
- }
|
|
-}
|
|
-
|
|
-void GoogleSettingsDialog::slotSaveSettings()
|
|
-{
|
|
- auto reset = [this] {
|
|
- m_settings->setAccount({});
|
|
- m_settings->setEnableIntervalCheck(m_ui->enableRefresh->isChecked());
|
|
- m_settings->setIntervalCheckTime(m_ui->refreshSpinBox->value());
|
|
- m_settings->setCalendars({});
|
|
- m_settings->setTaskLists({});
|
|
- m_settings->setEventsSince({});
|
|
- m_settings->save();
|
|
- };
|
|
-
|
|
- if (!m_account) {
|
|
- reset();
|
|
- return;
|
|
- }
|
|
-
|
|
- auto writeJob = m_settings->storeAccount(m_account);
|
|
- connect(writeJob, &WritePasswordJob::finished, this, [this, reset, writeJob]() {
|
|
- if (writeJob->error()) {
|
|
- qCWarning(GOOGLE_LOG) << "Failed to store account's password in secret storage" << writeJob->errorString();
|
|
- reset();
|
|
- return;
|
|
- }
|
|
-
|
|
- m_settings->setAccount(m_account->accountName());
|
|
- m_settings->setEnableIntervalCheck(m_ui->enableRefresh->isChecked());
|
|
- m_settings->setIntervalCheckTime(m_ui->refreshSpinBox->value());
|
|
-
|
|
- QStringList calendars;
|
|
- for (int i = 0; i < m_ui->calendarsList->count(); i++) {
|
|
- QListWidgetItem *item = m_ui->calendarsList->item(i);
|
|
-
|
|
- if (item->checkState() == Qt::Checked) {
|
|
- calendars.append(item->data(Qt::UserRole).toString());
|
|
- }
|
|
- }
|
|
- m_settings->setCalendars(calendars);
|
|
-
|
|
- if (m_ui->eventsLimitCombo->isValid()) {
|
|
- m_settings->setEventsSince(m_ui->eventsLimitCombo->date().toString(Qt::ISODate));
|
|
- }
|
|
-
|
|
- QStringList taskLists;
|
|
- for (int i = 0; i < m_ui->taskListsList->count(); i++) {
|
|
- QListWidgetItem *item = m_ui->taskListsList->item(i);
|
|
-
|
|
- if (item->checkState() == Qt::Checked) {
|
|
- taskLists.append(item->data(Qt::UserRole).toString());
|
|
- }
|
|
- }
|
|
- m_settings->setTaskLists(taskLists);
|
|
- m_settings->save();
|
|
-
|
|
- accept();
|
|
- });
|
|
-}
|
|
-
|
|
-void GoogleSettingsDialog::slotReloadCalendars()
|
|
-{
|
|
- m_ui->calendarsList->setDisabled(true);
|
|
- m_ui->reloadCalendarsBtn->setDisabled(true);
|
|
- m_ui->calendarsList->clear();
|
|
-
|
|
- if (!m_account) {
|
|
- return;
|
|
- }
|
|
-
|
|
- auto fetchJob = new CalendarFetchJob(m_account, this);
|
|
- connect(fetchJob, &CalendarFetchJob::finished, this, [this](KGAPI2::Job *job) {
|
|
- if (!handleError(job) || !m_account) {
|
|
- m_ui->calendarsList->setEnabled(false);
|
|
- m_ui->reloadCalendarsBtn->setEnabled(false);
|
|
- return;
|
|
- }
|
|
-
|
|
- const ObjectsList objects = qobject_cast<FetchJob *>(job)->items();
|
|
-
|
|
- QStringList activeCalendars;
|
|
- if (m_account->accountName() == m_settings->account()) {
|
|
- activeCalendars = m_settings->calendars();
|
|
- }
|
|
- m_ui->calendarsList->clear();
|
|
- for (const ObjectPtr &object : objects) {
|
|
- const CalendarPtr calendar = object.dynamicCast<Calendar>();
|
|
-
|
|
- auto item = new QListWidgetItem(calendar->title());
|
|
- item->setData(Qt::UserRole, calendar->uid());
|
|
- item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
|
|
- item->setCheckState((activeCalendars.isEmpty() || activeCalendars.contains(calendar->uid())) ? Qt::Checked : Qt::Unchecked);
|
|
- m_ui->calendarsList->addItem(item);
|
|
- }
|
|
-
|
|
- m_ui->calendarsList->setEnabled(true);
|
|
- m_ui->reloadCalendarsBtn->setEnabled(true);
|
|
- });
|
|
-}
|
|
-
|
|
-void GoogleSettingsDialog::slotReloadTaskLists()
|
|
-{
|
|
- if (!m_account) {
|
|
- return;
|
|
- }
|
|
-
|
|
- m_ui->taskListsList->setDisabled(true);
|
|
- m_ui->reloadTaskListsBtn->setDisabled(true);
|
|
- m_ui->taskListsList->clear();
|
|
-
|
|
- auto job = new TaskListFetchJob(m_account, this);
|
|
- connect(job, &TaskListFetchJob::finished, this, [this](KGAPI2::Job *job) {
|
|
- if (!handleError(job) || !m_account) {
|
|
- m_ui->taskListsList->setDisabled(true);
|
|
- m_ui->reloadTaskListsBtn->setDisabled(true);
|
|
- return;
|
|
- }
|
|
-
|
|
- const ObjectsList objects = qobject_cast<FetchJob *>(job)->items();
|
|
-
|
|
- QStringList activeTaskLists;
|
|
- if (m_account->accountName() == m_settings->account()) {
|
|
- activeTaskLists = m_settings->taskLists();
|
|
- }
|
|
- m_ui->taskListsList->clear();
|
|
- for (const ObjectPtr &object : objects) {
|
|
- const TaskListPtr taskList = object.dynamicCast<TaskList>();
|
|
-
|
|
- auto item = new QListWidgetItem(taskList->title());
|
|
- item->setData(Qt::UserRole, taskList->uid());
|
|
- item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
|
|
- item->setCheckState((activeTaskLists.isEmpty() || activeTaskLists.contains(taskList->uid())) ? Qt::Checked : Qt::Unchecked);
|
|
- m_ui->taskListsList->addItem(item);
|
|
- }
|
|
-
|
|
- m_ui->taskListsList->setEnabled(true);
|
|
- m_ui->reloadTaskListsBtn->setEnabled(true);
|
|
- });
|
|
-}
|
|
diff --git a/resources/google-groupware/googlesettingswidget.cpp b/resources/google-groupware/googlesettingswidget.cpp
|
|
new file mode 100644
|
|
index 0000000000..2543c4c6b8
|
|
--- /dev/null
|
|
+++ b/resources/google-groupware/googlesettingswidget.cpp
|
|
@@ -0,0 +1,288 @@
|
|
+/*
|
|
+ SPDX-FileCopyrightText: 2013 Daniel Vrátil <dvratil@redhat.com>
|
|
+ SPDX-FileCopyrightText: 2020 Igor Poboiko <igor.poboiko@gmail.com>
|
|
+
|
|
+ SPDX-License-Identifier: GPL-3.0-or-later
|
|
+*/
|
|
+
|
|
+#include "googlesettingswidget.h"
|
|
+#include "googleresource.h"
|
|
+#include "googleresource_debug.h"
|
|
+#include "googlescopes.h"
|
|
+#include "googlesettings.h"
|
|
+
|
|
+#include <QDialogButtonBox>
|
|
+
|
|
+#include <KGAPI/Account>
|
|
+#include <KGAPI/AuthJob>
|
|
+#include <KGAPI/Calendar/Calendar>
|
|
+#include <KGAPI/Calendar/CalendarFetchJob>
|
|
+#include <KGAPI/Tasks/TaskList>
|
|
+#include <KGAPI/Tasks/TaskListFetchJob>
|
|
+#include <KMessageBox>
|
|
+#include <kwindowsystem>
|
|
+
|
|
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
|
+#include <qt5keychain/keychain.h>
|
|
+#else
|
|
+#include <qt6keychain/keychain.h>
|
|
+#endif
|
|
+
|
|
+using namespace QKeychain;
|
|
+using namespace KGAPI2;
|
|
+
|
|
+GoogleSettingsWidget::GoogleSettingsWidget(GoogleSettings &settings, const QString &identifier, QWidget *parent)
|
|
+ : QWidget(parent)
|
|
+ , m_settings(settings)
|
|
+ , m_identifier(identifier)
|
|
+{
|
|
+ qDebug() << m_settings.account();
|
|
+ auto mainLayout = new QVBoxLayout(this);
|
|
+
|
|
+ auto mainWidget = new QWidget(this);
|
|
+ mainLayout->addWidget(mainWidget);
|
|
+ setupUi(mainWidget);
|
|
+
|
|
+ refreshSpinBox->setSuffix(ki18np(" minute", " minutes"));
|
|
+ enableRefresh->setChecked(m_settings.enableIntervalCheck());
|
|
+ refreshSpinBox->setEnabled(m_settings.enableIntervalCheck());
|
|
+ refreshSpinBox->setValue(m_settings.intervalCheckTime());
|
|
+
|
|
+ eventsLimitCombo->setMaximumDate(QDate::currentDate());
|
|
+ eventsLimitCombo->setMinimumDate(QDate::fromString(QStringLiteral("2000-01-01"), Qt::ISODate));
|
|
+ eventsLimitCombo->setOptions(KDateComboBox::EditDate | KDateComboBox::SelectDate | KDateComboBox::DatePicker | KDateComboBox::WarnOnInvalid);
|
|
+ if (m_settings.eventsSince().isEmpty()) {
|
|
+ const QString ds = QStringLiteral("%1-01-01").arg(QString::number(QDate::currentDate().year() - 3));
|
|
+ eventsLimitCombo->setDate(QDate::fromString(ds, Qt::ISODate));
|
|
+ } else {
|
|
+ eventsLimitCombo->setDate(QDate::fromString(m_settings.eventsSince(), Qt::ISODate));
|
|
+ }
|
|
+ connect(reloadCalendarsBtn, &QPushButton::clicked, this, &GoogleSettingsWidget::slotReloadCalendars);
|
|
+ connect(reloadTaskListsBtn, &QPushButton::clicked, this, &GoogleSettingsWidget::slotReloadTaskLists);
|
|
+ connect(configureBtn, &QPushButton::clicked, this, &GoogleSettingsWidget::loadSettings);
|
|
+ if (m_settings.isReady()) {
|
|
+ m_account = m_settings.accountPtr();
|
|
+ }
|
|
+ connect(&m_settings, &GoogleSettings::accountReady, this, [this](bool ready) {
|
|
+ if (ready) {
|
|
+ m_account = m_settings.accountPtr();
|
|
+ accountChanged();
|
|
+ }
|
|
+ });
|
|
+ QMetaObject::invokeMethod(this, &GoogleSettingsWidget::accountChanged, Qt::QueuedConnection);
|
|
+}
|
|
+
|
|
+GoogleSettingsWidget::~GoogleSettingsWidget()
|
|
+{
|
|
+}
|
|
+
|
|
+bool GoogleSettingsWidget::handleError(KGAPI2::Job *job)
|
|
+{
|
|
+ if ((job->error() == KGAPI2::NoError) || (job->error() == KGAPI2::OK)) {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ if (job->error() == KGAPI2::Unauthorized) {
|
|
+ qCDebug(GOOGLE_LOG) << job << job->errorString();
|
|
+ const QList<QUrl> resourceScopes = googleScopes();
|
|
+ for (const QUrl &scope : resourceScopes) {
|
|
+ if (!m_account->scopes().contains(scope)) {
|
|
+ m_account->addScope(scope);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ auto authJob = new AuthJob(m_account, m_settings.clientId(), m_settings.clientSecret(), this);
|
|
+ authJob->setProperty(JOB_PROPERTY, QVariant::fromValue(job));
|
|
+ connect(authJob, &AuthJob::finished, this, &GoogleSettingsWidget::slotAuthJobFinished);
|
|
+
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ KMessageBox::error(this, job->errorString());
|
|
+ return false;
|
|
+}
|
|
+
|
|
+void GoogleSettingsWidget::accountChanged()
|
|
+{
|
|
+ if (!m_account) {
|
|
+ accountLabel->setText(i18n("<b>not configured</b>"));
|
|
+ calendarsList->setDisabled(true);
|
|
+ reloadCalendarsBtn->setDisabled(true);
|
|
+ calendarsList->clear();
|
|
+ taskListsList->setDisabled(true);
|
|
+ reloadTaskListsBtn->setDisabled(true);
|
|
+ taskListsList->clear();
|
|
+ return;
|
|
+ }
|
|
+ accountLabel->setText(QStringLiteral("<b>%1</b>").arg(m_account->accountName()));
|
|
+ slotReloadCalendars();
|
|
+ slotReloadTaskLists();
|
|
+}
|
|
+
|
|
+void GoogleSettingsWidget::loadSettings()
|
|
+{
|
|
+ const QString username = m_account && !m_account->accountName().isEmpty() ? m_account->accountName() : QString();
|
|
+ m_account = AccountPtr(new Account());
|
|
+ const QList<QUrl> resourceScopes = googleScopes();
|
|
+ for (const QUrl &scope : resourceScopes) {
|
|
+ if (!m_account->scopes().contains(scope)) {
|
|
+ m_account->addScope(scope);
|
|
+ }
|
|
+ }
|
|
+ auto authJob = new AuthJob(m_account, m_settings.clientId(), m_settings.clientSecret());
|
|
+ authJob->setUsername(username);
|
|
+ connect(authJob, &AuthJob::finished, this, &GoogleSettingsWidget::slotAuthJobFinished);
|
|
+}
|
|
+
|
|
+void GoogleSettingsWidget::slotAuthJobFinished(KGAPI2::Job *job)
|
|
+{
|
|
+ auto authJob = qobject_cast<AuthJob *>(job);
|
|
+ m_account = authJob->account();
|
|
+ if (authJob->error() != KGAPI2::NoError) {
|
|
+ KMessageBox::error(this, authJob->errorString());
|
|
+ return;
|
|
+ }
|
|
+ accountChanged();
|
|
+
|
|
+ auto otherJob = job->property(JOB_PROPERTY).value<KGAPI2::Job *>();
|
|
+ if (otherJob) {
|
|
+ otherJob->setAccount(m_account);
|
|
+ otherJob->restart();
|
|
+ }
|
|
+}
|
|
+
|
|
+void GoogleSettingsWidget::saveSettings()
|
|
+{
|
|
+ auto reset = [this] {
|
|
+ m_settings.setAccount({});
|
|
+ m_settings.setEnableIntervalCheck(enableRefresh->isChecked());
|
|
+ m_settings.setIntervalCheckTime(refreshSpinBox->value());
|
|
+ m_settings.setCalendars({});
|
|
+ m_settings.setTaskLists({});
|
|
+ m_settings.setEventsSince({});
|
|
+ m_settings.save();
|
|
+ };
|
|
+
|
|
+ if (!m_account) {
|
|
+ reset();
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ auto writeJob = m_settings.storeAccount(m_account);
|
|
+ connect(writeJob, &WritePasswordJob::finished, this, [this, reset, writeJob]() {
|
|
+ if (writeJob->error()) {
|
|
+ qCWarning(GOOGLE_LOG) << "Failed to store account's password in secret storage" << writeJob->errorString();
|
|
+ reset();
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ m_settings.setAccount(m_account->accountName());
|
|
+ m_settings.setEnableIntervalCheck(enableRefresh->isChecked());
|
|
+ m_settings.setIntervalCheckTime(refreshSpinBox->value());
|
|
+
|
|
+ QStringList calendars;
|
|
+ for (int i = 0; i < calendarsList->count(); i++) {
|
|
+ QListWidgetItem *item = calendarsList->item(i);
|
|
+
|
|
+ if (item->checkState() == Qt::Checked) {
|
|
+ calendars.append(item->data(Qt::UserRole).toString());
|
|
+ }
|
|
+ }
|
|
+ m_settings.setCalendars(calendars);
|
|
+
|
|
+ if (eventsLimitCombo->isValid()) {
|
|
+ m_settings.setEventsSince(eventsLimitCombo->date().toString(Qt::ISODate));
|
|
+ }
|
|
+
|
|
+ QStringList taskLists;
|
|
+ for (int i = 0; i < taskListsList->count(); i++) {
|
|
+ QListWidgetItem *item = taskListsList->item(i);
|
|
+
|
|
+ if (item->checkState() == Qt::Checked) {
|
|
+ taskLists.append(item->data(Qt::UserRole).toString());
|
|
+ }
|
|
+ }
|
|
+ m_settings.setTaskLists(taskLists);
|
|
+ m_settings.save();
|
|
+ });
|
|
+}
|
|
+
|
|
+void GoogleSettingsWidget::slotReloadCalendars()
|
|
+{
|
|
+ calendarsList->setDisabled(true);
|
|
+ reloadCalendarsBtn->setDisabled(true);
|
|
+ calendarsList->clear();
|
|
+
|
|
+ if (!m_account) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ auto fetchJob = new CalendarFetchJob(m_account, this);
|
|
+ connect(fetchJob, &CalendarFetchJob::finished, this, [this](KGAPI2::Job *job) {
|
|
+ if (!handleError(job) || !m_account) {
|
|
+ calendarsList->setEnabled(false);
|
|
+ reloadCalendarsBtn->setEnabled(false);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ const ObjectsList objects = qobject_cast<FetchJob *>(job)->items();
|
|
+
|
|
+ QStringList activeCalendars;
|
|
+ if (m_account->accountName() == m_settings.account()) {
|
|
+ activeCalendars = m_settings.calendars();
|
|
+ }
|
|
+ calendarsList->clear();
|
|
+ for (const ObjectPtr &object : objects) {
|
|
+ const CalendarPtr calendar = object.dynamicCast<Calendar>();
|
|
+
|
|
+ auto item = new QListWidgetItem(calendar->title());
|
|
+ item->setData(Qt::UserRole, calendar->uid());
|
|
+ item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
|
|
+ item->setCheckState((activeCalendars.isEmpty() || activeCalendars.contains(calendar->uid())) ? Qt::Checked : Qt::Unchecked);
|
|
+ calendarsList->addItem(item);
|
|
+ }
|
|
+
|
|
+ calendarsList->setEnabled(true);
|
|
+ reloadCalendarsBtn->setEnabled(true);
|
|
+ });
|
|
+}
|
|
+
|
|
+void GoogleSettingsWidget::slotReloadTaskLists()
|
|
+{
|
|
+ if (!m_account) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ taskListsList->setDisabled(true);
|
|
+ reloadTaskListsBtn->setDisabled(true);
|
|
+ taskListsList->clear();
|
|
+
|
|
+ auto job = new TaskListFetchJob(m_account, this);
|
|
+ connect(job, &TaskListFetchJob::finished, this, [this](KGAPI2::Job *job) {
|
|
+ if (!handleError(job) || !m_account) {
|
|
+ taskListsList->setDisabled(true);
|
|
+ reloadTaskListsBtn->setDisabled(true);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ const ObjectsList objects = qobject_cast<FetchJob *>(job)->items();
|
|
+
|
|
+ QStringList activeTaskLists;
|
|
+ if (m_account->accountName() == m_settings.account()) {
|
|
+ activeTaskLists = m_settings.taskLists();
|
|
+ }
|
|
+ taskListsList->clear();
|
|
+ for (const ObjectPtr &object : objects) {
|
|
+ const TaskListPtr taskList = object.dynamicCast<TaskList>();
|
|
+
|
|
+ auto item = new QListWidgetItem(taskList->title());
|
|
+ item->setData(Qt::UserRole, taskList->uid());
|
|
+ item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
|
|
+ item->setCheckState((activeTaskLists.isEmpty() || activeTaskLists.contains(taskList->uid())) ? Qt::Checked : Qt::Unchecked);
|
|
+ taskListsList->addItem(item);
|
|
+ }
|
|
+
|
|
+ taskListsList->setEnabled(true);
|
|
+ reloadTaskListsBtn->setEnabled(true);
|
|
+ });
|
|
+}
|
|
diff --git a/resources/google-groupware/googlesettingsdialog.h b/resources/google-groupware/googlesettingswidget.h
|
|
similarity index 53%
|
|
rename from resources/google-groupware/googlesettingsdialog.h
|
|
rename to resources/google-groupware/googlesettingswidget.h
|
|
index a7d6ca0c92..4226a39d2d 100644
|
|
--- a/resources/google-groupware/googlesettingsdialog.h
|
|
+++ b/resources/google-groupware/googlesettingswidget.h
|
|
@@ -7,40 +7,37 @@
|
|
|
|
#pragma once
|
|
|
|
+#include "googlesettings.h"
|
|
+#include "ui_googlesettingswidget.h"
|
|
#include <KGAPI/Types>
|
|
-#include <QDialog>
|
|
|
|
-namespace Ui
|
|
-{
|
|
-class GoogleSettingsDialog;
|
|
-}
|
|
namespace KGAPI2
|
|
{
|
|
class Job;
|
|
}
|
|
-class GoogleResource;
|
|
-class GoogleSettings;
|
|
-
|
|
-class GoogleSettingsDialog : public QDialog
|
|
+class GoogleSettingsWidget : public QWidget, private Ui::GoogleSettingsWidget
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
- explicit GoogleSettingsDialog(GoogleResource *resource, GoogleSettings *settings, WId wId);
|
|
- ~GoogleSettingsDialog() override;
|
|
+ explicit GoogleSettingsWidget(GoogleSettings &settings, const QString &identifier, QWidget *parent);
|
|
+ ~GoogleSettingsWidget() override;
|
|
+
|
|
+ void loadSettings();
|
|
+ void saveSettings();
|
|
+
|
|
+Q_SIGNALS:
|
|
+ void okEnabled(bool enabled);
|
|
|
|
protected:
|
|
bool handleError(KGAPI2::Job *job);
|
|
void accountChanged();
|
|
|
|
private:
|
|
- void slotConfigure();
|
|
void slotAuthJobFinished(KGAPI2::Job *job);
|
|
- void slotSaveSettings();
|
|
void slotReloadCalendars();
|
|
void slotReloadTaskLists();
|
|
|
|
- GoogleResource *const m_resource;
|
|
- GoogleSettings *const m_settings;
|
|
- Ui::GoogleSettingsDialog *const m_ui;
|
|
+ GoogleSettings &m_settings;
|
|
KGAPI2::AccountPtr m_account;
|
|
+ const QString m_identifier;
|
|
};
|
|
diff --git a/resources/google-groupware/googlesettingsdialog.ui b/resources/google-groupware/googlesettingswidget.ui
|
|
similarity index 99%
|
|
rename from resources/google-groupware/googlesettingsdialog.ui
|
|
rename to resources/google-groupware/googlesettingswidget.ui
|
|
index 9ff9bc93b4..75fdfd24f1 100644
|
|
--- a/resources/google-groupware/googlesettingsdialog.ui
|
|
+++ b/resources/google-groupware/googlesettingswidget.ui
|
|
@@ -1,6 +1,6 @@
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<ui version="4.0">
|
|
- <class>GoogleSettingsDialog</class>
|
|
+ <class>GoogleSettingsWidget</class>
|
|
<widget class="QWidget" name="GoogleSettingsDialog">
|
|
<property name="geometry">
|
|
<rect>
|
|
diff --git a/resources/google-groupware/settingsbase.kcfg b/resources/google-groupware/settingsbase.kcfg
|
|
index ac58395d71..7dfe8dfe92 100644
|
|
--- a/resources/google-groupware/settingsbase.kcfg
|
|
+++ b/resources/google-groupware/settingsbase.kcfg
|
|
@@ -4,7 +4,7 @@
|
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
|
|
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
|
|
- <kcfgfile/>
|
|
+ <kcfgfile arg="true"/>
|
|
<group name="General">
|
|
<entry name="Account" type="String">
|
|
</entry>
|
|
--
|
|
GitLab
|
|
|