M module-apps/application-phonebook/ApplicationPhonebook.cpp => module-apps/application-phonebook/ApplicationPhonebook.cpp +20 -35
@@ 4,7 4,6 @@
#include <application-phonebook/ApplicationPhonebook.hpp>
#include "Dialog.hpp"
#include "DialogMetadataMessage.hpp"
-#include "models/PhonebookModel.hpp"
#include "models/MultipleNumbersModel.hpp"
#include "windows/PhonebookContactDetails.hpp"
#include "windows/PhonebookContactOptions.hpp"
@@ 16,7 15,6 @@
#include "windows/PhonebookSearchResults.hpp"
#include "windows/PhonebookIceContacts.hpp"
#include "windows/PhonebookInputOptions.hpp"
-#include <service-appmgr/Controller.hpp>
#include <service-db/QueryMessage.hpp>
#include <service-db/DBNotificationMessage.hpp>
#include <utility>
@@ 31,6 29,19 @@ namespace app
{
bus.channels.push_back(sys::BusChannel::ServiceDBNotifications);
addActionReceiver(manager::actions::ShowContacts, [this](auto &&data) {
+ /// Phonebook's contact entries should present different content when the ApplicationPhonebook is invoked
+ /// by external application request
+ phonebookModel->customContactActivationCallback = [this](const auto &item) {
+ if (item->contact->numbers.size() > 1) {
+ std::unique_ptr<PhonebookMultipleNumbersRequest> data =
+ std::make_unique<PhonebookMultipleNumbersRequest>("PhonebookMultipleNumbersRequest",
+ item->contact);
+
+ switchWindow(gui::window::name::multiple_numbers_select, std::move(data));
+ return true;
+ }
+ return false;
+ };
switchWindow(gui::name::window::main_window, std::move(data));
return actionHandled();
});
@@ 82,10 93,11 @@ namespace app
auto ApplicationPhonebook::InitHandler() -> sys::ReturnCodes
{
- auto ret = Application::InitHandler();
+ const auto ret = Application::InitHandler();
if (ret != sys::ReturnCodes::Success) {
return ret;
}
+ phonebookModel = std::make_shared<PhonebookModel>(this);
createUserInterface();
@@ 96,7 108,7 @@ namespace app
{
windowsFactory.attach(gui::name::window::main_window, [&](ApplicationCommon *app, const std::string &name) {
searchRequestModel = std::make_shared<SearchRequestModel>();
- return std::make_unique<gui::PhonebookMainWindow>(app, searchRequestModel);
+ return std::make_unique<gui::PhonebookMainWindow>(app, searchRequestModel, phonebookModel);
});
windowsFactory.attach(gui::window::name::contact, [](ApplicationCommon *app, const std::string &name) {
return std::make_unique<gui::PhonebookContactDetails>(app);
@@ 155,37 167,10 @@ namespace app
void ApplicationPhonebook::onSearchRequest(const std::string &searchFilter)
{
- auto phonebookModel = std::make_unique<PhonebookModel>(this, searchFilter);
-
- LOG_DEBUG("Search results count: %d", phonebookModel->requestRecordsCount());
- if (not searchRequestModel) {
- LOG_ERROR("application not build, model not available");
- assert(0);
- }
- if (phonebookModel->requestRecordsCount() > 0) {
- if (searchRequestModel->requestedSearch()) {
- phonebookModel->activateContactSelectCallback();
- }
- LOG_DEBUG("Switching to search results window.");
- auto data = std::make_unique<PhonebookSearchResultsData>(std::move(phonebookModel));
- switchWindow("SearchResults", gui::ShowMode::GUI_SHOW_INIT, std::move(data));
- }
- else {
- searchEmpty(searchFilter);
- }
- }
-
- bool ApplicationPhonebook::searchEmpty(const std::string &query)
- {
- gui::DialogMetadata meta;
- meta.icon = "search_128px_W_G";
- meta.text = utils::translate("app_phonebook_search_no_results");
- meta.title = utils::translate("common_results_prefix") + "\"" + query + "\"";
- auto data = std::make_unique<gui::DialogMetadataMessage>(meta);
- data->ignoreCurrentWindowOnStack = true;
- LOG_DEBUG("Switching to app_phonebook_search_no_results window.");
- switchWindow(gui::window::name::dialog, std::move(data));
- return true;
+ phonebookModel->setFilter(searchFilter);
+ LOG_DEBUG("Switching to search results window.");
+ auto data = std::make_unique<PhonebookSearchResultsData>(phonebookModel);
+ switchWindow(gui::window::name::search_results, gui::ShowMode::GUI_SHOW_INIT, std::move(data));
}
} /* namespace app */
M module-apps/application-phonebook/data/PhonebookItemData.hpp => module-apps/application-phonebook/data/PhonebookItemData.hpp +2 -11
@@ 42,18 42,9 @@ class PhonebookSearchResultsData : public gui::SwitchData
{
public:
PhonebookSearchResultsData() = delete;
- PhonebookSearchResultsData(std::unique_ptr<PhonebookModel> model) : model(std::move(model)){};
+ PhonebookSearchResultsData(std::shared_ptr<PhonebookModel> model) : model(std::move(model)){};
- std::unique_ptr<PhonebookModel> consumeSearchResultsModel()
- {
- assert(!consumed);
- consumed = true;
- return std::move(model);
- }
-
- protected:
- std::unique_ptr<PhonebookModel> model;
- bool consumed = false;
+ std::shared_ptr<PhonebookModel> model;
};
class PhonebookSearchRequest : public gui::SwitchData
M module-apps/application-phonebook/include/application-phonebook/ApplicationPhonebook.hpp => module-apps/application-phonebook/include/application-phonebook/ApplicationPhonebook.hpp +2 -1
@@ 7,6 7,7 @@
#include <string>
#include <application-phonebook/models/SearchRequestModel.hpp>
+#include <application-phonebook/models/PhonebookModel.hpp>
namespace gui::window::name
{
@@ 33,6 34,7 @@ namespace app
class ApplicationPhonebook : public app::Application
{
std::shared_ptr<SearchRequestModel> searchRequestModel;
+ std::shared_ptr<PhonebookModel> phonebookModel;
public:
explicit ApplicationPhonebook(std::string name = name_phonebook,
@@ 53,7 55,6 @@ namespace app
void destroyUserInterface() override;
void onSearchRequest(const std::string &searchFilter);
- bool searchEmpty(const std::string &query);
};
template <>
M module-apps/application-phonebook/models/PhonebookModel.cpp => module-apps/application-phonebook/models/PhonebookModel.cpp +10 -34
@@ 22,12 22,7 @@
const static std::uint32_t phonebookModelTimeout = 1000;
-PhonebookModel::PhonebookModel(app::ApplicationCommon *app,
- std::string filter,
- std::uint32_t groupFilter,
- std::uint32_t displayMode)
- : DatabaseModel(app), app::AsyncCallbackReceiver{app}, queryFilter(std::move(filter)),
- queryGroupFilter(std::move(groupFilter)), queryDisplayMode(std::move(displayMode))
+PhonebookModel::PhonebookModel(app::ApplicationCommon *app) : DatabaseModel(app), app::AsyncCallbackReceiver{app}
{}
auto PhonebookModel::requestRecordsCount() -> unsigned int
@@ 60,7 55,7 @@ auto PhonebookModel::requestRecordsCount() -> unsigned int
return recordsCount;
}
-void PhonebookModel::requestRecords(const uint32_t offset, const uint32_t limit)
+void PhonebookModel::requestRecords(const std::uint32_t offset, const std::uint32_t limit)
{
auto query =
std::make_unique<db::query::ContactGet>(limit, offset, queryFilter, queryGroupFilter, queryDisplayMode);
@@ 109,7 104,7 @@ auto PhonebookModel::getMinimalItemSpaceRequired() const -> unsigned int
auto PhonebookModel::getItem(gui::Order order) -> gui::ListItem *
{
- std::shared_ptr<ContactRecord> contact = getRecord(order);
+ const auto contact = getRecord(order);
if (contact == nullptr) {
return nullptr;
@@ 120,20 115,15 @@ auto PhonebookModel::getItem(gui::Order order) -> gui::ListItem *
item->setContact(contact);
item->setLabelMarkerDisplayMode(getLabelMarkerDisplayMode(contact->contactPosOnList));
item->activatedCallback = [this, item, contact](gui::Item &) {
- if (contactSelectCallback && contactSelectCallback(item)) {
- return true;
+ if (customContactActivationCallback) {
+ return customContactActivationCallback(item);
}
- std::unique_ptr<gui::SwitchData> data = std::make_unique<PhonebookItemData>(contact);
-
- application->switchWindow(gui::window::name::contact, std::move(data));
+ application->switchWindow(gui::window::name::contact, std::make_unique<PhonebookItemData>(contact));
return true;
};
item->inputCallback = [this, item](gui::Item &, const gui::InputEvent &event) {
- if (contactSelectCallback) {
- return false;
- }
if (event.isShortRelease(gui::KeyCode::KEY_LF)) {
if (item->contact && !item->contact->numbers.empty()) {
const auto phoneNumber = item->contact->numbers.front().number;
@@ 184,23 174,9 @@ auto PhonebookModel::getLabelMarkerDisplayMode(uint32_t posOnList) -> LabelMarke
}
}
-void PhonebookModel::activateContactSelectCallback()
+void PhonebookModel::setFilter(std::string filter, const std::uint32_t groupFilter, const std::uint32_t displayMode)
{
- contactSelectCallback = [=](gui::PhonebookItem *item) {
- if (item->contact->numbers.size() > 1) {
- std::unique_ptr<PhonebookMultipleNumbersRequest> data =
- std::make_unique<PhonebookMultipleNumbersRequest>("PhonebookMultipleNumbersRequest", item->contact);
-
- application->switchWindow(gui::window::name::multiple_numbers_select, std::move(data));
- return true;
- }
- else {
- std::unique_ptr<PhonebookSearchRequest> data = std::make_unique<PhonebookSearchRequest>();
- data->result = item->contact;
- data->setDescription("PhonebookSearchRequest");
- return app::manager::Controller::switchBack(
- application,
- std::make_unique<app::manager::SwitchBackRequest>(application->GetName(), std::move(data)));
- }
- };
+ queryFilter = std::move(filter);
+ queryGroupFilter = groupFilter;
+ queryDisplayMode = displayMode;
}
M module-apps/application-phonebook/models/PhonebookModel.hpp => module-apps/application-phonebook/models/PhonebookModel.hpp +5 -10
@@ 25,18 25,14 @@ class PhonebookModel : public app::DatabaseModel<ContactRecord>,
std::string queryFilter;
std::uint32_t queryGroupFilter;
std::uint32_t queryDisplayMode;
- std::uint32_t lastRequestedOffset = 0;
public:
ContactsMapData letterMap;
- PhonebookModel(app::ApplicationCommon *app,
- std::string filter = "",
- std::uint32_t groupFilter = 0,
- std::uint32_t displayMode = 0);
+ explicit PhonebookModel(app::ApplicationCommon *app);
// virtual methods from DatabaseModel
auto updateRecords(std::vector<ContactRecord> records) -> bool override;
- void requestRecords(const uint32_t offset, const uint32_t limit) override;
+ void requestRecords(std::uint32_t offset, std::uint32_t limit) override;
auto requestLetterMap() -> ContactsMapData;
// virtual methods for ListViewProvider
@@ 47,14 43,13 @@ class PhonebookModel : public app::DatabaseModel<ContactRecord>,
[[nodiscard]] auto requestRecordsCount() -> unsigned int override;
+ auto setFilter(std::string filter, std::uint32_t groupFilter = 0, std::uint32_t displayMode = 0) -> void;
[[nodiscard]] auto getFilter() const -> const std::string &;
void setDisplayMode(std::uint32_t displayMode);
auto getDisplayMode() -> std::uint32_t;
- auto getLastRequestedOffset() -> std::uint32_t;
auto getLabelMarkerDisplayMode(uint32_t posOnList) -> LabelMarkerDisplayMode;
- void activateContactSelectCallback();
- // onClick callback to register
- std::function<bool(gui::PhonebookItem *item)> contactSelectCallback = nullptr;
+ /// User can define custom action that will be executed when a contact item is activated
+ std::function<bool(gui::PhonebookItem *item)> customContactActivationCallback = nullptr;
};
M module-apps/application-phonebook/windows/PhonebookIceContacts.cpp => module-apps/application-phonebook/windows/PhonebookIceContacts.cpp +3 -2
@@ 11,9 11,10 @@
namespace gui
{
PhonebookIceContacts::PhonebookIceContacts(app::ApplicationCommon *app)
- : AppWindow(app, gui::window::name::ice_contacts), phonebookModel{std::make_shared<PhonebookModel>(
- this->application, "", ContactsDB::iceGroupId())}
+ : AppWindow(app, gui::window::name::ice_contacts), phonebookModel{
+ std::make_shared<PhonebookModel>(this->application)}
{
+ phonebookModel->setFilter("", ContactsDB::iceGroupId());
buildInterface();
}
M module-apps/application-phonebook/windows/PhonebookMainWindow.cpp => module-apps/application-phonebook/windows/PhonebookMainWindow.cpp +4 -3
@@ 16,9 16,11 @@
namespace gui
{
- PhonebookMainWindow::PhonebookMainWindow(app::ApplicationCommon *app, std::shared_ptr<SearchRequestModel> model)
+ PhonebookMainWindow::PhonebookMainWindow(app::ApplicationCommon *app,
+ std::shared_ptr<SearchRequestModel> model,
+ std::shared_ptr<PhonebookModel> phonebookModel)
: AppWindow(app, gui::name::window::main_window),
- model(std::move(model)), phonebookModel{std::make_shared<PhonebookModel>(this->application)}
+ model(std::move(model)), phonebookModel{std::move(phonebookModel)}
{
buildInterface();
}
@@ 91,7 93,6 @@ namespace gui
model->setRequested(contactRequest != nullptr);
if (model->requestedSearch()) {
enableNewContact = false;
- phonebookModel->activateContactSelectCallback();
navBar->setActive(nav_bar::Side::Left, false);
navBar->setText(nav_bar::Side::Center, utils::translate(style::strings::common::add));
M module-apps/application-phonebook/windows/PhonebookMainWindow.hpp => module-apps/application-phonebook/windows/PhonebookMainWindow.hpp +3 -1
@@ 36,7 36,9 @@ namespace gui
void onListFilled();
public:
- PhonebookMainWindow(app::ApplicationCommon *app, std::shared_ptr<SearchRequestModel> model);
+ PhonebookMainWindow(app::ApplicationCommon *app,
+ std::shared_ptr<SearchRequestModel> model,
+ std::shared_ptr<PhonebookModel> phonebookModel);
virtual ~PhonebookMainWindow();
// virtual methods
M module-apps/application-phonebook/windows/PhonebookSearchResults.cpp => module-apps/application-phonebook/windows/PhonebookSearchResults.cpp +35 -12
@@ 4,7 4,6 @@
#include "PhonebookSearchResults.hpp"
#include "application-phonebook/ApplicationPhonebook.hpp"
#include "application-phonebook/data/PhonebookStyle.hpp"
-#include "application-phonebook/widgets/PhonebookItem.hpp"
#include <service-db/QueryMessage.hpp>
#include <queries/phonebook/QueryContactGet.hpp>
@@ 41,6 40,20 @@ namespace gui
navBar->setActive(nav_bar::Side::Right, true);
navBar->setText(nav_bar::Side::Right, utils::translate(style::strings::common::back));
+ icon = new Icon(this,
+ style::window::default_left_margin,
+ style::window::default_vertical_pos,
+ style::window::default_body_width,
+ style::window::default_body_height,
+ "",
+ "");
+
+ icon->text->addRichText(utils::translate("app_phonebook_search_no_results"));
+ icon->image->set("search_128px_W_G");
+ icon->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Top));
+ icon->image->setMargins(Margins(0, icon::image_top_margin, 0, icon::image_bottom_margin));
+ icon->setVisible(false);
+
setTitle(utils::translate("common_results_prefix"));
}
@@ 56,6 69,10 @@ namespace gui
void PhonebookSearchResults::onBeforeShow(ShowMode mode, SwitchData *data)
{
+ // Model's data might have changed between calls
+ if (mode == ShowMode::GUI_SHOW_RETURN) {
+ handleContentUpdate();
+ }
searchResultList->rebuildList();
}
@@ 65,25 82,31 @@ namespace gui
return false;
}
- auto searchResultsData = dynamic_cast<PhonebookSearchResultsData *>(data);
+ const auto searchResultsData = dynamic_cast<PhonebookSearchResultsData *>(data);
assert(searchResultsData != nullptr);
- searchResultsModel = searchResultsData->consumeSearchResultsModel();
- setTitle(utils::translate("common_results_prefix") + "\"" + searchResultsModel->getFilter() + "\"");
+ searchResultsModel = searchResultsData->model;
searchResultList->setProvider(searchResultsModel);
+ handleContentUpdate();
- if (searchResultsModel->contactSelectCallback) {
- navBar->setActive(nav_bar::Side::Left, false);
- navBar->setText(nav_bar::Side::Left, "");
- navBar->setText(nav_bar::Side::Center, utils::translate(style::strings::common::select));
- }
- else {
+ return true;
+ }
+ void PhonebookSearchResults::handleContentUpdate()
+ {
+ setTitle(utils::translate("common_results_prefix") + "\"" + searchResultsModel->getFilter() + "\"");
+
+ if (searchResultsModel->requestRecordsCount() > 0) {
navBar->setActive(nav_bar::Side::Left, true);
navBar->setText(nav_bar::Side::Left, utils::translate(style::strings::common::call));
+ navBar->setActive(nav_bar::Side::Center, true);
navBar->setText(nav_bar::Side::Center, utils::translate(style::strings::common::open));
+ setFocusItem(searchResultList);
+ }
+ else {
+ navBar->setActive(nav_bar::Side::Left, false);
+ navBar->setActive(nav_bar::Side::Center, false);
+ setFocusItem(icon);
}
-
- return true;
}
} /* namespace gui */
M module-apps/application-phonebook/windows/PhonebookSearchResults.hpp => module-apps/application-phonebook/windows/PhonebookSearchResults.hpp +3 -0
@@ 7,6 7,7 @@
#include "application-phonebook/models/PhonebookModel.hpp"
#include "application-phonebook/widgets/PhonebookListView.hpp"
#include <AppWindow.hpp>
+#include <Icon.hpp>
namespace gui
{
@@ 22,9 23,11 @@ namespace gui
void onBeforeShow(ShowMode mode, SwitchData *data) override;
auto handleSwitchData(SwitchData *data) -> bool override;
void rebuild() override;
+ void handleContentUpdate();
std::shared_ptr<PhonebookModel> searchResultsModel;
PhonebookListView *searchResultList = nullptr;
+ Icon *icon = nullptr;
};
} /* namespace gui */
M pure_changelog.md => pure_changelog.md +1 -0
@@ 67,6 67,7 @@
* Fixed lack of contact search list update when returning to list after contact edition
* Fixed wrong USSD flow when user closed USSD popup with back button
* Fixed broken abbreviating of multiline text messages content in deletion window
+* Fixed misleading labels in the Phonebook application when using search engine
## [1.6.0 2023-02-27]