diff --git a/changelog.md b/changelog.md index 40c9e1ec6..b89472e35 100644 --- a/changelog.md +++ b/changelog.md @@ -21,6 +21,7 @@ * `[db]` Fixed database corruption issues on abrupt phone reset. * `[audio]` Fix audio looping. * `[phonebook]` Fix phone freezing when contacts database is empty. +* `[phonebook]` Contacts list rebuilding in place not from start. ### Other diff --git a/module-apps/DatabaseModel.hpp b/module-apps/DatabaseModel.hpp index 6b5b50fb7..f251f81fc 100644 --- a/module-apps/DatabaseModel.hpp +++ b/module-apps/DatabaseModel.hpp @@ -29,14 +29,14 @@ namespace app clear(); } - virtual bool updateRecords(std::unique_ptr> dbRecords) + virtual bool updateRecords(std::vector dbRecords) { modelIndex = 0; records.clear(); - if (dbRecords != nullptr) { - for (uint32_t i = 0; i < dbRecords->size(); i++) { - records.push_back(std::make_shared(dbRecords.get()->operator[](i))); + if (!dbRecords.empty()) { + for (uint32_t i = 0; i < dbRecords.size(); i++) { + records.push_back(std::make_shared(dbRecords[i])); } return true; diff --git a/module-apps/application-calendar/models/AllEventsModel.cpp b/module-apps/application-calendar/models/AllEventsModel.cpp index 3a4667aa6..6468f92eb 100644 --- a/module-apps/application-calendar/models/AllEventsModel.cpp +++ b/module-apps/application-calendar/models/AllEventsModel.cpp @@ -52,7 +52,7 @@ gui::ListItem *AllEventsModel::getItem(gui::Order order) return item; } -bool AllEventsModel::updateRecords(std::unique_ptr> records) +bool AllEventsModel::updateRecords(std::vector records) { DatabaseModel::updateRecords(std::move(records)); list->onProviderDataUpdate(); @@ -64,14 +64,13 @@ auto AllEventsModel::handleQueryResponse(db::QueryResult *queryResult) -> bool auto response = dynamic_cast(queryResult); assert(response != nullptr); - auto records_data = response->getResult(); + auto records = *response->getResult(); list->setElementsCount(*response->getCountResult()); - auto records = std::make_unique>(records_data->begin(), records_data->end()); auto app = dynamic_cast(application); assert(application != nullptr); - if (records->empty()) { + if (records.empty()) { if (app->getEquivalentToEmptyWindow() == EquivalentWindow::AllEventsWindow) { app->switchToNoEventsWindow(utils::localize.get("app_calendar_title_main")); @@ -79,7 +78,7 @@ auto AllEventsModel::handleQueryResponse(db::QueryResult *queryResult) -> bool } auto eventShift = app->getEventShift(); if (eventShift) { - for (auto &record : *records) { + for (auto &record : records) { record.date_from += hours(eventShift); record.date_till += hours(eventShift); } diff --git a/module-apps/application-calendar/models/AllEventsModel.hpp b/module-apps/application-calendar/models/AllEventsModel.hpp index b6e6c3a2e..4a31aa272 100644 --- a/module-apps/application-calendar/models/AllEventsModel.hpp +++ b/module-apps/application-calendar/models/AllEventsModel.hpp @@ -14,7 +14,7 @@ class AllEventsModel : public app::DatabaseModel, public gui::List virtual ~AllEventsModel() override = default; void requestRecords(const uint32_t offset, const uint32_t limit) override; - bool updateRecords(std::unique_ptr> records) override; + bool updateRecords(std::vector records) override; auto handleQueryResponse(db::QueryResult *) -> bool; // virtual methods for ListViewProvider diff --git a/module-apps/application-calllog/CalllogModel.cpp b/module-apps/application-calllog/CalllogModel.cpp index 4742c1604..0121650ac 100644 --- a/module-apps/application-calllog/CalllogModel.cpp +++ b/module-apps/application-calllog/CalllogModel.cpp @@ -1,11 +1,3 @@ -/* - * @file CalllogModel.cpp - * @author Aleksander Rudnik (aleksander.rudnik@mudita.com) - * @date 23.09.2019 - * @brief Call Log Model - * @copyright Copyright (C) 2019 mudita.com - * @details - */ #include "CalllogModel.hpp" #include "InputEvent.hpp" #include "ListView.hpp" @@ -31,7 +23,7 @@ void CalllogModel::requestRecords(const uint32_t offset, const uint32_t limit) DBServiceAPI::CalllogGetLimitOffset(application, offset, limit); } -bool CalllogModel::updateRecords(std::unique_ptr> records) +bool CalllogModel::updateRecords(std::vector records) { #if DEBUG_DB_MODEL_DATA == 1 LOG_DEBUG("Offset: %" PRIu32 ", Limit: %" PRIu32 " Count: %" PRIu32 "", offset, limit, count); diff --git a/module-apps/application-calllog/CalllogModel.hpp b/module-apps/application-calllog/CalllogModel.hpp index 5f9567968..ddbd22001 100644 --- a/module-apps/application-calllog/CalllogModel.hpp +++ b/module-apps/application-calllog/CalllogModel.hpp @@ -26,7 +26,7 @@ class CalllogModel : public app::DatabaseModel, public gui::ListI CalllogModel(app::Application *app); // virtual methods - bool updateRecords(std::unique_ptr> records) override; + bool updateRecords(std::vector records) override; void requestRecords(const uint32_t offset, const uint32_t limit) override; // virtual methods for ListViewProvider diff --git a/module-apps/application-calllog/windows/CallLogMainWindow.cpp b/module-apps/application-calllog/windows/CallLogMainWindow.cpp index fe420f5fe..f60a02148 100644 --- a/module-apps/application-calllog/windows/CallLogMainWindow.cpp +++ b/module-apps/application-calllog/windows/CallLogMainWindow.cpp @@ -70,11 +70,7 @@ namespace gui bool CallLogMainWindow::onDatabaseMessage(sys::Message *msgl) { DBCalllogResponseMessage *msg = reinterpret_cast(msgl); - if (calllogModel->updateRecords(std::move(msg->records))) { - return true; - } - - return false; + return calllogModel->updateRecords(std::move(*msg->records)); } } /* namespace gui */ diff --git a/module-apps/application-messages/models/BaseThreadsRecordModel.cpp b/module-apps/application-messages/models/BaseThreadsRecordModel.cpp index 83f2f7ad8..80e43e2f9 100644 --- a/module-apps/application-messages/models/BaseThreadsRecordModel.cpp +++ b/module-apps/application-messages/models/BaseThreadsRecordModel.cpp @@ -13,7 +13,7 @@ unsigned int BaseThreadsRecordModel::requestRecordsCount() return recordsCount; } -bool BaseThreadsRecordModel::updateRecords(std::unique_ptr> records) +bool BaseThreadsRecordModel::updateRecords(std::vector records) { DatabaseModel::updateRecords(std::move(records)); list->onProviderDataUpdate(); diff --git a/module-apps/application-messages/models/BaseThreadsRecordModel.hpp b/module-apps/application-messages/models/BaseThreadsRecordModel.hpp index d002cb004..6ae9d94ea 100644 --- a/module-apps/application-messages/models/BaseThreadsRecordModel.hpp +++ b/module-apps/application-messages/models/BaseThreadsRecordModel.hpp @@ -15,7 +15,7 @@ class BaseThreadsRecordModel : public app::DatabaseModel, public g BaseThreadsRecordModel(app::Application *app); unsigned int requestRecordsCount() override; - bool updateRecords(std::unique_ptr> records) override; + bool updateRecords(std::vector records) override; void requestRecords(const uint32_t offset, const uint32_t limit) override; app::Application *getApplication(void) diff --git a/module-apps/application-messages/models/SMSThreadModel.cpp b/module-apps/application-messages/models/SMSThreadModel.cpp index f726faed7..724d8ed36 100644 --- a/module-apps/application-messages/models/SMSThreadModel.cpp +++ b/module-apps/application-messages/models/SMSThreadModel.cpp @@ -54,7 +54,7 @@ void SMSThreadModel::requestRecords(uint32_t offset, uint32_t limit) DBServiceAPI::GetQuery(application, db::Interface::Name::SMS, std::move(query)); } -bool SMSThreadModel::updateRecords(std::unique_ptr> records) +bool SMSThreadModel::updateRecords(std::vector records) { DatabaseModel::updateRecords(std::move(records)); list->onProviderDataUpdate(); @@ -85,9 +85,7 @@ auto SMSThreadModel::handleQueryResponse(db::QueryResult *queryResult) -> bool smsInput->displayDraftMessage(); } - auto records = std::make_unique>(records_data.begin(), records_data.end()); - - return this->updateRecords(std::move(records)); + return this->updateRecords(std::move(records_data)); } void SMSThreadModel::addReturnNumber() diff --git a/module-apps/application-messages/models/SMSThreadModel.hpp b/module-apps/application-messages/models/SMSThreadModel.hpp index 2fc201eff..cb2994406 100644 --- a/module-apps/application-messages/models/SMSThreadModel.hpp +++ b/module-apps/application-messages/models/SMSThreadModel.hpp @@ -23,7 +23,7 @@ class SMSThreadModel : public app::DatabaseModel, public gui::ListIte auto handleQueryResponse(db::QueryResult *) -> bool; unsigned int requestRecordsCount() override; - bool updateRecords(std::unique_ptr> records) override; + bool updateRecords(std::vector records) 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/models/ThreadsModel.cpp b/module-apps/application-messages/models/ThreadsModel.cpp index 801095718..c3cec72c2 100644 --- a/module-apps/application-messages/models/ThreadsModel.cpp +++ b/module-apps/application-messages/models/ThreadsModel.cpp @@ -6,6 +6,7 @@ #include "application-messages/widgets/ThreadItem.hpp" #include "application-messages/windows/ThreadWindowOptions.hpp" #include +#include ThreadsModel::ThreadsModel(app::Application *app) : BaseThreadsRecordModel(app) {} @@ -67,6 +68,6 @@ auto ThreadsModel::handleQueryResponse(db::QueryResult *queryResult) -> bool assert(msgResponse != nullptr); auto records_data = msgResponse->getResults(); - auto records = std::make_unique>(records_data.begin(), records_data.end()); + auto records = std::vector(records_data.begin(), records_data.end()); return this->updateRecords(std::move(records)); } diff --git a/module-apps/application-messages/models/ThreadsSearchResultsModel.cpp b/module-apps/application-messages/models/ThreadsSearchResultsModel.cpp index 59a35c7b3..9ca776ba9 100644 --- a/module-apps/application-messages/models/ThreadsSearchResultsModel.cpp +++ b/module-apps/application-messages/models/ThreadsSearchResultsModel.cpp @@ -64,7 +64,7 @@ namespace gui::model assert(msgResponse != nullptr); auto records_data = msgResponse->getResults(); - auto records = std::make_unique>(records_data.begin(), records_data.end()); + auto records = std::vector(records_data.begin(), records_data.end()); if (msgResponse->getMax() == 0) { diff --git a/module-apps/application-messages/widgets/SMSTemplateModel.cpp b/module-apps/application-messages/widgets/SMSTemplateModel.cpp index 4d1dc75b3..1c32c0f17 100644 --- a/module-apps/application-messages/widgets/SMSTemplateModel.cpp +++ b/module-apps/application-messages/widgets/SMSTemplateModel.cpp @@ -23,7 +23,7 @@ void SMSTemplateModel::requestRecords(const uint32_t offset, const uint32_t limi DBServiceAPI::SMSTemplateGetLimitOffset(application, offset, limit); } -bool SMSTemplateModel::updateRecords(std::unique_ptr> records) +bool SMSTemplateModel::updateRecords(std::vector records) { if (DatabaseModel::updateRecords(std::move(records))) { list->onProviderDataUpdate(); diff --git a/module-apps/application-messages/widgets/SMSTemplateModel.hpp b/module-apps/application-messages/widgets/SMSTemplateModel.hpp index d55caa96e..ffb55e3b8 100644 --- a/module-apps/application-messages/widgets/SMSTemplateModel.hpp +++ b/module-apps/application-messages/widgets/SMSTemplateModel.hpp @@ -14,7 +14,7 @@ class SMSTemplateModel : public app::DatabaseModel, public gu virtual ~SMSTemplateModel() = default; unsigned int requestRecordsCount() override; - bool updateRecords(std::unique_ptr> records) override; + bool updateRecords(std::vector records) override; void requestRecords(const uint32_t offset, const uint32_t limit) override; unsigned int getMinimalItemHeight() const override; diff --git a/module-apps/application-messages/windows/SMSTemplatesWindow.cpp b/module-apps/application-messages/windows/SMSTemplatesWindow.cpp index 36ef43b9d..afcc8ca82 100644 --- a/module-apps/application-messages/windows/SMSTemplatesWindow.cpp +++ b/module-apps/application-messages/windows/SMSTemplatesWindow.cpp @@ -104,11 +104,7 @@ namespace gui bool SMSTemplatesWindow::onDatabaseMessage(sys::Message *msgl) { auto msg = dynamic_cast(msgl); - if (msg && smsTemplateModel->updateRecords(std::move(msg->records))) { - return true; - } - - return false; + return msg && smsTemplateModel->updateRecords(*msg->records); } } /* namespace gui */ diff --git a/module-apps/application-notes/NotesModel.cpp b/module-apps/application-notes/NotesModel.cpp index 435b166ee..149035d2d 100644 --- a/module-apps/application-notes/NotesModel.cpp +++ b/module-apps/application-notes/NotesModel.cpp @@ -26,7 +26,7 @@ void NotesModel::requestRecords(const uint32_t offset, const uint32_t limit) DBServiceAPI::NotesGetLimitOffset(application, offset, limit); } -bool NotesModel::updateRecords(std::unique_ptr> records) +bool NotesModel::updateRecords(std::vector records) { #if DEBUG_DB_MODEL_DATA == 1 LOG_DEBUG("Offset: %" PRIu32 ", Limit: %" PRIu32 " Count: %" PRIu32 "", offset, limit, count); diff --git a/module-apps/application-notes/NotesModel.hpp b/module-apps/application-notes/NotesModel.hpp index 1c90dbaad..8fcab60fc 100644 --- a/module-apps/application-notes/NotesModel.hpp +++ b/module-apps/application-notes/NotesModel.hpp @@ -26,7 +26,7 @@ class NotesModel : public app::DatabaseModel, public gui::ListItemP NotesModel(app::Application *app); // virtual methods - bool updateRecords(std::unique_ptr> records) override; + bool updateRecords(std::vector records) override; void requestRecords(const uint32_t offset, const uint32_t limit) override; // virtual methods for ListViewProvider diff --git a/module-apps/application-notes/windows/NotesMainWindow.cpp b/module-apps/application-notes/windows/NotesMainWindow.cpp index 62da91c81..ed2a4b279 100644 --- a/module-apps/application-notes/windows/NotesMainWindow.cpp +++ b/module-apps/application-notes/windows/NotesMainWindow.cpp @@ -85,10 +85,7 @@ namespace gui bool NotesMainWindow::onDatabaseMessage(sys::Message *msgl) { DBNotesResponseMessage *msg = reinterpret_cast(msgl); - if (notesModel->updateRecords(std::move(msg->records))) - return true; - - return false; + return notesModel->updateRecords(std::move(*msg->records)); } } /* namespace gui */ diff --git a/module-apps/application-phonebook/models/PhonebookModel.cpp b/module-apps/application-phonebook/models/PhonebookModel.cpp index 49a09060f..b5dd4d022 100644 --- a/module-apps/application-phonebook/models/PhonebookModel.cpp +++ b/module-apps/application-phonebook/models/PhonebookModel.cpp @@ -85,7 +85,7 @@ auto PhonebookModel::requestLetterMap() -> ContactsMapData return contactMapData; } -auto PhonebookModel::updateRecords(std::unique_ptr> records) -> bool +auto PhonebookModel::updateRecords(std::vector records) -> bool { #if DEBUG_DB_MODEL_DATA == 1 @@ -170,7 +170,7 @@ auto PhonebookModel::handleQueryResponse(db::QueryResult *queryResult) -> bool auto contactsResponse = dynamic_cast(queryResult); assert(contactsResponse != nullptr); - auto records = std::make_unique>(contactsResponse->getRecords()); + auto records = std::vector(contactsResponse->getRecords()); return this->updateRecords(std::move(records)); } diff --git a/module-apps/application-phonebook/models/PhonebookModel.hpp b/module-apps/application-phonebook/models/PhonebookModel.hpp index 43fded6a7..80864d97c 100644 --- a/module-apps/application-phonebook/models/PhonebookModel.hpp +++ b/module-apps/application-phonebook/models/PhonebookModel.hpp @@ -31,7 +31,7 @@ class PhonebookModel : public app::DatabaseModel, public gui::Lis ~PhonebookModel() override = default; // virtual methods from DatabaseModel - auto updateRecords(std::unique_ptr> records) -> bool override; + auto updateRecords(std::vector records) -> bool override; void requestRecords(const uint32_t offset, const uint32_t limit) override; auto requestLetterMap() -> ContactsMapData; diff --git a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp index c495f2b66..4d97b642c 100644 --- a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp +++ b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp @@ -62,6 +62,10 @@ namespace gui phonebookModel); setFocusItem(contactsList); + phonebookModel->letterMap = phonebookModel->requestLetterMap(); + phonebookModel->setDisplayMode(static_cast(ContactDisplayMode::SortedByLetter)); + contactsList->rebuildList(style::listview::RebuildType::Full); + bottomBar->setActive(BottomBar::Side::LEFT, true); bottomBar->setActive(BottomBar::Side::CENTER, true); bottomBar->setActive(BottomBar::Side::RIGHT, true); @@ -91,10 +95,6 @@ namespace gui { LOG_INFO("onBeforeShow"); - phonebookModel->letterMap = phonebookModel->requestLetterMap(); - phonebookModel->setDisplayMode(static_cast(ContactDisplayMode::SortedByLetter)); - contactsList->rebuildList(style::listview::RebuildType::Full, 0); - auto contactRequest = dynamic_cast(data); requestedSearch = contactRequest != nullptr; if (requestedSearch) { diff --git a/module-db/Interface/ThreadRecord.cpp b/module-db/Interface/ThreadRecord.cpp index 8144f40c0..00b8e3b87 100644 --- a/module-db/Interface/ThreadRecord.cpp +++ b/module-db/Interface/ThreadRecord.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include diff --git a/module-db/Interface/ThreadRecord.hpp b/module-db/Interface/ThreadRecord.hpp index b832a0ae3..dbc3ef9e1 100644 --- a/module-db/Interface/ThreadRecord.hpp +++ b/module-db/Interface/ThreadRecord.hpp @@ -5,7 +5,6 @@ #include "module-db/Databases/ContactsDB.hpp" #include "module-db/Common/Common.hpp" #include "module-db/queries/messages/threads/QueryThreadsSearch.hpp" -#include "module-db/queries/messages/threads/QueryThreadsGet.hpp" #include "module-db/queries/messages/threads/QueryThreadMarkAsRead.hpp" #include diff --git a/module-db/queries/messages/sms/QuerySMSGetForList.hpp b/module-db/queries/messages/sms/QuerySMSGetForList.hpp index 2b0c5eec1..2095bd1e3 100644 --- a/module-db/queries/messages/sms/QuerySMSGetForList.hpp +++ b/module-db/queries/messages/sms/QuerySMSGetForList.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include "Interface/SMSRecord.hpp" diff --git a/module-db/tests/ThreadRecord_tests.cpp b/module-db/tests/ThreadRecord_tests.cpp index ee2cd47f9..153979294 100644 --- a/module-db/tests/ThreadRecord_tests.cpp +++ b/module-db/tests/ThreadRecord_tests.cpp @@ -12,6 +12,7 @@ #include "queries/messages/threads/QueryThreadGetByContactID.hpp" #include "queries/messages/threads/QueryThreadGetByNumber.hpp" #include "queries/messages/threads/QueryThreadRemove.hpp" +#include "queries/messages/threads/QueryThreadsGet.hpp" #include "queries/messages/sms/QuerySMSGetLastByThreadID.hpp" #include "vfs.hpp" diff --git a/module-gui/gui/widgets/ListView.cpp b/module-gui/gui/widgets/ListView.cpp index cab91c024..85ac32a13 100644 --- a/module-gui/gui/widgets/ListView.cpp +++ b/module-gui/gui/widgets/ListView.cpp @@ -341,10 +341,10 @@ namespace gui setFocusItem(body); if (storedFocusIndex != 0) { - if (!body->setFocusOnElement(storedFocusIndex)) { body->setFocusOnLastElement(); } + storedFocusIndex = 0; } if (focusOnLastItem) {