summaryrefslogtreecommitdiff
path: root/saltoqd/commmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'saltoqd/commmanager.cpp')
-rw-r--r--saltoqd/commmanager.cpp164
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);