TizenRefApp-5943 Implement Log Details update 81/63481/4
authorNataliia Kamyshna <n.kamyshna@samsung.com>
Thu, 24 Mar 2016 07:58:00 +0000 (09:58 +0200)
committerNataliia Kamyshna <n.kamyshna@samsung.com>
Fri, 25 Mar 2016 09:49:23 +0000 (11:49 +0200)
Change-Id: I5b8a4c9856b304b66fa0b3c354f83e53ce07f5f4
Signed-off-by: Nataliia Kamyshna <n.kamyshna@samsung.com>
12 files changed:
lib-common/inc/Contacts/SelectTypes.h
lib-common/inc/Contacts/SelectView.h
lib-common/src/Contacts/SelectView.cpp
lib-logs/inc/Logs/Details/BasicInfoItem.h
lib-logs/inc/Logs/Details/DetailsView.h
lib-logs/inc/Logs/Model/Log.h
lib-logs/inc/Logs/Model/LogGroup.h
lib-logs/src/Logs/Details/BasicInfoItem.cpp
lib-logs/src/Logs/Details/DetailsView.cpp
lib-logs/src/Logs/List/LogItem.cpp
lib-logs/src/Logs/Model/Log.cpp
lib-logs/src/Logs/Model/LogGroup.cpp

index e3d7273..4ad47b9 100644 (file)
@@ -59,6 +59,12 @@ namespace Contacts
         * @return Whether the component that provided the selection should be destroyed.
         */
        typedef std::function<bool(SelectResults)> SelectCallback;
+
+       /**
+        * @brief Callback to be called when cancel is pressed.
+        * @return Whether the component that provided the selection should be destroyed.
+        */
+       typedef std::function<bool()> CancelCallback;
 }
 
 #endif /* CONTACTS_SELECT_TYPES_H */
index 8c28f83..22ca477 100644 (file)
@@ -70,6 +70,12 @@ namespace Contacts
                void setSelectCallback(SelectCallback callback);
 
                /**
+                * @brief Set cancel callback.
+                * @param[in]   callback    Cancel callback
+                */
+               void setCancelCallback(CancelCallback callback);
+
+               /**
                 * @brief Set item check callback.
                 * @param[in]   callback    Check callback
                 */
@@ -192,6 +198,7 @@ namespace Contacts
                SelectMode m_SelectMode;
                SelectCallback m_OnSelected;
                CheckCallback m_OnChecked;
+               CancelCallback m_OnCanceled;
        };
 }
 
index dd8c051..d4e091d 100644 (file)
@@ -78,6 +78,11 @@ void SelectView::setSelectCallback(SelectCallback callback)
        m_OnSelected = std::move(callback);
 }
 
+void SelectView::setCancelCallback(CancelCallback callback)
+{
+       m_OnCanceled = std::move(callback);
+}
+
 void SelectView::setCheckCallback(CheckCallback callback)
 {
        m_OnChecked = std::move(callback);
@@ -343,5 +348,7 @@ void SelectView::onDonePressed(Evas_Object *button, void *eventInfo)
 
 void SelectView::onCancelPressed(Evas_Object *button, void *eventInfo)
 {
-       getPage()->close();
+       if (!m_OnCanceled || m_OnCanceled()) {
+               getPage()->close();
+       }
 }
index 22a187b..f41d75e 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "Ui/GenlistItem.h"
 #include "App/AppControl.h"
+#include "Logs/Model/LogGroup.h"
 
 namespace Logs
 {
@@ -49,6 +50,11 @@ namespace Logs
                        BasicInfoItem(Model::LogGroup *group);
 
                        /**
+                        * @brief Destroy basic info item.
+                        */
+                       virtual ~BasicInfoItem() override;
+
+                       /**
                         * @brief Set "back" button callback.
                         * @param[in]   callback    "back" button callback
                         */
@@ -89,11 +95,13 @@ namespace Logs
                        void onBackPressed(Evas_Object *button, void *eventInfo);
                        void onCreatePressed();
                        void onUpdatePressed();
+                       void onGroupChanged(int type);
 
                        Model::LogGroup *m_Group;
                        Model::Log *m_Log;
                        App::AppControl m_AppControl;
                        BackCallback m_OnBackPressed;
+                       Model::LogGroup::ChangeCbHandle m_GroupChangeCbHandle;
                };
        }
 }
