TizenRefApp-6685 Implement menu in the Group's members list view 34/81034/5
authorNataliia Sydorchuk <n.sydorchuk@samsung.com>
Wed, 3 Aug 2016 08:51:51 +0000 (11:51 +0300)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Wed, 3 Aug 2016 11:32:04 +0000 (04:32 -0700)
Change-Id: I0d23c0c76dada63f5ea14d28b99af1ef36e37836
Signed-off-by: Nataliia Sydorchuk <n.sydorchuk@samsung.com>
19 files changed:
lib-apps-common/inc/App/AppControlRequest.h
lib-apps-common/src/App/AppControlRequest.cpp
lib-apps-common/src/Ui/NavigatorPage.cpp
lib-contacts/inc/Contacts/Groups/InputView.h
lib-contacts/inc/Contacts/Groups/MembersListView.h
lib-contacts/inc/Contacts/Groups/Model/MembersProvider.h
lib-contacts/inc/Contacts/Groups/NameItem.h
lib-contacts/inc/Contacts/Groups/RingtoneItem.h
lib-contacts/inc/Contacts/List/ListView.h
lib-contacts/src/Contacts/Groups/AddMembersItem.cpp
lib-contacts/src/Contacts/Groups/GroupItem.cpp
lib-contacts/src/Contacts/Groups/GroupsView.cpp
lib-contacts/src/Contacts/Groups/InputView.cpp
lib-contacts/src/Contacts/Groups/MembersListView.cpp
lib-contacts/src/Contacts/Groups/Model/MembersProvider.cpp
lib-contacts/src/Contacts/Groups/NameItem.cpp
lib-contacts/src/Contacts/Groups/RingtoneItem.cpp
lib-contacts/src/Contacts/List/ListView.cpp
lib-phone/src/Phone/Dialer/DialerView.cpp

index 2cf9354..182b25f 100644 (file)
@@ -19,6 +19,8 @@
 #define APP_APP_CONTROL_REQUEST_H
 
 #include "App/AppControl.h"
+#include "Utils/Range.h"
+
 #include <string>
 #include <vector>
 
@@ -87,14 +89,25 @@ namespace App
        AppControl EXPORT_API requestCallSettings();
 
        /**
-        * @brief Request message composer
-        * @param[in]   scheme      URI scheme (e.g. sms:, mmsto: or mailto:)
-        * @param[in]   to          Message recipient
-        * @param[in]   subject     Message subject
-        * @param[in]   text        Message text
+        * @brief Request message or email composer for single recipient.
+        * @param[in]   scheme      URI scheme (e.g. sms: or mmsto: for message, mailto: for email)
+        * @param[in]   to          Recipient
+        * @param[in]   subject     Subject
+        * @param[in]   text        Text
+        * @return AppControl wrapper
+        */
+       AppControl EXPORT_API requestComposer(const char *scheme, const char *to,
+                       const char *subject = nullptr, const char *text = nullptr);
+
+       /**
+        * @brief Request message or email composer for multiple recipients.
+        * @param[in]   scheme      URI scheme (e.g. sms: or mmsto: for message, mailto: for email)
+        * @param[in]   recipients  Multiple recipients
+        * @param[in]   subject     Subject
+        * @param[in]   text        Text
         * @return AppControl wrapper
         */
