*/
const SelectItems &getSelectItems() const;
+ /**
+ * @brief Enable active Done button despite number of selections.
+ * @param[in] isAllowed True - Done button should be enabled, otherwise false
+ */
+ void setEmptyResultAllowed(bool isAllowed);
+
protected:
/**
* @return View selection mode.
size_t m_TotalCount;
size_t m_SelectCount;
size_t m_SelectLimit;
+ bool m_IsEmptyResultAllowed;
SelectMode m_SelectMode;
SelectCallback m_OnSelected;
SelectView::SelectView()
: m_DoneButton(nullptr), m_CancelButton(nullptr), m_IsChecking(false),
- m_TotalCount(0), m_SelectCount(0), m_SelectLimit(0), m_SelectMode(SelectNone),
- m_Strings{ nullptr }
+ m_TotalCount(0), m_SelectCount(0), m_SelectLimit(0), m_IsEmptyResultAllowed(false),
+ m_SelectMode(SelectNone), m_Strings{ nullptr }
{
}
return m_Items;
}
+void SelectView::setEmptyResultAllowed(bool isAllowed)
+{
+ if (isAllowed != m_IsEmptyResultAllowed) {
+ m_IsEmptyResultAllowed = isAllowed;
+ updateDoneButtonState();
+ }
+}
+
SelectMode SelectView::getSelectMode() const
{
return m_SelectMode;
void SelectView::updateDoneButtonState()
{
- elm_object_disabled_set(m_DoneButton, m_SelectCount == 0);
+ elm_object_disabled_set(m_DoneButton,
+ m_IsEmptyResultAllowed ? m_TotalCount == 0 : m_SelectCount == 0);
}
void SelectView::updateSelectAllState()
}
/* m_TotalCount: 0 -> 1 or 1 -> 0 */
if (checkCount == 0) {
+ updateDoneButtonState();
updateSelectAllItem();
}
}
public:
/**
* @brief Constructor.
- * param[in] groupId Group id
+ * param[in] groupMembers Group members ids list
*/
- AddMembersItem(int groupId);
+ AddMembersItem(std::vector<int> groupMembers);
/**
- * @return the list of contact id added by user
+ * @return the list of person id added by user
*/
- const std::vector<int> &getMemberIdList() const;
+ const std::vector<int> &getMembers() const;
private:
virtual Elm_Genlist_Item_Class *getItemClass() const override;
void addMembers(Ux::SelectResults results);
void onAddMembersFinished(List::ListView *view, Ui::ProcessPopup *popup);
- int m_GroupId;
int m_Count;
- std::vector<int> m_ContactIdList;
+ std::vector<int> m_Members;
};
}
}
#include "Ui/View.h"
#include <contacts.h>
+#include <vector>
namespace Ui
{
bool isAlreadyExists();
void save();
+ void getGroupMembers();
+
int m_Id;
contacts_record_h m_Record;
+ std::vector<int> m_GroupMembers;
+
Evas_Object *m_CancelButton;
Evas_Object *m_DoneButton;
Ui::Genlist *m_Genlist;
{
public:
/**
+ * @brief Called when fill of list view is finished
+ */
+ typedef std::function<void()> FillFinishCallback;
+
+ /**
* @brief Sections types
*/
enum SectionId
*/
void setNoContentHelpText(const char *text);
+ /**
+ * @brief Set view fill finish callback
+ * @param[in] callback Callback to be called when fill of list view is finished
+ */
+ void setFillFinishCallback(FillFinishCallback callback);
+
protected:
Model::PersonProvider *getProvider() const;
std::map<Utils::UniString, PersonGroupItem *> m_PersonGroups;
Model::PersonProvider *m_PersonProvider;
Model::PersonSearchProvider m_SearchProvider;
+
+ FillFinishCallback m_OnFillFinished;
};
}
}
#include "Contacts/Groups/AddMembersItem.h"
#include "Contacts/Groups/Model/Queries.h"
-#include "Contacts/Groups/Model/MembersProvider.h"
#include "Contacts/List/ListView.h"
+#include "Contacts/List/Model/Person.h"
+#include "Contacts/List/PersonItem.h"
#include "GroupItemLayout.h"
#include "Common/Database/RecordUtils.h"
#include "Ui/Navigator.h"
#include "Ui/ProcessPopup.h"
-#include "Utils/Logger.h"
#include "Utils/Thread.h"
+#include <algorithm>
#include <app_i18n.h>
#define BUFFER_SIZE 32
using namespace Contacts::Groups;
using namespace Contacts::Groups::Model;
using namespace Contacts::List;
+using namespace Contacts::List::Model;
-AddMembersItem::AddMembersItem(int groupId)
- : m_GroupId(groupId)
+AddMembersItem::AddMembersItem(std::vector<int> groupMembers)
+ : m_Members(std::move(groupMembers))
{
- m_Count = getMembersCount(m_GroupId);
+ m_Count = m_Members.size();
}
-const std::vector<int> &AddMembersItem::getMemberIdList() const
+const std::vector<int> &AddMembersItem::getMembers() const
{
- return m_ContactIdList;
+ return m_Members;
}
Elm_Genlist_Item_Class *AddMembersItem::getItemClass() const
return;
}
- MembersProvider *provider = new MembersProvider(m_GroupId, MembersProvider::ModeExclude);
- m_Count = getMembersCount(m_GroupId);
- elm_genlist_item_fields_update(getObjectItem(),
- PART_GROUP_ADD_MEMBERS_COUNTER, ELM_GENLIST_ITEM_FIELD_TEXT);
- m_ContactIdList.clear();
-
- ListView *view = new ListView(provider);
+ ListView *view = new ListView(FilterNone);
view->setSelectMode(Ux::SelectMulti);
view->setSectionVisibility(ListView::SectionFavorites, false);
view->setSelectCallback(std::bind(&AddMembersItem::onMembersSelected, this, view,
std::placeholders::_1));
-
+ view->setEmptyResultAllowed(true);
+
+ view->setFillFinishCallback([this, view] {
+ for (auto &&item : view->getSelectItems()) {
+ PersonItem &personItem = static_cast<PersonItem &>(*item);
+ int personId = personItem.getPerson().getId();
+ auto it = std::find_if(m_Members.begin(), m_Members.end(), [personId](int id) {
+ return personId == id;
+ });
+ if (it != m_Members.end()) {
+ personItem.setChecked(true);
+ }
+ }
+ });
navigator->navigateTo(view);
}
void AddMembersItem::addMembers(Ux::SelectResults results)
{
contacts_connect_on_thread();
+ m_Members.clear();
+
for (auto &&result : results) {
contacts_record_h record = nullptr;
contacts_db_get_record(_contacts_person._uri, result.value.id, &record);
- m_ContactIdList.push_back(getRecordInt(record, _contacts_person.display_contact_id));
+ m_Members.push_back(getRecordInt(record, _contacts_person.id));
contacts_record_destroy(record, true);
}
- m_Count += m_ContactIdList.size();
+ m_Count = m_Members.size();
contacts_disconnect_on_thread();
}
#include "Contacts/Groups/InputView.h"
#include "Contacts/Groups/AddMembersItem.h"
+#include "Contacts/Groups/Model/Queries.h"
#include "Contacts/Groups/NameItem.h"
#include "Contacts/Groups/RingtoneItem.h"
#include "GroupItemLayout.h"
#include "App/Path.h"
+#include "Common/Database/Queries.h"
+#include "Common/Database/RecordIterator.h"
#include "Common/Database/RecordUtils.h"
#include "Ui/Genlist.h"
#include "Utils/Callback.h"
+#include <algorithm>
#include <app_i18n.h>
#include <notification.h>
nameItem->setFilledCallback(std::bind(&InputView::onNameFilled, this, std::placeholders::_1));
m_Genlist->insert(nameItem);
- m_AddMembersItem = new AddMembersItem(m_Id);
+ getGroupMembers();
+ m_AddMembersItem = new AddMembersItem(m_GroupMembers);
m_Genlist->insert(m_AddMembersItem);
m_Genlist->insert(new RingtoneItem(m_Record));
if (!m_Id) {
contacts_db_insert_record(m_Record, &m_Id);
}
- for (auto &&contactId : m_AddMembersItem->getMemberIdList()) {
- contacts_group_add_contact(m_Id, contactId);
+
+ for (auto &&personId : m_AddMembersItem->getMembers()) {
+ auto it = std::find_if(m_GroupMembers.begin(), m_GroupMembers.end(), [personId](int id) {
+ return personId == id;
+ });
+
+ if (it != m_GroupMembers.end()) {
+ m_GroupMembers.erase(it);
+ } else {
+ contacts_list_h contacts = getPersonContacts(personId);
+ for (auto &&record : makeRange(contacts)) {
+ contacts_group_add_contact(m_Id, getRecordInt(record, _contacts_contact.id));
+ }
+ contacts_list_destroy(contacts, true);
+ }
+ }
+
+ for (auto &&personId : m_GroupMembers) {
+ contacts_list_h contacts = getPersonContacts(personId);
+ for (auto &&record : makeRange(contacts)) {
+ contacts_group_remove_contact(m_Id, getRecordInt(record, _contacts_contact.id));
+ }
+ contacts_list_destroy(contacts, true);
}
contacts_db_update_record(m_Record);
}
+
+void InputView::getGroupMembers()
+{
+ if (!m_Id) {
+ return;
+ }
+ m_GroupMembers.clear();
+
+ contacts_list_h list = nullptr;
+ contacts_query_h query = getMembersQuery(m_Id);
+ contacts_db_get_records_with_query(query, 0, 0, &list);
+
+ for (auto &&record : makeRange(list)) {
+ int personId = getRecordInt(record, _contacts_person_group_assigned.person_id);
+ auto it = std::find_if(m_GroupMembers.begin(), m_GroupMembers.end(), [personId](int id) {
+ return personId == id;
+ });
+ if (it == m_GroupMembers.end()) {
+ m_GroupMembers.push_back(personId);
+ }
+ }
+
+ contacts_list_destroy(list, true);
+ contacts_query_destroy(query);
+}
contacts_filter_create(_contacts_person._uri, &filter);
}
- if (m_Mode == ModeExclude) {
- contacts_filter_add_bool(filter, _contacts_person.is_favorite, false);
- contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
- }
-
contacts_filter_h membersFilter = nullptr;
contacts_filter_create(_contacts_person._uri, &membersFilter);
for (auto &&record : makeRange(membersList)) {
item->scrollTo();
}
elm_index_level_go(m_Index, 0);
+ if (m_OnFillFinished) {
+ m_OnFillFinished();
+ }
});
m_SearchProvider.setInsertCallback(std::bind(&ListView::onPersonInserted, this, _1));
m_PersonProvider->setUpdateFinishedCallback(std::bind(&ListView::onUpdateFinished, this));
}
+void ListView::setFillFinishCallback(FillFinishCallback callback)
+{
+ m_OnFillFinished = std::move(callback);
+}
+
void ListView::onDestroy()
{
for (auto &§ion : m_Sections) {