1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2025-09-03 13:43:34 +02:00

swarm: first implementation to follow api changes

- use QString for interactionId

- swarm conversations: use loadConversationMessages and
subscribe to newMessagesAvailable signal

- avoid displaying "merge" and empty "data transfer" messages

- link composing status

Change-Id: Ic524bb786b2ff0471f03b1bb02d41d6da38e716a
This commit is contained in:
Sébastien Blin 2021-05-12 16:55:28 -04:00 committed by Andreas Traczyk
parent 5a0ee1c2f4
commit 3d71bfa8ae
18 changed files with 121 additions and 116 deletions

View file

@ -142,7 +142,7 @@ AccountAdapter::createJamiAccount(QString registeredName,
connectFailure(); connectFailure();
QtConcurrent::run([this, settings] { QtConcurrent::run([this, settings] {
lrcInstance_->accountModel().createNewAccount(lrc::api::profile::Type::RING, lrcInstance_->accountModel().createNewAccount(lrc::api::profile::Type::JAMI,
settings["alias"].toString(), settings["alias"].toString(),
settings["archivePath"].toString(), settings["archivePath"].toString(),
settings["password"].toString(), settings["password"].toString(),

View file

@ -90,8 +90,8 @@ ConversationListModelBase::dataForItem(item_t item, int role) const
} }
case Role::LastInteractionDate: { case Role::LastInteractionDate: {
if (!item.interactions.empty()) { if (!item.interactions.empty()) {
auto& date = item.interactions.at(item.lastMessageUid).timestamp; return QVariant(
return QVariant(Utils::formatTimeString(date)); Utils::formatTimeString(item.interactions.at(item.lastMessageUid).timestamp));
} }
break; break;
} }

View file

@ -33,7 +33,7 @@ ConversationsAdapter::ConversationsAdapter(SystemTray* systemTray,
LRCInstance* instance, LRCInstance* instance,
QObject* parent) QObject* parent)
: QmlAdapterBase(instance, parent) : QmlAdapterBase(instance, parent)
, currentTypeFilter_(profile::Type::RING) , currentTypeFilter_(profile::Type::JAMI)
, systemTray_(systemTray) , systemTray_(systemTray)
, convSrcModel_(new ConversationListModel(lrcInstance_)) , convSrcModel_(new ConversationListModel(lrcInstance_))
, convModel_(new ConversationListProxyModel(convSrcModel_.get())) , convModel_(new ConversationListProxyModel(convSrcModel_.get()))
@ -139,17 +139,17 @@ ConversationsAdapter::safeInit()
Q_EMIT modelChanged(QVariant::fromValue(conversationSmartListModel_)); Q_EMIT modelChanged(QVariant::fromValue(conversationSmartListModel_));
connect(&lrcInstance_->behaviorController(), // connect(&lrcInstance_->behaviorController(),
&BehaviorController::newUnreadInteraction, // &BehaviorController::newUnreadInteraction,
this, // this,
&ConversationsAdapter::onNewUnreadInteraction, // &ConversationsAdapter::onNewUnreadInteraction,
Qt::UniqueConnection); // Qt::UniqueConnection);
connect(&lrcInstance_->behaviorController(), // connect(&lrcInstance_->behaviorController(),
&BehaviorController::newReadInteraction, // &BehaviorController::newReadInteraction,
this, // this,
&ConversationsAdapter::onNewReadInteraction, // &ConversationsAdapter::onNewReadInteraction,
Qt::UniqueConnection); // Qt::UniqueConnection);
connect(&lrcInstance_->behaviorController(), connect(&lrcInstance_->behaviorController(),
&BehaviorController::newTrustRequest, &BehaviorController::newTrustRequest,
@ -194,7 +194,7 @@ ConversationsAdapter::onCurrentAccountIdChanged()
void void
ConversationsAdapter::onNewUnreadInteraction(const QString& accountId, ConversationsAdapter::onNewUnreadInteraction(const QString& accountId,
const QString& convUid, const QString& convUid,
uint64_t interactionId, const QString& interactionId,
const interaction::Info& interaction) const interaction::Info& interaction)
{ {
if (!interaction.authorUri.isEmpty() if (!interaction.authorUri.isEmpty()
@ -357,15 +357,15 @@ ConversationsAdapter::updateConversationFilterData()
int totalUnreadMessages {0}; int totalUnreadMessages {0};
if (accountInfo.profileInfo.type != profile::Type::SIP) { if (accountInfo.profileInfo.type != profile::Type::SIP) {
auto& convModel = accountInfo.conversationModel; auto& convModel = accountInfo.conversationModel;
auto conversations = convModel->getFilteredConversations(profile::Type::RING, false); auto conversations = convModel->getFilteredConversations(FilterType::JAMI, false);
conversations.for_each([&totalUnreadMessages](const conversation::Info& conversation) { conversations.for_each([&totalUnreadMessages](const conversation::Info& conversation) {
totalUnreadMessages += conversation.unreadMessages; totalUnreadMessages += conversation.unreadMessages;
}); });
} }
set_totalUnreadMessageCount(totalUnreadMessages); set_totalUnreadMessageCount(totalUnreadMessages);
set_pendingRequestCount(accountInfo.contactModel->pendingRequestCount()); set_pendingRequestCount(accountInfo.conversationModel->pendingRequestCount());
if (pendingRequestCount_ == 0 && currentTypeFilter_ == profile::Type::PENDING) { if (pendingRequestCount_ == 0 && currentTypeFilter_ == profile::Type::PENDING) {
set_currentTypeFilter(profile::Type::RING); set_currentTypeFilter(profile::Type::JAMI);
} }
} }

View file

@ -66,7 +66,7 @@ private Q_SLOTS:
// cross-account slots // cross-account slots
void onNewUnreadInteraction(const QString& accountId, void onNewUnreadInteraction(const QString& accountId,
const QString& convUid, const QString& convUid,
uint64_t interactionId, const QString& interactionId,
const interaction::Info& interaction); const interaction::Info& interaction);
void onNewReadInteraction(const QString& accountId, void onNewReadInteraction(const QString& accountId,
const QString& convUid, const QString& convUid,

View file

@ -76,12 +76,6 @@ LRCInstance::behaviorController()
return lrc_->getBehaviorController(); return lrc_->getBehaviorController();
} }
DataTransferModel&
LRCInstance::dataTransferModel()
{
return lrc_->getDataTransferModel();
}
AVModel& AVModel&
LRCInstance::avModel() LRCInstance::avModel()
{ {

View file

@ -80,7 +80,6 @@ public:
AVModel& avModel(); AVModel& avModel();
PluginModel& pluginModel(); PluginModel& pluginModel();
BehaviorController& behaviorController(); BehaviorController& behaviorController();
DataTransferModel& dataTransferModel();
void subscribeToDebugReceived(); void subscribeToDebugReceived();
bool isConnected(); bool isConnected();

View file

@ -259,7 +259,7 @@ MainApplication::init()
} }
auto downloadPath = settingsManager_->getValue(Settings::Key::DownloadPath); auto downloadPath = settingsManager_->getValue(Settings::Key::DownloadPath);
lrcInstance_->dataTransferModel().downloadDirectory = downloadPath.toString() + "/"; lrcInstance_->accountModel().downloadDirectory = downloadPath.toString() + "/";
initQmlLayer(); initQmlLayer();
initSystray(); initSystray();

View file

@ -208,7 +208,7 @@ Label {
height: visible ? preferredSize : 0 height: visible ? preferredSize : 0
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
visible: LRCInstance.currentAccountType === Profile.Type.RING visible: LRCInstance.currentAccountType === Profile.Type.JAMI
toolTipText: JamiStrings.displayQRCode toolTipText: JamiStrings.displayQRCode
source: "qrc:/images/icons/share-24px.svg" source: "qrc:/images/icons/share-24px.svg"

View file

@ -90,7 +90,7 @@ Rectangle {
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
visible: LRCInstance.currentAccountType === Profile.Type.RING visible: LRCInstance.currentAccountType === Profile.Type.JAMI
text: JamiStrings.shareInvite text: JamiStrings.shareInvite
color: JamiTheme.faddedFontColor color: JamiTheme.faddedFontColor
@ -105,7 +105,7 @@ Rectangle {
color: JamiTheme.secondaryBackgroundColor color: JamiTheme.secondaryBackgroundColor
visible: LRCInstance.currentAccountType === Profile.Type.RING visible: LRCInstance.currentAccountType === Profile.Type.JAMI
ColumnLayout { ColumnLayout {
id: jamiRegisteredNameRectColumnLayout id: jamiRegisteredNameRectColumnLayout

View file

@ -50,7 +50,7 @@ ModalPopup {
fillMode: Image.PreserveAspectFit fillMode: Image.PreserveAspectFit
source: { source: {
if (LRCInstance.currentAccountId && if (LRCInstance.currentAccountId &&
LRCInstance.currentAccountType === Profile.Type.RING) LRCInstance.currentAccountType === Profile.Type.JAMI)
return "image://qrImage/account_" + LRCInstance.currentAccountId return "image://qrImage/account_" + LRCInstance.currentAccountId
return "" return ""
} }

View file

@ -129,7 +129,7 @@ MessagesAdapter::connectConversationModel()
= QObject::connect(currentConversationModel, = QObject::connect(currentConversationModel,
&lrc::api::ConversationModel::newInteraction, &lrc::api::ConversationModel::newInteraction,
[this](const QString& convUid, [this](const QString& convUid,
uint64_t interactionId, const QString& interactionId,
const lrc::api::interaction::Info& interaction) { const lrc::api::interaction::Info& interaction) {
auto accountId = lrcInstance_->getCurrentAccountId(); auto accountId = lrcInstance_->getCurrentAccountId();
newInteraction(accountId, convUid, interactionId, interaction); newInteraction(accountId, convUid, interactionId, interaction);
@ -139,7 +139,7 @@ MessagesAdapter::connectConversationModel()
currentConversationModel, currentConversationModel,
&lrc::api::ConversationModel::interactionStatusUpdated, &lrc::api::ConversationModel::interactionStatusUpdated,
[this](const QString& convUid, [this](const QString& convUid,
uint64_t interactionId, const QString& interactionId,
const lrc::api::interaction::Info& interaction) { const lrc::api::interaction::Info& interaction) {
auto currentConversationModel = lrcInstance_->getCurrentConversationModel(); auto currentConversationModel = lrcInstance_->getCurrentConversationModel();
currentConversationModel->clearUnreadInteractions(convUid); currentConversationModel->clearUnreadInteractions(convUid);
@ -149,10 +149,27 @@ MessagesAdapter::connectConversationModel()
interactionRemovedConnection_ interactionRemovedConnection_
= QObject::connect(currentConversationModel, = QObject::connect(currentConversationModel,
&lrc::api::ConversationModel::interactionRemoved, &lrc::api::ConversationModel::interactionRemoved,
[this](const QString& convUid, uint64_t interactionId) { [this](const QString& convUid, const QString& interactionId) {
Q_UNUSED(convUid); Q_UNUSED(convUid);
removeInteraction(interactionId); removeInteraction(interactionId);
}); });
newMessagesAvailableConnection_
= QObject::connect(currentConversationModel,
&lrc::api::ConversationModel::newMessagesAvailable,
[this](const QString& accountId, const QString& conversationId) {
auto* convModel = lrcInstance_->accountModel()
.getAccountInfo(accountId)
.conversationModel.get();
auto optConv = convModel->getConversationForUid(conversationId);
if (!optConv)
return;
printHistory(*convModel, optConv->get().interactions);
Utils::oneShotConnect(qmlObj_,
SIGNAL(messagesLoaded()),
this,
SLOT(slotMessagesLoaded()));
});
} }
void void
@ -173,7 +190,7 @@ MessagesAdapter::updateConversationForAddedContact()
clear(); clear();
setConversationProfileData(convInfo); setConversationProfileData(convInfo);
printHistory(*convModel, convInfo.interactions); // printHistory(*convModel, convInfo.interactions);
} }
void void
@ -205,14 +222,18 @@ void
MessagesAdapter::slotMessagesCleared() MessagesAdapter::slotMessagesCleared()
{ {
auto* convModel = lrcInstance_->getCurrentConversationModel(); auto* convModel = lrcInstance_->getCurrentConversationModel();
const auto& convInfo = lrcInstance_->getConversationFromConvUid(
lrcInstance_->get_selectedConvUid());
printHistory(*convModel, convInfo.interactions); auto convOpt = convModel->getConversationForUid(lrcInstance_->get_selectedConvUid());
if (!convOpt)
Utils::oneShotConnect(qmlObj_, SIGNAL(messagesLoaded()), this, SLOT(slotMessagesLoaded())); return;
if (convOpt->get().mode != lrc::api::conversation::Mode::NON_SWARM
setConversationProfileData(convInfo); && !convOpt->get().allMessagesLoaded) {
convModel->loadConversationMessages(convOpt->get().uid, 0);
} else {
printHistory(*convModel, convOpt->get().interactions);
Utils::oneShotConnect(qmlObj_, SIGNAL(messagesLoaded()), this, SLOT(slotMessagesLoaded()));
}
setConversationProfileData(convOpt->get());
} }
void void
@ -303,16 +324,10 @@ MessagesAdapter::sendFile(const QString& message)
} }
void void
MessagesAdapter::retryInteraction(const QString& arg) MessagesAdapter::retryInteraction(const QString& interactionId)
{ {
bool ok; lrcInstance_->getCurrentConversationModel()
uint64_t interactionUid = arg.toULongLong(&ok); ->retryInteraction(lrcInstance_->get_selectedConvUid(), interactionId);
if (ok) {
lrcInstance_->getCurrentConversationModel()
->retryInteraction(lrcInstance_->get_selectedConvUid(), interactionUid);
} else {
qDebug() << "retryInteraction - invalid arg" << arg;
}
} }
void void
@ -330,16 +345,10 @@ MessagesAdapter::setNewMessagesContent(const QString& path)
} }
void void
MessagesAdapter::deleteInteraction(const QString& arg) MessagesAdapter::deleteInteraction(const QString& interactionId)
{ {
bool ok; lrcInstance_->getCurrentConversationModel()
uint64_t interactionUid = arg.toULongLong(&ok); ->clearInteractionFromConversation(lrcInstance_->get_selectedConvUid(), interactionId);
if (ok) {
lrcInstance_->getCurrentConversationModel()
->clearInteractionFromConversation(lrcInstance_->get_selectedConvUid(), interactionUid);
} else {
qDebug() << "DeleteInteraction - invalid arg" << arg;
}
} }
void void
@ -360,27 +369,17 @@ MessagesAdapter::openUrl(const QString& url)
} }
void void
MessagesAdapter::acceptFile(const QString& arg) MessagesAdapter::acceptFile(const QString& interactionId)
{ {
try { auto convUid = lrcInstance_->get_selectedConvUid();
auto interactionUid = arg.toLongLong(); lrcInstance_->getCurrentConversationModel()->acceptTransfer(convUid, interactionId);
auto convUid = lrcInstance_->get_selectedConvUid();
lrcInstance_->getCurrentConversationModel()->acceptTransfer(convUid, interactionUid);
} catch (...) {
qDebug() << "JS bridging - exception during acceptFile: " << arg;
}
} }
void void
MessagesAdapter::refuseFile(const QString& arg) MessagesAdapter::refuseFile(const QString& interactionId)
{ {
try { const auto convUid = lrcInstance_->get_selectedConvUid();
auto interactionUid = arg.toLongLong(); lrcInstance_->getCurrentConversationModel()->cancelTransfer(convUid, interactionId);
const auto convUid = lrcInstance_->get_selectedConvUid();
lrcInstance_->getCurrentConversationModel()->cancelTransfer(convUid, interactionUid);
} catch (...) {
qDebug() << "JS bridging - exception during refuseFile:" << arg;
}
} }
void void
@ -475,7 +474,7 @@ MessagesAdapter::setConversationProfileData(const lrc::api::conversation::Info&
void void
MessagesAdapter::newInteraction(const QString& accountId, MessagesAdapter::newInteraction(const QString& accountId,
const QString& convUid, const QString& convUid,
uint64_t interactionId, const QString& interactionId,
const interaction::Info& interaction) const interaction::Info& interaction)
{ {
Q_UNUSED(interactionId); Q_UNUSED(interactionId);
@ -550,7 +549,7 @@ MessagesAdapter::setDisplayLinks()
void void
MessagesAdapter::printHistory(lrc::api::ConversationModel& conversationModel, MessagesAdapter::printHistory(lrc::api::ConversationModel& conversationModel,
const std::map<uint64_t, lrc::api::interaction::Info> interactions) MessagesList interactions)
{ {
auto interactionsStr = interactionsToJsonArrayObject(conversationModel, interactions).toUtf8(); auto interactionsStr = interactionsToJsonArrayObject(conversationModel, interactions).toUtf8();
QString s = QString::fromLatin1("printHistory(%1);").arg(interactionsStr.constData()); QString s = QString::fromLatin1("printHistory(%1);").arg(interactionsStr.constData());
@ -573,7 +572,7 @@ MessagesAdapter::setSenderImage(const QString& sender, const QString& senderImag
void void
MessagesAdapter::printNewInteraction(lrc::api::ConversationModel& conversationModel, MessagesAdapter::printNewInteraction(lrc::api::ConversationModel& conversationModel,
uint64_t msgId, const QString& msgId,
const lrc::api::interaction::Info& interaction) const lrc::api::interaction::Info& interaction)
{ {
auto interactionObject auto interactionObject
@ -587,7 +586,7 @@ MessagesAdapter::printNewInteraction(lrc::api::ConversationModel& conversationMo
void void
MessagesAdapter::updateInteraction(lrc::api::ConversationModel& conversationModel, MessagesAdapter::updateInteraction(lrc::api::ConversationModel& conversationModel,
uint64_t msgId, const QString& msgId,
const lrc::api::interaction::Info& interaction) const lrc::api::interaction::Info& interaction)
{ {
auto interactionObject auto interactionObject
@ -629,9 +628,9 @@ MessagesAdapter::setMessagesFileContent(const QString& path)
} }
void void
MessagesAdapter::removeInteraction(uint64_t interactionId) MessagesAdapter::removeInteraction(const QString& interactionId)
{ {
QString s = QString::fromLatin1("removeInteraction(%1);").arg(QString::number(interactionId)); QString s = QString::fromLatin1("removeInteraction(%1);").arg(interactionId);
QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s)); QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
} }
@ -644,7 +643,15 @@ MessagesAdapter::setSendMessageContent(const QString& content)
void void
MessagesAdapter::contactIsComposing(const QString& uid, const QString& contactUri, bool isComposing) MessagesAdapter::contactIsComposing(const QString& uid, const QString& contactUri, bool isComposing)
{ {
if (lrcInstance_->get_selectedConvUid() == uid) { auto* convModel = lrcInstance_->getCurrentConversationModel();
auto convInfo = convModel->getConversationForUid(lrcInstance_->get_selectedConvUid());
if (!convInfo)
return;
auto& conv = convInfo->get();
bool showIsComposing = conv.mode != lrc::api::conversation::Mode::NON_SWARM
? uid == conv.uid
: uid.isEmpty() && conv.participants.first() == contactUri;
if (showIsComposing) {
QString s QString s
= QString::fromLatin1("showTypingIndicator(`%1`, %2);").arg(contactUri).arg(isComposing); = QString::fromLatin1("showTypingIndicator(`%1`, %2);").arg(contactUri).arg(isComposing);
QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s)); QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));

View file

@ -59,8 +59,8 @@ protected:
Q_INVOKABLE void sendMessage(const QString& message); Q_INVOKABLE void sendMessage(const QString& message);
Q_INVOKABLE void sendImage(const QString& message); Q_INVOKABLE void sendImage(const QString& message);
Q_INVOKABLE void sendFile(const QString& message); Q_INVOKABLE void sendFile(const QString& message);
Q_INVOKABLE void retryInteraction(const QString& arg); Q_INVOKABLE void retryInteraction(const QString& interactionId);
Q_INVOKABLE void deleteInteraction(const QString& arg); Q_INVOKABLE void deleteInteraction(const QString& interactionId);
Q_INVOKABLE void openUrl(const QString& url); Q_INVOKABLE void openUrl(const QString& url);
Q_INVOKABLE void openFile(const QString& arg); Q_INVOKABLE void openFile(const QString& arg);
Q_INVOKABLE void acceptFile(const QString& arg); Q_INVOKABLE void acceptFile(const QString& arg);
@ -76,18 +76,17 @@ protected:
void requestSendMessageContent(); void requestSendMessageContent();
void setInvitation(bool show, const QString& contactUri = {}, const QString& contactId = {}); void setInvitation(bool show, const QString& contactUri = {}, const QString& contactId = {});
void clear(); void clear();
void printHistory(lrc::api::ConversationModel& conversationModel, void printHistory(lrc::api::ConversationModel& conversationModel, MessagesList interactions);
const std::map<uint64_t, lrc::api::interaction::Info> interactions);
void setSenderImage(const QString& sender, const QString& senderImage); void setSenderImage(const QString& sender, const QString& senderImage);
void printNewInteraction(lrc::api::ConversationModel& conversationModel, void printNewInteraction(lrc::api::ConversationModel& conversationModel,
uint64_t msgId, const QString& msgId,
const lrc::api::interaction::Info& interaction); const lrc::api::interaction::Info& interaction);
void updateInteraction(lrc::api::ConversationModel& conversationModel, void updateInteraction(lrc::api::ConversationModel& conversationModel,
uint64_t msgId, const QString& msgId,
const lrc::api::interaction::Info& interaction); const lrc::api::interaction::Info& interaction);
void setMessagesImageContent(const QString& path, bool isBased64 = false); void setMessagesImageContent(const QString& path, bool isBased64 = false);
void setMessagesFileContent(const QString& path); void setMessagesFileContent(const QString& path);
void removeInteraction(uint64_t interactionId); void removeInteraction(const QString& interactionId);
void setSendMessageContent(const QString& content); void setSendMessageContent(const QString& content);
void contactIsComposing(const QString& convUid, const QString& contactUri, bool isComposing); void contactIsComposing(const QString& convUid, const QString& contactUri, bool isComposing);
@ -107,7 +106,7 @@ private:
void setConversationProfileData(const lrc::api::conversation::Info& convInfo); void setConversationProfileData(const lrc::api::conversation::Info& convInfo);
void newInteraction(const QString& accountId, void newInteraction(const QString& accountId,
const QString& convUid, const QString& convUid,
uint64_t interactionId, const QString& interactionId,
const interaction::Info& interaction); const interaction::Info& interaction);
QString LastConvUid_; QString LastConvUid_;
@ -119,6 +118,7 @@ private:
QMetaObject::Connection newInteractionConnection_; QMetaObject::Connection newInteractionConnection_;
QMetaObject::Connection interactionStatusUpdatedConnection_; QMetaObject::Connection interactionStatusUpdatedConnection_;
QMetaObject::Connection interactionRemovedConnection_; QMetaObject::Connection interactionRemovedConnection_;
QMetaObject::Connection newMessagesAvailableConnection_;
AppSettingsManager* settingsManager_; AppSettingsManager* settingsManager_;
}; };

View file

@ -38,12 +38,11 @@ SettingsAdapter::getDir_Document()
QString QString
SettingsAdapter::getDir_Download() SettingsAdapter::getDir_Download()
{ {
QString downloadPath = QDir::toNativeSeparators( QString downloadPath = QDir::toNativeSeparators(lrcInstance_->accountModel().downloadDirectory);
lrcInstance_->dataTransferModel().downloadDirectory);
if (downloadPath.isEmpty()) { if (downloadPath.isEmpty()) {
downloadPath = lrc::api::DataTransferModel::createDefaultDirectory(); downloadPath = lrc::api::DataTransferModel::createDefaultDirectory();
setDownloadPath(downloadPath); setDownloadPath(downloadPath);
lrcInstance_->dataTransferModel().downloadDirectory = downloadPath; lrcInstance_->accountModel().downloadDirectory = downloadPath;
} }
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
int pos = downloadPath.lastIndexOf(QChar('\\')); int pos = downloadPath.lastIndexOf(QChar('\\'));
@ -83,7 +82,7 @@ void
SettingsAdapter::setDownloadPath(QString dir) SettingsAdapter::setDownloadPath(QString dir)
{ {
setAppValue(Settings::Key::DownloadPath, dir); setAppValue(Settings::Key::DownloadPath, dir);
lrcInstance_->dataTransferModel().downloadDirectory = dir + "/"; lrcInstance_->accountModel().downloadDirectory = dir + "/";
} }
lrc::api::video::ResRateList lrc::api::video::ResRateList

View file

@ -50,8 +50,8 @@ SmartListModel::rowCount(const QModelIndex& parent) const
lrcInstance_->getCurrentAccountId()); lrcInstance_->getCurrentAccountId());
auto& convModel = accInfo.conversationModel; auto& convModel = accInfo.conversationModel;
if (listModelType_ == Type::TRANSFER) { if (listModelType_ == Type::TRANSFER) {
auto filterType = accInfo.profileInfo.type; // auto filterType = accInfo.profileInfo.type;
return convModel->getFilteredConversations(filterType).size(); // return convModel->getFilteredConversations(filterType).size();
} else if (listModelType_ == Type::CONFERENCE) { } else if (listModelType_ == Type::CONFERENCE) {
auto calls = conferenceables_[ConferenceableItem::CALL]; auto calls = conferenceables_[ConferenceableItem::CALL];
auto contacts = conferenceables_[ConferenceableItem::CONTACT]; auto contacts = conferenceables_[ConferenceableItem::CONTACT];
@ -81,8 +81,9 @@ SmartListModel::data(const QModelIndex& index, int role) const
lrcInstance_->getCurrentAccountId()); lrcInstance_->getCurrentAccountId());
auto& convModel = currentAccountInfo.conversationModel; auto& convModel = currentAccountInfo.conversationModel;
auto filterType = currentAccountInfo.profileInfo.type; auto filterType = currentAccountInfo.profileInfo.type;
auto& item = convModel->getFilteredConversations(filterType).at(index.row()); return {};
return dataForItem(item, role); // auto& item = convModel->getFilteredConversations(filterType).at(index.row());
// return dataForItem(item, role);
} catch (const std::exception& e) { } catch (const std::exception& e) {
qWarning() << e.what(); qWarning() << e.what();
} }

View file

@ -525,7 +525,7 @@ Utils::isContactValid(const QString& contactUid, const lrc::api::ConversationMod
const auto contact = model.owner.contactModel->getContact(contactUid); const auto contact = model.owner.contactModel->getContact(contactUid);
return (contact.profileInfo.type == lrc::api::profile::Type::PENDING return (contact.profileInfo.type == lrc::api::profile::Type::PENDING
|| contact.profileInfo.type == lrc::api::profile::Type::TEMPORARY || contact.profileInfo.type == lrc::api::profile::Type::TEMPORARY
|| contact.profileInfo.type == lrc::api::profile::Type::RING || contact.profileInfo.type == lrc::api::profile::Type::JAMI
|| contact.profileInfo.type == lrc::api::profile::Type::SIP) || contact.profileInfo.type == lrc::api::profile::Type::SIP)
&& !contact.profileInfo.uri.isEmpty(); && !contact.profileInfo.uri.isEmpty();
} catch (const std::out_of_range& e) { } catch (const std::out_of_range& e) {
@ -804,7 +804,7 @@ Utils::accountPhoto(LRCInstance* instance,
QString letterStr = (bestId == bestName || bestName == accountInfo.profileInfo.uri) QString letterStr = (bestId == bestName || bestName == accountInfo.profileInfo.uri)
? QString() ? QString()
: bestName; : bestName;
QString prefix = accountInfo.profileInfo.type == lrc::api::profile::Type::RING ? "ring:" QString prefix = accountInfo.profileInfo.type == lrc::api::profile::Type::JAMI ? "ring:"
: "sip:"; : "sip:";
photo = fallbackAvatar(prefix + accountInfo.profileInfo.uri, letterStr, size); photo = fallbackAvatar(prefix + accountInfo.profileInfo.uri, letterStr, size);
} }

View file

@ -23,16 +23,21 @@
QJsonObject QJsonObject
buildInteractionJson(lrc::api::ConversationModel& conversationModel, buildInteractionJson(lrc::api::ConversationModel& conversationModel,
const uint64_t msgId, const QString msgId,
const lrc::api::interaction::Info& inter) const lrc::api::interaction::Info& inter)
{ {
QRegExp reg(".(jpeg|jpg|gif|png)$"); QRegExp reg(".(jpeg|jpg|gif|png)$");
auto interaction = inter; auto interaction = inter;
if (interaction.type == lrc::api::interaction::Type::DATA_TRANSFER if (interaction.type == lrc::api::interaction::Type::DATA_TRANSFER) {
&& interaction.body.toLower().contains(reg)) { if (interaction.body.isEmpty())
interaction.body = "file://" + interaction.body; return {};
else if (interaction.body.toLower().contains(reg))
interaction.body = "file://" + interaction.body;
} }
if (interaction.type == lrc::api::interaction::Type::MERGE)
return {};
auto sender = interaction.authorUri; auto sender = interaction.authorUri;
auto timestamp = QString::number(interaction.timestamp); auto timestamp = QString::number(interaction.timestamp);
auto direction = lrc::api::interaction::isOutgoing(interaction) ? QString("out") auto direction = lrc::api::interaction::isOutgoing(interaction) ? QString("out")
@ -40,7 +45,7 @@ buildInteractionJson(lrc::api::ConversationModel& conversationModel,
QJsonObject interactionObject = QJsonObject(); QJsonObject interactionObject = QJsonObject();
interactionObject.insert("text", QJsonValue(interaction.body)); interactionObject.insert("text", QJsonValue(interaction.body));
interactionObject.insert("id", QJsonValue(QString::number(msgId))); interactionObject.insert("id", QJsonValue(msgId));
interactionObject.insert("sender", QJsonValue(sender)); interactionObject.insert("sender", QJsonValue(sender));
interactionObject.insert("sender_contact_method", QJsonValue(sender)); interactionObject.insert("sender_contact_method", QJsonValue(sender));
interactionObject.insert("timestamp", QJsonValue(timestamp)); interactionObject.insert("timestamp", QJsonValue(timestamp));
@ -60,7 +65,7 @@ buildInteractionJson(lrc::api::ConversationModel& conversationModel,
case lrc::api::interaction::Type::DATA_TRANSFER: { case lrc::api::interaction::Type::DATA_TRANSFER: {
interactionObject.insert("type", QJsonValue("data_transfer")); interactionObject.insert("type", QJsonValue("data_transfer"));
lrc::api::datatransfer::Info info = {}; lrc::api::datatransfer::Info info = {};
conversationModel.getTransferInfo(msgId, info); // conversationModel.getTransferInfo(msgId, info);
if (info.status != lrc::api::datatransfer::Status::INVALID) { if (info.status != lrc::api::datatransfer::Status::INVALID) {
interactionObject.insert("totalSize", QJsonValue(qint64(info.totalSize))); interactionObject.insert("totalSize", QJsonValue(qint64(info.totalSize)));
interactionObject.insert("progress", QJsonValue(qint64(info.progress))); interactionObject.insert("progress", QJsonValue(qint64(info.progress)));
@ -125,7 +130,7 @@ buildInteractionJson(lrc::api::ConversationModel& conversationModel,
QString QString
interactionToJsonInteractionObject(lrc::api::ConversationModel& conversationModel, interactionToJsonInteractionObject(lrc::api::ConversationModel& conversationModel,
const uint64_t msgId, const QString& msgId,
const lrc::api::interaction::Info& interaction) const lrc::api::interaction::Info& interaction)
{ {
auto interactionObject = buildInteractionJson(conversationModel, msgId, interaction); auto interactionObject = buildInteractionJson(conversationModel, msgId, interaction);
@ -134,7 +139,7 @@ interactionToJsonInteractionObject(lrc::api::ConversationModel& conversationMode
QString QString
interactionsToJsonArrayObject(lrc::api::ConversationModel& conversationModel, interactionsToJsonArrayObject(lrc::api::ConversationModel& conversationModel,
const std::map<uint64_t, lrc::api::interaction::Info> interactions) MessagesList interactions)
{ {
QJsonArray array; QJsonArray array;
for (const auto& interaction : interactions) { for (const auto& interaction : interactions) {

View file

@ -26,14 +26,14 @@
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include "lrcinstance.h"
#include "api/conversationmodel.h" #include "api/conversationmodel.h"
QJsonObject buildInteractionJson(lrc::api::ConversationModel& conversationModel, QJsonObject buildInteractionJson(lrc::api::ConversationModel& conversationModel,
const uint64_t msgId, const QString& msgId,
const lrc::api::interaction::Info& interaction); lrc::api::interaction::Info& interaction);
QString interactionToJsonInteractionObject(lrc::api::ConversationModel& conversationModel, QString interactionToJsonInteractionObject(lrc::api::ConversationModel& conversationModel,
const uint64_t msgId, const QString& msgId,
const lrc::api::interaction::Info& interaction); const lrc::api::interaction::Info& interaction);
QString interactionsToJsonArrayObject( QString interactionsToJsonArrayObject(lrc::api::ConversationModel& conversationModel,
lrc::api::ConversationModel& conversationModel, MessagesList interactions);
const std::map<uint64_t, lrc::api::interaction::Info> interactions);

View file

@ -77,7 +77,7 @@ public:
lrcInstance_->subscribeToDebugReceived(); lrcInstance_->subscribeToDebugReceived();
auto downloadPath = settingsManager_->getValue(Settings::Key::DownloadPath); auto downloadPath = settingsManager_->getValue(Settings::Key::DownloadPath);
lrcInstance_->dataTransferModel().downloadDirectory = downloadPath.toString() + "/"; lrcInstance_->accountModel().downloadDirectory = downloadPath.toString() + "/";
} }
void qmlEngineRegistration(QQmlEngine* engine) void qmlEngineRegistration(QQmlEngine* engine)