-       AppControl EXPORT_API requestMessageComposer(const char *scheme, const char *to,
+       AppControl EXPORT_API requestComposer(const char *scheme, Utils::Range<const char **> recipients,
                        const char *subject = nullptr, const char *text = nullptr);
 
        /**
index e873283..cc5b28e 100644 (file)
@@ -64,16 +64,27 @@ AppControl App::requestCallSettings()
        return AppControl(APP_CONTROL_OPERATION_SETTING_CALL, nullptr);
 }
 
-AppControl App::requestMessageComposer(const char *scheme, const char *to,
+AppControl App::requestComposer(const char *scheme, const char *to,
                const char *subject, const char *text)
 {
-       AppControl request(APP_CONTROL_OPERATION_COMPOSE, nullptr,
-                       std::string(scheme).append(to).c_str());
+       std::string uri = scheme;
+       if (to) {
+               uri.append(to);
+       }
+       AppControl request(APP_CONTROL_OPERATION_COMPOSE, nullptr, uri.c_str());
        request.addExtra(APP_CONTROL_DATA_TITLE, subject);
        request.addExtra(APP_CONTROL_DATA_TEXT, text);
        return request;
 }
 
+AppControl App::requestComposer(const char *scheme, Utils::Range<const char **> recipients,
+               const char *subject, const char *text)
+{
+       AppControl request = requestComposer(scheme, nullptr, subject, text);
+       request.addExtra(APP_CONTROL_DATA_TO, recipients.begin(), recipients.count());
+       return request;
+}
+
 AppControl App::requestCameraImage()
 {
        return AppControl(APP_CONTROL_OPERATION_CREATE_CONTENT, APP_CONTROL_MIME_IMAGE);
index 7225d7b..70a4614 100644 (file)
@@ -45,7 +45,7 @@ View *NavigatorPage::getView() const
 void NavigatorPage::setExpanded(bool isExpanded)
 {
        setTitleVisibility(isExpanded);
-       if (m_Navigator) {
+       if (m_Navigator && m_Navigator->getPage()) {
                m_Navigator->getPage()->setTitleVisibility(!isExpanded);
        }
 }
index 2e38209..e13bda2 100644 (file)
@@ -32,8 +32,6 @@ namespace Contacts
        namespace Groups
        {
                class AddMembersItem;
-               class NameItem;
-               class RingtoneItem;
 
                namespace Model
                {
@@ -73,8 +71,6 @@ namespace Contacts
                        Ui::Genlist *m_Genlist;
 
                        AddMembersItem *m_AddMembersItem;
-                       NameItem *m_NameItem;
-                       RingtoneItem *m_RingtoneItem;
                };
        }
 }
index d931413..78180e7 100644 (file)
@@ -24,6 +24,11 @@ namespace Contacts
 {
        namespace Groups
        {
+               namespace Model
+               {
+                       class MembersProvider;
+               }
+
                /**
                 * @brief Group members list view.
                 */
@@ -33,16 +38,35 @@ namespace Contacts
                        /**
                         * @brief Create members list view.
                         * @param[in]   groupId     Group id
+                        * @param[in]   provider    Group provider
                         */
-                       MembersListView(int groupId);
+                       MembersListView(int groupId, Model::MembersProvider *provider);
 
                private:
+                       enum EditType {
+                               EditAdd,
+                               EditRemove,
+                       };
+
+                       enum ComposerType {
+                               ComposerMessage,
+                               ComposerEmail
+                       };
+
                        virtual void onPageAttached(Ui::NavigatorPage *page) override;
                        virtual void onMenuPressed() override;
                        virtual void onUpdateFinished() override;
 
                        std::string getTitle() const;
 
+                       void onAddSelected();
+                       void onRemoveSelected();
+                       bool onRemoveFinished();
+
+                       void onMembersSelected(Ux::SelectResults results, EditType type);
+                       void onSendSelected(ComposerType composerType);
+                       bool onRecipientsSelected(Ux::SelectResults results, ComposerType type);
+
                        int m_GroupId;
                };
        }
index fcb99b1..61cf15d 100644 (file)
@@ -45,8 +45,10 @@ namespace Contacts
                                 * @brief Constructor.
                                 * @param[in]   groupId     Group id
                                 * @param[in]   mode        Members mode
+                                * @param[in]   type        Fiter type
                                 */
-                               explicit MembersProvider(int groupId, Mode mode = ModeDefault);
+                               explicit MembersProvider(int groupId, Mode mode = ModeDefault,
+                                               int type = FilterNone);
                                virtual ~MembersProvider() override;
 
                        private:
@@ -56,12 +58,10 @@ namespace Contacts
 
                                contacts_list_h getMembersList() const;
 
-                               void onChanged(const char *uri);
                                void onGroupChanged(const char *uri);
 
                                int m_GroupId;
                                Mode m_Mode;
