{
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.
bool m_IsAssignMode;
int m_NewGroupId;
- Model::GroupsProvider m_Provider;
+ Model2::DataProvider *m_Provider;
};
}
}
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)
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);
void GroupsView::onNavigation(bool isCurrent)
{
- m_Provider.setUpdateEnabled(isCurrent);
+ m_Provider->setUpdateEnabled(isCurrent);
}
void GroupsView::onMenuPressed()
#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)
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()
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()