Notifications for all accounts
- Handle notifications from all accounts not just the active one. - When a notification from the non-active account is clicked the active account is changed over to enter the correct room. network/neochat#121
This commit is contained in:
committed by
Tobias Fella
parent
f2ec6e1d4c
commit
8831da956a
@@ -128,16 +128,7 @@ Controller::Controller(QObject *parent)
|
|||||||
if (AccountRegistry::instance().size() > oldAccountCount) {
|
if (AccountRegistry::instance().size() > oldAccountCount) {
|
||||||
auto connection = AccountRegistry::instance().accounts()[AccountRegistry::instance().size() - 1];
|
auto connection = AccountRegistry::instance().accounts()[AccountRegistry::instance().size() - 1];
|
||||||
connect(connection, &Connection::syncDone, this, [=]() {
|
connect(connection, &Connection::syncDone, this, [=]() {
|
||||||
bool changes = false;
|
handleNotifications(connection);
|
||||||
for (const auto &room : connection->allRooms()) {
|
|
||||||
if (m_notificationCounts[room] != room->unreadStats().notableCount) {
|
|
||||||
m_notificationCounts[room] = room->unreadStats().notableCount;
|
|
||||||
changes = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (changes) {
|
|
||||||
handleNotifications();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
oldAccountCount = AccountRegistry::instance().size();
|
oldAccountCount = AccountRegistry::instance().size();
|
||||||
@@ -146,19 +137,16 @@ Controller::Controller(QObject *parent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef QUOTIENT_07
|
#ifdef QUOTIENT_07
|
||||||
void Controller::handleNotifications()
|
void Controller::handleNotifications(QPointer<Quotient::Connection> connection)
|
||||||
{
|
{
|
||||||
static bool initial = true;
|
static QStringList initial;
|
||||||
static QStringList oldNotifications;
|
static QStringList oldNotifications;
|
||||||
if (!m_connection) {
|
auto job = connection->callApi<GetNotificationsJob>();
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto job = m_connection->callApi<GetNotificationsJob>();
|
|
||||||
|
|
||||||
connect(job, &BaseJob::success, this, [this, job]() {
|
connect(job, &BaseJob::success, this, [job, connection]() {
|
||||||
const auto notifications = job->jsonData()["notifications"].toArray();
|
const auto notifications = job->jsonData()["notifications"].toArray();
|
||||||
if (initial) {
|
if (!initial.contains(connection->user()->id())) {
|
||||||
initial = false;
|
initial.append(connection->user()->id());
|
||||||
for (const auto &n : notifications) {
|
for (const auto &n : notifications) {
|
||||||
oldNotifications += n.toObject()["event"].toObject()["event_id"].toString();
|
oldNotifications += n.toObject()["event"].toObject()["event_id"].toString();
|
||||||
}
|
}
|
||||||
@@ -174,7 +162,7 @@ void Controller::handleNotifications()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
oldNotifications += notification["event"].toObject()["event_id"].toString();
|
oldNotifications += notification["event"].toObject()["event_id"].toString();
|
||||||
auto room = m_connection->room(notification["room_id"].toString());
|
auto room = connection->room(notification["room_id"].toString());
|
||||||
|
|
||||||
// If room exists, room is NOT active OR the application is NOT active, show notification
|
// If room exists, room is NOT active OR the application is NOT active, show notification
|
||||||
if (room && !(room->id() == RoomManager::instance().currentRoom()->id() && QGuiApplication::applicationState() == Qt::ApplicationActive)) {
|
if (room && !(room->id() == RoomManager::instance().currentRoom()->id() && QGuiApplication::applicationState() == Qt::ApplicationActive)) {
|
||||||
@@ -196,7 +184,7 @@ void Controller::handleNotifications()
|
|||||||
|
|
||||||
if (notification["event"]["type"] == "m.room.encrypted") {
|
if (notification["event"]["type"] == "m.room.encrypted") {
|
||||||
#ifdef Quotient_E2EE_ENABLED
|
#ifdef Quotient_E2EE_ENABLED
|
||||||
auto decrypted = m_connection->decryptNotification(notification);
|
auto decrypted = connection->decryptNotification(notification);
|
||||||
body = decrypted["content"].toObject()["body"].toString();
|
body = decrypted["content"].toObject()["body"].toString();
|
||||||
#endif
|
#endif
|
||||||
if (body.isEmpty()) {
|
if (body.isEmpty()) {
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ private:
|
|||||||
|
|
||||||
bool hasWindowSystem() const;
|
bool hasWindowSystem() const;
|
||||||
#ifdef QUOTIENT_07
|
#ifdef QUOTIENT_07
|
||||||
void handleNotifications();
|
void handleNotifications(QPointer<Quotient::Connection> connection);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
|
|||||||
@@ -11,6 +11,12 @@
|
|||||||
#include <KNotification>
|
#include <KNotification>
|
||||||
#include <KNotificationReplyAction>
|
#include <KNotificationReplyAction>
|
||||||
|
|
||||||
|
#ifdef QUOTIENT_07
|
||||||
|
#include <accountregistry.h>
|
||||||
|
#else
|
||||||
|
#include "neochataccountregistry.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <connection.h>
|
#include <connection.h>
|
||||||
#include <csapi/pushrules.h>
|
#include <csapi/pushrules.h>
|
||||||
#include <jobs/basejob.h>
|
#include <jobs/basejob.h>
|
||||||
@@ -68,6 +74,13 @@ void NotificationsManager::postNotification(NeoChatRoom *room,
|
|||||||
|
|
||||||
notification->setDefaultAction(i18n("Open NeoChat in this room"));
|
notification->setDefaultAction(i18n("Open NeoChat in this room"));
|
||||||
connect(notification, &KNotification::defaultActivated, this, [=]() {
|
connect(notification, &KNotification::defaultActivated, this, [=]() {
|
||||||
|
if (room->localUser()->id() != Controller::instance().activeConnection()->userId()) {
|
||||||
|
#ifdef QUOTIENT_07
|
||||||
|
Controller::instance().setActiveConnection(Accounts.get(room->localUser()->id()));
|
||||||
|
#else
|
||||||
|
Controller::instance().setActiveConnection(AccountRegistry::instance().get(room->localUser()->id()));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
RoomManager::instance().enterRoom(room);
|
RoomManager::instance().enterRoom(room);
|
||||||
WindowController::instance().showAndRaiseWindow(notification->xdgActivationToken());
|
WindowController::instance().showAndRaiseWindow(notification->xdgActivationToken());
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user