diff options
Diffstat (limited to 'saltoqd/commmanager.cpp')
-rw-r--r-- | saltoqd/commmanager.cpp | 164 |
1 files changed, 131 insertions, 33 deletions
diff --git a/saltoqd/commmanager.cpp b/saltoqd/commmanager.cpp index dc17e7d..f54bb89 100644 --- a/saltoqd/commmanager.cpp +++ b/saltoqd/commmanager.cpp @@ -1,17 +1,19 @@ #include <QtCore/QJsonArray> +#include <CommHistory/ConversationModel> +#include "contactsmanager.h" #include "commmanager.h" using namespace CommHistory; static const int RECORD_LIMIT = 20; +static const int PER_GROUP_LIMIT = 10; -CommManager::CommManager(StorageManager *storage, ToqManager *toq) : - QObject(toq), _toq(toq), _storage(storage), +CommManager::CommManager(StorageManager *storage, ContactsManager *contacts, ToqManager *toq) : + QObject(toq), _toq(toq), _contacts(contacts), _storage(storage), _calls(new CallModel(this)), _convs(new GroupModel(this)), _refreshTimer(new QTimer(this)) { - _calls->setTreeMode(false); _calls->setQueryMode(EventModel::AsyncQuery); _calls->setSorting(CallModel::SortByTime); _calls->setResolveContacts(true); @@ -21,7 +23,7 @@ CommManager::CommManager(StorageManager *storage, ToqManager *toq) : _convs->setLimit(RECORD_LIMIT); _refreshTimer->setSingleShot(true); - _refreshTimer->setInterval(1000); + _refreshTimer->setInterval(2000); connect(_calls, SIGNAL(modelReady(bool)), this, SLOT(scheduleRefresh())); @@ -34,6 +36,12 @@ CommManager::CommManager(StorageManager *storage, ToqManager *toq) : connect(_convs, SIGNAL(modelReady(bool)), this, SLOT(scheduleRefresh())); + connect(_convs, SIGNAL(modelReset()), + this, SLOT(scheduleRefresh())); + connect(_convs, SIGNAL(rowsInserted(QModelIndex,int,int)), + this, SLOT(scheduleRefresh())); + connect(_convs, SIGNAL(rowsRemoved(QModelIndex,int,int)), + this, SLOT(scheduleRefresh())); connect(_refreshTimer, &QTimer::timeout, this, &CommManager::refresh); @@ -60,60 +68,150 @@ void CommManager::refresh() int rows = _calls->rowCount(); for (int i = 0; i < rows; i++) { - Event e = _calls->event(i); + QModelIndex index = _calls->index(i, 0); + Event e = _calls->event(index); + QList<Event::Contact> contacts = e.contacts(); + QString name; + if (!contacts.empty()) { + name = contacts.first().second; + } + if (name.isEmpty()) { + name = e.remoteUid(); + } + if (name.isEmpty()) { + name = tr("Private number"); + } QDateTime dt = e.startTime(); QJsonObject obj; - obj.insert("Name", e.contactName()); - obj.insert("ContactId", QJsonValue()); + obj.insert("Name", name); + obj.insert("ContactId", _contacts->getRecordIdForContact(e.contactId())); + QJsonArray records; - QJsonObject record; - record.insert("CommsType", QLatin1String("Call")); - record.insert("ReceivedTime", qint64(dt.toTime_t())); - record.insert("CallerId", e.contactName()); - record.insert("ItemId", e.id()); - QJsonObject details; - details.insert("Duration", e.startTime().secsTo(e.endTime())); - details.insert("PhoneType", QLatin1String("Other")); // TODO - switch (e.direction()) { - case Event::Inbound: - details.insert("Direction", QLatin1String("Incoming")); - break; - case Event::Outbound: - details.insert("Direction", QLatin1String("Outgoing")); - break; - default: - details.insert("Direction", QLatin1String("Unknown")); - break; + if (_calls->hasChildren(index)) { + const int subrows = _calls->rowCount(index); + for (int j = 0; j < subrows; j++) { + QModelIndex index2 = _calls->index(j, 0, index); + const Event e = _calls->event(index2); + QJsonObject record; + record.insert("CommsType", QLatin1String("Call")); + record.insert("ReceivedTime", qint64(e.startTime().toTime_t())); + record.insert("CallerId", e.remoteUid()); + record.insert("ItemId", e.id()); + QJsonObject details; + details.insert("Duration", e.startTime().secsTo(e.endTime())); + details.insert("PhoneType", QLatin1String("Other")); // TODO + switch (e.direction()) { + case Event::Inbound: + details.insert("Direction", QLatin1String("Incoming")); + break; + case Event::Outbound: + details.insert("Direction", QLatin1String("Outgoing")); + break; + default: + details.insert("Direction", QLatin1String("Unknown")); + break; + } + details.insert("IsMissedCall", e.isMissedCall()); + record.insert("CommsDetails", details); + records.append(record); + } } - details.insert("IsMissedCall", e.isMissedCall()); - record.insert("CommsDetails", details); - records.append(record); + obj.insert("CommsRecords", records); events.insert(dt, obj); } + QScopedPointer<ConversationModel> conv(new ConversationModel); + conv->setTreeMode(false); + conv->setLimit(PER_GROUP_LIMIT); + conv->setQueryMode(EventModel::SyncQuery); + rows = _convs->rowCount(); for (int i = 0; i < rows; i++) { Group g = _convs->group(_convs->index(i, 0)); - qDebug() << "Chat" << g.contactName(); + + QList<Event::Contact> contacts = g.contacts(); + QString name; + if (!contacts.empty()) { + name = contacts.first().second; + } + if (name.isEmpty() && !g.remoteUids().isEmpty()) { + name = g.remoteUids().first(); + } + if (name.isEmpty()) { + name = tr("Unknown contact"); + } + + QJsonObject obj; + obj.insert("Name", name); + obj.insert("ContactId", _contacts->getRecordIdForContact(g.contactId())); + + QJsonArray records; + + if (conv->getEvents(g.id())) { + const int subrows = conv->rowCount(); + for (int j = 0; j < subrows; j++) { + Event e = conv->event(j); + QJsonObject record; + record.insert("CommsType", QLatin1String("Text")); + record.insert("ReceivedTime", qint64(e.startTime().toTime_t())); + record.insert("CallerId", e.remoteUid()); + record.insert("ItemId", e.id()); + QJsonObject details; + details.insert("Message", e.freeText()); + details.insert("privileged", int(0)); // TODO + switch (e.direction()) { + case Event::Inbound: + details.insert("Direction", int(1)); + break; + case Event::Outbound: + details.insert("Direction", int(2)); + break; + default: + details.insert("Direction", int(0)); + break; + } + details.insert("IsRead", e.isRead()); + record.insert("CommsDetails", details); + records.append(record); + } + } else { + qWarning() << "Failed to get events for group id" << g.id(); + QJsonObject record; + record.insert("CommsType", QLatin1String("Text")); + record.insert("ReceivedTime", qint64(g.startTime().toTime_t())); + record.insert("CallerId", g.remoteUids().first()); + record.insert("ItemId", g.id()); + QJsonObject details; + details.insert("Message", g.lastMessageText()); + details.insert("privileged", int(0)); // TODO + details.insert("Direction", int(0)); + details.insert("IsRead", g.unreadMessages() == 0); + record.insert("CommsDetails", details); + records.append(record); + } + + obj.insert("CommsRecords", records); + + events.insert(g.endTime(), obj); } QJsonArray records; int i = 0; - auto it = events.begin(); - while (it != events.end()) { + auto it = events.end(); + while (it != events.begin()) { + --it; + QJsonObject record; record.insert("RecordId", i); record.insert("RecordPayload", it.value()); records.append(record); - ++it; if (++i >= RECORD_LIMIT) break; } - QString storeName("Phub.Phone.RecentComms"); QJsonObject store; store.insert("Name", storeName); |