Notification icons from Android are now displayed
- FileTransferJob is now nonblocking. - Files are stored based on the image MD5. - Some improvements in displaying the notification, e.g. title is only displayed when different than the app name. - Most of the notification display code moved to the Notification class. REVIEW: 130050
This commit is contained in:
parent
34d419756b
commit
891f1bd355
6 changed files with 144 additions and 42 deletions
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -8,3 +8,8 @@ src/*_automoc.cpp*
|
|||
src/moc_*.cpp
|
||||
CMakeTmp
|
||||
CMakeFiles
|
||||
KDEConnect.config
|
||||
KDEConnect.creator
|
||||
KDEConnect.files
|
||||
KDEConnect.includes
|
||||
.directory
|
||||
|
|
|
@ -54,6 +54,9 @@ public:
|
|||
QUrl destination() const { return mDestination; }
|
||||
void setOriginName(const QString& from) { mFrom = from; }
|
||||
|
||||
Q_SIGNALS:
|
||||
void emitResult();
|
||||
|
||||
private Q_SLOTS:
|
||||
void doStart();
|
||||
|
||||
|
|
|
@ -20,16 +20,24 @@
|
|||
|
||||
#include "notification.h"
|
||||
|
||||
#include <QDBusConnection>
|
||||
#include <KNotification>
|
||||
#include <QIcon>
|
||||
#include <QString>
|
||||
#include <QUrl>
|
||||
#include <QPixmap>
|
||||
|
||||
Notification::Notification(const NetworkPackage& np, const QString& iconPath, QObject* parent)
|
||||
#include <core/filetransferjob.h>
|
||||
|
||||
|
||||
Notification::Notification(const NetworkPackage& np, QObject* parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
mInternalId = np.get<QString>(QStringLiteral("id"));
|
||||
mAppName = np.get<QString>(QStringLiteral("appName"));
|
||||
mTicker = np.get<QString>(QStringLiteral("ticker"));
|
||||
mDismissable = np.get<bool>(QStringLiteral("isClearable"));
|
||||
mIconPath = iconPath;
|
||||
mImagesDir = QDir::temp().absoluteFilePath(QStringLiteral("kdeconnect"));
|
||||
mImagesDir.mkpath(mImagesDir.absolutePath());
|
||||
mClosed = false;
|
||||
|
||||
parseNetworkPackage(np);
|
||||
createKNotification(false, np);
|
||||
}
|
||||
|
||||
Notification::~Notification()
|
||||
|
@ -44,3 +52,87 @@ void Notification::dismiss()
|
|||
}
|
||||
}
|
||||
|
||||
void Notification::show()
|
||||
{
|
||||
if (!mSilent) {
|
||||
mClosed = false;
|
||||
mNotification->sendEvent();
|
||||
}
|
||||
}
|
||||
|
||||
void Notification::applyIconAndShow()
|
||||
{
|
||||
if (!mSilent) {
|
||||
QPixmap icon(mIconPath, "PNG");
|
||||
mNotification->setPixmap(icon);
|
||||
show();
|
||||
}
|
||||
}
|
||||
|
||||
void Notification::update(const NetworkPackage &np)
|
||||
{
|
||||
parseNetworkPackage(np);
|
||||
createKNotification(!mClosed, np);
|
||||
}
|
||||
|
||||
KNotification* Notification::createKNotification(bool update, const NetworkPackage &np)
|
||||
{
|
||||
if (!update) {
|
||||
mNotification = new KNotification(QStringLiteral("notification"), KNotification::CloseOnTimeout, this);
|
||||
mNotification->setComponentName(QStringLiteral("kdeconnect"));
|
||||
}
|
||||
|
||||
mNotification->setTitle(mAppName);
|
||||
|
||||
if (mTitle.isEmpty() && mText.isEmpty()) {
|
||||
mNotification->setText(mTicker);
|
||||
} else if (mAppName==mTitle) {
|
||||
mNotification->setText(mText);
|
||||
} else if (mTitle.isEmpty()){
|
||||
mNotification->setText(mText);
|
||||
} else if (mText.isEmpty()){
|
||||
mNotification->setText(mTitle);
|
||||
} else {
|
||||
mNotification->setText(mTitle+": "+mText);
|
||||
}
|
||||
|
||||
if (!mHasIcon) {
|
||||
mNotification->setIconName(QStringLiteral("preferences-desktop-notification"));
|
||||
show();
|
||||
} else {
|
||||
QString filename = mPayloadHash;
|
||||
|
||||
if (filename.isEmpty()) {
|
||||
mHasIcon = false;
|
||||
} else {
|
||||
mIconPath = mImagesDir.absoluteFilePath(filename);
|
||||
QUrl destinationUrl(mIconPath);
|
||||
FileTransferJob* job = np.createPayloadTransferJob(destinationUrl);
|
||||
job->start();
|
||||
connect(job, &FileTransferJob::emitResult, this, &Notification::applyIconAndShow);
|
||||
}
|
||||
}
|
||||
|
||||
connect(mNotification, &KNotification::closed, this, &Notification::closed);
|
||||
|
||||
return mNotification;
|
||||
}
|
||||
|
||||
void Notification::closed()
|
||||
{
|
||||
mClosed = true;
|
||||
}
|
||||
|
||||
void Notification::parseNetworkPackage(const NetworkPackage &np)
|
||||
{
|
||||
mInternalId = np.get<QString>(QStringLiteral("id"));
|
||||
mAppName = np.get<QString>(QStringLiteral("appName"));
|
||||
mTicker = np.get<QString>(QStringLiteral("ticker"));
|
||||
mTitle = np.get<QString>(QStringLiteral("title"));
|
||||
mText = np.get<QString>(QStringLiteral("text"));
|
||||
mDismissable = np.get<bool>(QStringLiteral("isClearable"));
|
||||
mHasIcon = np.hasPayload();
|
||||
mSilent = np.get<bool>(QStringLiteral("silent"));
|
||||
mPayloadHash = np.get<QString>(QStringLiteral("payloadHash"));
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
#include <KNotification>
|
||||
#include <QDir>
|
||||
|
||||
#include <core/networkpackage.h>
|
||||
|
||||
|
@ -34,21 +36,34 @@ class Notification
|
|||
Q_PROPERTY(QString internalId READ internalId)
|
||||
Q_PROPERTY(QString appName READ appName)
|
||||
Q_PROPERTY(QString ticker READ ticker)
|
||||
Q_PROPERTY(QString title READ title)
|
||||
Q_PROPERTY(QString text READ text)
|
||||
Q_PROPERTY(QString iconPath READ iconPath)
|
||||
Q_PROPERTY(bool dismissable READ dismissable)
|
||||
Q_PROPERTY(bool hasIcon READ hasIcon)
|
||||
Q_PROPERTY(bool silent READ silent)
|
||||
|
||||
public:
|
||||
Notification(const NetworkPackage& np, const QString& iconPath, QObject* parent);
|
||||
Notification(const NetworkPackage& np, QObject* parent);
|
||||
~Notification() override;
|
||||
|
||||
QString internalId() const { return mInternalId; }
|
||||
QString appName() const { return mAppName; }
|
||||
QString ticker() const { return mTicker; }
|
||||
QString title() const { return mTitle; }
|
||||
QString text() const { return mText; }
|
||||
QString iconPath() const { return mIconPath; }
|
||||
bool dismissable() const { return mDismissable; }
|
||||
bool hasIcon() const { return mHasIcon; }
|
||||
void show();
|
||||
bool silent() const { return mSilent; }
|
||||
void update(const NetworkPackage &np);
|
||||
KNotification* createKNotification(bool update, const NetworkPackage &np);
|
||||
|
||||
public Q_SLOTS:
|
||||
Q_SCRIPTABLE void dismiss();
|
||||
Q_SCRIPTABLE void applyIconAndShow();
|
||||
void closed();
|
||||
|
||||
Q_SIGNALS:
|
||||
void dismissRequested(const QString& mInternalId);
|
||||
|
@ -57,9 +72,18 @@ private:
|
|||
QString mInternalId;
|
||||
QString mAppName;
|
||||
QString mTicker;
|
||||
QString mTitle;
|
||||
QString mText;
|
||||
QString mIconPath;
|
||||
bool mDismissable;
|
||||
bool mHasIcon;
|
||||
KNotification* mNotification;
|
||||
QDir mImagesDir;
|
||||
bool mSilent;
|
||||
bool mClosed;
|
||||
QString mPayloadHash;
|
||||
|
||||
void parseNetworkPackage(const NetworkPackage& np);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,16 +20,11 @@
|
|||
|
||||
#include "notificationsdbusinterface.h"
|
||||
#include "notification_debug.h"
|
||||
#include "notification.h"
|
||||
|
||||
#include <QDBusConnection>
|
||||
|
||||
#include <KNotification>
|
||||
#include <QIcon>
|
||||
#include <QCryptographicHash>
|
||||
|
||||
#include <core/device.h>
|
||||
#include <core/kdeconnectplugin.h>
|
||||
#include <core/filetransferjob.h>
|
||||
|
||||
#include "notificationsplugin.h"
|
||||
|
||||
|
@ -38,9 +33,8 @@ NotificationsDbusInterface::NotificationsDbusInterface(KdeConnectPlugin* plugin)
|
|||
, mDevice(plugin->device())
|
||||
, mPlugin(plugin)
|
||||
, mLastId(0)
|
||||
, imagesDir(QDir::temp().absoluteFilePath(QStringLiteral("kdeconnect")))
|
||||
{
|
||||
imagesDir.mkpath(imagesDir.absolutePath());
|
||||
|
||||
}
|
||||
|
||||
NotificationsDbusInterface::~NotificationsDbusInterface()
|
||||
|
@ -79,32 +73,18 @@ void NotificationsDbusInterface::processPackage(const NetworkPackage& np)
|
|||
});
|
||||
mPlugin->sendPackage(np);
|
||||
}
|
||||
} else if(np.get<bool>(QStringLiteral("requestAnswer"), false)) {
|
||||
|
||||
} else {
|
||||
QString id = np.get<QString>(QStringLiteral("id"));
|
||||
|
||||
//TODO: Uncoment when we are able to display app icon on plasmoid
|
||||
QString destination;
|
||||
/*
|
||||
if (np.hasPayload()) {
|
||||
QString filename = KMD5(np.get<QString>("appName").toLatin1()).hexDigest(); //TODO: Store with extension?
|
||||
destination = imagesDir.absoluteFilePath(filename);
|
||||
FileTransferJob* job = np.createPayloadTransferJob(destination);
|
||||
job->start();
|
||||
}
|
||||
*/
|
||||
|
||||
Notification* noti = new Notification(np, destination, this);
|
||||
|
||||
//Do not show updates to existent notification nor answers to a initialization request
|
||||
if (!mInternalIdToPublicId.contains(noti->internalId()) && !np.get<bool>(QStringLiteral("requestAnswer"), false) && !np.get<bool>(QStringLiteral("silent"), false)) {
|
||||
KNotification* notification = new KNotification(QStringLiteral("notification"), KNotification::CloseOnTimeout, this);
|
||||
notification->setIconName(QStringLiteral("preferences-desktop-notification"));
|
||||
notification->setComponentName(QStringLiteral("kdeconnect"));
|
||||
notification->setTitle(mDevice->name());
|
||||
notification->setText(noti->appName() + ": " + noti->ticker());
|
||||
notification->sendEvent();
|
||||
}
|
||||
|
||||
if (!mInternalIdToPublicId.contains(id)) {
|
||||
Notification* noti = new Notification(np, this);
|
||||
addNotification(noti);
|
||||
} else {
|
||||
QString pubId = mInternalIdToPublicId[id];
|
||||
mNotifications[pubId]->update(np);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -65,8 +65,6 @@ private /*attributes*/:
|
|||
QHash<QString, Notification*> mNotifications;
|
||||
QHash<QString, QString> mInternalIdToPublicId;
|
||||
int mLastId;
|
||||
QDir imagesDir;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue