TizenRefApp-8159 Implement handling of memo update in Details View 26/119126/4
authorAleksandr Sapozhnik <a.sapozhnik@samsung.com>
Wed, 15 Mar 2017 14:16:22 +0000 (16:16 +0200)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Mon, 20 Mar 2017 14:44:45 +0000 (07:44 -0700)
Change-Id: I88cf0612ea830f1d57652567c9e20026f14263c8
Signed-off-by: Aleksandr Sapozhnik <a.sapozhnik@samsung.com>
lib-common/inc/Common/Model/Memo.h
lib-common/src/Common/Model/Memo.cpp
memo-app/inc/Input/DetailsView.h
memo-app/inc/Input/InputView.h
memo-app/src/Input/DetailsView.cpp
memo-app/src/Input/InputView.cpp

index 2485ebf6a288158bd1a66f42e3aab2a1dc34fff8..4459ce4ee4bd23fd37c7694066a535d481c7ea19 100644 (file)
@@ -23,8 +23,9 @@
 #include "Common/Model/Thumbnail.h"
 #include "Model/DataItem.h"
 
-#include <list>
 #include <ctime>
+#include <data_control_types.h>
+#include <list>
 
 #define MAX_IMAGE_COUNT 10
 
@@ -75,6 +76,9 @@ namespace Common
                        };
 
                        Memo();
+                       virtual ~Memo();
+                       Memo(const Memo &that) = default;
+                       Memo &operator=(const Memo &that) = default;
 
                        /**
                         * @brief Compare memos for equality.
@@ -213,22 +217,18 @@ namespace Common
                         */
                        bool isEmpty() const;
 
-               protected:
-
-                       /**
-                        * @see DataItem::onUpdate().
-                        */
-                       virtual int onUpdate(void *data) override;
-
                private:
                        bool compareSounds(const SoundRecordList &list) const;
                        bool compareImages(const ImageList &list) const;
                        int generateImageIndex();
                        void addSoundToRemove(SoundRecord sound);
                        void addImageToRemove(Image image);
-
                        void setThumbnail(Thumbnail thumbnail);
 
+                       virtual int onUpdate(void *data) override;
+                       virtual void onStandalone(bool isStandalone) override;
+                       void onDataChanged(int id, data_control_data_change_type_e type);
+
                        time_t m_Time;
                        std::string m_Title;
                        std::string m_Content;
index 11865b0cb752749303fd80e1336dfafb94c576d0..a5aacea21d9b58cc6a39559aa95f900a53841387 100644 (file)
  * limitations under the License.
  */
 
-#include <algorithm>
 #include "Common/Model/Memo.h"
+
+#include "Common/Model/MemoConsumer.h"
 #include "Common/Model/TextTool.h"
 #include "Utils/Logger.h"
 
 using namespace Common::Model;
+using namespace std::placeholders;
 
 Memo::Memo()
        : m_Time(0)
@@ -28,6 +30,11 @@ Memo::Memo()
 {
 }
 
+Memo::~Memo()
+{
+       MemoConsumer::getInstance().onDataItemChanged() -= this;
+}
+
 bool Memo::operator==(const Memo &other) const
 {
        return (getId() == other.getId() && m_Time == other.m_Time && m_Color == other.m_Color
@@ -202,6 +209,55 @@ bool Memo::isEmpty() const
                        && (m_SoundRecords.empty() || !m_SoundRecords.front().isExist()));
 }
 
