diff options
author | Eugene Kurzberg <i.kurtsberg@samsung.com> | 2017-07-24 09:43:32 +0300 |
---|---|---|
committer | Eugene Kurzberg <i.kurtsberg@samsung.com> | 2017-07-24 09:43:32 +0300 |
commit | ba10d486e51671cac51a6fa8f5562354e87c891a (patch) | |
tree | a22c7059db3911563507090e4b3f646630c79b68 | |
parent | 48de4caee33d90997bf2c1a25e14cf8c6f8d7106 (diff) | |
download | alarm-ba10d486e51671cac51a6fa8f5562354e87c891a.tar.gz alarm-ba10d486e51671cac51a6fa8f5562354e87c891a.tar.bz2 alarm-ba10d486e51671cac51a6fa8f5562354e87c891a.zip |
Update and integrate apps-common Model.
Change-Id: I4f64cff416cad59578ba33f65a6ff43c54fc5d5f
Signed-off-by: Eugene Kurzberg <i.kurtsberg@samsung.com>
-rw-r--r-- | alarm-app/inc/List/AlarmsView.h | 5 | ||||
-rw-r--r-- | alarm-app/inc/List/Model/AlarmProvider.h | 42 | ||||
-rw-r--r-- | alarm-app/src/List/AlarmsView.cpp | 11 | ||||
-rw-r--r-- | alarm-widget/src/AlarmWidget.cpp | 2 | ||||
-rw-r--r-- | lib-apps-common/inc/Model/DataItem.h | 39 | ||||
-rw-r--r-- | lib-apps-common/inc/Model/DataProvider.h | 65 | ||||
-rw-r--r-- | lib-apps-common/src/Model/DataControlProvider.cpp | 9 | ||||
-rw-r--r-- | lib-apps-common/src/Model/DataItem.cpp | 33 | ||||
-rw-r--r-- | lib-apps-common/src/Model/DataProvider.cpp | 79 |
9 files changed, 207 insertions, 78 deletions
diff --git a/alarm-app/inc/List/AlarmsView.h b/alarm-app/inc/List/AlarmsView.h index ad3c9b1..9586d3f 100644 --- a/alarm-app/inc/List/AlarmsView.h +++ b/alarm-app/inc/List/AlarmsView.h @@ -17,7 +17,7 @@ #ifndef LIST_ALARMS_VIEW_H #define LIST_ALARMS_VIEW_H -#include "Model/DataControlProvider.h" +#include "List/Model/AlarmProvider.h" #include "Ux/SelectView.h" #include <system_settings.h> @@ -61,7 +61,6 @@ namespace List virtual void onSelectCountChanged(size_t selectCount) override; virtual Evas_Object *createDoneButton() override; virtual Ux::MultiSelector *createMultiSelector() override; - void onUpdateFinished(); Evas_Object *createContentLayout(Evas_Object *parent); Evas_Object *createNoContents(Evas_Object *parent); @@ -84,7 +83,7 @@ namespace List void onItemLongpressed(Evas_Object *genlist, Elm_Object_Item *item); bool onSelectFinished(); - Model::DataControlProvider m_Provider; + Model::AlarmProvider m_Provider; Evas_Object *m_NoContents; Evas_Object *m_ContentLayout; Ui::Genlist *m_Genlist; diff --git a/alarm-app/inc/List/Model/AlarmProvider.h b/alarm-app/inc/List/Model/AlarmProvider.h new file mode 100644 index 0000000..82cee58 --- /dev/null +++ b/alarm-app/inc/List/Model/AlarmProvider.h @@ -0,0 +1,42 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LIST_MODEL_ALARM_PROVIDER_H +#define LIST_MODEL_ALARM_PROVIDER_H + +#include "Model/DataControlProvider.h" +#include "Common/Model/Alarm.h" + +namespace List +{ + namespace Model + { + class AlarmProvider : public ::Model::DataControlProvider + { + public: + using DataControlProvider::DataControlProvider; + + private: + virtual bool compareDataItems(const ::Model::DataItem *first, const ::Model::DataItem *second) override + { + return static_cast<const Common::Model::Alarm &>(*first) < + static_cast<const Common::Model::Alarm &>(*second); + } + }; + } +} + +#endif /* LIST_MODEL_ALARM_PROVIDER_H */ diff --git a/alarm-app/src/List/AlarmsView.cpp b/alarm-app/src/List/AlarmsView.cpp index 33000ae..7656e0b 100644 --- a/alarm-app/src/List/AlarmsView.cpp +++ b/alarm-app/src/List/AlarmsView.cpp @@ -84,15 +84,15 @@ Evas_Object *AlarmsView::onCreate(Evas_Object *parent) void AlarmsView::onCreated() { - m_Provider.onUpdateFinished() += { std::bind(&AlarmsView::onUpdateFinished, this), this }; + m_Provider.onUpdated() += { std::bind(&AlarmsView::updateEmptyState, this), this }; m_Provider.onInserted() += { std::bind(&AlarmsView::onAlarmInserted, this, _1), this }; - m_Provider.initialize([this] { + m_Provider.initialize({ [this] { for (auto &&dataItem : m_Provider.getDataList()) { insertItem(createItem(*dataItem)); } m_AddAlarmItem->getNextItem()->scrollTo(ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); updateEmptyState(); - }); + }, this }); } void AlarmsView::onPageAttached(Ui::NavigatorPage *page) @@ -176,11 +176,6 @@ Ux::MultiSelector *AlarmsView::createMultiSelector() return multiSelector; } -void AlarmsView::onUpdateFinished() -{ - updateEmptyState(); -} - Evas_Object *AlarmsView::createContentLayout(Evas_Object *parent) { Evas_Object *layout = elm_layout_add(parent); diff --git a/alarm-widget/src/AlarmWidget.cpp b/alarm-widget/src/AlarmWidget.cpp index 3bcb691..c98c052 100644 --- a/alarm-widget/src/AlarmWidget.cpp +++ b/alarm-widget/src/AlarmWidget.cpp @@ -194,7 +194,7 @@ void AlarmWidget::setAlarm(Alarm *alarm) widget->saveContent(bundle.getBundle()); }, this); }, this }; - m_Alarm->onUpdated() += { [this](int changes) { + m_Alarm->onUpdated() += { [this](int changes, DataItem *nextDataItem) { updateContentLayout(changes); }, this }; diff --git a/lib-apps-common/inc/Model/DataItem.h b/lib-apps-common/inc/Model/DataItem.h index ff70af6..fb9684d 100644 --- a/lib-apps-common/inc/Model/DataItem.h +++ b/lib-apps-common/inc/Model/DataItem.h @@ -28,8 +28,8 @@ namespace Model enum ChangeType { ChangeNone, - ChangeInsert, ChangeUpdate, + ChangeInsert, ChangeDelete }; @@ -38,9 +38,10 @@ namespace Model public: /** * @brief Called after item was updated. - * @param[in] Which item data was updated (depends on the specific item) + * @param[in] Which item data was updated (depends on the specific item) + * @param[in] Next item according to sort order */ - typedef Utils::CallbackManager<int> UpdateCallback; + typedef Utils::CallbackManager<int, DataItem *> UpdateCallback; /** * @brief Called before item is deleted. @@ -48,8 +49,8 @@ namespace Model typedef Utils::CallbackManager<> DeleteCallback; DataItem(); - DataItem(const DataItem &); - DataItem &operator=(const DataItem &); + DataItem(const DataItem &that); + DataItem &operator=(const DataItem &that); virtual ~DataItem() { } /** @@ -58,13 +59,23 @@ namespace Model int getId() const; /** - * @brief Update item with new data. - * @param[in] data New item data + * @return Custom data associated with the item. */ - void update(void *data); + void *getUserData() const; /** - * @return Whether is standalone (not managed by DataProvider). + * @brief Set custom data associated with the item. + * @param[in] data Data to set + */ + void setUserData(void *data); + + /** + * @return Whether the item was changed during update. + */ + bool isChanged() const; + + /** + * @return Whether item is standalone (not managed by DataProvider). */ bool isStandalone() const; @@ -86,6 +97,13 @@ namespace Model protected: /** + * @brief Update item with new data. + * @param[in] data New item data + * @return Mask describing detected changes or 0 if none. + */ + int update(void *data); + + /** * @brief Set ID. * @param[in] id Data item id */ @@ -113,12 +131,13 @@ namespace Model private: friend class DataProvider; - void finishUpdate(); + void finishUpdate(DataItem *nextItem = nullptr); int m_Id; bool m_IsStandalone; int m_Changes; ChangeType m_ChangeType; + void *m_UserData; UpdateCallback m_OnUpdated; DeleteCallback m_OnDeleted; diff --git a/lib-apps-common/inc/Model/DataProvider.h b/lib-apps-common/inc/Model/DataProvider.h index 101023b..2e8a891 100644 --- a/lib-apps-common/inc/Model/DataProvider.h +++ b/lib-apps-common/inc/Model/DataProvider.h @@ -18,46 +18,46 @@ #define MODEL_DATA_PROVIDER_H #include "Model/DataItem.h" - -#include <list> +#include <vector> namespace Model { class EXPORT_API DataProvider { public: - typedef std::list<DataItem *> DataList; + typedef std::vector<DataItem *> DataList; /** * @brief Called once initialization is finished. */ - typedef std::function<void()> InitializeCallback; + typedef Utils::CallbackManager<> InitializeCallback; /** - * @brief Called when provider has started or finished updating its items. + * @brief Called when provider has finished updating its items. */ typedef Utils::CallbackManager<> UpdateCallback; /** * @brief Called after item was inserted. * @param[in] Inserted item + * @param[in] Next item according to sort order */ - typedef Utils::CallbackManager<DataItem &> InsertCallback; + typedef Utils::CallbackManager<DataItem &, DataItem *> InsertCallback; DataProvider(); virtual ~DataProvider(); /** - * @return Provider data list. + * @return List of provided data items. */ - const DataList &getDataList(); + const DataList &getDataList() const; /** * @brief Initialize provider data. * @remark Should be called before retrieving the data. * @param[in] callback Initialization finished callback */ - void initialize(InitializeCallback callback); + void initialize(InitializeCallback::Callback callback); /** * @brief Update provider data. @@ -81,25 +81,32 @@ namespace Model DataItem *findDataItem(int id); /** + * @brief Find next item for the specified data item according to sort order. + * @param[in] dataItem Data item to find next item for + * @return Next data item or nullptr if none. + */ + DataItem *findNextDataItem(DataItem &dataItem); + + /** * @brief Set whether to start update immediately when update() is called. * @param[in] isEnabled Whether data update is enabled */ void setUpdateEnabled(bool isEnabled); /** - * @brief Add/remove insert callback. + * @brief Add/remove initialize callback. */ - InsertCallback &onInserted(); + InitializeCallback &onInitialized(); /** - * @brief Add/remove update start callback. + * @brief Add/remove insert callback. */ - UpdateCallback &onUpdateStarted(); + InsertCallback &onInserted(); /** - * @brief Add/remove update finish callback. + * @brief Add/remove update callback. */ - UpdateCallback &onUpdateFinished(); + UpdateCallback &onUpdated(); protected: /** @@ -115,12 +122,32 @@ namespace Model virtual void startUpdate() = 0; /** + * @brief Called to compare two data items for sorting. + * @param[in] first First item + * @param[in] second Second item + * @return Whether first item is less than second. + */ + virtual bool compareDataItems(const DataItem *first, const DataItem *second) = 0; + + /** + * @brief Called after setUpdateEnabled(). + */ + virtual void onUpdateEnabled(bool isEnabled) { } + + /** * @brief Insert new DataItem into the list. * @param[in] dataItem New data item */ void insertDataItem(DataItem *dataItem); /** + * @brief Update DataItem with new data. + * @param[in] dataItem Data item to update + * @param[in] data New item data + */ + void updateDataItem(DataItem &dataItem, void *data); + + /** * @brief Delete DataItem from the list. * @param[in] dataItem Data item to be deleted */ @@ -128,9 +155,8 @@ namespace Model /** * @brief Should be called when initialization is finished. - * @param[in] dataList Initialized data list */ - void finishInit(DataList dataList); + void finishInit(); /** * @brief Should be called when update is finished. @@ -139,6 +165,8 @@ namespace Model void finishUpdate(); private: + void insertSorted(DataItem *dataItem); + bool m_IsBusy; bool m_IsInitialized; bool m_IsUpdateEnabled; @@ -147,8 +175,7 @@ namespace Model InitializeCallback m_OnInitialized; InsertCallback m_OnInserted; - UpdateCallback m_OnUpdateStarted; - UpdateCallback m_OnUpdateFinished; + UpdateCallback m_OnUpdated; DataList m_DataList; }; diff --git a/lib-apps-common/src/Model/DataControlProvider.cpp b/lib-apps-common/src/Model/DataControlProvider.cpp index e7f6313..be78ce7 100644 --- a/lib-apps-common/src/Model/DataControlProvider.cpp +++ b/lib-apps-common/src/Model/DataControlProvider.cpp @@ -32,8 +32,13 @@ DataControlProvider::~DataControlProvider() void DataControlProvider::startInit() { - m_Consumer.getDataItems(std::bind(&DataControlProvider::finishInit, this, _1)); m_Consumer.onDataItemChanged() += { std::bind(&DataControlProvider::onDataItemChanged, this, _1, _2), this }; + m_Consumer.getDataItems([this](DataList dataItems) { + for (auto &&dataItem : dataItems) { + insertDataItem(dataItem); + } + finishInit(); + }); } void DataControlProvider::startUpdate() @@ -67,7 +72,7 @@ void DataControlProvider::applyChange(ChangeInfo change, ::Model::DataItem *newI break; case DATA_CONTROL_DATA_CHANGE_SQL_UPDATE: if (auto item = findDataItem(change.id)) { - item->update(newItem); + updateDataItem(*item, newItem); } delete newItem; break; diff --git a/lib-apps-common/src/Model/DataItem.cpp b/lib-apps-common/src/Model/DataItem.cpp index b9622f0..22900dd 100644 --- a/lib-apps-common/src/Model/DataItem.cpp +++ b/lib-apps-common/src/Model/DataItem.cpp @@ -19,7 +19,8 @@ using namespace Model; DataItem::DataItem() - : m_Id(0), m_IsStandalone(false), m_Changes(0), m_ChangeType(ChangeNone) + : m_Id(0), m_IsStandalone(false), m_Changes(0), m_ChangeType(ChangeNone), + m_UserData(nullptr) { } @@ -46,14 +47,19 @@ int DataItem::getId() const return m_Id; } -void DataItem::update(void *data) +void *DataItem::getUserData() const { - m_Changes |= onUpdate(data); - m_ChangeType = ChangeUpdate; + return m_UserData; +} - if (m_IsStandalone) { - finishUpdate(); - } +void DataItem::setUserData(void *data) +{ + m_UserData = data; +} + +bool DataItem::isChanged() const +{ + return m_ChangeType != ChangeNone; } bool DataItem::isStandalone() const @@ -79,6 +85,13 @@ DataItem::DeleteCallback &DataItem::onDeleted() return m_OnDeleted; } +int DataItem::update(void *data) +{ + int changes = onUpdate(data); + setChanged(ChangeUpdate, changes); + return changes; +} + void DataItem::setId(int id) { m_Id = id; @@ -86,7 +99,7 @@ void DataItem::setId(int id) void DataItem::setChanged(ChangeType changeType, int changes) { - if (m_ChangeType == ChangeNone) { + if (m_ChangeType < changeType) { m_ChangeType = changeType; } if (changeType == ChangeUpdate) { @@ -98,12 +111,12 @@ void DataItem::setChanged(ChangeType changeType, int changes) } } -void DataItem::finishUpdate() +void DataItem::finishUpdate(DataItem *nextItem) { switch (m_ChangeType) { case ChangeUpdate: if (m_Changes) { - m_OnUpdated(m_Changes); + m_OnUpdated(m_Changes, nextItem); } break; case ChangeDelete: diff --git a/lib-apps-common/src/Model/DataProvider.cpp b/lib-apps-common/src/Model/DataProvider.cpp index b48c177..86b6469 100644 --- a/lib-apps-common/src/Model/DataProvider.cpp +++ b/lib-apps-common/src/Model/DataProvider.cpp @@ -15,8 +15,10 @@ */ #include "Model/DataProvider.h" +#include <algorithm> using namespace Model; +using namespace std::placeholders; DataProvider::DataProvider() : m_IsBusy(false), m_IsInitialized(false), @@ -32,19 +34,19 @@ DataProvider::~DataProvider() } } -const DataProvider::DataList &DataProvider::getDataList() +const DataProvider::DataList &DataProvider::getDataList() const { return m_DataList; } -void DataProvider::initialize(InitializeCallback callback) +void DataProvider::initialize(InitializeCallback::Callback callback) { if (m_IsInitialized || m_IsBusy) { return; } m_IsBusy = true; - m_OnInitialized = std::move(callback); + m_OnInitialized += std::move(callback); startInit(); } @@ -62,7 +64,6 @@ void DataProvider::update() m_IsBusy = true; m_IsUpdatePending = false; - m_OnUpdateStarted(); startUpdate(); } @@ -86,12 +87,28 @@ DataItem *DataProvider::findDataItem(int id) return nullptr; } +DataItem *DataProvider::findNextDataItem(DataItem &dataItem) +{ + auto it = std::find(m_DataList.begin(), m_DataList.end(), &dataItem); + if (it != m_DataList.end() && ++it != m_DataList.end()) { + return *it; + } + + return nullptr; +} + void DataProvider::setUpdateEnabled(bool isEnabled) { m_IsUpdateEnabled = isEnabled; if (m_IsUpdateEnabled && m_IsUpdatePending) { update(); } + onUpdateEnabled(m_IsUpdateEnabled); +} + +DataProvider::InitializeCallback &DataProvider::onInitialized() +{ + return m_OnInitialized; } DataProvider::InsertCallback &DataProvider::onInserted() @@ -99,42 +116,45 @@ DataProvider::InsertCallback &DataProvider::onInserted() return m_OnInserted; } -DataProvider::UpdateCallback &DataProvider::onUpdateStarted() +DataProvider::UpdateCallback &DataProvider::onUpdated() { - return m_OnUpdateStarted; + return m_OnUpdated; } -DataProvider::UpdateCallback &DataProvider::onUpdateFinished() +void DataProvider::insertDataItem(DataItem *dataItem) { - return m_OnUpdateFinished; + if (m_IsInitialized) { + dataItem->setChanged(ChangeInsert); + } + + insertSorted(dataItem); } -void DataProvider::insertDataItem(DataItem *dataItem) +void DataProvider::updateDataItem(DataItem &dataItem, void *data) { - dataItem->m_ChangeType = ChangeInsert; - m_DataList.push_back(dataItem); + if (dataItem.update(data)) { + auto it = std::find(m_DataList.begin(), m_DataList.end(), &dataItem); + if (it != m_DataList.end()) { + m_DataList.erase(it); + } + insertSorted(&dataItem); + } } void DataProvider::deleteDataItem(DataItem &dataItem) { - dataItem.m_ChangeType = ChangeDelete; + dataItem.setChanged(ChangeDelete); } -void DataProvider::finishInit(DataList dataList) +void DataProvider::finishInit() { if (m_IsDestroyPending) { delete this; return; } - m_DataList = std::move(dataList); m_IsInitialized = true; - - if (m_OnInitialized) { - m_OnInitialized(); - m_OnInitialized = nullptr; - } - + m_OnInitialized(); m_IsBusy = false; } @@ -145,26 +165,35 @@ void DataProvider::finishUpdate() return; } - for (auto it = m_DataList.begin(); it != m_DataList.end(); ) { + DataItem *nextItem = nullptr; + for (auto it = m_DataList.rbegin(); it != m_DataList.rend(); ) { auto changeType = (*it)->m_ChangeType; - (*it)->finishUpdate(); + (*it)->finishUpdate(nextItem); if (changeType == ChangeInsert) { if (m_OnInserted) { - m_OnInserted(**it); + m_OnInserted(**it, nextItem); } } else if (changeType == ChangeDelete) { delete *it; - it = m_DataList.erase(it); + it = DataList::reverse_iterator(m_DataList.erase((++it).base())); continue; } + nextItem = *it; ++it; } - m_OnUpdateFinished(); + m_OnUpdated(); m_IsBusy = false; if (m_IsUpdatePending) { update(); } } + +void DataProvider::insertSorted(DataItem *dataItem) +{ + auto nextItem = std::upper_bound(m_DataList.begin(), m_DataList.end(), + dataItem, std::bind(&DataProvider::compareDataItems, this, _1, _2)); + m_DataList.insert(nextItem, dataItem); +} |