index 4a2c8df..f8ab3fd 100644 (file)
@@ -19,6 +19,7 @@
 #define LOGS_DETAILS_DETAILS_VIEW_H
 
 #include "Contacts/SelectView.h"
+#include "Logs/Model/LogGroup.h"
 
 namespace Ui
 {
@@ -29,11 +30,16 @@ namespace Logs
 {
        namespace Model
        {
-               class LogGroup;
+               class Log;
+       }
+       namespace List
+       {
+               class LogGroupItem;
        }
        namespace Details
        {
                class BasicInfoItem;
+               class LogDetailItem;
 
                /**
                 * @brief Log details view.
@@ -48,20 +54,32 @@ namespace Logs
                        DetailsView(Model::LogGroup *group);
 
                private:
+                       virtual ~DetailsView() override;
                        virtual Evas_Object *onCreate(Evas_Object *parent) override;
                        virtual void onCreated() override;
+                       virtual bool onBackPressed() override;
+                       virtual void onMenuPressed() override;
+
                        virtual void onSelectModeChanged(Contacts::SelectMode selectMode) override;
                        virtual void onSelectAllInsert(Ui::GenlistItem *item) override;
-                       virtual void onMenuPressed() override;
 
                        void fillGenList();
                        void insertBasicInfoItem();
                        void insertLogGroupItem();
+                       void insertLogDetailItem(Model::Log *log);
                        void insertLogDetailItems();
 
+                       bool onSelected(Contacts::SelectResults results);
+                       bool onCanceled();
+                       void onGroupChanged(int type);
+                       void onLogAdded(Model::Log *log);
+                       void onLogRemoved(LogDetailItem *logItem);
+
                        Model::LogGroup *m_Group;
                        Ui::Genlist *m_Genlist;
                        BasicInfoItem *m_BasicInfoItem;
+                       List::LogGroupItem *m_GroupItem;
+                       Model::LogGroup::ChangeCbHandle m_GroupChangeCbHandle;
                };
        }
 }
index 49f6031..9cb71a1 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <contacts.h>
 #include <time.h>
+#include <functional>
 
 namespace Logs
 {
@@ -33,6 +34,12 @@ namespace Logs
                {
                public:
                        /**
+                        * @brief Callback to be called when log was removed to group.
+                        * @param[in]   log   Removed log
+                        */
+                       typedef std::function<void()> RemoveCallback;
+
+                       /**
                         * @brief Create log record
                         * @param[in]   record  Log record (_contact_person_phone_log)
                         */
@@ -42,6 +49,17 @@ namespace Logs
                        Log &operator=(const Log &log) = delete;
 
                        /**
+                        * @brief Set log remove callback.
+                        * @param[in]   callback    log remove callback
+                        */
+                       void setRemoveCallback(RemoveCallback callback);
+
+                       /**
+                        * @brief Unset log remove callback.
+                        */
+                       void unsetRemoveCallback();
+
+                       /**
                         * @return log name
                         */
                        const char *getName() const;
@@ -119,6 +137,7 @@ namespace Logs
                        contacts_record_h m_ContactRecord;
 
                        LogGroup *m_Group;
+                       RemoveCallback m_OnRemoved;
                };
        }
 }
index b280eb8..31b2252 100644 (file)
@@ -49,11 +49,27 @@ namespace Logs
                        typedef std::function<void(int)> ChangeCallback;
 
                        /**
+                        * @brief Callback to be called when log was added to group.
+                        * @param[in]   log   Added log
+                        */
+                       typedef std::function<void(Log *log)> LogAddCallback;
+
+               private:
+                       typedef std::list<ChangeCallback> ChangeCbs;
+
+               public:
+                       /**
                         * @brief List of logs.
                         */
                        typedef std::list<Log *> LogList;
 
                        /**
+                        * @brief Callback handle
+                        * @remark Used to remove callback
+                        */
+                       typedef ChangeCbs::const_iterator ChangeCbHandle;
+
+                       /**
                         * @brief Constructor
                         * @param[in]   log  Log to add
                         */
@@ -100,16 +116,18 @@ namespace Logs
                        void remove();
 
                        /**
-                        * @brief Set log changed callback
+                        * @brief Add log changed callback
                         * @remark Callback called when log is changed.
-                        * @param[in]    callback    Changed log callback
+                        * @param[in]   callback    Changed log callback
+                        * @return handle of change callback
                         */
-                       void setChangeCallback(ChangeCallback callback);
+                       ChangeCbHandle addChangeCallback(ChangeCallback callback);
 
                        /**
-                        * @brief Unset log change callback
+                        * @brief Remove log change callback
+                        * @param[in]   handle   Handle of change callback
                         */
-                       void unsetChangeCallback();
+                       void removeChangeCallback(ChangeCbHandle handle);
 
                        /**
                         * @brief Call log change callback
@@ -122,11 +140,22 @@ namespace Logs
                         */
                        void setChangedType(int type);
 
+                       /**
+                        * @brief Set log add callback.
+                        * @param[in]   callback    log add callback
+                        */
+                       void setLogAddCallback(LogAddCallback callback);
+
+                       /**
+                        * @brief Unset log add callback.
+                        */
+                       void unsetLogAddCallback();
+
                private:
                        LogList m_LogList;
-
-                       ChangeCallback m_ChangeCallback;
                        int m_ChangedType;
+                       ChangeCbs m_ChangeCbs;
+                       LogAddCallback m_OnLogAdded;
                };
        }
 }
index 6f2c29c..49f307d 100644 (file)
 
 using namespace Logs::Details;
 using namespace Logs::Model;
+using namespace std::placeholders;
 
 BasicInfoItem::BasicInfoItem(LogGroup *group)
        : m_Group(group)
 {
        m_Log = m_Group->getLogList().back();
+       m_GroupChangeCbHandle = m_Group->addChangeCallback(std::bind(&BasicInfoItem::onGroupChanged, this, _1));
+}
+
+BasicInfoItem::~BasicInfoItem()
+{
+       if (m_Group) {
+               m_Group->removeChangeCallback(m_GroupChangeCbHandle);
+       }
 }
 
 void BasicInfoItem::setBackCallback(BackCallback callback)
@@ -51,9 +60,8 @@ Elm_Genlist_Item_Class *BasicInfoItem::getItemClass() const
 
 char *BasicInfoItem::getText(Evas_Object *parent, const char *part)
 {
-       const char *name = m_Log->getName();
        if (isSavedLog() && strcmp(part, PART_NAME) == 0) {
-               return strdup(name);
+               return strdup(m_Log->getName());
        }
 
        return nullptr;
@@ -94,6 +102,7 @@ Evas_Object *BasicInfoItem::createBackButton(Evas_Object *parent)
 {
        Evas_Object *button = elm_button_add(parent);
        elm_object_style_set(button, "naviframe/back_btn/default");
+       evas_object_propagate_events_set(button, EINA_FALSE);
        evas_object_smart_callback_add(button, "clicked",
                        makeCallback(&BasicInfoItem::onBackPressed), this);
        return button;
@@ -151,3 +160,20 @@ void BasicInfoItem::onUpdatePressed()
        m_AppControl = App::requestContactEdit(0, m_Log->getNumber());
        m_AppControl.launch();
 }
+
+void BasicInfoItem::onGroupChanged(int type)
+{
+       if (type & LogGroup::ChangeRemoved) {
+               m_Group = nullptr;
+       } else {
+               m_Log = m_Group->getLogList().back();
+               if (type & LogGroup::ChangeName) {
+                       elm_genlist_item_fields_update(getObjectItem(), STATE_SAVED, ELM_GENLIST_ITEM_FIELD_STATE);
+                       elm_genlist_item_fields_update(getObjectItem(), PART_NAME, ELM_GENLIST_ITEM_FIELD_TEXT);
+                       elm_genlist_item_fields_update(getObjectItem(), PART_UNSAVED_BTNS, ELM_GENLIST_ITEM_FIELD_CONTENT);
+               }
+               if (type & LogGroup::ChangeImage) {
+                       elm_genlist_item_fields_update(getObjectItem(), PART_THUMBNAIL, ELM_GENLIST_ITEM_FIELD_CONTENT);
+               }
+       }
+}
index a2030d6..dc8bf1e 100644 (file)
 #include "Logs/Details/BasicInfoItem.h"
 #include "Logs/Details/LogDetailItem.h"
 #include "Logs/List/LogGroupItem.h"
-#include "Logs/Model/LogGroup.h"
 #include "Logs/Model/Log.h"
 #include "LogsDetailsItemLayout.h"
 
 #include "App/Path.h"
 #include "Ui/Genlist.h"
 #include "Ui/Menu.h"
-#include "Ui/Navigator.h"
+
+#include <algorithm>
 
 using namespace Logs::Model;
 using namespace Logs::Details;
 using namespace Logs::List;
 using namespace Contacts;
+using namespace std::placeholders;
 
 DetailsView::DetailsView(LogGroup *group)
-       : m_Group(group), m_Genlist(nullptr), m_BasicInfoItem(nullptr)
+       : m_Group(group), m_Genlist(nullptr), m_BasicInfoItem(nullptr), m_GroupItem(nullptr)
 {
+       setSelectCallback(std::bind(&DetailsView::onSelected, this, _1));
+       setCancelCallback(std::bind(&DetailsView::onCanceled, this));
+       m_Group->setLogAddCallback(std::bind(&DetailsView::onLogAdded, this, _1));
+       m_GroupChangeCbHandle = m_Group->addChangeCallback(std::bind(&DetailsView::onGroupChanged, this, _1));
+}
+
+DetailsView::~DetailsView()
+{
+       if (m_Group) {
+               for (auto &log : m_Group->getLogList()) {
+                       log->unsetRemoveCallback();
+               }
+               m_Group->unsetLogAddCallback();
+               m_Group->removeChangeCallback(m_GroupChangeCbHandle);
+       }
 }
 
 Evas_Object *DetailsView::onCreate(Evas_Object *parent)
@@ -51,19 +67,13 @@ void DetailsView::onCreated()
        fillGenList();
 }
 