+bool Memo::compareImages(const ImageList &list) const
+{
+       if (list.size() != m_Images.size()) {
+               return false;
+       }
+
+       auto left = list.begin();
+       auto right = m_Images.begin();
+       for (; left != list.end(); ++left, ++right) {
+               if (left != right) {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+bool Memo::compareSounds(const SoundRecordList &list) const
+{
+       return ((m_SoundRecords.empty() && list.empty())
+                       || (!m_SoundRecords.empty() && !list.empty() &&
+                               m_SoundRecords.front().getPath() == list.front().getPath()));
+}
+
+int Memo::generateImageIndex()
+{
+       for (int i = 0; i < MAX_IMAGE_COUNT; i++) {
+               if (!getImage(i)) {
+                       return i;
+               }
+       }
+       return DEFAULT_IMAGE_INDEX;
+}
+
+void Memo::addSoundToRemove(SoundRecord sound)
+{
+       m_SoundRecordsToRemove.push_back(std::move(sound));
+}
+
+void Memo::addImageToRemove(Image image)
+{
+       m_ImagesToRemove.push_back(std::move(image));
+}
+
+void Memo::setThumbnail(Thumbnail thumbnail)
+{
+       m_Thumbnail = std::move(thumbnail);
+}
+
 int Memo::onUpdate(void *data)
 {
        auto memo = (Memo *)data;
@@ -243,51 +299,27 @@ int Memo::onUpdate(void *data)
        return changes;
 }
 
-bool Memo::compareImages(const ImageList &list) const
+void Memo::onStandalone(bool isStandalone)
 {
-       if (list.size() != m_Images.size()) {
-               return false;
-       }
-
-       auto left = list.begin();
-       auto right = m_Images.begin();
-       for (; left != list.end(); ++left, ++right) {
-               if (left != right) {
-                       return false;
-               }
+       if (isStandalone) {
+               MemoConsumer::getInstance().onDataItemChanged() += { std::bind(&Memo::onDataChanged, this, _1, _2), this };
+       } else {
+               MemoConsumer::getInstance().onDataItemChanged() -= this;
        }
-
-       return true;
 }
 
-bool Memo::compareSounds(const SoundRecordList &list) const
+void Memo::onDataChanged(int id, data_control_data_change_type_e type)
 {
-       return ((m_SoundRecords.empty() && list.empty())
-                       || (!m_SoundRecords.empty() && !list.empty() &&
-                               m_SoundRecords.front().getPath() == list.front().getPath()));
-}
-
-int Memo::generateImageIndex()
-{
-       for (int i = 0; i < MAX_IMAGE_COUNT; i++) {
-               if (!getImage(i)) {
-                       return i;
-               }
+       if (id != getId()) {
+               return;
        }
-       return DEFAULT_IMAGE_INDEX;
-}
 
-void Memo::addSoundToRemove(SoundRecord sound)
-{
-       m_SoundRecordsToRemove.push_back(std::move(sound));
-}
-
-void Memo::addImageToRemove(Image image)
-{
-       m_ImagesToRemove.push_back(std::move(image));
-}
-
-void Memo::setThumbnail(Thumbnail thumbnail)
-{
-       m_Thumbnail = std::move(thumbnail);
+       if (type == DATA_CONTROL_DATA_CHANGE_SQL_UPDATE) {
+               MemoConsumer::getInstance().getDataItem(getId(), [this](MemoConsumer::DataList dataList) {
+                       update(dataList.front());
+                       delete dataList.front();
+               });
+       } else if (type == DATA_CONTROL_DATA_CHANGE_SQL_DELETE) {
+               setChanged(::Model::ChangeDelete);
+       }
 }
index 0c4f2156280d8940d38ef5b47e7f358c9df18efb..8380644380cb4da782fd33c7b99ec1a5f6520748 100644 (file)
@@ -65,6 +65,8 @@ namespace Input
 
                void subscribeToSystemSettings();
                void unsubscribeFromSystemSettings();
+               void onMemoUpdated();
+               void onMemoDeleted();
 
                const char *getDateTimeFormat();
 
index 0b0efd828edcd9dce5ac97ebf0024fdd3f9ef3df..3f9bd7df48ee47dc991c788f576709ac94c3d8f6 100644 (file)
@@ -57,6 +57,9 @@ namespace Input
                virtual void onFavIconChanged() {};
                virtual void onResult(bool isSuccess, int id);
 
+               void fillLayout();
+               void resetContent();
+               void resetPageTitle();
                InputBox *getInputBox() const;
                TitleField *getTitleField() const;
                RecordField *getRecordField() const;
@@ -87,10 +90,12 @@ namespace Input
                void onFavChanged(Evas_Object *check, void *eventInfo);
                void onContentChanged(bool isEmpty);
                void onRecordFieldDelete();
-               void onMemoChanged();
+               void onChanged();
                void onMaxImagesReached();
                bool isSupportedResolution(const std::string &path) const;
 
+               Evas_Object *m_Layout;
+               Evas_Object *m_CancelButton;
                Evas_Object *m_DoneButton;
                InputBox *m_InputBox;
                Evas_Object *m_Bg;
index 19631cc034bface18bdf08bc888645029a8d5f04..0f81915c7316afe0774e075da3912b9d4e1f9d10 100644 (file)
@@ -50,6 +50,10 @@ DetailsView::~DetailsView()
 
 void DetailsView::onCreated()
 {
+       getMemo().setStandalone(true);
+       getMemo().onUpdated() += { std::bind(&DetailsView::onMemoUpdated, this), this };
+       getMemo().onDeleted() += { std::bind(&DetailsView::onMemoDeleted, this), this };
+
        updateView();
 }
 
@@ -108,7 +112,6 @@ void DetailsView::onDelete()
        popup->addButton("IDS_MEMO_BUTTON_DELETE_ABB4", [this] {
                MemoConsumer::getInstance().deleteDataItem(getMemo().getId());
                notification_status_message_post(_("IDS_MEMO_POP_DELETED"));
-               getPage()->close();
                return true;
        });
        popup->show();
@@ -164,6 +167,7 @@ void DetailsView::updateView()
                        if (getRecordField()) {
                                getRecordField()->setEditable(false);
                        }
+                       resetPageTitle();
                        subscribeToSystemSettings();
                        elm_object_signal_emit(getEvasObject(), SIGNAL_DATETIME_SHOW, "*");
                        elm_layout_text_set(getEvasObject(), PART_DATETIME,
@@ -203,6 +207,21 @@ void DetailsView::unsubscribeFromSystemSettings()
        system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR);
 }
 
+void DetailsView::onMemoUpdated()
+{
+       resetContent();
+
+       if (m_Mode == ModeInput) {
+               m_Mode = ModeDetails;
+       }
+       updateView();
+}
+
+void DetailsView::onMemoDeleted()
+{
+       getPage()->close();
+}
+
 const char *DetailsView::getDateTimeFormat()
 {
        bool is24Hours = false;
index ded42e46337a6fb382087333e58e9ad81fdf570f..7e08ea4afd696208363a01f6c0c40c5a58473b19 100644 (file)
@@ -51,13 +51,9 @@ namespace
 }
 
 InputView::InputView(Memo memo)
-       : m_DoneButton(nullptr)
-       , m_InputBox(nullptr)
-       , m_Bg(nullptr)
-       , m_TitleField(nullptr)
-       , m_RecordField(nullptr)
-       , m_InitialMemo(memo)
-       , m_Memo(std::move(memo))
+       : m_Layout(nullptr), m_CancelButton(nullptr), m_DoneButton(nullptr)
+       , m_InputBox(nullptr), m_Bg(nullptr), m_TitleField(nullptr)
+       , m_RecordField(nullptr), m_InitialMemo(memo), m_Memo(std::move(memo))
 {
 }
 
@@ -67,19 +63,10 @@ InputView::~InputView()
 
 Evas_Object *InputView::onCreate(Evas_Object *parent)
 {
-       Evas_Object *layout = createLayout(parent, LAYOUT_INPUT);
+       m_Layout = createLayout(parent, LAYOUT_INPUT);
+       fillLayout();
 
-       elm_layout_content_set(layout, PART_BG, createBg(layout));
-       elm_layout_content_set(layout, PART_TITLE, createTitle(layout));
-       elm_layout_content_set(layout, PART_FAV_BTN, createFavIcon(layout));
-       elm_layout_content_set(layout, PART_CONTENT, createContent(layout));
-       if (m_Memo.getSoundRecord()) {
-               elm_layout_content_set(layout, PART_RECORD, createRecordField(layout, RecordField::ModePlayer));
-       }
-
-       elm_object_focus_custom_chain_set(layout, eina_list_append(nullptr, m_Bg));
-
-       return layout;
+       return m_Layout;
 }
 
 void InputView::onCreated()
@@ -89,7 +76,7 @@ void InputView::onCreated()
 
 void InputView::onPageAttached(Ui::NavigatorPage *page)
 {
-       page->addTitleButton(Ui::ButtonLeft, "IDS_MEMO_ACBUTTON_CANCEL_ABB2",
+       m_CancelButton = page->addTitleButton(Ui::ButtonLeft, "IDS_MEMO_ACBUTTON_CANCEL_ABB2",
                        makeCallback(&InputView::onCancelPressed), this);
 
        m_DoneButton = page->addTitleButton(Ui::ButtonRight, "IDS_MEMO_ACBUTTON_DONE_ABB2",
@@ -165,6 +152,42 @@ void InputView::onResult(bool isSuccess, int id)
        }
 }
 
+void InputView::fillLayout()
+{
+       elm_layout_content_set(m_Layout, PART_BG, createBg(m_Layout));
+       elm_object_focus_custom_chain_set(m_Layout, eina_list_append(nullptr, m_Bg));
+
+       elm_layout_content_set(m_Layout, PART_TITLE, createTitle(m_Layout));
+       elm_layout_content_set(m_Layout, PART_FAV_BTN, createFavIcon(m_Layout));
+       elm_layout_content_set(m_Layout, PART_CONTENT, createContent(m_Layout));
+       elm_layout_content_set(m_Layout, PART_RECORD, createRecordField(m_Layout, RecordField::ModePlayer));
+}
+
+void InputView::resetContent()
+{
+       m_InitialMemo = m_Memo;
+       fillLayout();
+}
+
+void InputView::resetPageTitle()
+{
+       if (!getPage()) {
+               return;
+       }
+
+       if (m_CancelButton) {
+               evas_object_del(m_CancelButton);
+               m_CancelButton = nullptr;
+       }
+
+       if (m_DoneButton) {
+               evas_object_del(m_DoneButton);
+               m_DoneButton = nullptr;
+       }
+
+       getPage()->setTitle(nullptr);
+}
+
 InputBox *InputView::getInputBox() const
 {
        return m_InputBox;
@@ -244,13 +267,16 @@ Evas_Object *InputView::createContent(Evas_Object *parent)
 
 Evas_Object *InputView::createRecordField(Evas_Object *parent, RecordField::Mode mode)
 {
-       m_RecordField = new RecordField(m_Memo.getSoundRecord()->getPath(), mode);
-       m_RecordField->create(parent);
-       m_RecordField->setRecordingStartCallback(std::bind(&InputView::onMemoChanged, this));
-       m_RecordField->setDeleteCallback(std::bind(&InputView::onRecordFieldDelete, this));
-       onRotationChanged(getRotation());
+       if (m_Memo.getSoundRecord()) {
+               m_RecordField = new RecordField(m_Memo.getSoundRecord()->getPath(), mode);
+               m_RecordField->create(parent);
+               m_RecordField->setRecordingStartCallback(std::bind(&InputView::onChanged, this));
+               m_RecordField->setDeleteCallback(std::bind(&InputView::onRecordFieldDelete, this));
+               onRotationChanged(getRotation());
+               return m_RecordField->getEvasObject();
+       }
 
-       return m_RecordField->getEvasObject();
+       return nullptr;
 }
 
 void InputView::onDonePressed(Evas_Object *button, void *eventInfo)
@@ -389,7 +415,7 @@ void InputView::onTitleActivated(Evas_Object *entry, void *eventInfo)
 void InputView::onTitleChanged(Evas_Object *entry, void *eventInfo)
 {
        m_Memo.setTitle(elm_entry_entry_get(entry));
-       onMemoChanged();
+       onChanged();
 }
 
 void InputView::onFavChanged(Evas_Object *check, void *eventInfo)
@@ -402,7 +428,7 @@ void InputView::onContentChanged(bool isEmpty)
 {
        if (isEmpty != m_Memo.getContent().empty()) {
                m_Memo.setContent(m_InputBox->getContent());
-               onMemoChanged();
+               onChanged();
        }
 }
 
@@ -410,10 +436,10 @@ void InputView::onRecordFieldDelete()
 {
        m_Memo.removeSoundRecord();
        m_RecordField = nullptr;
-       onMemoChanged();
+       onChanged();
 }
 
-void InputView::onMemoChanged()
+void InputView::onChanged()
 {
        elm_object_disabled_set(m_DoneButton, m_Memo.isEmpty());
 }