TizenRefApp-6688 Implement Remove group functionality 95/82495/3
authorNataliia Sydorchuk <n.sydorchuk@samsung.com>
Fri, 5 Aug 2016 11:29:18 +0000 (14:29 +0300)
committerNataliia Sydorchuk <n.sydorchuk@samsung.com>
Fri, 5 Aug 2016 11:29:18 +0000 (14:29 +0300)
Change-Id: Ib99c85ad0b15b5b63fa59f29c1f78e4e4c36bc02
Signed-off-by: Nataliia Sydorchuk <n.sydorchuk@samsung.com>
lib-contacts/inc/Contacts/Groups/GroupsView.h
lib-contacts/src/Contacts/Groups/GroupsView.cpp

index b730956..c697374 100644 (file)
@@ -21,6 +21,8 @@
 #include "Ux/SelectView.h"
 #include "Contacts/Groups/Model/GroupsProvider.h"
 
+#include <vector>
+
 namespace Ui
 {
        class Genlist;
@@ -67,10 +69,16 @@ namespace Contacts
                        void deleteItem(GroupItem *item);
                        Ui::GenItem *getNextItem(Model::Group &group);
 
+                       bool onDeleteFinished();
+                       void onDeleteSelected(Ux::SelectResults results, void *data);
+                       void deleteGroups(Ux::SelectResults results, bool shouldDeleteMembers);
+                       void deleteMembers(const std::vector<int> &groupIds);
+
                        Ui::Genlist *m_Genlist;
                        CreateGroupItem *m_CreateItem;
                        Model::GroupsProvider m_Provider;
                        Ui::GenGroupItem *m_GroupsItem;
+                       std::vector<GroupItem *> m_MainItems;
 
                        bool m_IsAssignMode;
                        int m_NewGroupId;
index 074e8e2..2a2b5d8 100644 (file)
 #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),
@@ -52,13 +63,19 @@ void GroupsView::setAssignMode(bool isEnabled)
 
 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();
@@ -67,23 +84,47 @@ Evas_Object *GroupsView::onCreate(Evas_Object *parent)
 
 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()
@@ -151,7 +192,7 @@ void GroupsView::deleteItem(GroupItem *item)
        delete item;
 }
 
-Ui::GenItem *GroupsView::getNextItem(Group &group)
+GenItem *GroupsView::getNextItem(Group &group)
 {
        for (auto &&item : *m_GroupsItem) {
                GroupItem *groupItem = static_cast<GroupItem *>(item);
@@ -161,3 +202,80 @@ Ui::GenItem *GroupsView::getNextItem(Group &group)
        }
        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);
+}