-void DetailsView::onSelectModeChanged(SelectMode selectMode)
+bool DetailsView::onBackPressed()
 {
-       if (getSelectMode() == SelectNone) {
-               insertBasicInfoItem();
-       } else if (m_BasicInfoItem) {
-               delete m_BasicInfoItem;
-               m_BasicInfoItem = nullptr;
+       if (getSelectMode() != SelectNone) {
+               setSelectMode(SelectNone);
+               return false;
        }
-}
-
-void DetailsView::onSelectAllInsert(Ui::GenlistItem *item)
-{
-       m_Genlist->insert(item, nullptr, nullptr, Ui::Genlist::After);
+       return true;
 }
 
 void DetailsView::onMenuPressed()
@@ -74,22 +84,27 @@ void DetailsView::onMenuPressed()
 
        Ui::Menu *menu = new Ui::Menu();
        menu->create(getEvasObject());
-
        menu->addItem("IDS_LOGS_OPT_DELETE", [this] {
-               DetailsView *view = new DetailsView(m_Group);
-               view->setSelectMode(SelectMulti);
-               view->setSelectCallback([](SelectResults results) {
-                       for (auto &&result : results) {
-                               Log *log = (Log *)result.value.data;
-                               log->remove();
-                       }
-                       return true;
-               });
-               getNavigator()->navigateTo(view);
+               setSelectMode(SelectMulti);
        });
        menu->show();
 }
 