-                               int m_DbVersion;
                                int m_GroupDbVersion;
                        };
                }
index 9c53a31..1f0a67e 100644 (file)
@@ -20,7 +20,7 @@
 
 #include "Ui/GenItem.h"
 
-#include <string>
+#include <contacts.h>
 
 namespace Ui
 {
@@ -42,9 +42,9 @@ namespace Contacts
 
                        /**
                         * @brief Genlist item representing group's name item
-                        * @param[in]   name    value that will be set to entry
+                        * @param[in]   record  Group's record
                         */
-                       NameItem(std::string name = "");
+                       NameItem(contacts_record_h record);
 
                        /**
                         * @brief Set item filled callback.
@@ -52,11 +52,6 @@ namespace Contacts
                         */
                        void setFilledCallback(FilledCallback callback);
 
-                       /**
-                        * @return group name
-                        */
-                       const std::string &getName() const;
-
                private:
                        virtual Elm_Genlist_Item_Class *getItemClass() const override;
                        virtual char *getText(Evas_Object *parent, const char *part) override;
@@ -65,7 +60,7 @@ namespace Contacts
 
                        void onChanged(Evas_Object *entry, void *eventInfo);
 
-                       std::string m_Name;
+                       contacts_record_h m_Record;
                        FilledCallback m_OnFilled;
                };
        }
index 7de4ab7..5dda5ee 100644 (file)
@@ -22,7 +22,7 @@
 
 #include "App/AppControl.h"
 
-#include <string>
+#include <contacts.h>
 
 namespace Contacts
 {
@@ -35,9 +35,10 @@ namespace Contacts
                {
                public:
                        /**
-                        * @return ringtone path
+                        * @brief Create group's ringtone item
+                        * @param[in]   record  Group's record
                         */
-                       const std::string &getPath() const;
+                       RingtoneItem(contacts_record_h record);
 
                private:
                        virtual Elm_Genlist_Item_Class *getItemClass() const override;
@@ -50,7 +51,7 @@ namespace Contacts
                                        app_control_result_e result);
 
                        App::AppControl m_AppControl;
-                       std::string m_Path;
+                       contacts_record_h m_Record;
                };
        }
 }
index 81fab36..f880ee2 100644 (file)
@@ -87,7 +87,7 @@ namespace Contacts
                        void setAddButtonVisibility(bool isVisible);
 
                        /**
-                        * @brief Set help text for no content layout.
+                        * @brief Set help text for no content layout
                         * @param[in]   text    Help text
                         */
                        void setNoContentHelpText(const char *text);
@@ -96,10 +96,15 @@ namespace Contacts
                        Model::PersonProvider *getProvider() const;
 
                        /**
-                        * @brief Called when updating is finished.
+                        * @brief Called when updating is finished
                         */
                        virtual void onUpdateFinished();
 
+                       /**
+                        * @return True if list is empty, false - otherwise
+                        */
+                       bool isListEmpty();
+
                private:
                        struct Section
                        {
index fd20277..447d96f 100644 (file)
@@ -38,8 +38,9 @@ using namespace Contacts::Groups::Model;
 using namespace Contacts::List;
 
 AddMembersItem::AddMembersItem(int groupId)
-       : m_GroupId(groupId), m_Count(0)
+       : m_GroupId(groupId)
 {
+       m_Count = getMembersCount(m_GroupId);
 }
 
 const std::vector<int> &AddMembersItem::getMemberIdList() const
index 19da911..99255ca 100644 (file)
@@ -19,9 +19,9 @@
 
 #include "Contacts/Groups/MembersListView.h"
 #include "Contacts/Groups/Model/Queries.h"
+#include "Contacts/Groups/Model/MembersProvider.h"
 
 #include "Ui/Navigator.h"
-#include "Utils/Logger.h"
 
 #define BUFFER_SIZE 1024
 
@@ -81,5 +81,6 @@ void GroupItem::onSelected()
                return;
        }
 
-       navigator->navigateTo(new MembersListView(m_Group.getId()));
+       navigator->navigateTo(new MembersListView(m_Group.getId(),
+                       new MembersProvider(m_Group.getId())));
 }
