*
*/
-#include "Common/Database/Queries.h"
#include "Common/Database/RecordIterator.h"
#include "Common/Database/RecordUtils.h"
#include "Contacts/List/Model/MfcProvider.h"
#include "Contacts/List/Model/Person.h"
-#include "Utils/Callback.h"
#include "Utils/Logger.h"
+#include "Utils/Thread.h"
using namespace Common::Database;
using namespace Contacts::List::Model;
+using namespace Utils;
+using namespace std::placeholders;
#define MFC_MAX_COUNT 5
MfcProvider::MfcProvider()
{
+ contacts_db_add_changed_cb(_contacts_person._uri,
+ &MfcProvider::onChanged, this);
contacts_db_add_changed_cb(_contacts_phone_log._uri,
- makeCallbackWithLastParam(&MfcProvider::onPersonUsageUpdate), this);
+ &MfcProvider::onChanged, this);
+ contacts_setting_add_name_display_order_changed_cb(
+ &MfcProvider::onNameFormatChanged, this);
}
MfcProvider::~MfcProvider()
{
+ contacts_db_remove_changed_cb(_contacts_person._uri,
+ &MfcProvider::onChanged, this);
contacts_db_remove_changed_cb(_contacts_phone_log._uri,
- makeCallbackWithLastParam(&MfcProvider::onPersonUsageUpdate), this);
+ &MfcProvider::onChanged, this);
+ contacts_setting_remove_name_display_order_changed_cb(
+ &MfcProvider::onNameFormatChanged, this);
}
contacts_list_h MfcProvider::getPersonList() const
for (auto &&usageRecord : makeRange(usageList)) {
int personId = getRecordInt(usageRecord, _contacts_person_usage.person_id);
contacts_record_h personRecord = nullptr;
- contacts_db_get_record(_contacts_person._uri, personId, &personRecord);
+ int err = contacts_db_get_record(_contacts_person._uri, personId, &personRecord);
+ WARN_IF_ERR(err, "contacts_db_get_record() failed.");
contacts_list_add(personList, personRecord);
}
return personList;
}
-contacts_record_h MfcProvider::getPersonRecord(int id, PersonProvider::IdType idType) const
-{
- if (idType == ContactId) {
- return nullptr;
- }
-
- contacts_record_h record = nullptr;
- contacts_list_h list = getPersonUsageList();
- for (auto &&usageRecord : makeRange(list)) {
- if (getRecordInt(usageRecord, _contacts_person_usage.person_id) == id) {
- contacts_db_get_record(_contacts_person._uri, id, &record);
- break;
- }
- }
-
- contacts_list_destroy(list, true);
- return record;
-}
-
-void MfcProvider::insertPerson(contacts_record_h personRecord)
-{
- if (!personRecord) {
- return;
- }
-
- update();
-}
-
-void MfcProvider::deletePerson(DataList::const_iterator personIt)
-{
- reload();
-}
-
contacts_list_h MfcProvider::getPersonUsageList() const
{
- contacts_list_h list = nullptr;
- contacts_query_h query = nullptr;
+ contacts_filter_h usageTypeFilter = nullptr;
+ contacts_filter_create(_contacts_person_usage._uri, &usageTypeFilter);
+ contacts_filter_add_int(usageTypeFilter, _contacts_person_usage.usage_type,
+ CONTACTS_MATCH_EQUAL, CONTACTS_USAGE_STAT_TYPE_OUTGOING_CALL);
+ contacts_filter_add_operator(usageTypeFilter, CONTACTS_FILTER_OPERATOR_OR);
+ contacts_filter_add_int(usageTypeFilter, _contacts_person_usage.usage_type,
+ CONTACTS_MATCH_EQUAL, CONTACTS_USAGE_STAT_TYPE_INCOMING_CALL);
+
+ contacts_filter_h filter = nullptr;
+ contacts_filter_create(_contacts_person_usage._uri, &filter);
+ contacts_filter_add_int(filter, _contacts_person_usage.times_used, CONTACTS_MATCH_GREATER_THAN, 0);
+ contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
+ contacts_filter_add_bool(filter, _contacts_person_usage.is_favorite, false);
+ contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
+ contacts_filter_add_filter(filter, usageTypeFilter);
+ contacts_filter_destroy(usageTypeFilter);
+ contacts_query_h query = nullptr;
contacts_query_create(_contacts_person_usage._uri, &query);
contacts_query_set_sort(query, _contacts_person_usage.times_used, false);
+ contacts_query_set_filter(query, filter);
- if (query) {
- contacts_filter_h filter = nullptr;
- contacts_filter_create(_contacts_person_usage._uri, &filter);
-
- if (filter) {
- contacts_filter_add_int(filter, _contacts_person_usage.times_used, CONTACTS_MATCH_GREATER_THAN, 0);
- contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
- contacts_filter_add_bool(filter, _contacts_person_usage.is_favorite, false);
-
- contacts_filter_h usageTypeFilter = nullptr;
- contacts_filter_create(_contacts_person_usage._uri, &usageTypeFilter);
- if (usageTypeFilter) {
- contacts_filter_add_int(usageTypeFilter, _contacts_person_usage.usage_type, CONTACTS_MATCH_EQUAL, CONTACTS_USAGE_STAT_TYPE_OUTGOING_CALL);
- contacts_filter_add_operator(usageTypeFilter, CONTACTS_FILTER_OPERATOR_OR);
- contacts_filter_add_int(usageTypeFilter, _contacts_person_usage.usage_type, CONTACTS_MATCH_EQUAL, CONTACTS_USAGE_STAT_TYPE_INCOMING_CALL);
-
- contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
- contacts_filter_add_filter(filter, usageTypeFilter);
- contacts_filter_destroy(usageTypeFilter);
- }
-
- contacts_query_set_filter(query, filter);
- }
+ contacts_list_h list = nullptr;
+ int err = contacts_db_get_records_with_query(query, 0, MFC_MAX_COUNT, &list);
+ WARN_IF_ERR(err, "contacts_db_get_records_with_query() failed.");
- int err = contacts_db_get_records_with_query(query, 0, MFC_MAX_COUNT, &list);
- WARN_IF_ERR(err, "contacts_db_get_records_with_query() failed.");
+ contacts_query_destroy(query);
+ contacts_filter_destroy(filter);
- contacts_query_destroy(query);
- contacts_filter_destroy(filter);
- }
return list;
}
-void MfcProvider::onPersonUsageUpdate(const char *viewUri)
-{
- update();
-}
-
-bool MfcProvider::update()
+void MfcProvider::startInit()
{
- contacts_list_h mfcList = getPersonList();
- int count = 0;
- contacts_list_get_count(mfcList, &count);
+ new Thread(CallbackPairWithResult<DataList>([this] {
+ contacts_connect_on_thread();
+ contacts_list_h list = getPersonList();
- const DataList &dataList = getDataList();
+ DataList dataList;
+ for (auto &&record : makeRange(list)) {
+ dataList.push_back(new Person(record));
+ }
- if (dataList.size() == (size_t)count) {
- bool isEqual = std::equal(dataList.begin(), dataList.end(), begin(mfcList), equalPredicate);
- contacts_list_first(mfcList);
+ contacts_list_destroy(list, false);
+ contacts_disconnect_on_thread();
+ return dataList;
+ }, std::bind(&MfcProvider::finishInit, this, _1)));
+}
- if (!isEqual && count) {
- reload();
- return true;
+void MfcProvider::startUpdate()
+{
+ new Thread([this] {
+ contacts_connect_on_thread();
+ for (auto &&dataItem : getDataList()) {
+ deleteDataItem(*dataItem);
}
- } else {
- reload();
- return true;
- }
+ contacts_list_h list = getPersonList();
+ for (auto &&record : makeRange(list)) {
+ insertDataItem(new Person(record));
+ }
+ contacts_list_destroy(list, false);
+ contacts_disconnect_on_thread();
+ }, std::bind(&MfcProvider::finishUpdate, this));
+}
- contacts_list_destroy(mfcList, true);
- return false;
+void MfcProvider::onChanged(const char *viewUri, void *data)
+{
+ MfcProvider *provider = (MfcProvider *) data;
+ provider->update();
}
-bool MfcProvider::equalPredicate(::Model2::DataItem *data, contacts_record_h record)
+void MfcProvider::onNameFormatChanged(contacts_name_display_order_e order, void *data)
{
- Person *person = static_cast<Person *>(data);
- return person->getId() == getRecordInt(record, _contacts_person.id);
+ MfcProvider *provider = (MfcProvider *) data;
+ if (!provider->getDataList().empty()) {
+ provider->update();
+ }
}