From 995bd420aac932c6c59153d22fd18989b4c0d43c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= Date: Tue, 29 Nov 2022 13:00:08 -0500 Subject: [PATCH] locationsharing: add notification Show notification when a peer is sharing its position on the non current conversation. This needed a lot of changes. Now we store shared position via accountId + peer. This also fix location icons and keep state when changing from one account to another. Change-Id: I8c1848890efa09f6e296e9da779a355167e4d3d4 GitLab: #888 --- .../components/SmartListItemDelegate.qml | 4 +- src/app/positioning.cpp | 2 +- src/app/positioning.h | 3 +- src/app/positionmanager.cpp | 168 +++++++++++------- src/app/positionmanager.h | 25 ++- src/app/qmlregister.cpp | 2 +- src/app/webengine/map/MapPosition.qml | 4 +- src/libclient/accountmodel.cpp | 28 +++ src/libclient/api/accountmodel.h | 9 + src/libclient/api/conversationmodel.h | 8 - src/libclient/callbackshandler.cpp | 8 + src/libclient/callbackshandler.h | 8 + src/libclient/conversationmodel.cpp | 2 - 13 files changed, 179 insertions(+), 92 deletions(-) diff --git a/src/app/mainview/components/SmartListItemDelegate.qml b/src/app/mainview/components/SmartListItemDelegate.qml index 5d56c4db..11f173b2 100644 --- a/src/app/mainview/components/SmartListItemDelegate.qml +++ b/src/app/mainview/components/SmartListItemDelegate.qml @@ -76,10 +76,10 @@ ItemDelegate { Connections { target: PositionManager - function onPositionShareConvIdsChanged () { + function onPositionShareConvIdsCountChanged () { avatar.showSharePositionIndicator = PositionManager.isPositionSharedToConv(UID) } - function onSharingUrisChanged () { + function onSharingUrisCountChanged () { avatar.showSharedPositionIndicator = PositionManager.isConvSharingPosition(UID) } } diff --git a/src/app/positioning.cpp b/src/app/positioning.cpp index 27d79953..d8a8bbf0 100644 --- a/src/app/positioning.cpp +++ b/src/app/positioning.cpp @@ -80,7 +80,7 @@ void Positioning::positionUpdated(const QGeoPositionInfo& info) { Q_EMIT positioningError(""); - Q_EMIT newPosition(uri_, convertToJson(info), -1, ""); + Q_EMIT newPosition("", uri_, convertToJson(info), -1, ""); } void diff --git a/src/app/positioning.h b/src/app/positioning.h index d75e98d5..9b3423c9 100644 --- a/src/app/positioning.h +++ b/src/app/positioning.h @@ -57,7 +57,8 @@ private Q_SLOTS: void locationServicesActivated(); Q_SIGNALS: - void newPosition(const QString& peerId, + void newPosition(const QString& unused_AccountId, + const QString& peerId, const QString& body, const uint64_t& timestamp, const QString& daemonId); diff --git a/src/app/positionmanager.cpp b/src/app/positionmanager.cpp index b21d4fa4..e9504557 100644 --- a/src/app/positionmanager.cpp +++ b/src/app/positionmanager.cpp @@ -9,8 +9,9 @@ #include #include -PositionManager::PositionManager(LRCInstance* instance, QObject* parent) +PositionManager::PositionManager(SystemTray* systemTray, LRCInstance* instance, QObject* parent) : QmlAdapterBase(instance, parent) + , systemTray_(systemTray) { timerTimeLeftSharing_ = new QTimer(this); timerStopSharing_ = new QTimer(this); @@ -19,36 +20,26 @@ PositionManager::PositionManager(LRCInstance* instance, QObject* parent) }); connect(timerStopSharing_, &QTimer::timeout, [=] { stopSharingPosition(); }); connect(lrcInstance_, &LRCInstance::selectedConvUidChanged, [this]() { - Q_EMIT positionShareConvIdsChanged(); set_mapAutoOpening(true); }); + connect(lrcInstance_, &LRCInstance::currentAccountIdChanged, [this]() { + localPositioning_->setUri(lrcInstance_->getCurrentAccountInfo().profileInfo.uri); + }); set_isMapActive(false); } void PositionManager::safeInit() { - connect(lrcInstance_, &LRCInstance::currentAccountIdChanged, [this]() { - connectConversationModel(); - set_sharingUris({}); - objectListSharingUris_.clear(); - set_positionShareConvIds({}); - localPositioning_->setUri(lrcInstance_->getCurrentAccountInfo().profileInfo.uri); - }); - set_sharingUris({}); - objectListSharingUris_.clear(); - set_positionShareConvIds({}); localPositioning_.reset(new Positioning(lrcInstance_->getCurrentAccountInfo().profileInfo.uri)); - connectConversationModel(); + connectAccountModel(); } void -PositionManager::connectConversationModel() +PositionManager::connectAccountModel() { - auto currentConversationModel = lrcInstance_->getCurrentConversationModel(); - - QObject::connect(currentConversationModel, - &ConversationModel::newPosition, + QObject::connect(&lrcInstance_->accountModel(), + &AccountModel::newPosition, this, &PositionManager::onPositionReceived, Qt::UniqueConnection); @@ -90,7 +81,8 @@ PositionManager::isConvSharingPosition(const QString& convUri) .participantsUris(); Q_FOREACH (const auto& id, convParticipants) { if (id != lrcInstance_->getCurrentAccountInfo().profileInfo.uri) { - if (sharingUris_.contains(id)) { + if (objectListSharingUris_.contains( + QPair {lrcInstance_->get_currentAccountId(), id})) { return true; } } @@ -109,34 +101,37 @@ PositionManager::loadPreviousLocations() jsonObj.insert("long", it.value()->getLongitude().toString()); QJsonDocument doc(jsonObj); QString strJson(doc.toJson(QJsonDocument::Compact)); - onPositionReceived(it.key(), strJson, -1, ""); + onPositionReceived(it.key().first, it.key().second, strJson, -1, ""); } } bool -PositionManager::isPositionSharedToConv(const QString& convUri) +PositionManager::isPositionSharedToConv(const QString& convUid) { if (positionShareConvIds_.length()) { - auto iter = std::find(positionShareConvIds_.begin(), positionShareConvIds_.end(), convUri); + auto iter = std::find(positionShareConvIds_.begin(), + positionShareConvIds_.end(), + QPair {lrcInstance_->get_currentAccountId(), + convUid}); return (iter != positionShareConvIds_.end()); } return false; } void -PositionManager::sendPosition(const QString& peerId, const QString& body) +PositionManager::sendPosition(const QString& body) { try { - Q_FOREACH (const auto& id, positionShareConvIds_) { - const auto& convInfo = lrcInstance_->getConversationFromConvUid(id); + Q_FOREACH (const auto& key, positionShareConvIds_) { + const auto& convInfo = lrcInstance_->getConversationFromConvUid(key.second, key.first); + auto accountUri = lrcInstance_->getAccountInfo(key.first).profileInfo.uri; Q_FOREACH (const QString& uri, convInfo.participantsUris()) { - if (peerId != uri) { - lrcInstance_->getCurrentAccountInfo() + if (uri != accountUri) { + lrcInstance_->getAccountInfo(key.first) .contactModel->sendDhtMessage(uri, body, APPLICATION_GEO); } } } - } catch (const std::exception& e) { qDebug() << Q_FUNC_INFO << e.what(); } @@ -151,24 +146,28 @@ PositionManager::onWatchdogTimeout() [obj](const auto& it) { return it == obj; }); if (it != objectListSharingUris_.cend()) { QString stopMsg("{\"type\":\"Stop\"}"); - onPositionReceived(it.key(), stopMsg, -1, ""); + onPositionReceived(it.key().first, it.key().second, stopMsg, -1, ""); } } void PositionManager::sharePosition(int maximumTime) { - connect(localPositioning_.get(), - &Positioning::newPosition, - this, - &PositionManager::sendPosition, - Qt::UniqueConnection); + connect( + localPositioning_.get(), + &Positioning::newPosition, + this, + [&](const QString&, const QString&, const QString& body, const uint64_t&, const QString&) { + sendPosition(body); + }, + Qt::UniqueConnection); try { startPositionTimers(maximumTime); const auto convUid = lrcInstance_->get_selectedConvUid(); - positionShareConvIds_.append(convUid); - Q_EMIT positionShareConvIdsChanged(); + positionShareConvIds_.append( + QPair {lrcInstance_->get_currentAccountId(), convUid}); + set_positionShareConvIdsCount(positionShareConvIds_.size()); } catch (...) { qDebug() << "Exception during sharePosition:"; } @@ -180,9 +179,10 @@ PositionManager::stopSharingPosition(const QString convId) QString stopMsg; stopMsg = "{\"type\":\"Stop\"}"; if (convId == "") { - sendPosition(lrcInstance_->getCurrentAccountInfo().profileInfo.uri, stopMsg); + sendPosition(stopMsg); stopPositionTimers(); - set_positionShareConvIds({}); + positionShareConvIds_.clear(); + set_positionShareConvIdsCount(positionShareConvIds_.size()); } else { const auto& convInfo = lrcInstance_->getConversationFromConvUid(convId); Q_FOREACH (const QString& uri, convInfo.participantsUris()) { @@ -192,11 +192,14 @@ PositionManager::stopSharingPosition(const QString convId) APPLICATION_GEO); } } - auto iter = std::find(positionShareConvIds_.begin(), positionShareConvIds_.end(), convId); + auto iter = std::find(positionShareConvIds_.begin(), + positionShareConvIds_.end(), + QPair {lrcInstance_->get_currentAccountId(), + convId}); if (iter != positionShareConvIds_.end()) { positionShareConvIds_.remove(std::distance(positionShareConvIds_.begin(), iter)); } - Q_EMIT positionShareConvIdsChanged(); + set_positionShareConvIdsCount(positionShareConvIds_.size()); } } @@ -208,15 +211,16 @@ PositionManager::setMapActive(bool state) } QString -PositionManager::getAvatar(const QString& uri) +PositionManager::getAvatar(const QString& accountId, const QString& uri) { QString avatarBase64; QByteArray ba; QBuffer bu(&ba); - auto& accInfo = lrcInstance_->getCurrentAccountInfo(); + auto& accInfo = accountId == "" ? lrcInstance_->getCurrentAccountInfo() + : lrcInstance_->getAccountInfo(accountId); auto currentAccountUri = accInfo.profileInfo.uri; - if (currentAccountUri == uri) { + if (currentAccountUri == uri || accountId.isEmpty()) { // use accountPhoto Utils::accountPhoto(lrcInstance_, accInfo.id).save(&bu, "PNG"); } else { @@ -271,7 +275,36 @@ PositionManager::onPositionErrorReceived(const QString error) } void -PositionManager::onPositionReceived(const QString& peerId, +PositionManager::showNotification(const QString& accountId, + const QString& convId, + const QString& from) +{ + auto bestName = lrcInstance_->getAccountInfo(accountId).contactModel->bestNameForContact(from); + auto body = tr("%1 is sharing it's location").arg(bestName); +#ifdef Q_OS_LINUX + auto contactPhoto = Utils::contactPhoto(lrcInstance_, from, QSize(50, 50), accountId); + auto notifId = QString("%1;%2;%3").arg(accountId).arg(convId).arg(from); + systemTray_->showNotification(notifId, + tr("Location sharing"), + body, + NotificationType::CHAT, + Utils::QImageToByteArray(contactPhoto)); + +#else + auto onClicked = [this, accountId, convId] { + Q_EMIT lrcInstance_->notificationClicked(); + const auto& convInfo = lrcInstance_->getConversationFromConvUid(convId, accountId); + if (convInfo.uid.isEmpty()) + return; + lrcInstance_->selectConversation(convInfo.uid, accountId); + }; + systemTray_->showNotification(body, from, onClicked); +#endif +} + +void +PositionManager::onPositionReceived(const QString& accountId, + const QString& peerId, const QString& body, const uint64_t& timestamp, const QString& daemonId) @@ -290,7 +323,7 @@ PositionManager::onPositionReceived(const QString& peerId, QVariantMap shareInfo; shareInfo["author"] = peerId; if (!update) { - shareInfo["avatar"] = getAvatar(peerId); + shareInfo["avatar"] = getAvatar(accountId, peerId); } shareInfo["long"] = newPosition["long"]; shareInfo["lat"] = newPosition["lat"]; @@ -298,6 +331,8 @@ PositionManager::onPositionReceived(const QString& peerId, }; auto endSharing = newPosition["type"] == "Stop"; + auto key = QPair {accountId, peerId}; + if (!endSharing) { // open map on position reception if (!isMapActive_ && mapAutoOpening_ && isPeerIdInConv @@ -305,19 +340,18 @@ PositionManager::onPositionReceived(const QString& peerId, set_isMapActive(true); } } - auto iter = std::find(currentConvSharingUris_.begin(), currentConvSharingUris_.end(), peerId); + auto iter = std::find(currentConvSharingUris_.begin(), currentConvSharingUris_.end(), key); if (iter == currentConvSharingUris_.end()) { // New share if (!endSharing) { - sharingUris_.insert(peerId); - Q_EMIT sharingUrisChanged(); - // list to save more information on position + watchdog - auto it = objectListSharingUris_.find(peerId); - if (it == objectListSharingUris_.end()) { + auto it = objectListSharingUris_.find(key); + auto isNewSharing = it == objectListSharingUris_.end(); + if (isNewSharing) { auto obj = new PositionObject(newPosition["lat"], newPosition["long"], this); - objectListSharingUris_.insert(peerId, obj); + objectListSharingUris_.insert(key, obj); + set_sharingUrisCount(objectListSharingUris_.size()); connect(obj, &PositionObject::timeout, this, @@ -326,40 +360,42 @@ PositionManager::onPositionReceived(const QString& peerId, } if (isPeerIdInConv) { - currentConvSharingUris_.insert(peerId); + currentConvSharingUris_.insert(key); Q_EMIT positionShareAdded(getShareInfo(false)); + } else if (isNewSharing && accountId != "") { + auto& convInfo = lrcInstance_->getConversationFromPeerUri(peerId, accountId); + if (!convInfo.uid.isEmpty()) { + showNotification(accountId, convInfo.uid, peerId); + } } // stop sharing position } else { - sharingUris_.remove(peerId); - Q_EMIT sharingUrisChanged(); - auto it = objectListSharingUris_.find(peerId); + auto it = objectListSharingUris_.find(key); if (it != objectListSharingUris_.end()) { it.value()->deleteLater(); objectListSharingUris_.erase(it); + set_sharingUrisCount(objectListSharingUris_.size()); } } } else { // Update/remove existing if (endSharing) { // Remove - - sharingUris_.remove(peerId); - Q_EMIT sharingUrisChanged(); - auto it = objectListSharingUris_.find(peerId); + auto it = objectListSharingUris_.find(key); if (it != objectListSharingUris_.end()) { it.value()->deleteLater(); objectListSharingUris_.erase(it); + set_sharingUrisCount(objectListSharingUris_.size()); } if (isPeerIdInConv) { - currentConvSharingUris_.remove(peerId); + currentConvSharingUris_.remove(key); Q_EMIT positionShareRemoved(peerId); // close the map if you're not sharing and you don't receive position anymore if (!positionShareConvIds_.length() - && ((sharingUris_.size() == 1 - && sharingUris_.contains( - lrcInstance_->getCurrentAccountInfo().profileInfo.uri)) - || sharingUris_.size() == 0)) { + && ((sharingUrisCount_ == 1 + && objectListSharingUris_.contains(QPair { + "", lrcInstance_->getCurrentAccountInfo().profileInfo.uri})) + || sharingUrisCount_ == 0)) { set_isMapActive(false); } } @@ -369,7 +405,7 @@ PositionManager::onPositionReceived(const QString& peerId, Q_EMIT positionShareUpdated(getShareInfo(true)); // reset watchdog - auto it = objectListSharingUris_.find(peerId); + auto it = objectListSharingUris_.find(key); if (it != objectListSharingUris_.end()) { it.value()->resetWatchdog(); } diff --git a/src/app/positionmanager.h b/src/app/positionmanager.h index 0111a4d9..fc8c53a3 100644 --- a/src/app/positionmanager.h +++ b/src/app/positionmanager.h @@ -22,6 +22,7 @@ #include "qmladapterbase.h" #include "positioning.h" #include "positionobject.h" +#include "systemtray.h" #include #include @@ -31,11 +32,13 @@ class PositionManager : public QmlAdapterBase Q_OBJECT QML_RO_PROPERTY(bool, isMapActive) QML_RO_PROPERTY(int, timeSharingRemaining) - QML_PROPERTY(QList, positionShareConvIds) - QML_PROPERTY(QSet, sharingUris) + QML_PROPERTY(int, positionShareConvIdsCount) + QML_PROPERTY(int, sharingUrisCount) QML_PROPERTY(bool, mapAutoOpening) public: - explicit PositionManager(LRCInstance* instance, QObject* parent = nullptr); + explicit PositionManager(SystemTray* systemTray, + LRCInstance* instance, + QObject* parent = nullptr); ~PositionManager() = default; Q_SIGNALS: @@ -47,13 +50,13 @@ Q_SIGNALS: protected: void safeInit() override; - QString getAvatar(const QString& peerId); + QString getAvatar(const QString& accountId, const QString& peerId); QVariantMap parseJsonPosition(const QString& body, const QString& peerId); void positionWatchDog(); void startPositionTimers(int timeSharing); void stopPositionTimers(); - Q_INVOKABLE void connectConversationModel(); + Q_INVOKABLE void connectAccountModel(); Q_INVOKABLE void setMapActive(bool state); Q_INVOKABLE void sharePosition(int maximumTime); Q_INVOKABLE void stopSharingPosition(const QString convId = ""); @@ -69,17 +72,21 @@ protected: private Q_SLOTS: void onPositionErrorReceived(const QString error); - void onPositionReceived(const QString& peerId, + void onPositionReceived(const QString& accountId, + const QString& peerId, const QString& body, const uint64_t& timestamp, const QString& daemonId); - void sendPosition(const QString& peerId, const QString& body); + void sendPosition(const QString& body); void onWatchdogTimeout(); + void showNotification(const QString& accountId, const QString& convId, const QString& from); private: + SystemTray* systemTray_; std::unique_ptr localPositioning_; QTimer* timerTimeLeftSharing_ = nullptr; QTimer* timerStopSharing_ = nullptr; - QSet currentConvSharingUris_; - QMap objectListSharingUris_; + QSet> currentConvSharingUris_; + QMap, PositionObject*> objectListSharingUris_; + QList> positionShareConvIds_; }; diff --git a/src/app/qmlregister.cpp b/src/app/qmlregister.cpp index bf9edc0c..6a57fe61 100644 --- a/src/app/qmlregister.cpp +++ b/src/app/qmlregister.cpp @@ -111,7 +111,7 @@ registerTypes(QQmlEngine* engine, // setup the adapters (their lifetimes are that of MainApplication) auto callAdapter = new CallAdapter(systemTray, lrcInstance, parent); auto messagesAdapter = new MessagesAdapter(settingsManager, previewEngine, lrcInstance, parent); - auto positionManager = new PositionManager(lrcInstance, parent); + auto positionManager = new PositionManager(systemTray, lrcInstance, parent); auto conversationsAdapter = new ConversationsAdapter(systemTray, lrcInstance, parent); auto avAdapter = new AvAdapter(lrcInstance, parent); auto contactAdapter = new ContactAdapter(lrcInstance, parent); diff --git a/src/app/webengine/map/MapPosition.qml b/src/app/webengine/map/MapPosition.qml index 1da46a4e..17d9f723 100644 --- a/src/app/webengine/map/MapPosition.qml +++ b/src/app/webengine/map/MapPosition.qml @@ -61,7 +61,7 @@ Rectangle { property bool isLoaded: false property var positionList: PositionManager.positionList; property var avatarPositionList: PositionManager.avatarPositionList; - property bool isSharing: (PositionManager.positionShareConvIds.length !== 0 ) + property bool isSharing: (PositionManager.positionShareConvIdsCount !== 0 ) function loadScripts () { var scriptMapJs = { @@ -276,7 +276,7 @@ Rectangle { property bool isError: positioningError.length onClicked: { if (!isError) { - if (PositionManager.positionShareConvIds.length >= 2) { + if (PositionManager.positionShareConvIdsCount >= 2) { stopSharingPositionPopup.open() } else { PositionManager.stopSharingPosition(); diff --git a/src/libclient/accountmodel.cpp b/src/libclient/accountmodel.cpp index 91a4cd85..fa796210 100644 --- a/src/libclient/accountmodel.cpp +++ b/src/libclient/accountmodel.cpp @@ -177,6 +177,20 @@ public Q_SLOTS: void slotAccountProfileReceived(const QString& accountId, const QString& displayName, const QString& userPhoto); + + /** + * Emit new position + * @param accountId + * @param peerId + * @param body + * @param timestamp + * @param daemonId + */ + void slotNewPosition(const QString& accountId, + const QString& peerId, + const QString& body, + const uint64_t& timestamp, + const QString& daemonId) const; }; AccountModel::AccountModel(Lrc& lrc, @@ -415,6 +429,10 @@ AccountModelPimpl::AccountModelPimpl(AccountModel& linked, &CallbacksHandler::accountProfileReceived, this, &AccountModelPimpl::slotAccountProfileReceived); + connect(&callbacksHandler, + &CallbacksHandler::newPosition, + this, + &AccountModelPimpl::slotNewPosition); } AccountModelPimpl::~AccountModelPimpl() {} @@ -698,6 +716,16 @@ AccountModelPimpl::slotAccountProfileReceived(const QString& accountId, Q_EMIT linked.profileUpdated(accountId); } +void +AccountModelPimpl::slotNewPosition(const QString& accountId, + const QString& peerId, + const QString& body, + const uint64_t& timestamp, + const QString& daemonId) const +{ + Q_EMIT linked.newPosition(accountId, peerId, body, timestamp, daemonId); +} + void AccountModelPimpl::addToAccounts(const QString& accountId, std::shared_ptr db) { diff --git a/src/libclient/api/accountmodel.h b/src/libclient/api/accountmodel.h index 73c2bbfd..1eca832a 100644 --- a/src/libclient/api/accountmodel.h +++ b/src/libclient/api/accountmodel.h @@ -326,6 +326,15 @@ Q_SIGNALS: */ void migrationEnded(const QString& accountId, bool ok); + /** + * Emitted when a conversation receives a new position + */ + void newPosition(const QString& accountId, + const QString& peerId, + const QString& body, + const uint64_t& timestamp, + const QString& daemonId) const; + private: std::unique_ptr pimpl_; }; diff --git a/src/libclient/api/conversationmodel.h b/src/libclient/api/conversationmodel.h index 73e7530b..cd5849d1 100644 --- a/src/libclient/api/conversationmodel.h +++ b/src/libclient/api/conversationmodel.h @@ -440,14 +440,6 @@ public: Q_SIGNALS: - /** - * Emitted when a conversation receives a new position - */ - void newPosition(const QString& peerId, - const QString& body, - const uint64_t& timestamp, - const QString& daemonId) const; - /** * Emitted when a conversation receives a new interaction * @param uid of conversation diff --git a/src/libclient/callbackshandler.cpp b/src/libclient/callbackshandler.cpp index b35e2173..a4013199 100644 --- a/src/libclient/callbackshandler.cpp +++ b/src/libclient/callbackshandler.cpp @@ -32,6 +32,8 @@ #include "dbus/presencemanager.h" #include "dbus/videomanager.h" +#include "typedefs.h" + // libjami #include @@ -386,6 +388,12 @@ CallbacksHandler::slotNewAccountMessage(const QString& accountId, const MapStringString& payloads) { auto peerId2 = QString(peerId).replace("@ring.dht", ""); + for (const auto& payload : payloads.keys()) { + if (payload.contains(APPLICATION_GEO)) { + Q_EMIT newPosition(accountId, peerId, payloads.value(payload), 0, msgId); + return; + } + } Q_EMIT newAccountMessage(accountId, peerId2, msgId, payloads); } diff --git a/src/libclient/callbackshandler.h b/src/libclient/callbackshandler.h index 0466f7ec..b9fbf654 100644 --- a/src/libclient/callbackshandler.h +++ b/src/libclient/callbackshandler.h @@ -388,6 +388,14 @@ Q_SIGNALS: const QString& conversationId, const MapStringString& preferences); + /** + * Emitted when a conversation receives a new position + */ + void newPosition(const QString& accountId, + const QString& peerId, + const QString& body, + const uint64_t& timestamp, + const QString& daemonId) const; private Q_SLOTS: /** * Emit newAccountMessage diff --git a/src/libclient/conversationmodel.cpp b/src/libclient/conversationmodel.cpp index 26c8ddc4..45d777fa 100644 --- a/src/libclient/conversationmodel.cpp +++ b/src/libclient/conversationmodel.cpp @@ -3572,8 +3572,6 @@ ConversationModelPimpl::slotNewAccountMessage(const QString& accountId, for (const auto& payload : payloads.keys()) { if (payload.contains(TEXT_PLAIN)) { addIncomingMessage(peerId, payloads.value(payload), 0, msgId); - } else if (payload.contains(APPLICATION_GEO)) { - Q_EMIT linked.newPosition(peerId, payloads.value(payload), 0, msgId); } else { qWarning() << payload; }