#include "Contacts/Groups/InputView.h"
#include "Contacts/Groups/Model/Group.h"
+#include "Common/Database/RecordIterator.h"
+#include "Common/Database/RecordUtils.h"
#include "Common/Strings.h"
+
#include "Ui/Genlist.h"
#include "Ui/GenGroupItem.h"
+#include "Ui/ListPopup.h"
#include "Ui/Menu.h"
#include "Ui/Navigator.h"
+#include "Ui/ProcessPopup.h"
+#include "Utils/Logger.h"
+#include "Utils/Thread.h"
+using namespace Common::Database;
using namespace Contacts::Groups;
using namespace Contacts::Groups::Model;
using namespace std::placeholders;
+using namespace Ui;
+using namespace Utils;
+using namespace Ux;
GroupsView::GroupsView()
: m_Genlist(nullptr), m_CreateItem(nullptr), m_GroupsItem(nullptr),
Evas_Object *GroupsView::onCreate(Evas_Object *parent)
{
- m_Genlist = new Ui::Genlist();
+ m_Genlist = new Genlist();
m_Genlist->create(parent);
- m_GroupsItem = new Ui::GenGroupItem("IDS_PB_OPT_GROUPS");
+ m_GroupsItem = new GenGroupItem("IDS_PB_OPT_GROUPS");
m_Genlist->insert(m_GroupsItem);
for (auto &&data : m_Provider.getDataList()) {
- insertItem(createItem(*static_cast<Group *>(data)));
+ GroupItem *groupItem = createItem(*static_cast<Group *>(data));
+ const char *name = groupItem->getGroup().getName();
+ if (safeCmp(name, "Co-workers") || safeCmp(name, "Family")
+ || safeCmp(name, "Friends")) {
+ m_MainItems.push_back(groupItem);
+ }
+ insertItem(groupItem);
}
updateCreateItem();
void GroupsView::onMenuPressed()
{
- if (getSelectMode() != Ux::SelectNone) {
+ if (getSelectMode() != SelectNone) {
return;
}
- Ui::Menu *menu = new Ui::Menu();
+ Menu *menu = new Menu();
menu->create(getEvasObject());
menu->addItem("IDS_PB_OPT_CREATE", [this] {
getNavigator()->navigateTo(new InputView());
});
+ if (m_GroupsItem->getItemCount() != m_MainItems.size()) {
+ menu->addItem("IDS_LOGS_OPT_DELETE", [this] {
+ setSelectMode(SelectMulti);
+ for (auto &&groupItem : m_MainItems) {
+ groupItem->pop();
+ groupItem->setExcluded(true);
+ }
+
+ setCancelCallback(std::bind(&GroupsView::onDeleteFinished, this));
+ setSelectCallback([this](SelectResults results) {
+ ListPopup *popup = new ListPopup();
+ popup->create(getEvasObject());
+ popup->setTitle("IDS_PB_HEADER_DELETE_GROUPS_ABB");
+
+ popup->addItem("IDS_PB_OPT_GROUPS_ONLY_ABB", (void *)false);
+ popup->addItem("IDS_PB_OPT_GROUPS_AND_MEMBERS_ABB", (void *)true);
+ popup->setSelectedCallback(std::bind(&GroupsView::onDeleteSelected,
+ this, std::move(results), _1));
+
+ return false;
+ });
+ });
+ }
+
menu->show();
}
-void GroupsView::onSelectAllInsert(Ui::GenItem *item)
+void GroupsView::onSelectAllInsert(GenItem *item)
{
- m_Genlist->insert(item, nullptr, nullptr, Ui::Genlist::After);
+ m_Genlist->insert(item, nullptr, nullptr, Genlist::After);
}
void GroupsView::updateCreateItem()
delete item;
}
-Ui::GenItem *GroupsView::getNextItem(Group &group)
+GenItem *GroupsView::getNextItem(Group &group)
{
for (auto &&item : *m_GroupsItem) {
GroupItem *groupItem = static_cast<GroupItem *>(item);
}
return m_CreateItem;
}
+
+bool GroupsView::onDeleteFinished()
+{
+ setSelectMode(SelectNone);
+ getPage()->setTitleVisibility(true);
+ setCancelCallback(nullptr);
+ setSelectCallback(nullptr);
+ for (auto &&groupItem : m_MainItems) {
+ groupItem->setExcluded(false);
+ m_GroupsItem->insertSubItem(groupItem, getNextItem(groupItem->getGroup()));
+ }
+
+ return false;
+}
+
+void GroupsView::onDeleteSelected(SelectResults results, void *data)
+{
+ bool shouldDeleteMembers = (bool)data;
+ auto popup = ProcessPopup::create(getEvasObject(), "IDS_PB_TPOP_PROCESSING_ING");
+ new Thread(std::bind(&GroupsView::deleteGroups, this, std::move(results), shouldDeleteMembers),
+ [this, popup] {
+ popup->close();
+ onDeleteFinished();
+ });
+}
+
+void GroupsView::deleteGroups(SelectResults results, bool shouldDeleteMembers)
+{
+ contacts_connect_on_thread();
+
+ std::vector<int> groupIds;
+ groupIds.reserve(results.size());
+ for (auto &&result : results) {
+ groupIds.push_back(static_cast<Group *>(result.value.data)->getId());
+ }
+
+ if (shouldDeleteMembers) {
+ deleteMembers(groupIds);
+ }
+ int err = contacts_db_delete_records(_contacts_group._uri, groupIds.data(), groupIds.size());
+ WARN_IF_ERR(err, "contacts_db_delete_records() failed.");
+
+ contacts_disconnect_on_thread();
+}
+
+void GroupsView::deleteMembers(const std::vector<int> &groupIds)
+{
+ contacts_filter_h filter = nullptr;
+ contacts_filter_create(_contacts_group_relation._uri, &filter);
+
+ for (auto &&id : groupIds) {
+ contacts_filter_add_int(filter, _contacts_group_relation.group_id,
+ CONTACTS_MATCH_EQUAL, id);
+ contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_OR);
+ }
+
+ contacts_query_h query = nullptr;
+ contacts_query_create(_contacts_group_relation._uri, &query);
+ contacts_query_set_filter(query, filter);
+ contacts_list_h list = nullptr;
+ int err = contacts_db_get_records_with_query(query, 0, 0, &list);
+ WARN_IF_ERR(err, "contacts_db_get_records_with_query() failed.");
+
+ std::vector<int> contactIds;
+ int count = 0;
+ contacts_list_get_count(list, &count);
+ contactIds.reserve(count);
+ for (auto &&record : makeRange(list)) {
+ contactIds.push_back(getRecordInt(record, _contacts_group_relation.contact_id));
+ }
+ err = contacts_db_delete_records(_contacts_contact._uri, contactIds.data(), contactIds.size());
+ WARN_IF_ERR(err, "contacts_db_delete_records() failed.");
+
+ contacts_filter_destroy(filter);
+ contacts_query_destroy(query);
+ contacts_list_destroy(list, true);
+}