summaryrefslogtreecommitdiff
path: root/saltoqd/commmanager.cpp
blob: dc17e7d564865de958e4c4e67ed2eaf6efd1a6f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <QtCore/QJsonArray>
#include "commmanager.h"

using namespace CommHistory;

static const int RECORD_LIMIT = 20;

CommManager::CommManager(StorageManager *storage, ToqManager *toq) :
	QObject(toq), _toq(toq), _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);
	_calls->setLimit(RECORD_LIMIT);

	_convs->setQueryMode(EventModel::AsyncQuery);
	_convs->setLimit(RECORD_LIMIT);

	_refreshTimer->setSingleShot(true);
	_refreshTimer->setInterval(1000);

	connect(_calls, SIGNAL(modelReady(bool)),
			this, SLOT(scheduleRefresh()));
	connect(_calls, SIGNAL(modelReset()),
			this, SLOT(scheduleRefresh()));
	connect(_calls, SIGNAL(rowsInserted(QModelIndex,int,int)),
			this, SLOT(scheduleRefresh()));
	connect(_calls, SIGNAL(rowsRemoved(QModelIndex,int,int)),
			this, SLOT(scheduleRefresh()));

	connect(_convs, SIGNAL(modelReady(bool)),
			this, SLOT(scheduleRefresh()));

	connect(_refreshTimer, &QTimer::timeout,
			this, &CommManager::refresh);

	if (!_calls->getEvents()) {
		qWarning() << "Could not get the call log";
	}
	if (!_convs->getGroups()) {
		qWarning() << "Could not get conversation groups";
	}
}

void CommManager::scheduleRefresh()
{
	if (!_refreshTimer->isActive()) {
		_refreshTimer->start();
	}
}

void CommManager::refresh()
{
	qDebug() << "refreshing now";
	QMultiMap<QDateTime, QJsonObject> events;

	int rows = _calls->rowCount();
	for (int i = 0; i < rows; i++) {
		Event e = _calls->event(i);
		QDateTime dt = e.startTime();
		QJsonObject obj;
		obj.insert("Name", e.contactName());
		obj.insert("ContactId", QJsonValue());
		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;
		}
		details.insert("IsMissedCall", e.isMissedCall());
		record.insert("CommsDetails", details);
		records.append(record);
		obj.insert("CommsRecords", records);

		events.insert(dt, obj);
	}

	rows = _convs->rowCount();
	for (int i = 0; i < rows; i++) {
		Group g = _convs->group(_convs->index(i, 0));
		qDebug() << "Chat" << g.contactName();
	}

	QJsonArray records;

	int i = 0;
	auto it = events.begin();
	while (it != events.end()) {
		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);
	store.insert("Records", records);

	QJsonObject root;
	root.insert("DataStore", store);

	_storage->updateStore(storeName, root);
}