mirror of https://github.com/qTox/qTox.git
12 changed files with 831 additions and 101 deletions
@ -0,0 +1,11 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <QString> |
||||||
|
#include <QPixmap> |
||||||
|
|
||||||
|
struct NotificationData |
||||||
|
{ |
||||||
|
QString title; |
||||||
|
QString message; |
||||||
|
QPixmap pixmap; |
||||||
|
}; |
@ -0,0 +1,247 @@ |
|||||||
|
#include "notificationgenerator.h" |
||||||
|
#include "src/chatlog/content/filetransferwidget.h" |
||||||
|
|
||||||
|
#include <QCollator> |
||||||
|
|
||||||
|
namespace |
||||||
|
{ |
||||||
|
size_t getNumMessages( |
||||||
|
const QHash<const Friend*, size_t>& friendNotifications, |
||||||
|
const QHash<const Group* , size_t>& groupNotifications) |
||||||
|
{ |
||||||
|
auto numMessages = std::accumulate(friendNotifications.begin(), friendNotifications.end(), 0); |
||||||
|
numMessages = std::accumulate(groupNotifications.begin(), groupNotifications.end(), numMessages); |
||||||
|
|
||||||
|
return numMessages; |
||||||
|
} |
||||||
|
|
||||||
|
size_t getNumChats( |
||||||
|
const QHash<const Friend*, size_t>& friendNotifications, |
||||||
|
const QHash<const Group* , size_t>& groupNotifications) |
||||||
|
{ |
||||||
|
return friendNotifications.size() + groupNotifications.size(); |
||||||
|
} |
||||||
|
|
||||||
|
QString generateMultiChatTitle(size_t numChats, size_t numMessages) |
||||||
|
{ |
||||||
|
// FIXME: how do I tr this
|
||||||
|
return QObject::tr("%1 messages from %2 chats") |
||||||
|
.arg(numMessages) |
||||||
|
.arg(numChats); |
||||||
|
} |
||||||
|
|
||||||
|
template <typename T> |
||||||
|
QString generateSingleChatTitle( |
||||||
|
const QHash<T, size_t> numNotifications, |
||||||
|
T contact) |
||||||
|
{ |
||||||
|
if (numNotifications[contact] > 1) |
||||||
|
{ |
||||||
|
return QObject::tr("%1 messages from %2") |
||||||
|
.arg(numNotifications[contact]) |
||||||
|
.arg(contact->getDisplayedName()); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
return QObject::tr("%1") |
||||||
|
.arg(contact->getDisplayedName()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
QString generateTitle( |
||||||
|
const QHash<const Friend*, size_t>& friendNotifications, |
||||||
|
const QHash<const Group* , size_t>& groupNotifications, |
||||||
|
const Friend* f) |
||||||
|
{ |
||||||
|
auto numChats = getNumChats(friendNotifications, groupNotifications); |
||||||
|
if (numChats > 1) |
||||||
|
{ |
||||||
|
return generateMultiChatTitle(numChats, getNumMessages(friendNotifications, groupNotifications)); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
return generateSingleChatTitle(friendNotifications, f); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
QString generateTitle( |
||||||
|
const QHash<const Friend*, size_t>& friendNotifications, |
||||||
|
const QHash<const Group* , size_t>& groupNotifications, |
||||||
|
const Group* g) |
||||||
|
{ |
||||||
|
auto numChats = getNumChats(friendNotifications, groupNotifications); |
||||||
|
if (numChats > 1) |
||||||
|
{ |
||||||
|
return generateMultiChatTitle(numChats, getNumMessages(friendNotifications, groupNotifications)); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
return generateSingleChatTitle(groupNotifications, g); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
QString generateContent( |
||||||
|
const QHash<const Friend*, size_t>& friendNotifications, |
||||||
|
const QHash<const Group*, size_t>& groupNotifications, |
||||||
|
QString lastMessage, |
||||||
|
const ToxPk& sender) |
||||||
|
{ |
||||||
|
assert(friendNotifications.size() > 0 || groupNotifications.size() > 0); |
||||||
|
|
||||||
|
auto numChats = getNumChats(friendNotifications, groupNotifications); |
||||||
|
if (numChats > 1) { |
||||||
|
// Copy all names into a vector to simplify formatting logic between
|
||||||
|
// multiple lists
|
||||||
|
std::vector<QString> displayNames; |
||||||
|
displayNames.reserve(numChats); |
||||||
|
|
||||||
|
for (auto it = friendNotifications.begin(); it != friendNotifications.end(); ++it) { |
||||||
|
displayNames.push_back(it.key()->getDisplayedName()); |
||||||
|
} |
||||||
|
|
||||||
|
for (auto it = groupNotifications.begin(); it != groupNotifications.end(); ++it) { |
||||||
|
displayNames.push_back(it.key()->getDisplayedName()); |
||||||
|
} |
||||||
|
|
||||||
|
assert(displayNames.size() > 0); |
||||||
|
|
||||||
|
// Lexiographically sort all display names to ensure consistent formatting
|
||||||
|
QCollator collator; |
||||||
|
std::sort(displayNames.begin(), displayNames.end(), [&] (const QString& a, const QString& b) { |
||||||
|
return collator.compare(a, b) < 1; |
||||||
|
}); |
||||||
|
|
||||||
|
auto it = displayNames.begin(); |
||||||
|
|
||||||
|
QString ret = *it; |
||||||
|
|
||||||
|
while (++it != displayNames.end()) { |
||||||
|
ret += ", " + *it; |
||||||
|
} |
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
||||||
|
else { |
||||||
|
if (groupNotifications.size() == 1) { |
||||||
|
return groupNotifications.begin().key()->getPeerList()[sender] + ": " + lastMessage; |
||||||
|
} |
||||||
|
|
||||||
|
return lastMessage; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
QPixmap getSenderAvatar(Profile* profile, const ToxPk& sender) |
||||||
|
{ |
||||||
|
return profile ? profile->loadAvatar(sender) : QPixmap(); |
||||||
|
} |
||||||
|
} // namespace
|
||||||
|
|
||||||
|
NotificationGenerator::NotificationGenerator( |
||||||
|
INotificationSettings const& notificationSettings, |
||||||
|
Profile* profile) |
||||||
|
: notificationSettings(notificationSettings) |
||||||
|
, profile(profile) |
||||||
|
{} |
||||||
|
|
||||||
|
NotificationData NotificationGenerator::friendMessageNotification(const Friend* f, const QString& message) |
||||||
|
{ |
||||||
|
friendNotifications[f]++; |
||||||
|
|
||||||
|
NotificationData ret; |
||||||
|
|
||||||
|
if (notificationSettings.getNotifyHide()) { |
||||||
|
ret.title = tr("New message"); |
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
ret.title = generateTitle(friendNotifications, groupNotifications, f); |
||||||
|
ret.message = generateContent(friendNotifications, groupNotifications, message, f->getPublicKey()); |
||||||
|
ret.pixmap = getSenderAvatar(profile, f->getPublicKey()); |
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
NotificationData NotificationGenerator::groupMessageNotification(const Group* g, const ToxPk& sender, const QString& message) |
||||||
|
{ |
||||||
|
groupNotifications[g]++; |
||||||
|
|
||||||
|
NotificationData ret; |
||||||
|
|
||||||
|
if (notificationSettings.getNotifyHide()){ |
||||||
|
ret.title = tr("New group message"); |
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
ret.title = generateTitle(friendNotifications, groupNotifications, g); |
||||||
|
ret.message = generateContent(friendNotifications, groupNotifications, message, sender); |
||||||
|
ret.pixmap = getSenderAvatar(profile, sender); |
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
NotificationData NotificationGenerator::fileTransferNotification(const Friend* f, const QString& filename, size_t fileSize) |
||||||
|
{ |
||||||
|
friendNotifications[f]++; |
||||||
|
|
||||||
|
NotificationData ret; |
||||||
|
|
||||||
|
if (notificationSettings.getNotifyHide()) { |
||||||
|
ret.title = tr("Incoming file transfer"); |
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
auto numChats = getNumChats(friendNotifications, groupNotifications); |
||||||
|
auto numMessages = getNumMessages(friendNotifications, groupNotifications); |
||||||
|
|
||||||
|
if (numChats > 1 || numMessages > 1) |
||||||
|
{ |
||||||
|
ret.title = generateTitle(friendNotifications, groupNotifications, f); |
||||||
|
ret.message = generateContent(friendNotifications, groupNotifications, tr("Incoming file transfer"), f->getPublicKey()); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ret.title = f->getDisplayedName() + " - " + tr("File sent"); |
||||||
|
ret.message = filename + " (" + FileTransferWidget::getHumanReadableSize(fileSize) + ")"; |
||||||
|
} |
||||||
|
|
||||||
|
ret.pixmap = getSenderAvatar(profile, f->getPublicKey()); |
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
NotificationData NotificationGenerator::groupInvitationNotification(const Friend* from) |
||||||
|
{ |
||||||
|
NotificationData ret; |
||||||
|
|
||||||
|
if (notificationSettings.getNotifyHide()) { |
||||||
|
ret.title = tr("Group invite received"); |
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
ret.title = from->getDisplayedName() + tr(" invites you to join a group."); |
||||||
|
ret.message = ""; |
||||||
|
ret.pixmap = getSenderAvatar(profile, from->getPublicKey()); |
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
NotificationData NotificationGenerator::friendRequestNotification(const ToxPk& sender, const QString& message) |
||||||
|
{ |
||||||
|
NotificationData ret; |
||||||
|
|
||||||
|
if (notificationSettings.getNotifyHide()) { |
||||||
|
ret.title = tr("Friend request received"); |
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
ret.title = sender.toString() + tr(" sent you a friend request."); |
||||||
|
ret.message = message; |
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
void NotificationGenerator::onNotificationActivated() |
||||||
|
{ |
||||||
|
friendNotifications = {}; |
||||||
|
groupNotifications = {}; |
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
|
||||||
|
#include "notificationdata.h" |
||||||
|
#include "friend.h" |
||||||
|
#include "group.h" |
||||||
|
|
||||||
|
#include "src/persistence/inotificationsettings.h" |
||||||
|
#include "src/persistence/profile.h" |
||||||
|
|
||||||
|
#include <QObject> |
||||||
|
#include <QHash> |
||||||
|
|
||||||
|
class NotificationGenerator : public QObject |
||||||
|
{ |
||||||
|
public: |
||||||
|
NotificationGenerator( |
||||||
|
INotificationSettings const& notificationSettings, |
||||||
|
// Optional profile input to lookup avatars. Avatar lookup is not
|
||||||
|
// currently mockable so we allow profile to be nullptr for unit
|
||||||
|
// testing
|
||||||
|
Profile* profile); |
||||||
|
|
||||||
|
NotificationData friendMessageNotification(const Friend* f, const QString& message); |
||||||
|
NotificationData groupMessageNotification(const Group* g, const ToxPk& sender, const QString& message); |
||||||
|
NotificationData fileTransferNotification(const Friend* f, const QString& filename, size_t fileSize); |
||||||
|
NotificationData groupInvitationNotification(const Friend* from); |
||||||
|
NotificationData friendRequestNotification(const ToxPk& sender, const QString& message); |
||||||
|
|
||||||
|
public slots: |
||||||
|
void onNotificationActivated(); |
||||||
|
|
||||||
|
private: |
||||||
|
INotificationSettings const& notificationSettings; |
||||||
|
Profile* profile; |
||||||
|
QHash<const Friend*, size_t> friendNotifications; |
||||||
|
QHash<const Group*, size_t> groupNotifications; |
||||||
|
}; |
@ -0,0 +1,50 @@ |
|||||||
|
/*
|
||||||
|
Copyright © 2014-2019 by The qTox Project Contributors |
||||||
|
|
||||||
|
This file is part of qTox, a Qt-based graphical interface for Tox. |
||||||
|
|
||||||
|
qTox is libre software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
qTox is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with qTox. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef INOTIFICATION_SETTINGS_H |
||||||
|
#define INOTIFICATION_SETTINGS_H |
||||||
|
|
||||||
|
#include <QStringList> |
||||||
|
|
||||||
|
class INotificationSettings |
||||||
|
{ |
||||||
|
public: |
||||||
|
virtual bool getNotify() const = 0; |
||||||
|
virtual void setNotify(bool newValue) = 0; |
||||||
|
|
||||||
|
virtual bool getShowWindow() const = 0; |
||||||
|
virtual void setShowWindow(bool newValue) = 0; |
||||||
|
|
||||||
|
virtual bool getDesktopNotify() const = 0; |
||||||
|
virtual void setDesktopNotify(bool enabled) = 0; |
||||||
|
|
||||||
|
virtual bool getNotifySound() const = 0; |
||||||
|
virtual void setNotifySound(bool newValue) = 0; |
||||||
|
|
||||||
|
virtual bool getNotifyHide() const = 0; |
||||||
|
virtual void setNotifyHide(bool newValue) = 0; |
||||||
|
|
||||||
|
virtual bool getBusySound() const = 0; |
||||||
|
virtual void setBusySound(bool newValue) = 0; |
||||||
|
|
||||||
|
virtual bool getGroupAlwaysNotify() const = 0; |
||||||
|
virtual void setGroupAlwaysNotify(bool newValue) = 0; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif /*INOTIFICATION_SETTINGS_H*/ |
@ -0,0 +1,26 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
#include "src/core/icoreidhandler.h" |
||||||
|
|
||||||
|
#include <tox/tox.h> |
||||||
|
|
||||||
|
class MockCoreIdHandler : public ICoreIdHandler |
||||||
|
{ |
||||||
|
public: |
||||||
|
ToxId getSelfId() const override |
||||||
|
{ |
||||||
|
std::terminate(); |
||||||
|
return ToxId(); |
||||||
|
} |
||||||
|
|
||||||
|
ToxPk getSelfPublicKey() const override |
||||||
|
{ |
||||||
|
static uint8_t id[TOX_PUBLIC_KEY_SIZE] = {0}; |
||||||
|
return ToxPk(id); |
||||||
|
} |
||||||
|
|
||||||
|
QString getUsername() const override |
||||||
|
{ |
||||||
|
return "me"; |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,63 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
#include "src/core/icoregroupquery.h" |
||||||
|
|
||||||
|
#include <tox/tox.h> |
||||||
|
|
||||||
|
/**
|
||||||
|
* Mock 1 peer at group number 0 |
||||||
|
*/ |
||||||
|
class MockGroupQuery : public ICoreGroupQuery |
||||||
|
{ |
||||||
|
public: |
||||||
|
GroupId getGroupPersistentId(uint32_t groupNumber) const override |
||||||
|
{ |
||||||
|
return GroupId(0); |
||||||
|
} |
||||||
|
|
||||||
|
uint32_t getGroupNumberPeers(int groupId) const override |
||||||
|
{ |
||||||
|
if (emptyGroup) { |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
return 2; |
||||||
|
} |
||||||
|
|
||||||
|
QString getGroupPeerName(int groupId, int peerId) const override |
||||||
|
{ |
||||||
|
return QString("peer") + peerId; |
||||||
|
} |
||||||
|
|
||||||
|
ToxPk getGroupPeerPk(int groupId, int peerId) const override |
||||||
|
{ |
||||||
|
uint8_t id[TOX_PUBLIC_KEY_SIZE] = {static_cast<uint8_t>(peerId)}; |
||||||
|
return ToxPk(id); |
||||||
|
} |
||||||
|
|
||||||
|
QStringList getGroupPeerNames(int groupId) const override |
||||||
|
{ |
||||||
|
if (emptyGroup) { |
||||||
|
return QStringList({QString("me")}); |
||||||
|
} |
||||||
|
return QStringList({QString("me"), QString("other")}); |
||||||
|
} |
||||||
|
|
||||||
|
bool getGroupAvEnabled(int groupId) const override |
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
void setAsEmptyGroup() |
||||||
|
{ |
||||||
|
emptyGroup = true; |
||||||
|
} |
||||||
|
|
||||||
|
void setAsFunctionalGroup() |
||||||
|
{ |
||||||
|
emptyGroup = false; |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
bool emptyGroup = false; |
||||||
|
}; |
@ -0,0 +1,375 @@ |
|||||||
|
|
||||||
|
/*
|
||||||
|
Copyright © 2019 by The qTox Project Contributors |
||||||
|
|
||||||
|
This file is part of qTox, a Qt-based graphical interface for Tox. |
||||||
|
|
||||||
|
qTox is libre software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
qTox is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with qTox. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "src/model/notificationgenerator.h" |
||||||
|
|
||||||
|
#include "test/mock/mockcoreidhandler.h" |
||||||
|
#include "test/mock/mockgroupquery.h" |
||||||
|
|
||||||
|
#include <QObject> |
||||||
|
#include <QtTest/QtTest> |
||||||
|
|
||||||
|
namespace |
||||||
|
{ |
||||||
|
class MockNotificationSettings : public INotificationSettings |
||||||
|
{ |
||||||
|
virtual bool getNotify() const override { return true; } |
||||||
|
|
||||||
|
virtual void setNotify(bool newValue) override {} |
||||||
|
|
||||||
|
virtual bool getShowWindow() const override { return true; } |
||||||
|
virtual void setShowWindow(bool newValue) override {} |
||||||
|
|
||||||
|
virtual bool getDesktopNotify() const override { return true; } |
||||||
|
virtual void setDesktopNotify(bool enabled) override {} |
||||||
|
|
||||||
|
virtual bool getNotifySound() const override { return true; } |
||||||
|
virtual void setNotifySound(bool newValue) override {} |
||||||
|
|
||||||
|
virtual bool getNotifyHide() const override { return notifyHide; } |
||||||
|
virtual void setNotifyHide(bool newValue) override { notifyHide = newValue; }; |
||||||
|
|
||||||
|
virtual bool getBusySound() const override { return true; } |
||||||
|
virtual void setBusySound(bool newValue) override {} |
||||||
|
|
||||||
|
virtual bool getGroupAlwaysNotify() const override { return true; } |
||||||
|
virtual void setGroupAlwaysNotify(bool newValue) override {} |
||||||
|
private: |
||||||
|
bool notifyHide = false; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
class TestNotificationGenerator : public QObject |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
private slots: |
||||||
|
void init(); |
||||||
|
void testSingleFriendMessage(); |
||||||
|
void testMultipleFriendMessages(); |
||||||
|
void testNotificationClear(); |
||||||
|
void testGroupMessage(); |
||||||
|
void testMultipleGroupMessages(); |
||||||
|
void testMultipleFriendSourceMessages(); |
||||||
|
void testMultipleGroupSourceMessages(); |
||||||
|
void testMixedSourceMessages(); |
||||||
|
void testFileTransfer(); |
||||||
|
void testFileTransferAfterMessage(); |
||||||
|
void testGroupInvitation(); |
||||||
|
void testGroupInviteUncounted(); |
||||||
|
void testFriendRequest(); |
||||||
|
void testFriendRequestUncounted(); |
||||||
|
void testSimpleFriendMessage(); |
||||||
|
void testSimpleFileTransfer(); |
||||||
|
void testSimpleGroupMessage(); |
||||||
|
void testSimpleFriendRequest(); |
||||||
|
void testSimpleGroupInvite(); |
||||||
|
void testSimpleMessageToggle(); |
||||||
|
|
||||||
|
private: |
||||||
|
std::unique_ptr<INotificationSettings> notificationSettings; |
||||||
|
std::unique_ptr<NotificationGenerator> notificationGenerator; |
||||||
|
std::unique_ptr<MockGroupQuery> groupQuery; |
||||||
|
std::unique_ptr<MockCoreIdHandler> coreIdHandler; |
||||||
|
}; |
||||||
|
|
||||||
|
void TestNotificationGenerator::init() |
||||||
|
{ |
||||||
|
notificationSettings.reset(new MockNotificationSettings()); |
||||||
|
notificationGenerator.reset(new NotificationGenerator(*notificationSettings, nullptr)); |
||||||
|
groupQuery.reset(new MockGroupQuery()); |
||||||
|
coreIdHandler.reset(new MockCoreIdHandler()); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testSingleFriendMessage() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friendName"); |
||||||
|
auto notificationData = notificationGenerator->friendMessageNotification(&f, "test"); |
||||||
|
QVERIFY(notificationData.title == "friendName"); |
||||||
|
QVERIFY(notificationData.message == "test"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testMultipleFriendMessages() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friendName"); |
||||||
|
notificationGenerator->friendMessageNotification(&f, "test"); |
||||||
|
auto notificationData = notificationGenerator->friendMessageNotification(&f, "test2"); |
||||||
|
QVERIFY(notificationData.title == "2 messages from friendName"); |
||||||
|
QVERIFY(notificationData.message == "test2"); |
||||||
|
|
||||||
|
notificationData = notificationGenerator->friendMessageNotification(&f, "test3"); |
||||||
|
QVERIFY(notificationData.title == "3 messages from friendName"); |
||||||
|
QVERIFY(notificationData.message == "test3"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testNotificationClear() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friendName"); |
||||||
|
|
||||||
|
notificationGenerator->friendMessageNotification(&f, "test"); |
||||||
|
|
||||||
|
// On notification clear we shouldn't see a notification count from the friend
|
||||||
|
notificationGenerator->onNotificationActivated(); |
||||||
|
|
||||||
|
auto notificationData = notificationGenerator->friendMessageNotification(&f, "test2"); |
||||||
|
QVERIFY(notificationData.title == "friendName"); |
||||||
|
QVERIFY(notificationData.message == "test2"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testGroupMessage() |
||||||
|
{ |
||||||
|
Group g(0, GroupId(0), "groupName", false, "selfName", *groupQuery, *coreIdHandler); |
||||||
|
g.setName("groupName"); |
||||||
|
auto sender = groupQuery->getGroupPeerPk(0, 0); |
||||||
|
g.updateUsername(sender, "sender1"); |
||||||
|
|
||||||
|
auto notificationData = notificationGenerator->groupMessageNotification(&g, sender, "test"); |
||||||
|
QVERIFY(notificationData.title == "groupName"); |
||||||
|
QVERIFY(notificationData.message == "sender1: test"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testMultipleGroupMessages() |
||||||
|
{ |
||||||
|
Group g(0, GroupId(0), "groupName", false, "selfName", *groupQuery, *coreIdHandler); |
||||||
|
g.setName("groupName"); |
||||||
|
auto sender = groupQuery->getGroupPeerPk(0, 0); |
||||||
|
g.updateUsername(sender, "sender1"); |
||||||
|
|
||||||
|
auto sender2 = groupQuery->getGroupPeerPk(0, 1); |
||||||
|
g.updateUsername(sender2, "sender2"); |
||||||
|
|
||||||
|
auto notificationData = notificationGenerator->groupMessageNotification(&g, sender2, "test2"); |
||||||
|
QVERIFY(notificationData.title == "groupName"); |
||||||
|
QVERIFY(notificationData.message == "sender2: test2"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testMultipleFriendSourceMessages() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friend1"); |
||||||
|
|
||||||
|
Friend f2(1, ToxPk()); |
||||||
|
f2.setName("friend2"); |
||||||
|
|
||||||
|
notificationGenerator->friendMessageNotification(&f, "test1"); |
||||||
|
auto notificationData = notificationGenerator->friendMessageNotification(&f2, "test2"); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "2 messages from 2 chats"); |
||||||
|
QVERIFY(notificationData.message == "friend1, friend2"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testMultipleGroupSourceMessages() |
||||||
|
{ |
||||||
|
Group g(0, GroupId(QByteArray(32, 0)), "groupName", false, "selfName", *groupQuery, *coreIdHandler); |
||||||
|
g.setName("groupName"); |
||||||
|
|
||||||
|
Group g2(1, GroupId(QByteArray(32, 1)), "groupName", false, "selfName", *groupQuery, *coreIdHandler); |
||||||
|
g.setName("groupName2"); |
||||||
|
|
||||||
|
auto sender = groupQuery->getGroupPeerPk(0, 0); |
||||||
|
g.updateUsername(sender, "sender1"); |
||||||
|
|
||||||
|
notificationGenerator->groupMessageNotification(&g, sender, "test1"); |
||||||
|
auto notificationData = notificationGenerator->groupMessageNotification(&g2, sender, "test1"); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "2 messages from 2 chats"); |
||||||
|
QVERIFY(notificationData.message == "groupName, groupName2"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testMixedSourceMessages() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friend"); |
||||||
|
|
||||||
|
Group g(0, GroupId(QByteArray(32, 0)), "groupName", false, "selfName", *groupQuery, *coreIdHandler); |
||||||
|
g.setName("group"); |
||||||
|
|
||||||
|
auto sender = groupQuery->getGroupPeerPk(0, 0); |
||||||
|
g.updateUsername(sender, "sender1"); |
||||||
|
|
||||||
|
notificationGenerator->friendMessageNotification(&f, "test1"); |
||||||
|
auto notificationData = notificationGenerator->groupMessageNotification(&g, sender, "test2"); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "2 messages from 2 chats"); |
||||||
|
QVERIFY(notificationData.message == "friend, group"); |
||||||
|
|
||||||
|
notificationData = notificationGenerator->fileTransferNotification(&f, "file", 0); |
||||||
|
QVERIFY(notificationData.title == "3 messages from 2 chats"); |
||||||
|
QVERIFY(notificationData.message == "friend, group"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testFileTransfer() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friend"); |
||||||
|
|
||||||
|
auto notificationData = notificationGenerator->fileTransferNotification(&f, "file", 5 * 1024 * 1024 /* 5MB */); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "friend - File sent"); |
||||||
|
QVERIFY(notificationData.message == "file (5.00MiB)"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testFileTransferAfterMessage() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friend"); |
||||||
|
|
||||||
|
notificationGenerator->friendMessageNotification(&f, "test1"); |
||||||
|
auto notificationData = notificationGenerator->fileTransferNotification(&f, "file", 5 * 1024 * 1024 /* 5MB */); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "2 messages from friend"); |
||||||
|
QVERIFY(notificationData.message == "Incoming file transfer"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testGroupInvitation() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friend"); |
||||||
|
|
||||||
|
auto notificationData = notificationGenerator->groupInvitationNotification(&f); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "friend invites you to join a group."); |
||||||
|
QVERIFY(notificationData.message == ""); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testGroupInviteUncounted() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friend"); |
||||||
|
|
||||||
|
notificationGenerator->friendMessageNotification(&f, "test"); |
||||||
|
notificationGenerator->groupInvitationNotification(&f); |
||||||
|
auto notificationData = notificationGenerator->friendMessageNotification(&f, "test2"); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "2 messages from friend"); |
||||||
|
QVERIFY(notificationData.message == "test2"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testFriendRequest() |
||||||
|
{ |
||||||
|
ToxPk sender(QByteArray(32, 0)); |
||||||
|
|
||||||
|
auto notificationData = notificationGenerator->friendRequestNotification(sender, "request"); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "0000000000000000000000000000000000000000000000000000000000000000 sent you a friend request."); |
||||||
|
QVERIFY(notificationData.message == "request"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testFriendRequestUncounted() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friend"); |
||||||
|
ToxPk sender(QByteArray(32, 0)); |
||||||
|
|
||||||
|
notificationGenerator->friendMessageNotification(&f, "test"); |
||||||
|
notificationGenerator->friendRequestNotification(sender, "request"); |
||||||
|
auto notificationData = notificationGenerator->friendMessageNotification(&f, "test2"); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "2 messages from friend"); |
||||||
|
QVERIFY(notificationData.message == "test2"); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testSimpleFriendMessage() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friend"); |
||||||
|
|
||||||
|
notificationSettings->setNotifyHide(true); |
||||||
|
|
||||||
|
auto notificationData = notificationGenerator->friendMessageNotification(&f, "test"); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "New message"); |
||||||
|
QVERIFY(notificationData.message == ""); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testSimpleFileTransfer() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friend"); |
||||||
|
|
||||||
|
notificationSettings->setNotifyHide(true); |
||||||
|
|
||||||
|
auto notificationData = notificationGenerator->fileTransferNotification(&f, "file", 0); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "Incoming file transfer"); |
||||||
|
QVERIFY(notificationData.message == ""); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testSimpleGroupMessage() |
||||||
|
{ |
||||||
|
Group g(0, GroupId(0), "groupName", false, "selfName", *groupQuery, *coreIdHandler); |
||||||
|
g.setName("groupName"); |
||||||
|
auto sender = groupQuery->getGroupPeerPk(0, 0); |
||||||
|
g.updateUsername(sender, "sender1"); |
||||||
|
|
||||||
|
notificationSettings->setNotifyHide(true); |
||||||
|
|
||||||
|
auto notificationData = notificationGenerator->groupMessageNotification(&g, sender, "test"); |
||||||
|
QVERIFY(notificationData.title == "New group message"); |
||||||
|
QVERIFY(notificationData.message == ""); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testSimpleFriendRequest() |
||||||
|
{ |
||||||
|
ToxPk sender(QByteArray(32, 0)); |
||||||
|
|
||||||
|
notificationSettings->setNotifyHide(true); |
||||||
|
|
||||||
|
auto notificationData = notificationGenerator->friendRequestNotification(sender, "request"); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "Friend request received"); |
||||||
|
QVERIFY(notificationData.message == ""); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testSimpleGroupInvite() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friend"); |
||||||
|
|
||||||
|
notificationSettings->setNotifyHide(true); |
||||||
|
auto notificationData = notificationGenerator->groupInvitationNotification(&f); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "Group invite received"); |
||||||
|
QVERIFY(notificationData.message == ""); |
||||||
|
} |
||||||
|
|
||||||
|
void TestNotificationGenerator::testSimpleMessageToggle() |
||||||
|
{ |
||||||
|
Friend f(0, ToxPk()); |
||||||
|
f.setName("friend"); |
||||||
|
|
||||||
|
notificationSettings->setNotifyHide(true); |
||||||
|
|
||||||
|
notificationGenerator->friendMessageNotification(&f, "test"); |
||||||
|
|
||||||
|
notificationSettings->setNotifyHide(false); |
||||||
|
|
||||||
|
auto notificationData = notificationGenerator->friendMessageNotification(&f, "test2"); |
||||||
|
|
||||||
|
QVERIFY(notificationData.title == "2 messages from friend"); |
||||||
|
QVERIFY(notificationData.message == "test2"); |
||||||
|
} |
||||||
|
|
||||||
|
QTEST_GUILESS_MAIN(TestNotificationGenerator) |
||||||
|
#include "notificationgenerator_test.moc" |
Loading…
Reference in new issue