index 9c1e84d..074e8e2 100644 (file)
@@ -140,6 +140,8 @@ void GroupsView::updateItem(GroupItem *item, int changes)
        if (changes & Group::ChangedName) {
                item->pop();
                insertItem(item);
+       } else {
+               item->update(changes);
        }
 }
 
index 7bb2659..70d6dc8 100644 (file)
 
 #include "Contacts/Groups/InputView.h"
 
-#include "Common/Database/RecordIterator.h"
-#include "Common/Database/RecordUtils.h"
 #include "Contacts/Groups/AddMembersItem.h"
 #include "Contacts/Groups/NameItem.h"
 #include "Contacts/Groups/RingtoneItem.h"
 #include "GroupItemLayout.h"
 
 #include "App/Path.h"
+#include "Common/Database/RecordUtils.h"
 #include "Ui/Genlist.h"
 #include "Utils/Callback.h"
 
 #include <app_i18n.h>
 #include <notification.h>
 
+using namespace Common::Database;
 using namespace Contacts::Groups;
 using namespace Contacts::Groups::Model;
-using namespace Common::Database;
 
 InputView::InputView(int id)
        : m_Id(id), m_CancelButton(nullptr), m_DoneButton(nullptr), m_Genlist(nullptr),
-         m_AddMembersItem(nullptr), m_NameItem(nullptr), m_RingtoneItem(nullptr)
+         m_AddMembersItem(nullptr)
 {
        if (m_Id) {
                contacts_db_get_record(_contacts_group._uri, m_Id, &m_Record);
@@ -57,15 +56,14 @@ Evas_Object *InputView::onCreate(Evas_Object *parent)
        m_Genlist = new Ui::Genlist();
        m_Genlist->create(parent);
 
-       m_NameItem = new NameItem();
-       m_NameItem->setFilledCallback(std::bind(&InputView::onNameFilled, this, std::placeholders::_1));
-       m_Genlist->insert(m_NameItem);
+       NameItem *nameItem = new NameItem(m_Record);
+       nameItem->setFilledCallback(std::bind(&InputView::onNameFilled, this, std::placeholders::_1));
+       m_Genlist->insert(nameItem);
 
        m_AddMembersItem = new AddMembersItem(m_Id);
        m_Genlist->insert(m_AddMembersItem);
 
-       m_RingtoneItem = new RingtoneItem();
-       m_Genlist->insert(m_RingtoneItem);
+       m_Genlist->insert(new RingtoneItem(m_Record));
 
        return m_Genlist->getEvasObject();
 }
@@ -121,7 +119,12 @@ bool InputView::isAlreadyExists()
        contacts_filter_h filter = nullptr;
        contacts_filter_create(_contacts_group._uri, &filter);
        contacts_filter_add_str(filter, _contacts_group.name,
-                       CONTACTS_MATCH_EXACTLY, m_NameItem->getName().c_str());
+                       CONTACTS_MATCH_EXACTLY, getRecordStr(m_Record, _contacts_group.name));
+
+       if (m_Id) {
+               contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
+               contacts_filter_add_int(filter, _contacts_group.id, CONTACTS_MATCH_NOT_EQUAL, m_Id);
+       }
 
        contacts_query_h query = nullptr;
        contacts_query_create(_contacts_group._uri, &query);
@@ -131,22 +134,17 @@ bool InputView::isAlreadyExists()
        int count = 0;
        contacts_db_get_count_with_query(query, &count);
        contacts_query_destroy(query);
+
        return count != 0;
 }
 
 void InputView::save()
 {
-       contacts_record_set_str(m_Record, _contacts_group.name,
-                       m_NameItem->getName().c_str());
-       contacts_record_set_str(m_Record, _contacts_group.ringtone_path,
-                       m_RingtoneItem->getPath().c_str());
-
        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 &&contactId : m_AddMembersItem->getMemberIdList()) {
+               contacts_group_add_contact(m_Id, contactId);
        }
 
        contacts_db_update_record(m_Record);
