summaryrefslogtreecommitdiff
path: root/saltoqd/contactsmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'saltoqd/contactsmanager.cpp')
-rw-r--r--saltoqd/contactsmanager.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/saltoqd/contactsmanager.cpp b/saltoqd/contactsmanager.cpp
new file mode 100644
index 0000000..2bc79d2
--- /dev/null
+++ b/saltoqd/contactsmanager.cpp
@@ -0,0 +1,111 @@
+#include "contactsmanager.h"
+#include <QtContacts/QtContacts>
+#include <qtcontacts-extensions_impl.h>
+
+QTCONTACTS_USE_NAMESPACE
+
+ContactsManager::ContactsManager(StorageManager *storage, ToqManager *toq) :
+ QObject(toq), _toq(toq), _storage(storage),
+ _contacts(new QContactManager(this)),
+ _refreshTimer(new QTimer(this))
+{
+ connect(_contacts, &QContactManager::contactsAdded,
+ this, &ContactsManager::scheduleRefresh);
+ connect(_contacts, &QContactManager::dataChanged,
+ this, &ContactsManager::scheduleRefresh);
+
+ connect(_refreshTimer, &QTimer::timeout,
+ this, &ContactsManager::refresh);
+
+ _refreshTimer->setSingleShot(true);
+ _refreshTimer->setInterval(2000);
+ _refreshTimer->start();
+}
+
+qint64 ContactsManager::getRecordIdForContact(uint contactId)
+{
+ return contactId;
+}
+
+void ContactsManager::scheduleRefresh()
+{
+ if (!_refreshTimer->isActive()) {
+ _refreshTimer->start();
+ }
+}
+
+void ContactsManager::refresh()
+{
+ qDebug() << "Refreshing contacts";
+
+ QContactSortOrder order;
+ order.setBlankPolicy(QContactSortOrder::BlanksLast);
+ order.setCaseSensitivity(Qt::CaseInsensitive);
+ order.setDetailType(QContactDetail::TypeDisplayLabel, QContactDisplayLabel::FieldLabel);
+
+ QList<QContact> contacts = _contacts->contacts(order);
+
+ QJsonArray records;
+ for (const QContact &contact : contacts) {
+ QJsonObject payload;
+ QContactName cName = contact.detail<QContactName>();
+ QContactDisplayLabel cDisplay = contact.detail<QContactDisplayLabel>();
+ QContactFavorite cFav = contact.detail<QContactFavorite>();
+ QJsonObject name;
+ name.insert("Initial", cName.prefix());
+ name.insert("First", cName.firstName());
+ name.insert("Middle", cName.middleName());
+ name.insert("Last", cName.lastName());
+ name.insert("Display", cDisplay.label());
+ QJsonArray phones;
+ for (const QContactPhoneNumber &cPhone : contact.details<QContactPhoneNumber>()) {
+ QJsonObject phone;
+ QString type;
+ if (!cPhone.subTypes().isEmpty()) {
+ if (cPhone.subTypes().first() == QContactPhoneNumber::SubTypeMobile) {
+ type = "Mobile";
+ }
+ }
+ if (type.isEmpty() && !cPhone.contexts().isEmpty()) {
+ switch (cPhone.contexts().first()) {
+ case QContactDetail::ContextHome:
+ type = "Home";
+ break;
+ case QContactDetail::ContextWork:
+ type = "Work";
+ break;
+ default:
+ break;
+ }
+ }
+ if (type.isEmpty()) {
+ type = "Other";
+ }
+ phone.insert("Type", type);
+ phone.insert("Number", cPhone.number());
+ phones.append(phone);
+ }
+ payload.insert("Name", name);
+ payload.insert("PhoneNumber", phones);
+ payload.insert("IsFav", cFav.isFavorite());
+ QJsonObject record;
+ record.insert("RecordId", getRecordIdForContact(QtContactsSqliteExtensions::internalContactId(contact.id())));
+ record.insert("RecordPayload", payload);
+ records.append(record);
+ }
+
+ QString storeName("Phub.Phone.Contacts");
+ QJsonObject store;
+ store.insert("Name", storeName);
+ store.insert("Records", records);
+
+ QJsonObject root;
+ root.insert("DataStore", store);
+
+ QJsonDocument doc(root);
+ qDebug() << doc.toJson();
+
+ _storage->updateStore(storeName, root);
+
+ emit changed();
+}