diff --git a/src/api/contactmodel.h b/src/api/contactmodel.h index 0bacb15a45fc71ae13f2f33c4a4c636bd788545e..af6505e2d578f97cc3a20aa94edce91fcd0f0dee 100644 --- a/src/api/contactmodel.h +++ b/src/api/contactmodel.h @@ -117,7 +117,7 @@ Q_SIGNALS: /** * Connect this signal to know when this model was updated. */ - void modelUpdated(const std::string& uri) const; + void modelUpdated(const std::string& uri, bool needsSorted=true) const; /** * Connect this signal to know when a contact was added. * @param contactUri diff --git a/src/contactmodel.cpp b/src/contactmodel.cpp index a6dd776cc60b4ebeed132b682fdd335685e00d14..3eed56d9723948b7d2584c5dd2625939c291aa7e 100644 --- a/src/contactmodel.cpp +++ b/src/contactmodel.cpp @@ -519,7 +519,7 @@ ContactModelPimpl::slotNewBuddySubscription(const std::string& contactUri, bool } else return; } - emit linked.modelUpdated(contactUri); + emit linked.modelUpdated(contactUri, false); } void diff --git a/src/conversationmodel.cpp b/src/conversationmodel.cpp index 805fd8a638d18448adf80b97204c2dc494adf716..850384b693160066d87202409bc6c024f92b1785 100644 --- a/src/conversationmodel.cpp +++ b/src/conversationmodel.cpp @@ -177,7 +177,7 @@ public Q_SLOTS: /** * Listen from contactModel when updated (like new alias, avatar, etc.) */ - void slotContactModelUpdated(const std::string& uri); + void slotContactModelUpdated(const std::string& uri, bool needsSorted); /** * Listen from contactModel when a new contact is added * @param uri @@ -1223,7 +1223,7 @@ ConversationModelPimpl::slotContactRemoved(const std::string& uri) } void -ConversationModelPimpl::slotContactModelUpdated(const std::string& uri) +ConversationModelPimpl::slotContactModelUpdated(const std::string& uri, bool needsSorted) { // We don't create newConversationItem if we already filter on pending conversation::Info newConversationItem; @@ -1259,7 +1259,11 @@ ConversationModelPimpl::slotContactModelUpdated(const std::string& uri) conversations.emplace_front(conversationInfo); } dirtyConversations = {true, true}; - emit linked.modelSorted(); + if (needsSorted) { + emit linked.modelSorted(); + } else { + emit linked.conversationUpdated(conversations.front().uid); + } return; } } else { @@ -1267,7 +1271,7 @@ ConversationModelPimpl::slotContactModelUpdated(const std::string& uri) if (!conversations.empty()) { auto firstContactUri = conversations.front().participants.front(); - if (firstContactUri.empty()) { + if (firstContactUri.empty() && needsSorted) { conversations.pop_front(); dirtyConversations = {true, true}; emit linked.modelSorted(); @@ -1280,7 +1284,8 @@ ConversationModelPimpl::slotContactModelUpdated(const std::string& uri) dirtyConversations = {true, true}; int index = indexOfContact(uri); if (index != -1) { - if (!conversations.empty() && conversations.front().participants.front().empty()) { + if (!conversations.empty() && conversations.front().participants.front().empty() && + needsSorted) { // In this case, contact is present in list, so temporary item does not longer exists emit linked.modelSorted(); } else { diff --git a/test/contactmodeltester.cpp b/test/contactmodeltester.cpp index 958fc56284833f74c63010479cdfaab067b58f2b..75bb94a5ad4ec4a02fed210a0f40c0708ea7c461 100644 --- a/test/contactmodeltester.cpp +++ b/test/contactmodeltester.cpp @@ -29,7 +29,9 @@ #include <api/newaccountmodel.h> #include <api/contact.h> #include <api/contactmodel.h> +#include <api/conversationmodel.h> #include <dbus/configurationmanager.h> +#include <dbus/presencemanager.h> namespace ring { @@ -199,7 +201,32 @@ ContactModelTester::testAddAlreadyAddedContact() CPPUNIT_ASSERT_NO_THROW(accInfo_.contactModel->getContact("contact1")); auto nbContactsAtEnd = accInfo_.contactModel->getAllContacts().size(); CPPUNIT_ASSERT_EQUAL(nbContactsAtBegin, nbContactsAtEnd); +} +void +ContactModelTester::testReceivesContactPresenceUpdate() +{ + CPPUNIT_ASSERT_NO_THROW(accInfo_.contactModel->getContact("contact1")); + CPPUNIT_ASSERT_EQUAL(accInfo_.contactModel->getContact("contact1").isPresent, false); + + PresenceManager::instance().emitNewBuddyNotification(QString::fromStdString(accInfo_.id), "contact1", true, QString()); + auto contactModelUpdated = WaitForSignalHelper (*accInfo_.contactModel, SIGNAL(modelUpdated(const std::string&, bool))).wait(1000); + CPPUNIT_ASSERT(contactModelUpdated); + + // TODO: CPPUNIT_ASSERT(!modelSorted) + + auto conversations = accInfo_.conversationModel->allFilteredConversations(); + auto contactInfo = accInfo_.contactModel->getContact("contact1"); + auto conversation = std::find_if(conversations.begin(), conversations.end(), + [&contactInfo](const lrc::api::conversation::Info& conversation) { + return std::find(conversation.participants.begin(), + conversation.participants.end(), + contactInfo.profileInfo.uri) != conversation.participants.end(); + }); + auto contactConversationUpdated = WaitForSignalHelper(*accInfo_.conversationModel, + SIGNAL(conversationUpdated(conversation.uid))).wait(1000); + CPPUNIT_ASSERT(contactConversationUpdated); + CPPUNIT_ASSERT_EQUAL(accInfo_.contactModel->getContact("contact1").isPresent, true); } void diff --git a/test/contactmodeltester.h b/test/contactmodeltester.h index f4d6c1debb6acb944f6e5b298f4c2b169bc38763..a2201e988f9443e30040138d96cc143cb5ec0d88 100644 --- a/test/contactmodeltester.h +++ b/test/contactmodeltester.h @@ -47,6 +47,7 @@ class ContactModelTester : public CppUnit::TestFixture { CPPUNIT_TEST(testAddRingURI); CPPUNIT_TEST(testAddNewSIPContact); CPPUNIT_TEST(testAddAlreadyAddedContact); + CPPUNIT_TEST(testReceivesContactPresenceUpdate); CPPUNIT_TEST(testRmRingContact); CPPUNIT_TEST(testRmPendingContact); CPPUNIT_TEST(testRmSIPContact); @@ -90,6 +91,11 @@ public: * No new contact should appears. */ void testAddAlreadyAddedContact(); + /** + * receive a presence update. + * modelSorted should not be emitted, but conversationUpdated should. + */ + void testReceivesContactPresenceUpdate(); /** * Remove "dummy" from "ring1" contacts. * The contact should be removed. diff --git a/test/mocks/presencemanager_mock.h b/test/mocks/presencemanager_mock.h index 40d41924efc88ec83cb4922be875204938d7ced7..2ef9b44cf22f870fc9ffa292635b454e4d3f96dd 100644 --- a/test/mocks/presencemanager_mock.h +++ b/test/mocks/presencemanager_mock.h @@ -48,6 +48,11 @@ public: ~PresenceManagerInterface() {} + void emitNewBuddyNotification(const QString &accountID, const QString &buddyUri, bool status, const QString &lineStatus) + { + emit newBuddyNotification(accountID, buddyUri, status, lineStatus); + } + public Q_SLOTS: // METHODS void answerServerRequest(const QString &uri, bool flag) {