index a3cc623..6a67066 100644 (file)
 
 #include "Contacts/Groups/MembersListView.h"
 
-#include "Contacts/Groups/Model/Queries.h"
+#include "Contacts/Common/ContactSelectTypes.h"
+#include "Contacts/Groups/InputView.h"
 #include "Contacts/Groups/Model/MembersProvider.h"
 
+#include "App/AppControlRequest.h"
 #include "Common/Database/RecordUtils.h"
+#include "Ui/Menu.h"
+#include "Ui/Navigator.h"
+#include "Ui/ProcessPopup.h"
+#include "Utils/Thread.h"
 
 #define BUFFER_SIZE 1024
 
+using namespace Common::Database;
 using namespace Contacts::Groups;
+using namespace Contacts::Groups::Model;
 using namespace Contacts::List;
+using namespace Ui;
+using namespace Ux;
+using namespace std::placeholders;
 
-MembersListView::MembersListView(int groupId)
-       : ListView(new Model::MembersProvider(groupId)), m_GroupId(groupId)
+namespace
+{
+       struct ComposerData {
+               int type;
+               contacts_person_property_e propertyType;
+               const char *uri;
+               unsigned int propertyId;
+               const char *scheme;
+       } composerData[] = {
+               /*ComposerMessage = */ { Contacts::FilterNumber, CONTACTS_PERSON_PROPERTY_NUMBER,
+                               _contacts_number._uri, _contacts_number.number, "sms:" },
+               /*ComposerEmail   = */ { Contacts::FilterEmail, CONTACTS_PERSON_PROPERTY_EMAIL,
+                               _contacts_email._uri, _contacts_email.email, "mailto:" }
+       };
+}
+
+MembersListView::MembersListView(int groupId, Model::MembersProvider *provider)
+       : ListView(provider), m_GroupId(groupId)
 {
        setAddButtonVisibility(false);
        setNoContentHelpText("IDS_PB_BODY_AFTER_YOU_ADD_CONTACTS_THEY_WILL_BE_SHOWN_HERE");
@@ -37,22 +64,47 @@ MembersListView::MembersListView(int groupId)
        }
 }
 
-void MembersListView::onPageAttached(Ui::NavigatorPage *page)
+void MembersListView::onPageAttached(NavigatorPage *page)
 {
-       if (getSelectMode() == Ux::SelectNone) {
+       if (getSelectMode() == SelectNone) {
                page->setTitle(getTitle().c_str());
+       } else {
+               SelectView::onPageAttached(page);
        }
 }
 
 void MembersListView::onMenuPressed()
 {
+       if (getSelectMode() != SelectNone) {
+               return;
+       }
+
+       Menu *menu = new Menu();
+       menu->create(getEvasObject());
+
+       menu->addItem("IDS_PB_OPT_EDIT", [this] {
+               getNavigator()->navigateTo(new InputView(m_GroupId));
+       });
+
+       menu->addItem("IDS_PB_OPT_ADD", std::bind(&MembersListView::onAddSelected, this));
+
+       if (!isListEmpty()) {
+               menu->addItem("IDS_PB_OPT_REMOVE",
+                               std::bind(&MembersListView::onRemoveSelected, this));
+               menu->addItem("IDS_PB_OPT_SEND_MESSAGE_ABB2",
+                               std::bind(&MembersListView::onSendSelected, this, ComposerMessage));
+               menu->addItem("IDS_PB_OPT_SEND_EMAIL",
+                               std::bind(&MembersListView::onSendSelected, this, ComposerEmail));
+       }
+
+       menu->show();
 }
 
 void MembersListView::onUpdateFinished()
 {
        ListView::onUpdateFinished();
 
-       if (getSelectMode() == Ux::SelectNone) {
+       if (getSelectMode() == SelectNone) {
                getPage()->setTitle(getTitle().c_str());
        }
 }
@@ -61,7 +113,7 @@ std::string MembersListView::getTitle() const
 {
        contacts_record_h record = nullptr;
        contacts_db_get_record(_contacts_group._uri, m_GroupId, &record);
-       const char *name = Common::Database::getRecordStr(record, _contacts_group.name);
+       const char *name = getRecordStr(record, _contacts_group.name);
 
        char title[BUFFER_SIZE] = { 0, };
        int count = getProvider()->getDataList().size();
@@ -73,3 +125,112 @@ std::string MembersListView::getTitle() const
        contacts_record_destroy(record, true);
        return std::string(title);
 }
+
+void MembersListView::onAddSelected()
+{
+       ListView *view = new ListView(new Model::MembersProvider(m_GroupId,
+                       Model::MembersProvider::ModeExclude));
+       view->setSelectMode(SelectMulti);
+       view->setNoContentHelpText("");
+       view->setSectionVisibility(ListView::SectionFavorites, false);
+
+       view->setSelectCallback([this, view](SelectResults results) {
+               auto popup = ProcessPopup::create(view->getEvasObject(), "IDS_PB_TPOP_PROCESSING_ING");
+               new Utils::Thread(std::bind(&MembersListView::onMembersSelected, this, std::move(results), EditAdd),
+                               [view, popup] {
+                                       popup->close();
+                                       view->getPage()->close();
+                               });
+               return false;
+       });
+
+       getNavigator()->navigateTo(view);
+}
+
+void MembersListView::onRemoveSelected()
+{
+       setSelectMode(SelectMulti);
+       setCancelCallback(std::bind(&MembersListView::onRemoveFinished, this));
+
+       setSelectCallback([this](SelectResults results) {
+               auto popup = ProcessPopup::create(getEvasObject(), "IDS_PB_TPOP_PROCESSING_ING");
+               new Utils::Thread(std::bind(&MembersListView::onMembersSelected, this, std::move(results), EditRemove),
+                               [this, popup] {
+                                       popup->close();
+                                       onRemoveFinished();
+                               });
+               return false;
+       });
+}
+
+bool MembersListView::onRemoveFinished()
+{
+       setSelectMode(SelectNone);
+       getPage()->setTitleVisibility(true);
+       getPage()->setTitle(getTitle().c_str());
+       setCancelCallback(nullptr);
+       setSelectCallback(nullptr);
+       return false;
+}
+
+void MembersListView::onMembersSelected(SelectResults results, EditType type)
+{
+       contacts_connect_on_thread();
+       for (auto &&result : results) {
+               contacts_record_h record = nullptr;
+               contacts_db_get_record(_contacts_person._uri, result.value.id, &record);
+               if (type == EditAdd) {
+                       contacts_group_add_contact(m_GroupId, getRecordInt(record,
+                                       _contacts_person.display_contact_id));
+               } else {
+                       contacts_group_remove_contact(m_GroupId, getRecordInt(record,
+                                       _contacts_person.display_contact_id));
+               }
+               contacts_record_destroy(record, true);
+       }
+       contacts_disconnect_on_thread();
+}
+
+void MembersListView::onSendSelected(ComposerType composerType)
+{
+       MembersListView *view = new MembersListView(m_GroupId, new MembersProvider(m_GroupId,
+                       MembersProvider::ModeDefault, composerData[composerType].type));
+       view->setSelectMode(SelectMulti);
+       view->setNoContentHelpText("");
+       view->setSelectCallback(std::bind(&MembersListView::onRecipientsSelected,
+                       this, _1, composerType));
+
+       getNavigator()->navigateTo(view);
+}
+
+bool MembersListView::onRecipientsSelected(SelectResults results, ComposerType type)
+{
+       int length = results.size();
+       std::vector<std::string> recipientsString(length);
+       std::vector<const char *> recipients(length);
+
+       int index = 0;
+       for (auto &&result : results) {
+               int id = 0;
+               contacts_person_get_default_property(composerData[type].propertyType,
+                               result.value.id, &id);
+
+               contacts_record_h record = nullptr;
+               contacts_db_get_record(composerData[type].uri, id, &record);
+
+               if (const char *recipient = getRecordStr(record, composerData[type].propertyId)) {
+                       recipientsString[index] = recipient;
+                       recipients[index] = recipientsString[index].c_str();
+                       ++index;
+               }
+
+               contacts_record_destroy(record, true);
+       }
+
+       App::AppControl request = App::requestComposer(composerData[type].scheme,
+                       { recipients.data(), recipients.size() });
+       request.launch();
+       request.detach();
+
+       return true;
+}
index 4dc13f3..26808b7 100644 (file)
@@ -37,21 +37,16 @@ namespace
        };
 }
 
