From d3148f8c8b1cff052b56955d8cdc36416a007d18 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sun, 12 Nov 2023 17:08:15 -0500 Subject: [PATCH] Don't start the entire NeoChat backend when receiving push notifications This adds a dedicated "set up for push notifications only" function in Controller, which only sets up the KUnifiedPush connector for receiving the message and then quitting right afterward. If the user tries to open a notification, then it will quit and open the main client. --- src/controller.cpp | 20 +++++++++++++------- src/controller.h | 10 ++++++++++ src/main.cpp | 24 ++++++++++++++---------- src/notificationsmanager.cpp | 11 ++++++++++- 4 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/controller.cpp b/src/controller.cpp index 6a15b00f6..644fd0ccb 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -42,10 +42,6 @@ #include "trayicon_sni.h" #endif -#ifdef HAVE_KUNIFIEDPUSH -#include -#endif - using namespace Quotient; Controller::Controller(QObject *parent) @@ -116,9 +112,6 @@ Controller::Controller(QObject *parent) connection->setupPushNotifications(endpoint); } }); - connect(connector, &KUnifiedPush::Connector::messageReceived, this, [this](const QByteArray &data) { - NotificationsManager::instance().postPushNotification(data); - }); connector->registerClient(i18n("Receiving push notifications")); @@ -383,6 +376,19 @@ void Controller::forceRefreshTextDocument(QQuickTextDocument *textDocument, QQui connect(textDocument->textDocument(), SIGNAL(imagesLoaded()), item, SLOT(updateWholeDocument())); } +void Controller::listenForNotifications() +{ +#ifdef HAVE_KUNIFIEDPUSH + auto connector = new KUnifiedPush::Connector(QStringLiteral("org.kde.neochat")); + + connect(connector, &KUnifiedPush::Connector::messageReceived, [](const QByteArray &data) { + NotificationsManager::instance().postPushNotification(data); + }); + + connector->registerClient(i18n("Receiving push notifications")); +#endif +} + void Controller::setApplicationProxy() { NeoChatConfig *cfg = NeoChatConfig::self(); diff --git a/src/controller.h b/src/controller.h index 85d6121e9..b222f4aac 100644 --- a/src/controller.h +++ b/src/controller.h @@ -12,6 +12,10 @@ #include #include +#ifdef HAVE_KUNIFIEDPUSH +#include +#endif + class NeoChatRoom; class TrayIcon; class QQuickTextDocument; @@ -119,6 +123,12 @@ public: */ Q_INVOKABLE void forceRefreshTextDocument(QQuickTextDocument *textDocument, QQuickItem *item); + /** + * @brief Start listening for notifications in dbus-activated mode. + * These notifications will quit the application when closed. + */ + static void listenForNotifications(); + Quotient::AccountRegistry &accounts(); private: diff --git a/src/main.cpp b/src/main.cpp index 295e5d4a8..bc25a9ea6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -166,21 +166,11 @@ int main(int argc, char *argv[]) QStringLiteral("/var/config/fontconfig/conf.d/99-noto-mono-color-emoji.conf")); #endif -#ifdef HAVE_KDBUSADDONS - KDBusService service(KDBusService::Unique); -#endif - ColorSchemer colorScheme; if (!NeoChatConfig::self()->colorScheme().isEmpty()) { colorScheme.apply(NeoChatConfig::self()->colorScheme()); } - qml_register_types_org_kde_neochat(); - qmlRegisterSingletonInstance("org.kde.neochat.config", 1, 0, "Config", NeoChatConfig::self()); - qmlRegisterSingletonInstance("org.kde.neochat.accounts", 1, 0, "AccountRegistry", &Controller::instance().accounts()); - - qmlRegisterUncreatableType("com.github.quotient_im.libquotient", 1, 0, "KeyVerificationSession", {}); - QCommandLineParser parser; parser.setApplicationDescription(i18n("Client for the matrix communication protocol")); parser.addPositionalArgument(QStringLiteral("urls"), i18n("Supports matrix: url scheme")); @@ -198,10 +188,24 @@ int main(int argc, char *argv[]) #ifdef HAVE_KUNIFIEDPUSH if (parser.isSet(dbusActivatedOption)) { + // We want to be replaceable by the main client + KDBusService service(KDBusService::Replace); + + Controller::listenForNotifications(); return QCoreApplication::exec(); } #endif +#ifdef HAVE_KDBUSADDONS + KDBusService service(KDBusService::Unique); +#endif + + qml_register_types_org_kde_neochat(); + qmlRegisterSingletonInstance("org.kde.neochat.config", 1, 0, "Config", NeoChatConfig::self()); + qmlRegisterSingletonInstance("org.kde.neochat.accounts", 1, 0, "AccountRegistry", &Controller::instance().accounts()); + + qmlRegisterUncreatableType("com.github.quotient_im.libquotient", 1, 0, "KeyVerificationSession", {}); + QQmlApplicationEngine engine; #ifdef HAVE_KDBUSADDONS diff --git a/src/notificationsmanager.cpp b/src/notificationsmanager.cpp index b75188f56..9a36e69a2 100644 --- a/src/notificationsmanager.cpp +++ b/src/notificationsmanager.cpp @@ -16,6 +16,10 @@ #include #include +#ifdef HAVE_KIO +#include +#endif + #include "controller.h" #include "neochatconfig.h" #include "neochatconnection.h" @@ -319,10 +323,15 @@ void NotificationsManager::postPushNotification(const QByteArray &message) notification->setText(i18n("Encrypted Message")); } +#ifdef HAVE_KIO auto openAction = notification->addAction(i18n("Open NeoChat")); connect(openAction, &KNotificationAction::activated, this, [=]() { - WindowController::instance().showAndRaiseWindow(notification->xdgActivationToken()); + auto *job = new KIO::ApplicationLauncherJob(KService::serviceByDesktopName(QStringLiteral("org.kde.neochat"))); + job->start(); }); +#endif + + connect(notification, &KNotification::closed, qGuiApp, &QGuiApplication::quit); notification->sendEvent();