+void DetailsView::onSelectModeChanged(SelectMode selectMode)
+{
+       if (getSelectMode() == SelectNone) {
+               insertBasicInfoItem();
+       } else if (m_BasicInfoItem) {
+               delete m_BasicInfoItem;
+               m_BasicInfoItem = nullptr;
+       }
+}
+
+void DetailsView::onSelectAllInsert(Ui::GenlistItem *item)
+{
+       m_Genlist->insert(item, nullptr, nullptr, Ui::Genlist::After);
+}
+
 void DetailsView::fillGenList()
 {
        if (getSelectMode() == SelectNone) {
@@ -111,16 +126,57 @@ void DetailsView::insertBasicInfoItem()
 void DetailsView::insertLogGroupItem()
 {
        Log *log = m_Group->getLogList().back();
-       LogGroupItem *groupItem = new LogGroupItem(log->getTime());
-       m_Genlist->insert(groupItem);
-       elm_genlist_item_select_mode_set(groupItem->getObjectItem(), ELM_OBJECT_SELECT_MODE_NONE);
+       m_GroupItem = new LogGroupItem(log->getTime());
+       m_Genlist->insert(m_GroupItem);
+       elm_genlist_item_select_mode_set(m_GroupItem->getObjectItem(), ELM_OBJECT_SELECT_MODE_NONE);
+}
+
+void DetailsView::insertLogDetailItem(Log *log)
+{
+       LogDetailItem *logItem = new LogDetailItem(log);
+       m_Genlist->insert(logItem, m_GroupItem, m_GroupItem, Ui::Genlist::After);
+       log->setRemoveCallback(std::bind(&DetailsView::onLogRemoved, this, logItem));
+       onItemInserted(logItem);
 }
 
 void DetailsView::insertLogDetailItems()
 {
-       for (auto &log:m_Group->getLogList()) {
-               LogDetailItem *logItem = new LogDetailItem(log);
-               m_Genlist->insert(logItem);
-               onItemInserted(logItem);
+       for (auto &log : m_Group->getLogList()) {
+               insertLogDetailItem(log);
        }
 }
+
+bool DetailsView::onSelected(SelectResults results)
+{
+       for (auto &&result : results) {
+               Log *log = (Log *)result.value.data;
+               log->remove();
+       }
+       setSelectMode(SelectNone);
+       return false;
+}
+
+bool DetailsView::onCanceled()
+{
+       setSelectMode(SelectNone);
+       return false;
+}
+
+void DetailsView::onGroupChanged(int type)
+{
+       if (type & LogGroup::ChangeRemoved) {
+               getPage()->close();
+               m_Group = nullptr;
+       }
+}
+
+void DetailsView::onLogAdded(Log *log)
+{
+       insertLogDetailItem(log);
+}
+
+void DetailsView::onLogRemoved(LogDetailItem *logItem)
+{
+       onItemRemove(logItem);
+       delete logItem;
+}
index aff6a37..3f459ce 100644 (file)
@@ -215,7 +215,7 @@ void LogItem::updateItem(int type)
 
 void LogItem::setUpdateCallback()
 {
-       m_Group->setChangeCallback([this](int type){
+       m_Group->addChangeCallback([this](int type){
                if (type & LogGroup::ChangeRemoved) {
                        if (m_OnDelete) {
                                m_OnDelete(this);
index 8011863..d7dd9a6 100644 (file)
@@ -31,12 +31,25 @@ Log::~Log()
        if (m_Group) {
                m_Group->removeLog(this);
        }
+       if (m_OnRemoved) {
+               m_OnRemoved();
+       }
        contacts_record_destroy(m_LogRecord, true);
        if (m_ContactRecord) {
                contacts_record_destroy(m_ContactRecord, true);
        }
 }
 
+void Log::setRemoveCallback(RemoveCallback callback)
+{
+       m_OnRemoved = std::move(callback);
+}
+
+void Log::unsetRemoveCallback()
+{
+       m_OnRemoved = nullptr;
+}
+
 const char *Log::getName() const
 {
        char *name = nullptr;
index f4a693b..88a4015 100644 (file)
@@ -51,6 +51,9 @@ void LogGroup::addLog(Log *log)
        setChangedType(ChangeCount);
        m_LogList.push_back(log);
        log->setLogGroup(this);
+       if (m_OnLogAdded) {
+               m_OnLogAdded(log);
+       }
 }
 
 void LogGroup::removeLog(Log *log)
@@ -72,25 +75,27 @@ void LogGroup::remove()
        }
 }
 
-void LogGroup::setChangeCallback(ChangeCallback callback)
+LogGroup::ChangeCbHandle LogGroup::addChangeCallback(ChangeCallback callback)
 {
-       m_ChangeCallback = std::move(callback);
+       m_ChangeCbs.push_back(std::move(callback));
+       return --m_ChangeCbs.cend();
 }
 
-void LogGroup::unsetChangeCallback()
+void LogGroup::removeChangeCallback(ChangeCbHandle handle)
 {
-       m_ChangeCallback = nullptr;
+       m_ChangeCbs.erase(handle);
 }
 
 void LogGroup::onChange()
 {
-       if (m_ChangeCallback) {
+       if (!m_ChangeCbs.empty()) {
                if (m_ChangedType != ChangeNone) {
                        if (m_LogList.empty()) {
                                m_ChangedType = ChangeRemoved;
                        }
-
-                       m_ChangeCallback(m_ChangedType);
+                       for (auto &changeCb : m_ChangeCbs) {
+                               changeCb(m_ChangedType);
+                       }
                        m_ChangedType = ChangeNone;
                }
        }
@@ -98,7 +103,17 @@ void LogGroup::onChange()
 
 void LogGroup::setChangedType(int type)
 {
-       if (m_ChangeCallback) {
+       if (!m_ChangeCbs.empty()) {
                m_ChangedType |= type;
        }
 }
+
+void LogGroup::setLogAddCallback(LogAddCallback callback)
+{
+       m_OnLogAdded = std::move(callback);
+}
+
+void LogGroup::unsetLogAddCallback()
+{
+       m_OnLogAdded = nullptr;
+}