From 010ecf6b37187a0bb02605bc850d66ea1d39ae1d Mon Sep 17 00:00:00 2001 From: Przemyslaw Brudny Date: Wed, 5 Aug 2020 12:55:17 +0200 Subject: [PATCH] [EGD-3451] Notifications and db messages for list refresh added to Phonebook and Messages. --- .../ApplicationMessages.cpp | 18 ++++++++ .../models/BaseThreadRecordModel.hpp | 6 ++- .../models/SearchResultsModel.cpp | 37 +++++++++++++-- .../models/SearchResultsModel.hpp | 3 ++ .../models/ThreadModel.cpp | 25 +++++++++++ .../models/ThreadModel.hpp | 4 ++ .../windows/MessagesMainWindow.cpp | 11 ++--- .../windows/SearchResults.cpp | 45 ++++++++++--------- .../windows/SearchResults.hpp | 2 +- .../windows/SearchStart.cpp | 1 + .../ApplicationPhonebook.cpp | 33 ++++++++------ .../windows/PhonebookMainWindow.cpp | 29 +++++++++++- .../windows/PhonebookMainWindow.hpp | 2 + .../windows/PhonebookSearchResults.cpp | 5 ++- module-db/CMakeLists.txt | 1 + module-db/Common/Query.cpp | 1 + module-db/Interface/ThreadRecord.cpp | 23 ++++++---- module-db/Interface/ThreadRecord.hpp | 2 +- module-db/queries/sms/QuerySMSThreadsGet.cpp | 27 +++++++++++ module-db/queries/sms/QuerySMSThreadsGet.hpp | 30 +++++++++++++ module-gui/gui/widgets/ListView.cpp | 4 +- module-services/service-db/ServiceDB.cpp | 3 ++ 22 files changed, 250 insertions(+), 62 deletions(-) create mode 100644 module-db/queries/sms/QuerySMSThreadsGet.cpp create mode 100644 module-db/queries/sms/QuerySMSThreadsGet.hpp diff --git a/module-apps/application-messages/ApplicationMessages.cpp b/module-apps/application-messages/ApplicationMessages.cpp index 8340aebdc..cbe1a17a7 100644 --- a/module-apps/application-messages/ApplicationMessages.cpp +++ b/module-apps/application-messages/ApplicationMessages.cpp @@ -63,8 +63,26 @@ namespace app case MessageType::DBThreadGetLimitOffset: case MessageType::DBQuery: case MessageType::DBSMSTemplateGetLimitOffset: { + + LOG_DEBUG("Nowe Dane odebrane"); + LOG_DEBUG("W jakim oknie jestem? %s", getCurrentWindow()->getName().c_str()); + + if (auto queryResponse = dynamic_cast(resp)) { + + LOG_INFO("I co jest jakis handler1?"); + + if (queryResponse->getResult()->handle()) { + + LOG_INFO("I co jest jakis handler2?"); + + refreshWindow(gui::RefreshModes::GUI_REFRESH_FAST); + break; + } + } + if (getCurrentWindow()->onDatabaseMessage(resp)) refreshWindow(gui::RefreshModes::GUI_REFRESH_FAST); + } break; default: break; diff --git a/module-apps/application-messages/models/BaseThreadRecordModel.hpp b/module-apps/application-messages/models/BaseThreadRecordModel.hpp index f41d8d523..b3013aa02 100644 --- a/module-apps/application-messages/models/BaseThreadRecordModel.hpp +++ b/module-apps/application-messages/models/BaseThreadRecordModel.hpp @@ -1,14 +1,16 @@ #pragma once - #include "DatabaseModel.hpp" #include "Application.hpp" #include "ListItemProvider.hpp" +#include "Common/Query.hpp" #include "Interface/ThreadRecord.hpp" #include -class BaseThreadRecordModel : public app::DatabaseModel, public gui::ListItemProvider +class BaseThreadRecordModel : public app::DatabaseModel, + public gui::ListItemProvider, + public db::QueryListener { public: BaseThreadRecordModel() = delete; diff --git a/module-apps/application-messages/models/SearchResultsModel.cpp b/module-apps/application-messages/models/SearchResultsModel.cpp index 4ad6b33a3..4cc4884b8 100644 --- a/module-apps/application-messages/models/SearchResultsModel.cpp +++ b/module-apps/application-messages/models/SearchResultsModel.cpp @@ -1,9 +1,11 @@ #include "SearchResultsModel.hpp" +#include "ListView.hpp" #include "time/time_conversion.hpp" #include "../widgets/SearchResultsItem.hpp" #include "service-db/api/DBServiceAPI.hpp" #include +#include namespace gui::model { @@ -43,9 +45,12 @@ namespace gui::model void SearchResultsModel::requestRecords(uint32_t offset, uint32_t limit) { if (std::string(search_value).compare("") != 0) { - DBServiceAPI::GetQuery(getApplication(), - db::Interface::Name::SMSThread, - std::make_unique(search_value, offset, limit)); + + LOG_INFO("Szukam nowych danych"); + + auto query = std::make_unique(search_value, offset, limit); + query->setQueryListener(this); + DBServiceAPI::GetQuery(getApplication(), db::Interface::Name::SMSThread, std::move(query)); } } @@ -54,4 +59,30 @@ namespace gui::model this->search_value = search_value; } + auto SearchResultsModel::handleQueryResponse(db::QueryResult *queryResult) -> bool + { + + LOG_DEBUG("Przyszły nowe dane"); + + auto msgResponse = dynamic_cast(queryResult); + assert(msgResponse != nullptr); + + int count = msgResponse->getResults().size(); + auto records_data = msgResponse->getResults(); + auto records = std::make_unique>(records_data.begin(), records_data.end()); + + if (msgResponse->getMax() == 0) { + + auto app = dynamic_cast(application); + assert(app); + return app->searchEmpty(); + } + + if (list != nullptr) { + list->setElementsCount(msgResponse->getMax()); + } + + return this->updateRecords(std::move(records), 0, msgResponse->getMax(), count); + } + }; // namespace gui::model diff --git a/module-apps/application-messages/models/SearchResultsModel.hpp b/module-apps/application-messages/models/SearchResultsModel.hpp index 47161a7fa..e16c46ba6 100644 --- a/module-apps/application-messages/models/SearchResultsModel.hpp +++ b/module-apps/application-messages/models/SearchResultsModel.hpp @@ -19,5 +19,8 @@ namespace gui::model void requestRecords(uint32_t offset, uint32_t limit) override; /// set what we need to search void setSearchValue(const UTF8 &search_value); + + // virtual method for db::QueryListener + auto handleQueryResponse(db::QueryResult *) -> bool override; }; }; // namespace gui::model diff --git a/module-apps/application-messages/models/ThreadModel.cpp b/module-apps/application-messages/models/ThreadModel.cpp index c6920ee77..b66c5e932 100644 --- a/module-apps/application-messages/models/ThreadModel.cpp +++ b/module-apps/application-messages/models/ThreadModel.cpp @@ -1,3 +1,5 @@ +#include +#include #include "ThreadModel.hpp" #include "OptionWindow.hpp" #include "application-messages/windows/OptionsWindow.hpp" @@ -48,3 +50,26 @@ gui::ListItem *ThreadModel::getItem(gui::Order order) }; return item; } + +void ThreadModel::requestRecords(uint32_t offset, uint32_t limit) +{ + LOG_INFO("Szukam nowych danych"); + + auto query = std::make_unique(offset, limit); + query->setQueryListener(this); + DBServiceAPI::GetQuery(getApplication(), db::Interface::Name::SMSThread, std::move(query)); +} + +auto ThreadModel::handleQueryResponse(db::QueryResult *queryResult) -> bool +{ + + LOG_INFO("woła się z threada?"); + + auto msgResponse = dynamic_cast(queryResult); + assert(msgResponse != nullptr); + + auto records_data = msgResponse->getResults(); + auto records = std::make_unique>(records_data.begin(), records_data.end()); + + return this->updateRecords(std::move(records), 0, 0, 0); +} diff --git a/module-apps/application-messages/models/ThreadModel.hpp b/module-apps/application-messages/models/ThreadModel.hpp index 6371aa915..0cd70fc4b 100644 --- a/module-apps/application-messages/models/ThreadModel.hpp +++ b/module-apps/application-messages/models/ThreadModel.hpp @@ -7,6 +7,10 @@ class ThreadModel : public BaseThreadRecordModel public: ThreadModel(app::Application *app); + // virtual method for db::QueryListener + auto handleQueryResponse(db::QueryResult *) -> bool override; + + void requestRecords(uint32_t offset, uint32_t limit) override; unsigned int getMinimalItemHeight() const override; gui::ListItem *getItem(gui::Order order) override; }; diff --git a/module-apps/application-messages/windows/MessagesMainWindow.cpp b/module-apps/application-messages/windows/MessagesMainWindow.cpp index 2d29226bf..7d9182b14 100644 --- a/module-apps/application-messages/windows/MessagesMainWindow.cpp +++ b/module-apps/application-messages/windows/MessagesMainWindow.cpp @@ -161,9 +161,12 @@ namespace gui bool MessagesMainWindow::onDatabaseMessage(sys::Message *msgl) { auto *msgResponse = dynamic_cast(msgl); - if (msgResponse && + if (msgResponse) { + + LOG_INFO("Dlaczego ty to konsumujesz?"); threadModel->updateRecords( - std::move(msgResponse->records), msgResponse->offset, msgResponse->limit, msgResponse->count)) { + std::move(msgResponse->records), msgResponse->offset, msgResponse->limit, msgResponse->count); + return true; } @@ -181,9 +184,7 @@ namespace gui LOG_INFO("I CO MAMY intefejs? %d", (int)msgNotification->interface); rebuild(); - if (this == application->getCurrentWindow()) { - application->refreshWindow(gui::RefreshModes::GUI_REFRESH_FAST); - } + return true; } } diff --git a/module-apps/application-messages/windows/SearchResults.cpp b/module-apps/application-messages/windows/SearchResults.cpp index 65aa0bec3..37d3e7ba2 100644 --- a/module-apps/application-messages/windows/SearchResults.cpp +++ b/module-apps/application-messages/windows/SearchResults.cpp @@ -58,28 +58,29 @@ namespace gui return false; } - bool SearchResults::onDatabaseMessage(sys::Message *msgl) - { - if (auto msg = dynamic_cast(msgl)) { - auto result = msg->getResult(); - if (auto response = dynamic_cast(result.get())) { - int count = response->getResults().size(); - auto records_data = response->getResults(); - auto records = std::make_unique>(records_data.begin(), records_data.end()); - - if (response->getMax() == 0) { - return showEmptyResults(); - } - - list->setElementsCount(response->getMax()); - model->updateRecords(std::move(records), 0, response->getMax(), count); - - return true; - }; - } - return false; - } - + // bool SearchResults::onDatabaseMessage(sys::Message *msgl) + // { + // if (auto msg = dynamic_cast(msgl)) { + // auto result = msg->getResult(); + // if (auto response = dynamic_cast(result.get())) { + // int count = response->getResults().size(); + // auto records_data = response->getResults(); + // auto records = std::make_unique>(records_data.begin(), + // records_data.end()); + // + // if (response->getMax() == 0) { + // return showEmptyResults(); + // } + // + // list->setElementsCount(response->getMax()); + // model->updateRecords(std::move(records), 0, response->getMax(), count); + // + // return true; + // }; + // } + // return false; + // } + // bool SearchResults::showEmptyResults() { auto app = dynamic_cast(application); diff --git a/module-apps/application-messages/windows/SearchResults.hpp b/module-apps/application-messages/windows/SearchResults.hpp index 67fb35fae..b96ef595d 100644 --- a/module-apps/application-messages/windows/SearchResults.hpp +++ b/module-apps/application-messages/windows/SearchResults.hpp @@ -24,7 +24,7 @@ namespace gui /// needed to init populate db void onBeforeShow(ShowMode mode, SwitchData *data) override; /// needed to populate db responses - auto onDatabaseMessage(sys::Message *msgl) -> bool override; + // auto onDatabaseMessage(sys::Message *msgl) -> bool override; auto showEmptyResults() -> bool; }; diff --git a/module-apps/application-messages/windows/SearchStart.cpp b/module-apps/application-messages/windows/SearchStart.cpp index 328fa6b13..ae70afa5f 100644 --- a/module-apps/application-messages/windows/SearchStart.cpp +++ b/module-apps/application-messages/windows/SearchStart.cpp @@ -30,6 +30,7 @@ namespace gui auto search_text = text->getText(); app->showSearchResults(utils::localize.get("common_search_results") + ": " + std::string(search_text), search_text); + return true; } return false; }; diff --git a/module-apps/application-phonebook/ApplicationPhonebook.cpp b/module-apps/application-phonebook/ApplicationPhonebook.cpp index ac1d59071..4f2d01bff 100644 --- a/module-apps/application-phonebook/ApplicationPhonebook.cpp +++ b/module-apps/application-phonebook/ApplicationPhonebook.cpp @@ -19,7 +19,9 @@ namespace app ApplicationPhonebook::ApplicationPhonebook(std::string name, std::string parent, bool startBackgound) : Application(name, parent, startBackgound, phonebook_stack_size) - {} + { + busChannels.push_back(sys::BusChannels::ServiceDBNotifications); + } // Invoked upon receiving data message auto ApplicationPhonebook::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) -> sys::Message_t @@ -31,19 +33,22 @@ namespace app return retMsg; } - // if (msgl->messageType == MessageType::DBServiceNotification) { - // auto msg = dynamic_cast(msgl); - // LOG_DEBUG("Received multicast"); - // if (msg != nullptr) { - // // window-specific actions - // for (auto &[name, window] : windows) { - // window->onDatabaseMessage(msg); - // } - // // app-wide actions - // // - // return std::make_shared(); - // } - // } + if (msgl->messageType == MessageType::DBServiceNotification) { + auto msg = dynamic_cast(msgl); + LOG_DEBUG("Received multicast"); + if (msg != nullptr) { + // window-specific actions + LOG_DEBUG("Notyfikacja odebrana"); + LOG_DEBUG("W jakim oknie jestem? %s", getCurrentWindow()->getName().c_str()); + + for (auto &[name, window] : windows) { + window->onDatabaseMessage(msg); + } + // app-wide actions + // + return std::make_shared(); + } + } // this variable defines whether message was processed. bool handled = false; diff --git a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp index 4c66a5863..97c1d09e8 100644 --- a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp +++ b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp @@ -7,6 +7,8 @@ #include #include +#include +#include namespace gui { @@ -19,8 +21,7 @@ namespace gui void PhonebookMainWindow::rebuild() { - destroyInterface(); - buildInterface(); + contactsList->rebuildList(); } void PhonebookMainWindow::buildInterface() @@ -129,6 +130,30 @@ namespace gui return AppWindow::onInput(inputEvent); } + bool PhonebookMainWindow::onDatabaseMessage(sys::Message *msgl) + { + auto *msgNotification = dynamic_cast(msgl); + if (msgNotification != nullptr) { + // whatever notification had happened, rebuild + if (msgNotification->interface == db::Interface::Name::Contact) { + + if (msgNotification->type == db::Query::Type::Delete || + msgNotification->type == db::Query::Type::Update || + msgNotification->type == db::Query::Type::Create) { + + LOG_INFO("I CO MAMY type? %d", (int)msgNotification->type); + LOG_INFO("I CO MAMY intefejs? %d", (int)msgNotification->interface); + + rebuild(); + + return true; + } + } + } + + return false; + } + bool PhonebookMainWindow::isSearchRequested() const { return requestedSearch; diff --git a/module-apps/application-phonebook/windows/PhonebookMainWindow.hpp b/module-apps/application-phonebook/windows/PhonebookMainWindow.hpp index 9d5c99d1b..4b50b1999 100644 --- a/module-apps/application-phonebook/windows/PhonebookMainWindow.hpp +++ b/module-apps/application-phonebook/windows/PhonebookMainWindow.hpp @@ -29,6 +29,8 @@ namespace gui bool onInput(const InputEvent &inputEvent) override; void onBeforeShow(ShowMode mode, SwitchData *data) override; + bool onDatabaseMessage(sys::Message *msgl) override; + void rebuild() override; void buildInterface() override; void destroyInterface() override; diff --git a/module-apps/application-phonebook/windows/PhonebookSearchResults.cpp b/module-apps/application-phonebook/windows/PhonebookSearchResults.cpp index e25d69f91..430256116 100644 --- a/module-apps/application-phonebook/windows/PhonebookSearchResults.cpp +++ b/module-apps/application-phonebook/windows/PhonebookSearchResults.cpp @@ -34,6 +34,7 @@ namespace gui phonebookStyle::searchResultsWindow::searchResultList::w, phonebookStyle::searchResultsWindow::searchResultList::h, searchResultsModel); + setFocusItem(searchResultList); bottomBar->setActive(BottomBar::Side::CENTER, true); bottomBar->setActive(BottomBar::Side::RIGHT, true); @@ -56,7 +57,9 @@ namespace gui void PhonebookSearchResults::onBeforeShow(ShowMode mode, SwitchData *data) { - setFocusItem(searchResultList); + // if (mode == ShowMode::GUI_SHOW_INIT) { + // searchResultList->rebuildList(); + // } } auto PhonebookSearchResults::onInput(const InputEvent &inputEvent) -> bool diff --git a/module-db/CMakeLists.txt b/module-db/CMakeLists.txt index 8f3abd719..cf3f0d34e 100644 --- a/module-db/CMakeLists.txt +++ b/module-db/CMakeLists.txt @@ -55,6 +55,7 @@ set(SOURCES queries/RecordQuery.cpp queries/sms/QuerySMSSearch.cpp + queries/sms/QuerySMSThreadsGet.cpp queries/sms/QuerySMSSearchByType.cpp queries/sms/QuerySmsThreadMarkAsRead.cpp queries/calllog/QueryCalllogSetAllRead.cpp diff --git a/module-db/Common/Query.cpp b/module-db/Common/Query.cpp index ed192ac01..0f3a05f5e 100644 --- a/module-db/Common/Query.cpp +++ b/module-db/Common/Query.cpp @@ -35,6 +35,7 @@ std::shared_ptr QueryResult::getRequestQuery() const noexcept bool QueryResult::handle() { if (requestQuery == nullptr || requestQuery->getQueryListener() == nullptr) { + return false; throw std::runtime_error("No listener to handle query"); } diff --git a/module-db/Interface/ThreadRecord.cpp b/module-db/Interface/ThreadRecord.cpp index 2518e2c08..d72b4ab88 100644 --- a/module-db/Interface/ThreadRecord.cpp +++ b/module-db/Interface/ThreadRecord.cpp @@ -1,6 +1,5 @@ #include "ThreadRecord.hpp" #include "SMSRecord.hpp" -#include "queries/sms/QuerySMSSearch.hpp" #include #include @@ -123,20 +122,28 @@ ThreadRecord ThreadRecordInterface::GetByContact(uint32_t contact_id) std::unique_ptr ThreadRecordInterface::runQuery(std::shared_ptr query) { if (const auto local_query = dynamic_cast(query.get())) { - return runQueryImpl(local_query); + auto db_result = + smsDB->threads.getBySMSQuery(local_query->text, local_query->starting_postion, local_query->depth); + + auto response = std::make_unique(db_result.first, db_result.second); + response->setRequestQuery(query); + return response; } + + if (const auto local_query = dynamic_cast(query.get())) { + auto db_result = smsDB->threads.getLimitOffset(local_query->offset, local_query->limit); + + auto response = std::make_unique(db_result); + response->setRequestQuery(query); + return response; + } + if (const auto local_query = dynamic_cast(query.get())) { return runQueryImpl(local_query); } return nullptr; } -std::unique_ptr ThreadRecordInterface::runQueryImpl(const db::query::SMSSearch *query) -{ - auto db_result = smsDB->threads.getBySMSQuery(query->text, query->starting_postion, query->depth); - return std::make_unique(db_result.first, db_result.second); -} - std::unique_ptr ThreadRecordInterface::runQueryImpl( const db::query::smsthread::MarkAsRead *query) { diff --git a/module-db/Interface/ThreadRecord.hpp b/module-db/Interface/ThreadRecord.hpp index 84a738b3c..b6d56eba2 100644 --- a/module-db/Interface/ThreadRecord.hpp +++ b/module-db/Interface/ThreadRecord.hpp @@ -5,6 +5,7 @@ #include "module-db/Databases/ContactsDB.hpp" #include "module-db/Common/Common.hpp" #include "module-db/queries/sms/QuerySMSSearch.hpp" +#include "module-db/queries/sms/QuerySMSThreadsGet.hpp" #include "module-db/queries/sms/QuerySmsThreadMarkAsRead.hpp" #include @@ -69,6 +70,5 @@ class ThreadRecordInterface : public RecordInterface Database /// it would only make sense to pass Query from Inteface to multiple databases to get all data we are interested in /// or better split it to smaller entities... this could be done with any db high level interface - left as it is - std::unique_ptr runQueryImpl(const db::query::SMSSearch *query); std::unique_ptr runQueryImpl(const db::query::smsthread::MarkAsRead *query); }; diff --git a/module-db/queries/sms/QuerySMSThreadsGet.cpp b/module-db/queries/sms/QuerySMSThreadsGet.cpp new file mode 100644 index 000000000..315d68ff9 --- /dev/null +++ b/module-db/queries/sms/QuerySMSThreadsGet.cpp @@ -0,0 +1,27 @@ +#include +#include "QuerySMSThreadsGet.hpp" + +namespace db::query +{ + SMSThreadsGet::SMSThreadsGet(unsigned int offset, unsigned int limit) + : Query(Query::Type::Read), offset(offset), limit(limit) + {} + + auto SMSThreadsGet::debugInfo() const -> std::string + { + return "SMSThreadsGet"; + } + + SMSThreadsGetResults::SMSThreadsGetResults(std::vector result_rows) : results(result_rows) + {} + + auto SMSThreadsGetResults::getResults() const -> std::vector + { + return results; + } + + [[nodiscard]] auto SMSThreadsGetResults::debugInfo() const -> std::string + { + return "SMSThreadsGetResults"; + } +} // namespace db::query diff --git a/module-db/queries/sms/QuerySMSThreadsGet.hpp b/module-db/queries/sms/QuerySMSThreadsGet.hpp new file mode 100644 index 000000000..fc3cef8cd --- /dev/null +++ b/module-db/queries/sms/QuerySMSThreadsGet.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include + +namespace db::query +{ + /// implements search for SMS by text + class SMSThreadsGet : public Query + { + public: + unsigned int offset; + unsigned int limit; + SMSThreadsGet(unsigned int offset, unsigned int limit); + + [[nodiscard]] auto debugInfo() const -> std::string override; + }; + + class SMSThreadsGetResults : public QueryResult + { + std::vector results; + + public: + SMSThreadsGetResults(std::vector result_rows); + [[nodiscard]] auto getResults() const -> std::vector; + [[nodiscard]] auto debugInfo() const -> std::string override; + }; + +}; // namespace db::query diff --git a/module-gui/gui/widgets/ListView.cpp b/module-gui/gui/widgets/ListView.cpp index e69b88268..6852e8786 100644 --- a/module-gui/gui/widgets/ListView.cpp +++ b/module-gui/gui/widgets/ListView.cpp @@ -117,12 +117,10 @@ namespace gui void ListView::setProvider(std::shared_ptr prov) { if (prov != nullptr) { - clear(); provider = prov; provider->list = this; - setElementsCount(provider->requestRecordsCount()); - provider->requestRecords(0, calculateLimit()); + rebuildList(); } } diff --git a/module-services/service-db/ServiceDB.cpp b/module-services/service-db/ServiceDB.cpp index f5d61c02a..e3683ae82 100644 --- a/module-services/service-db/ServiceDB.cpp +++ b/module-services/service-db/ServiceDB.cpp @@ -278,6 +278,7 @@ sys::Message_t ServiceDB::DataReceivedHandler(sys::DataMessage *msgl, sys::Respo DBContactMessage *msg = reinterpret_cast(msgl); auto ret = contactRecordInterface->Add(msg->record); responseMsg = std::make_shared(nullptr, ret); + sendUpdateNotification(db::Interface::Name::Contact, db::Query::Type::Create); } break; case MessageType::DBContactGetByName: { @@ -351,6 +352,7 @@ sys::Message_t ServiceDB::DataReceivedHandler(sys::DataMessage *msgl, sys::Respo DBContactMessage *msg = reinterpret_cast(msgl); auto ret = contactRecordInterface->RemoveByID(msg->id); responseMsg = std::make_shared(nullptr, ret); + sendUpdateNotification(db::Interface::Name::Contact, db::Query::Type::Delete); } break; case MessageType::DBContactBlock: { @@ -365,6 +367,7 @@ sys::Message_t ServiceDB::DataReceivedHandler(sys::DataMessage *msgl, sys::Respo DBContactMessage *msg = reinterpret_cast(msgl); auto ret = contactRecordInterface->Update(msg->record); responseMsg = std::make_shared(nullptr, ret); + sendUpdateNotification(db::Interface::Name::Contact, db::Query::Type::Update); } break; case MessageType::DBContactGetCount: {