-MembersProvider::MembersProvider(int groupId, Mode mode)
-       : m_GroupId(groupId), m_Mode(mode)
+MembersProvider::MembersProvider(int groupId, Mode mode, int type)
+       : PersonProvider(type), m_GroupId(groupId), m_Mode(mode)
 {
-       contacts_db_get_current_version(&m_DbVersion);
-       m_GroupDbVersion = m_DbVersion;
-       contacts_db_add_changed_cb(_contacts_group_relation._uri,
-                       makeCallbackWithLastParam(&MembersProvider::onChanged), this);
+       contacts_db_get_current_version(&m_GroupDbVersion);
        contacts_db_add_changed_cb(_contacts_group._uri,
                        makeCallbackWithLastParam(&MembersProvider::onGroupChanged), this);
 }
 
 MembersProvider::~MembersProvider()
 {
-       contacts_db_remove_changed_cb(_contacts_group_relation._uri,
-                       makeCallbackWithLastParam(&MembersProvider::onChanged), this);
        contacts_db_remove_changed_cb(_contacts_group._uri,
                        makeCallbackWithLastParam(&MembersProvider::onGroupChanged), this);
 }
@@ -66,8 +61,13 @@ contacts_filter_h MembersProvider::getFilter() const
                return nullptr;
        }
 
-       contacts_filter_h filter = nullptr;
-       contacts_filter_create(_contacts_person._uri, &filter);
+       contacts_filter_h filter = PersonProvider::getFilter();
+       if (filter) {
+               contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
+       } else {
+               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);
@@ -144,41 +144,6 @@ contacts_list_h MembersProvider::getMembersList() const
        return list;
 }
 
