mirror of
https://git.jami.net/savoirfairelinux/jami-client-qt.git
synced 2025-08-24 16:53:51 +02:00
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
This commit is contained in:
parent
7367c28733
commit
995bd420aa
13 changed files with 179 additions and 92 deletions
|
@ -76,10 +76,10 @@ ItemDelegate {
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: PositionManager
|
target: PositionManager
|
||||||
function onPositionShareConvIdsChanged () {
|
function onPositionShareConvIdsCountChanged () {
|
||||||
avatar.showSharePositionIndicator = PositionManager.isPositionSharedToConv(UID)
|
avatar.showSharePositionIndicator = PositionManager.isPositionSharedToConv(UID)
|
||||||
}
|
}
|
||||||
function onSharingUrisChanged () {
|
function onSharingUrisCountChanged () {
|
||||||
avatar.showSharedPositionIndicator = PositionManager.isConvSharingPosition(UID)
|
avatar.showSharedPositionIndicator = PositionManager.isConvSharingPosition(UID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ void
|
||||||
Positioning::positionUpdated(const QGeoPositionInfo& info)
|
Positioning::positionUpdated(const QGeoPositionInfo& info)
|
||||||
{
|
{
|
||||||
Q_EMIT positioningError("");
|
Q_EMIT positioningError("");
|
||||||
Q_EMIT newPosition(uri_, convertToJson(info), -1, "");
|
Q_EMIT newPosition("", uri_, convertToJson(info), -1, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -57,7 +57,8 @@ private Q_SLOTS:
|
||||||
void locationServicesActivated();
|
void locationServicesActivated();
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void newPosition(const QString& peerId,
|
void newPosition(const QString& unused_AccountId,
|
||||||
|
const QString& peerId,
|
||||||
const QString& body,
|
const QString& body,
|
||||||
const uint64_t& timestamp,
|
const uint64_t& timestamp,
|
||||||
const QString& daemonId);
|
const QString& daemonId);
|
||||||
|
|
|
@ -9,8 +9,9 @@
|
||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
#include <QImageReader>
|
#include <QImageReader>
|
||||||
|
|
||||||
PositionManager::PositionManager(LRCInstance* instance, QObject* parent)
|
PositionManager::PositionManager(SystemTray* systemTray, LRCInstance* instance, QObject* parent)
|
||||||
: QmlAdapterBase(instance, parent)
|
: QmlAdapterBase(instance, parent)
|
||||||
|
, systemTray_(systemTray)
|
||||||
{
|
{
|
||||||
timerTimeLeftSharing_ = new QTimer(this);
|
timerTimeLeftSharing_ = new QTimer(this);
|
||||||
timerStopSharing_ = new QTimer(this);
|
timerStopSharing_ = new QTimer(this);
|
||||||
|
@ -19,36 +20,26 @@ PositionManager::PositionManager(LRCInstance* instance, QObject* parent)
|
||||||
});
|
});
|
||||||
connect(timerStopSharing_, &QTimer::timeout, [=] { stopSharingPosition(); });
|
connect(timerStopSharing_, &QTimer::timeout, [=] { stopSharingPosition(); });
|
||||||
connect(lrcInstance_, &LRCInstance::selectedConvUidChanged, [this]() {
|
connect(lrcInstance_, &LRCInstance::selectedConvUidChanged, [this]() {
|
||||||
Q_EMIT positionShareConvIdsChanged();
|
|
||||||
set_mapAutoOpening(true);
|
set_mapAutoOpening(true);
|
||||||
});
|
});
|
||||||
|
connect(lrcInstance_, &LRCInstance::currentAccountIdChanged, [this]() {
|
||||||
|
localPositioning_->setUri(lrcInstance_->getCurrentAccountInfo().profileInfo.uri);
|
||||||
|
});
|
||||||
set_isMapActive(false);
|
set_isMapActive(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PositionManager::safeInit()
|
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));
|
localPositioning_.reset(new Positioning(lrcInstance_->getCurrentAccountInfo().profileInfo.uri));
|
||||||
connectConversationModel();
|
connectAccountModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PositionManager::connectConversationModel()
|
PositionManager::connectAccountModel()
|
||||||
{
|
{
|
||||||
auto currentConversationModel = lrcInstance_->getCurrentConversationModel();
|
QObject::connect(&lrcInstance_->accountModel(),
|
||||||
|
&AccountModel::newPosition,
|
||||||
QObject::connect(currentConversationModel,
|
|
||||||
&ConversationModel::newPosition,
|
|
||||||
this,
|
this,
|
||||||
&PositionManager::onPositionReceived,
|
&PositionManager::onPositionReceived,
|
||||||
Qt::UniqueConnection);
|
Qt::UniqueConnection);
|
||||||
|
@ -90,7 +81,8 @@ PositionManager::isConvSharingPosition(const QString& convUri)
|
||||||
.participantsUris();
|
.participantsUris();
|
||||||
Q_FOREACH (const auto& id, convParticipants) {
|
Q_FOREACH (const auto& id, convParticipants) {
|
||||||
if (id != lrcInstance_->getCurrentAccountInfo().profileInfo.uri) {
|
if (id != lrcInstance_->getCurrentAccountInfo().profileInfo.uri) {
|
||||||
if (sharingUris_.contains(id)) {
|
if (objectListSharingUris_.contains(
|
||||||
|
QPair<QString, QString> {lrcInstance_->get_currentAccountId(), id})) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,34 +101,37 @@ PositionManager::loadPreviousLocations()
|
||||||
jsonObj.insert("long", it.value()->getLongitude().toString());
|
jsonObj.insert("long", it.value()->getLongitude().toString());
|
||||||
QJsonDocument doc(jsonObj);
|
QJsonDocument doc(jsonObj);
|
||||||
QString strJson(doc.toJson(QJsonDocument::Compact));
|
QString strJson(doc.toJson(QJsonDocument::Compact));
|
||||||
onPositionReceived(it.key(), strJson, -1, "");
|
onPositionReceived(it.key().first, it.key().second, strJson, -1, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
PositionManager::isPositionSharedToConv(const QString& convUri)
|
PositionManager::isPositionSharedToConv(const QString& convUid)
|
||||||
{
|
{
|
||||||
if (positionShareConvIds_.length()) {
|
if (positionShareConvIds_.length()) {
|
||||||
auto iter = std::find(positionShareConvIds_.begin(), positionShareConvIds_.end(), convUri);
|
auto iter = std::find(positionShareConvIds_.begin(),
|
||||||
|
positionShareConvIds_.end(),
|
||||||
|
QPair<QString, QString> {lrcInstance_->get_currentAccountId(),
|
||||||
|
convUid});
|
||||||
return (iter != positionShareConvIds_.end());
|
return (iter != positionShareConvIds_.end());
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PositionManager::sendPosition(const QString& peerId, const QString& body)
|
PositionManager::sendPosition(const QString& body)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
Q_FOREACH (const auto& id, positionShareConvIds_) {
|
Q_FOREACH (const auto& key, positionShareConvIds_) {
|
||||||
const auto& convInfo = lrcInstance_->getConversationFromConvUid(id);
|
const auto& convInfo = lrcInstance_->getConversationFromConvUid(key.second, key.first);
|
||||||
|
auto accountUri = lrcInstance_->getAccountInfo(key.first).profileInfo.uri;
|
||||||
Q_FOREACH (const QString& uri, convInfo.participantsUris()) {
|
Q_FOREACH (const QString& uri, convInfo.participantsUris()) {
|
||||||
if (peerId != uri) {
|
if (uri != accountUri) {
|
||||||
lrcInstance_->getCurrentAccountInfo()
|
lrcInstance_->getAccountInfo(key.first)
|
||||||
.contactModel->sendDhtMessage(uri, body, APPLICATION_GEO);
|
.contactModel->sendDhtMessage(uri, body, APPLICATION_GEO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
qDebug() << Q_FUNC_INFO << e.what();
|
qDebug() << Q_FUNC_INFO << e.what();
|
||||||
}
|
}
|
||||||
|
@ -151,24 +146,28 @@ PositionManager::onWatchdogTimeout()
|
||||||
[obj](const auto& it) { return it == obj; });
|
[obj](const auto& it) { return it == obj; });
|
||||||
if (it != objectListSharingUris_.cend()) {
|
if (it != objectListSharingUris_.cend()) {
|
||||||
QString stopMsg("{\"type\":\"Stop\"}");
|
QString stopMsg("{\"type\":\"Stop\"}");
|
||||||
onPositionReceived(it.key(), stopMsg, -1, "");
|
onPositionReceived(it.key().first, it.key().second, stopMsg, -1, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PositionManager::sharePosition(int maximumTime)
|
PositionManager::sharePosition(int maximumTime)
|
||||||
{
|
{
|
||||||
connect(localPositioning_.get(),
|
connect(
|
||||||
|
localPositioning_.get(),
|
||||||
&Positioning::newPosition,
|
&Positioning::newPosition,
|
||||||
this,
|
this,
|
||||||
&PositionManager::sendPosition,
|
[&](const QString&, const QString&, const QString& body, const uint64_t&, const QString&) {
|
||||||
|
sendPosition(body);
|
||||||
|
},
|
||||||
Qt::UniqueConnection);
|
Qt::UniqueConnection);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
startPositionTimers(maximumTime);
|
startPositionTimers(maximumTime);
|
||||||
const auto convUid = lrcInstance_->get_selectedConvUid();
|
const auto convUid = lrcInstance_->get_selectedConvUid();
|
||||||
positionShareConvIds_.append(convUid);
|
positionShareConvIds_.append(
|
||||||
Q_EMIT positionShareConvIdsChanged();
|
QPair<QString, QString> {lrcInstance_->get_currentAccountId(), convUid});
|
||||||
|
set_positionShareConvIdsCount(positionShareConvIds_.size());
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
qDebug() << "Exception during sharePosition:";
|
qDebug() << "Exception during sharePosition:";
|
||||||
}
|
}
|
||||||
|
@ -180,9 +179,10 @@ PositionManager::stopSharingPosition(const QString convId)
|
||||||
QString stopMsg;
|
QString stopMsg;
|
||||||
stopMsg = "{\"type\":\"Stop\"}";
|
stopMsg = "{\"type\":\"Stop\"}";
|
||||||
if (convId == "") {
|
if (convId == "") {
|
||||||
sendPosition(lrcInstance_->getCurrentAccountInfo().profileInfo.uri, stopMsg);
|
sendPosition(stopMsg);
|
||||||
stopPositionTimers();
|
stopPositionTimers();
|
||||||
set_positionShareConvIds({});
|
positionShareConvIds_.clear();
|
||||||
|
set_positionShareConvIdsCount(positionShareConvIds_.size());
|
||||||
} else {
|
} else {
|
||||||
const auto& convInfo = lrcInstance_->getConversationFromConvUid(convId);
|
const auto& convInfo = lrcInstance_->getConversationFromConvUid(convId);
|
||||||
Q_FOREACH (const QString& uri, convInfo.participantsUris()) {
|
Q_FOREACH (const QString& uri, convInfo.participantsUris()) {
|
||||||
|
@ -192,11 +192,14 @@ PositionManager::stopSharingPosition(const QString convId)
|
||||||
APPLICATION_GEO);
|
APPLICATION_GEO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto iter = std::find(positionShareConvIds_.begin(), positionShareConvIds_.end(), convId);
|
auto iter = std::find(positionShareConvIds_.begin(),
|
||||||
|
positionShareConvIds_.end(),
|
||||||
|
QPair<QString, QString> {lrcInstance_->get_currentAccountId(),
|
||||||
|
convId});
|
||||||
if (iter != positionShareConvIds_.end()) {
|
if (iter != positionShareConvIds_.end()) {
|
||||||
positionShareConvIds_.remove(std::distance(positionShareConvIds_.begin(), iter));
|
positionShareConvIds_.remove(std::distance(positionShareConvIds_.begin(), iter));
|
||||||
}
|
}
|
||||||
Q_EMIT positionShareConvIdsChanged();
|
set_positionShareConvIdsCount(positionShareConvIds_.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,15 +211,16 @@ PositionManager::setMapActive(bool state)
|
||||||
}
|
}
|
||||||
|
|
||||||
QString
|
QString
|
||||||
PositionManager::getAvatar(const QString& uri)
|
PositionManager::getAvatar(const QString& accountId, const QString& uri)
|
||||||
{
|
{
|
||||||
QString avatarBase64;
|
QString avatarBase64;
|
||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
QBuffer bu(&ba);
|
QBuffer bu(&ba);
|
||||||
|
|
||||||
auto& accInfo = lrcInstance_->getCurrentAccountInfo();
|
auto& accInfo = accountId == "" ? lrcInstance_->getCurrentAccountInfo()
|
||||||
|
: lrcInstance_->getAccountInfo(accountId);
|
||||||
auto currentAccountUri = accInfo.profileInfo.uri;
|
auto currentAccountUri = accInfo.profileInfo.uri;
|
||||||
if (currentAccountUri == uri) {
|
if (currentAccountUri == uri || accountId.isEmpty()) {
|
||||||
// use accountPhoto
|
// use accountPhoto
|
||||||
Utils::accountPhoto(lrcInstance_, accInfo.id).save(&bu, "PNG");
|
Utils::accountPhoto(lrcInstance_, accInfo.id).save(&bu, "PNG");
|
||||||
} else {
|
} else {
|
||||||
|
@ -271,7 +275,36 @@ PositionManager::onPositionErrorReceived(const QString error)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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 QString& body,
|
||||||
const uint64_t& timestamp,
|
const uint64_t& timestamp,
|
||||||
const QString& daemonId)
|
const QString& daemonId)
|
||||||
|
@ -290,7 +323,7 @@ PositionManager::onPositionReceived(const QString& peerId,
|
||||||
QVariantMap shareInfo;
|
QVariantMap shareInfo;
|
||||||
shareInfo["author"] = peerId;
|
shareInfo["author"] = peerId;
|
||||||
if (!update) {
|
if (!update) {
|
||||||
shareInfo["avatar"] = getAvatar(peerId);
|
shareInfo["avatar"] = getAvatar(accountId, peerId);
|
||||||
}
|
}
|
||||||
shareInfo["long"] = newPosition["long"];
|
shareInfo["long"] = newPosition["long"];
|
||||||
shareInfo["lat"] = newPosition["lat"];
|
shareInfo["lat"] = newPosition["lat"];
|
||||||
|
@ -298,6 +331,8 @@ PositionManager::onPositionReceived(const QString& peerId,
|
||||||
};
|
};
|
||||||
auto endSharing = newPosition["type"] == "Stop";
|
auto endSharing = newPosition["type"] == "Stop";
|
||||||
|
|
||||||
|
auto key = QPair<QString, QString> {accountId, peerId};
|
||||||
|
|
||||||
if (!endSharing) {
|
if (!endSharing) {
|
||||||
// open map on position reception
|
// open map on position reception
|
||||||
if (!isMapActive_ && mapAutoOpening_ && isPeerIdInConv
|
if (!isMapActive_ && mapAutoOpening_ && isPeerIdInConv
|
||||||
|
@ -305,19 +340,18 @@ PositionManager::onPositionReceived(const QString& peerId,
|
||||||
set_isMapActive(true);
|
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()) {
|
if (iter == currentConvSharingUris_.end()) {
|
||||||
// New share
|
// New share
|
||||||
if (!endSharing) {
|
if (!endSharing) {
|
||||||
sharingUris_.insert(peerId);
|
|
||||||
Q_EMIT sharingUrisChanged();
|
|
||||||
|
|
||||||
// list to save more information on position + watchdog
|
// list to save more information on position + watchdog
|
||||||
auto it = objectListSharingUris_.find(peerId);
|
auto it = objectListSharingUris_.find(key);
|
||||||
if (it == objectListSharingUris_.end()) {
|
auto isNewSharing = it == objectListSharingUris_.end();
|
||||||
|
if (isNewSharing) {
|
||||||
auto obj = new PositionObject(newPosition["lat"], newPosition["long"], this);
|
auto obj = new PositionObject(newPosition["lat"], newPosition["long"], this);
|
||||||
|
|
||||||
objectListSharingUris_.insert(peerId, obj);
|
objectListSharingUris_.insert(key, obj);
|
||||||
|
set_sharingUrisCount(objectListSharingUris_.size());
|
||||||
connect(obj,
|
connect(obj,
|
||||||
&PositionObject::timeout,
|
&PositionObject::timeout,
|
||||||
this,
|
this,
|
||||||
|
@ -326,40 +360,42 @@ PositionManager::onPositionReceived(const QString& peerId,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPeerIdInConv) {
|
if (isPeerIdInConv) {
|
||||||
currentConvSharingUris_.insert(peerId);
|
currentConvSharingUris_.insert(key);
|
||||||
Q_EMIT positionShareAdded(getShareInfo(false));
|
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
|
// stop sharing position
|
||||||
} else {
|
} else {
|
||||||
sharingUris_.remove(peerId);
|
auto it = objectListSharingUris_.find(key);
|
||||||
Q_EMIT sharingUrisChanged();
|
|
||||||
auto it = objectListSharingUris_.find(peerId);
|
|
||||||
if (it != objectListSharingUris_.end()) {
|
if (it != objectListSharingUris_.end()) {
|
||||||
it.value()->deleteLater();
|
it.value()->deleteLater();
|
||||||
objectListSharingUris_.erase(it);
|
objectListSharingUris_.erase(it);
|
||||||
|
set_sharingUrisCount(objectListSharingUris_.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Update/remove existing
|
// Update/remove existing
|
||||||
if (endSharing) {
|
if (endSharing) {
|
||||||
// Remove
|
// Remove
|
||||||
|
auto it = objectListSharingUris_.find(key);
|
||||||
sharingUris_.remove(peerId);
|
|
||||||
Q_EMIT sharingUrisChanged();
|
|
||||||
auto it = objectListSharingUris_.find(peerId);
|
|
||||||
if (it != objectListSharingUris_.end()) {
|
if (it != objectListSharingUris_.end()) {
|
||||||
it.value()->deleteLater();
|
it.value()->deleteLater();
|
||||||
objectListSharingUris_.erase(it);
|
objectListSharingUris_.erase(it);
|
||||||
|
set_sharingUrisCount(objectListSharingUris_.size());
|
||||||
}
|
}
|
||||||
if (isPeerIdInConv) {
|
if (isPeerIdInConv) {
|
||||||
currentConvSharingUris_.remove(peerId);
|
currentConvSharingUris_.remove(key);
|
||||||
Q_EMIT positionShareRemoved(peerId);
|
Q_EMIT positionShareRemoved(peerId);
|
||||||
// close the map if you're not sharing and you don't receive position anymore
|
// close the map if you're not sharing and you don't receive position anymore
|
||||||
if (!positionShareConvIds_.length()
|
if (!positionShareConvIds_.length()
|
||||||
&& ((sharingUris_.size() == 1
|
&& ((sharingUrisCount_ == 1
|
||||||
&& sharingUris_.contains(
|
&& objectListSharingUris_.contains(QPair<QString, QString> {
|
||||||
lrcInstance_->getCurrentAccountInfo().profileInfo.uri))
|
"", lrcInstance_->getCurrentAccountInfo().profileInfo.uri}))
|
||||||
|| sharingUris_.size() == 0)) {
|
|| sharingUrisCount_ == 0)) {
|
||||||
set_isMapActive(false);
|
set_isMapActive(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -369,7 +405,7 @@ PositionManager::onPositionReceived(const QString& peerId,
|
||||||
Q_EMIT positionShareUpdated(getShareInfo(true));
|
Q_EMIT positionShareUpdated(getShareInfo(true));
|
||||||
// reset watchdog
|
// reset watchdog
|
||||||
|
|
||||||
auto it = objectListSharingUris_.find(peerId);
|
auto it = objectListSharingUris_.find(key);
|
||||||
if (it != objectListSharingUris_.end()) {
|
if (it != objectListSharingUris_.end()) {
|
||||||
it.value()->resetWatchdog();
|
it.value()->resetWatchdog();
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "qmladapterbase.h"
|
#include "qmladapterbase.h"
|
||||||
#include "positioning.h"
|
#include "positioning.h"
|
||||||
#include "positionobject.h"
|
#include "positionobject.h"
|
||||||
|
#include "systemtray.h"
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
@ -31,11 +32,13 @@ class PositionManager : public QmlAdapterBase
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
QML_RO_PROPERTY(bool, isMapActive)
|
QML_RO_PROPERTY(bool, isMapActive)
|
||||||
QML_RO_PROPERTY(int, timeSharingRemaining)
|
QML_RO_PROPERTY(int, timeSharingRemaining)
|
||||||
QML_PROPERTY(QList<QString>, positionShareConvIds)
|
QML_PROPERTY(int, positionShareConvIdsCount)
|
||||||
QML_PROPERTY(QSet<QString>, sharingUris)
|
QML_PROPERTY(int, sharingUrisCount)
|
||||||
QML_PROPERTY(bool, mapAutoOpening)
|
QML_PROPERTY(bool, mapAutoOpening)
|
||||||
public:
|
public:
|
||||||
explicit PositionManager(LRCInstance* instance, QObject* parent = nullptr);
|
explicit PositionManager(SystemTray* systemTray,
|
||||||
|
LRCInstance* instance,
|
||||||
|
QObject* parent = nullptr);
|
||||||
~PositionManager() = default;
|
~PositionManager() = default;
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
|
@ -47,13 +50,13 @@ Q_SIGNALS:
|
||||||
protected:
|
protected:
|
||||||
void safeInit() override;
|
void safeInit() override;
|
||||||
|
|
||||||
QString getAvatar(const QString& peerId);
|
QString getAvatar(const QString& accountId, const QString& peerId);
|
||||||
QVariantMap parseJsonPosition(const QString& body, const QString& peerId);
|
QVariantMap parseJsonPosition(const QString& body, const QString& peerId);
|
||||||
void positionWatchDog();
|
void positionWatchDog();
|
||||||
void startPositionTimers(int timeSharing);
|
void startPositionTimers(int timeSharing);
|
||||||
void stopPositionTimers();
|
void stopPositionTimers();
|
||||||
|
|
||||||
Q_INVOKABLE void connectConversationModel();
|
Q_INVOKABLE void connectAccountModel();
|
||||||
Q_INVOKABLE void setMapActive(bool state);
|
Q_INVOKABLE void setMapActive(bool state);
|
||||||
Q_INVOKABLE void sharePosition(int maximumTime);
|
Q_INVOKABLE void sharePosition(int maximumTime);
|
||||||
Q_INVOKABLE void stopSharingPosition(const QString convId = "");
|
Q_INVOKABLE void stopSharingPosition(const QString convId = "");
|
||||||
|
@ -69,17 +72,21 @@ protected:
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void onPositionErrorReceived(const QString error);
|
void onPositionErrorReceived(const QString error);
|
||||||
void onPositionReceived(const QString& peerId,
|
void onPositionReceived(const QString& accountId,
|
||||||
|
const QString& peerId,
|
||||||
const QString& body,
|
const QString& body,
|
||||||
const uint64_t& timestamp,
|
const uint64_t& timestamp,
|
||||||
const QString& daemonId);
|
const QString& daemonId);
|
||||||
void sendPosition(const QString& peerId, const QString& body);
|
void sendPosition(const QString& body);
|
||||||
void onWatchdogTimeout();
|
void onWatchdogTimeout();
|
||||||
|
void showNotification(const QString& accountId, const QString& convId, const QString& from);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
SystemTray* systemTray_;
|
||||||
std::unique_ptr<Positioning> localPositioning_;
|
std::unique_ptr<Positioning> localPositioning_;
|
||||||
QTimer* timerTimeLeftSharing_ = nullptr;
|
QTimer* timerTimeLeftSharing_ = nullptr;
|
||||||
QTimer* timerStopSharing_ = nullptr;
|
QTimer* timerStopSharing_ = nullptr;
|
||||||
QSet<QString> currentConvSharingUris_;
|
QSet<QPair<QString, QString>> currentConvSharingUris_;
|
||||||
QMap<QString, PositionObject*> objectListSharingUris_;
|
QMap<QPair<QString, QString>, PositionObject*> objectListSharingUris_;
|
||||||
|
QList<QPair<QString, QString>> positionShareConvIds_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -111,7 +111,7 @@ registerTypes(QQmlEngine* engine,
|
||||||
// setup the adapters (their lifetimes are that of MainApplication)
|
// setup the adapters (their lifetimes are that of MainApplication)
|
||||||
auto callAdapter = new CallAdapter(systemTray, lrcInstance, parent);
|
auto callAdapter = new CallAdapter(systemTray, lrcInstance, parent);
|
||||||
auto messagesAdapter = new MessagesAdapter(settingsManager, previewEngine, 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 conversationsAdapter = new ConversationsAdapter(systemTray, lrcInstance, parent);
|
||||||
auto avAdapter = new AvAdapter(lrcInstance, parent);
|
auto avAdapter = new AvAdapter(lrcInstance, parent);
|
||||||
auto contactAdapter = new ContactAdapter(lrcInstance, parent);
|
auto contactAdapter = new ContactAdapter(lrcInstance, parent);
|
||||||
|
|
|
@ -61,7 +61,7 @@ Rectangle {
|
||||||
property bool isLoaded: false
|
property bool isLoaded: false
|
||||||
property var positionList: PositionManager.positionList;
|
property var positionList: PositionManager.positionList;
|
||||||
property var avatarPositionList: PositionManager.avatarPositionList;
|
property var avatarPositionList: PositionManager.avatarPositionList;
|
||||||
property bool isSharing: (PositionManager.positionShareConvIds.length !== 0 )
|
property bool isSharing: (PositionManager.positionShareConvIdsCount !== 0 )
|
||||||
|
|
||||||
function loadScripts () {
|
function loadScripts () {
|
||||||
var scriptMapJs = {
|
var scriptMapJs = {
|
||||||
|
@ -276,7 +276,7 @@ Rectangle {
|
||||||
property bool isError: positioningError.length
|
property bool isError: positioningError.length
|
||||||
onClicked: {
|
onClicked: {
|
||||||
if (!isError) {
|
if (!isError) {
|
||||||
if (PositionManager.positionShareConvIds.length >= 2) {
|
if (PositionManager.positionShareConvIdsCount >= 2) {
|
||||||
stopSharingPositionPopup.open()
|
stopSharingPositionPopup.open()
|
||||||
} else {
|
} else {
|
||||||
PositionManager.stopSharingPosition();
|
PositionManager.stopSharingPosition();
|
||||||
|
|
|
@ -177,6 +177,20 @@ public Q_SLOTS:
|
||||||
void slotAccountProfileReceived(const QString& accountId,
|
void slotAccountProfileReceived(const QString& accountId,
|
||||||
const QString& displayName,
|
const QString& displayName,
|
||||||
const QString& userPhoto);
|
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,
|
AccountModel::AccountModel(Lrc& lrc,
|
||||||
|
@ -415,6 +429,10 @@ AccountModelPimpl::AccountModelPimpl(AccountModel& linked,
|
||||||
&CallbacksHandler::accountProfileReceived,
|
&CallbacksHandler::accountProfileReceived,
|
||||||
this,
|
this,
|
||||||
&AccountModelPimpl::slotAccountProfileReceived);
|
&AccountModelPimpl::slotAccountProfileReceived);
|
||||||
|
connect(&callbacksHandler,
|
||||||
|
&CallbacksHandler::newPosition,
|
||||||
|
this,
|
||||||
|
&AccountModelPimpl::slotNewPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
AccountModelPimpl::~AccountModelPimpl() {}
|
AccountModelPimpl::~AccountModelPimpl() {}
|
||||||
|
@ -698,6 +716,16 @@ AccountModelPimpl::slotAccountProfileReceived(const QString& accountId,
|
||||||
Q_EMIT linked.profileUpdated(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
|
void
|
||||||
AccountModelPimpl::addToAccounts(const QString& accountId, std::shared_ptr<Database> db)
|
AccountModelPimpl::addToAccounts(const QString& accountId, std::shared_ptr<Database> db)
|
||||||
{
|
{
|
||||||
|
|
|
@ -326,6 +326,15 @@ Q_SIGNALS:
|
||||||
*/
|
*/
|
||||||
void migrationEnded(const QString& accountId, bool ok);
|
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:
|
private:
|
||||||
std::unique_ptr<AccountModelPimpl> pimpl_;
|
std::unique_ptr<AccountModelPimpl> pimpl_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -440,14 +440,6 @@ public:
|
||||||
|
|
||||||
Q_SIGNALS:
|
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
|
* Emitted when a conversation receives a new interaction
|
||||||
* @param uid of conversation
|
* @param uid of conversation
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
#include "dbus/presencemanager.h"
|
#include "dbus/presencemanager.h"
|
||||||
#include "dbus/videomanager.h"
|
#include "dbus/videomanager.h"
|
||||||
|
|
||||||
|
#include "typedefs.h"
|
||||||
|
|
||||||
// libjami
|
// libjami
|
||||||
#include <datatransfer_interface.h>
|
#include <datatransfer_interface.h>
|
||||||
|
|
||||||
|
@ -386,6 +388,12 @@ CallbacksHandler::slotNewAccountMessage(const QString& accountId,
|
||||||
const MapStringString& payloads)
|
const MapStringString& payloads)
|
||||||
{
|
{
|
||||||
auto peerId2 = QString(peerId).replace("@ring.dht", "");
|
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);
|
Q_EMIT newAccountMessage(accountId, peerId2, msgId, payloads);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -388,6 +388,14 @@ Q_SIGNALS:
|
||||||
const QString& conversationId,
|
const QString& conversationId,
|
||||||
const MapStringString& preferences);
|
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:
|
private Q_SLOTS:
|
||||||
/**
|
/**
|
||||||
* Emit newAccountMessage
|
* Emit newAccountMessage
|
||||||
|
|
|
@ -3572,8 +3572,6 @@ ConversationModelPimpl::slotNewAccountMessage(const QString& accountId,
|
||||||
for (const auto& payload : payloads.keys()) {
|
for (const auto& payload : payloads.keys()) {
|
||||||
if (payload.contains(TEXT_PLAIN)) {
|
if (payload.contains(TEXT_PLAIN)) {
|
||||||
addIncomingMessage(peerId, payloads.value(payload), 0, msgId);
|
addIncomingMessage(peerId, payloads.value(payload), 0, msgId);
|
||||||
} else if (payload.contains(APPLICATION_GEO)) {
|
|
||||||
Q_EMIT linked.newPosition(peerId, payloads.value(payload), 0, msgId);
|
|
||||||
} else {
|
} else {
|
||||||
qWarning() << payload;
|
qWarning() << payload;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue