Implemented initialization and update in separate thread for GroupsProvider. 59/91659/2
authorEugene Kurzberg <i.kurtsberg@samsung.com>
Mon, 10 Oct 2016 14:20:58 +0000 (17:20 +0300)
committerAleksandr Sapozhnik <a.sapozhnik@samsung.com>
Tue, 11 Oct 2016 15:37:42 +0000 (08:37 -0700)
Change-Id: I9f60483d216add357053079e2afd775124a06d92
Signed-off-by: Eugene Kurzberg <i.kurtsberg@samsung.com>
lib-contacts/inc/Contacts/Groups/GroupsView.h
lib-contacts/src/Contacts/Groups/GroupsView.cpp
lib-contacts/src/Contacts/Groups/Model/GroupsProvider.cpp

index 6601237..c420ed7 100644 (file)
@@ -50,11 +50,11 @@ namespace Contacts
                {
                public:
                        /**
-                        * @brief Create groups main view.
-                        * @param[in]   filterType  Bitmask filter
-                        * @see FilterType
+                        * @brief Create groups list view
+                        * @param[in]   filterType  Defines how to count group members
                         */
-                       GroupsView(int filterType = Common::FilterNone);
+                       explicit GroupsView(int filterType = Common::FilterNone);
+                       virtual ~GroupsView() override;
 
                        /**
                         * @brief Set whether the view is used for assigning contacts to groups.
@@ -100,7 +100,7 @@ namespace Contacts
 
                        bool m_IsAssignMode;
                        int m_NewGroupId;
-                       Model::GroupsProvider m_Provider;
+                       Model2::DataProvider *m_Provider;
                };
        }
 }
index 6cff337..084c8ff 100644 (file)
@@ -47,14 +47,19 @@ using namespace Ux;
 GroupsView::GroupsView(int filterType)
        : m_Genlist(nullptr), m_GroupsItem(nullptr),
          m_NotAssignedItem(nullptr), m_CreateItem(nullptr),
-         m_IsAssignMode(false), m_NewGroupId(0), m_Provider(filterType)
+         m_IsAssignMode(false), m_NewGroupId(0), m_Provider(new GroupsProvider(filterType))
 {
        auto strings = getSelectViewStrings();
        strings.titleDefault = "IDS_PB_HEADER_GROUPS_ABB";
        strings.titleMulti = "IDS_PB_HEADER_SELECT_GROUPS_ABB";
        setStrings(strings);
 
-       m_Provider.setInsertCallback(std::bind(&GroupsView::onInserted, this, _1));
+       m_Provider->setInsertCallback(std::bind(&GroupsView::onInserted, this, _1));
+}
+
+GroupsView::~GroupsView()
+{
+       m_Provider->destroy();
 }
 
 void GroupsView::setAssignMode(bool isEnabled)
@@ -73,8 +78,8 @@ Evas_Object *GroupsView::onCreate(Evas_Object *parent)
        m_GroupsItem = new GenGroupItem("IDS_PB_OPT_GROUPS");
        m_Genlist->insert(m_GroupsItem);
 
-       m_Provider.initialize([this] {
-               for (auto &&data : m_Provider.getDataList()) {
+       m_Provider->initialize([this] {
+               for (auto &&data : m_Provider->getDataList()) {
                        Group &group = static_cast<Group &>(*data);
                        GroupItem *groupItem = createItem(group);
 
@@ -94,7 +99,7 @@ Evas_Object *GroupsView::onCreate(Evas_Object *parent)
 
 void GroupsView::onNavigation(bool isCurrent)
 {
-       m_Provider.setUpdateEnabled(isCurrent);
+       m_Provider->setUpdateEnabled(isCurrent);
 }
 
 void GroupsView::onMenuPressed()
index 8f2c4e5..b1154ef 100644 (file)
 #include "Contacts/Groups/Model/Group.h"
 #include "Common/Database/RecordIterator.h"
 #include "Common/Database/RecordUtils.h"
+
 #include "Utils/Callback.h"
+#include "Utils/Thread.h"
 
 #include <algorithm>
 
 using namespace Contacts::Groups::Model;
 using namespace Common::Database;
 using namespace Model2;
+using namespace Utils;
+using namespace std::placeholders;
 
 GroupsProvider::GroupsProvider(int filterType)
        : m_DbVersion(0), m_MembersDbVersion(0), m_UpdateType(UpdateNone), m_FilterType(filterType)
@@ -49,16 +53,20 @@ void GroupsProvider::startInit()
        contacts_db_add_changed_cb(_contacts_group_relation._uri,
                        makeCallbackWithLastParam(&GroupsProvider::onMembersChanged), this);
 
-       contacts_list_h list = nullptr;
-       contacts_db_get_all_records(_contacts_group._uri, 0, 0, &list);
+       new Thread(CallbackPairWithResult<DataList>([this] {
+               contacts_list_h list = nullptr;
+               contacts_connect_on_thread();
+               contacts_db_get_all_records(_contacts_group._uri, 0, 0, &list);
 
-       DataList dataList;
-       for (auto &&record : makeRange(list)) {
-               dataList.push_back(new Group(record, m_FilterType));
-       }
-       contacts_list_destroy(list, false);
+               DataList dataList;
+               for (auto &&record : makeRange(list)) {
+                       dataList.push_back(new Group(record, m_FilterType));
+               }
 
-       finishInit(std::move(dataList));
+               contacts_list_destroy(list, false);
+               contacts_disconnect_on_thread();
+               return dataList;
+       }, std::bind(&GroupsProvider::finishInit, this, _1)));
 }
 
 void GroupsProvider::startUpdate()
@@ -66,13 +74,16 @@ void GroupsProvider::startUpdate()
        int updateType = m_UpdateType;
        m_UpdateType = UpdateNone;
 
-       if (updateType & UpdateGroups) {
-               updateGroups();
-       }
-       if (updateType & UpdateMembers) {
-               updateMembers();
-       }
-       finishUpdate();
+       new Thread([this, updateType] {
+               contacts_connect_on_thread();
+               if (updateType & UpdateGroups) {
+                       updateGroups();
+               }
+               if (updateType & UpdateMembers) {
+                       updateMembers();
+               }
+               contacts_disconnect_on_thread();
+       }, std::bind(&GroupsProvider::finishUpdate, this));
 }
 
 void GroupsProvider::updateGroups()