-void MembersProvider::onChanged(const char *uri)
-{
-       contacts_list_h changes = nullptr;
-       contacts_db_get_changes_by_version(_contacts_grouprel_updated_info._uri, 0,
-                       m_DbVersion, &changes, &m_DbVersion);
-       bool isChanged = false;
-
-       for (auto &&record : makeRange(changes)) {
-               if (getRecordInt(record, _contacts_grouprel_updated_info.group_id) != m_GroupId) {
-                       continue;
-               }
-
-               int contactId = getRecordInt(record, _contacts_grouprel_updated_info.contact_id);
-               int changeType = getRecordInt(record, _contacts_grouprel_updated_info.type);
-               switch (changeType) {
-                       case CONTACTS_CHANGE_INSERTED:
-                               insertPerson(getPersonRecord(contactId, ContactId));
-                               break;
-
-                       case CONTACTS_CHANGE_DELETED:
-                               auto personIt = findPerson(contactId, ContactId);
-                               if (personIt != getDataList().end()) {
-                                       deletePerson(personIt);
-                               }
-                               break;
-               }
-               isChanged = true;
-       }
-       contacts_list_destroy(changes, true);
-
-       if (isChanged) {
-               onUpdateFinished();
-       }
-}
-
 void MembersProvider::onGroupChanged(const char *uri)
 {
        contacts_list_h changes = nullptr;
index c2685eb..6adb89a 100644 (file)
 
 #include "GroupItemLayout.h"
 
+#include "Common/Database/RecordUtils.h"
 #include "Ui/Editfield.h"
 #include "Utils/Callback.h"
 
 #include <app_i18n.h>
 
+using namespace Common::Database;
 using namespace Contacts::Groups;
 
-NameItem::NameItem(std::string name)
-       : m_Name(name)
+NameItem::NameItem(contacts_record_h record)
+       : m_Record(record)
 {
 }
 
-const std::string &NameItem::getName() const
-{
-       return m_Name;
-}
-
 void NameItem::setFilledCallback(FilledCallback callback)
 {
        m_OnFilled = std::move(callback);
@@ -59,7 +56,7 @@ Evas_Object *NameItem::getContent(Evas_Object *parent, const char *part)
 {
        if (strcmp(part, PART_GROUP_NAME_VALUE) == 0) {
                Ui::Editfield *edit = Ui::Editfield::create(parent, "IDS_PB_MBODY_GROUP_NAME_ABB");
-               char *name = elm_entry_utf8_to_markup(m_Name.c_str());
+               char *name = elm_entry_utf8_to_markup(getRecordStr(m_Record, _contacts_group.name));
                elm_entry_entry_set(edit->getEntry(), name);
                free(name);
                evas_object_smart_callback_add(edit->getEntry(), "changed",
@@ -77,7 +74,7 @@ void NameItem::onInserted()
 void NameItem::onChanged(Evas_Object *entry, void *eventInfo)
 {
        char *text = elm_entry_markup_to_utf8(elm_entry_entry_get(entry));
-       m_Name = text ? text : "";
+       contacts_record_set_str(m_Record, _contacts_group.name, text ? text : "");
        free(text);
 
        m_OnFilled(!elm_entry_is_empty(entry));
index 001c83b..017c228 100644 (file)
 #include "Contacts/Groups/RingtoneItem.h"
 
 #include "App/AppControlRequest.h"
+#include "Common/Database/RecordUtils.h"
 #include "Utils/Callback.h"
 #include "Utils/Logger.h"
 
 #include <app_i18n.h>
 #include <system_settings.h>
 
+using namespace Common::Database;
 using namespace Contacts::Groups;
 
-const std::string &RingtoneItem::getPath() const
+RingtoneItem::RingtoneItem(contacts_record_h record)
+       : m_Record(record)
 {
-       return m_Path;
 }
 
 Elm_Genlist_Item_Class *RingtoneItem::getItemClass() const
@@ -58,8 +60,9 @@ void RingtoneItem::onSelected()
 char *RingtoneItem::getRingtonePath() const
 {
        char *value = nullptr;
-       if (!m_Path.empty()) {
-               value = strdup(m_Path.c_str());
+       const char *path = getRecordStr(m_Record, _contacts_group.ringtone_path);
+       if (path) {
+               value = strdup(path);
        } else {
                char *defaultValue = nullptr;
                system_settings_get_value_string(SYSTEM_SETTINGS_KEY_INCOMING_CALL_RINGTONE, &defaultValue);
@@ -83,6 +86,6 @@ void RingtoneItem::onPickResult(app_control_h request, app_control_h reply,
        char *path = nullptr;
        int err = app_control_get_extra_data(reply, "result", &path);
        WARN_IF_ERR(err, "app_control_get_extra_data() failed.");
-       m_Path = path ? path : "";
+       contacts_record_set_str(m_Record, _contacts_group.ringtone_path, path ? path : "");
        free(path);
 }
index d8d2c79..d09ca96 100644 (file)
@@ -116,6 +116,11 @@ void ListView::onUpdateFinished()
        elm_index_level_go(m_Index, 0);
 }
 
+bool ListView::isListEmpty()
+{
+       return m_IsEmpty;
+}
+
 Evas_Object *ListView::onCreate(Evas_Object *parent)
 {
        Evas_Object *layout = elm_layout_add(parent);
index a89ae5f..46594d8 100644 (file)
@@ -124,7 +124,7 @@ void DialerView::onMenuPressed()
 
        if (!m_Entry->getNumber().empty()) {
                menu->addItem("IDS_KPD_OPT_SEND_MESSAGE_ABB", [this] {
-                       m_AppControl = App::requestMessageComposer("sms:", m_Entry->getNumber().c_str());
+                       m_AppControl = App::requestComposer("sms:", m_Entry->getNumber().c_str());
                        m_AppControl.launch();
                });
                menu->addItem("IDS_KPD_OPT_ADD_2_SECOND_PAUSE_ABB", [this] {