Reimplemented MfcProvider to be simpler and independent from PersonProvider. 17/90617/3
authorEugene Kurzberg <i.kurtsberg@samsung.com>
Mon, 3 Oct 2016 06:56:28 +0000 (09:56 +0300)
committerEugene Kurzberg <i.kurtsberg@samsung.com>
Tue, 4 Oct 2016 09:33:22 +0000 (02:33 -0700)
Change-Id: Ie3ebaed85328fb2cc126e466edcdb38d6d0089c5
Signed-off-by: Eugene Kurzberg <i.kurtsberg@samsung.com>
lib-contacts/inc/Contacts/List/ListSection.h
lib-contacts/inc/Contacts/List/Model/MfcProvider.h
lib-contacts/inc/Contacts/List/Model/PersonProvider.h
lib-contacts/src/Contacts/List/ListSection.cpp
lib-contacts/src/Contacts/List/ListView.cpp
lib-contacts/src/Contacts/List/Model/MfcProvider.cpp
lib-contacts/src/Contacts/List/Model/PersonProvider.cpp
lib-contacts/src/Contacts/List/RemoveFavView.cpp

index 0346aec..de5629a 100644 (file)
 #define CONTACTS_LIST_LIST_SECTION_H
 
 #include "Ui/GenGroupItem.h"
-#include "Model2/DataItem.h"
+#include "Model2/DataProvider.h"
 
 namespace Contacts
 {
        namespace List
        {
-               namespace Model
-               {
-                       class Person;
-                       class PersonProvider;
-               }
                class ContactItem;
 
                /**
@@ -54,7 +49,7 @@ namespace Contacts
                         * @param[in]   provider    Section provider
                         *
                         */
-                       ListSection(const char *title, Model::PersonProvider *provider,
+                       ListSection(const char *title, Model2::DataProvider *provider,
                                        SectionMode mode = DefaultMode);
                        virtual ~ListSection() override;
 
@@ -96,7 +91,7 @@ namespace Contacts
                        ContactItem *insertItem(::Model2::DataItem &dataItem);
 
                        UpdateCallback m_OnUpdated;
-                       Model::PersonProvider *m_Provider;
+                       Model2::DataProvider *m_Provider;
                        SectionMode m_Mode;
                        Elm_Object_Item *m_IndexItem;
                };
index c116b2c..7047c1f 100644 (file)
@@ -18,7 +18,7 @@
 #ifndef CONTACTS_LIST_MODEL_MFC_PROVIDER_H
 #define CONTACTS_LIST_MODEL_MFC_PROVIDER_H
 
-#include "Contacts/List/Model/PersonProvider.h"
+#include "Model2/DataProvider.h"
 
 namespace Contacts
 {
@@ -29,23 +29,21 @@ namespace Contacts
                        /**
                         * @brief Provides list of most frequent contacts(mfc).
                         */
-                       class MfcProvider : public PersonProvider
+                       class MfcProvider : public Model2::DataProvider
                        {
                        public:
                                MfcProvider();
                                virtual ~MfcProvider() override;
 
                        private:
-                               virtual contacts_list_h getPersonList() const override;
-                               virtual contacts_record_h getPersonRecord(int id, IdType idType) const override;
-                               virtual void insertPerson(contacts_record_h personRecord) override;
-                               virtual void deletePerson(DataList::const_iterator personIt) override;
+                               virtual void startInit() override;
+                               virtual void startUpdate() override;
 
+                               contacts_list_h getPersonList() const;
                                contacts_list_h getPersonUsageList() const;
 
-                               void onPersonUsageUpdate(const char *viewUri);
-                               bool update();
-                               static bool equalPredicate(::Model2::DataItem *data, contacts_record_h record);
+                               static void onChanged(const char *viewUri, void *data);
+                               static void onNameFormatChanged(contacts_name_display_order_e order, void *data);
                        };
                }
        }
index 1b9177f..ff856e2 100644 (file)
@@ -49,13 +49,6 @@ namespace Contacts
                                 */
                                int getFilterType() const;
 
-                               /**
-                                * @brief Reload the person list.
-                                * Delete all persons, get new list from db and insert every person.
-                                * Delete and Insert callbacks will be invoked.
-                                */
-                               void reload();
-
                        protected:
                                enum IdType
                                {
index 1222de7..bcc33ee 100644 (file)
@@ -25,7 +25,7 @@ using namespace Model2;
 using namespace Contacts::List;
 using namespace Contacts::List::Model;
 
-ListSection::ListSection(const char *title, PersonProvider *provider, SectionMode mode)
+ListSection::ListSection(const char *title, DataProvider *provider, SectionMode mode)
        : GenGroupItem(title), m_Provider(provider), m_Mode(mode), m_IndexItem(nullptr)
 {
        m_Provider->setInsertCallback(std::bind(&ListSection::insertItem, this, std::placeholders::_1));
@@ -49,7 +49,7 @@ void ListSection::setUpdateCallback(UpdateCallback callback)
 
 void ListSection::update()
 {
-       m_Provider->reload();
+       m_Provider->update();
 }
 
 void ListSection::reorderItem(int reorderedId, int previousId)
index 021b07c..20b4851 100644 (file)
@@ -333,7 +333,7 @@ Ui::GenGroupItem *ListView::createMyProfileSection()
 Ui::GenGroupItem *ListView::createListSection(SectionId sectionId)
 {
        const char *title = nullptr;
-       PersonProvider *provider = nullptr;
+       DataProvider *provider = nullptr;
        switch (sectionId) {
                case SectionFavorites:
                        title = "IDS_PB_HEADER_FAVOURITES";
index a014eef..fbac843 100644 (file)
  *
  */
 
-#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
@@ -50,7 +59,8 @@ 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);
        }
 
@@ -58,113 +68,84 @@ contacts_list_h MfcProvider::getPersonList() const
        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();
+       }
 }
index 77b7616..d15c432 100644 (file)
@@ -51,29 +51,6 @@ int PersonProvider::getFilterType() const
        return m_FilterType;
 }
 
-void PersonProvider::reload()
-{
-       /*
-        * This done to support update functionality of Mfc.
-        * The PersonProvider's methods are used because list is fully cleared and
-        * the new list is get using overridden getPersonList method.
-        *
-        * If some of inherited classes will keep own person list, this code should be updated.
-        */
-       while (!getDataList().empty()) {
-               PersonProvider::deletePerson(getDataList().begin());
-       }
-
-       resetDbVersion();
-
-       contacts_list_h list = getPersonList();
-       for (auto &&record : makeRange(list)) {
-               PersonProvider::insertPerson(record);
-       }
-
-       contacts_list_destroy(list, false);
-}
-
 Person *PersonProvider::createPerson(contacts_record_h record)
 {
        return new Person(record);
index d235ec2..59a5421 100644 (file)
@@ -69,7 +69,7 @@ void RemoveFavView::onSelectAllInsert(Ui::GenItem *item)
 Ui::GenGroupItem *RemoveFavView::createListSection(SectionId sectionId)
 {
        const char *title = nullptr;
-       PersonProvider *provider = nullptr;
+       DataProvider *provider = nullptr;
        switch (sectionId) {
                case SectionFavorites:
                        title = "IDS_PB_HEADER_FAVOURITES";