// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "PhonebookMainWindow.hpp" #include "application-phonebook/ApplicationPhonebook.hpp" #include "application-phonebook/data/PhonebookItemData.hpp" #include "application-phonebook/data/PhonebookStyle.hpp" #include #include #include #include namespace gui { PhonebookMainWindow::PhonebookMainWindow(app::Application *app) : AppWindow(app, gui::name::window::main_window), phonebookModel{ std::make_shared(this->application)} { buildInterface(); } void PhonebookMainWindow::rebuild() { contactsList->rebuildList(style::listview::RebuildType::InPlace); } void PhonebookMainWindow::buildInterface() { AppWindow::buildInterface(); topBar->setActive(TopBar::Elements::TIME, true); setTitle(utils::localize.get("app_phonebook_title_main")); leftArrowImage = new gui::Image(this, phonebookStyle::mainWindow::leftArrowImage::x, phonebookStyle::mainWindow::leftArrowImage::y, phonebookStyle::mainWindow::leftArrowImage::w, phonebookStyle::mainWindow::leftArrowImage::h, "arrow_left"); rightArrowImage = new gui::Image(this, phonebookStyle::mainWindow::rightArrowImage::x, phonebookStyle::mainWindow::rightArrowImage::y, phonebookStyle::mainWindow::rightArrowImage::w, phonebookStyle::mainWindow::rightArrowImage::h, "arrow_right"); newContactImage = new gui::Image(this, phonebookStyle::mainWindow::newContactImage::x, phonebookStyle::mainWindow::newContactImage::y, phonebookStyle::mainWindow::newContactImage::w, phonebookStyle::mainWindow::newContactImage::h, "cross"); searchImage = new gui::Image(this, phonebookStyle::mainWindow::searchImage::x, phonebookStyle::mainWindow::searchImage::y, phonebookStyle::mainWindow::searchImage::w, phonebookStyle::mainWindow::searchImage::h, "search"); contactsList = new gui::PhonebookListView(this, phonebookStyle::mainWindow::contactsList::x, phonebookStyle::mainWindow::contactsList::y, phonebookStyle::mainWindow::contactsList::w, phonebookStyle::mainWindow::contactsList::h, 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); bottomBar->setText(BottomBar::Side::LEFT, utils::localize.get(style::strings::common::call)); bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::open)); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); auto app = application; inputMode = std::make_unique( std::list{InputMode::ABC, InputMode::abc}, [app](const UTF8 &text) { app->getCurrentWindow()->bottomBarTemporaryMode(text); }, [app]() { app->getCurrentWindow()->bottomBarRestoreFromTemporaryMode(); }, [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }); } void PhonebookMainWindow::destroyInterface() { erase(); } PhonebookMainWindow::~PhonebookMainWindow() { destroyInterface(); } void PhonebookMainWindow::onBeforeShow(ShowMode mode, SwitchData *data) { LOG_INFO("onBeforeShow"); auto contactRequest = dynamic_cast(data); requestedSearch = contactRequest != nullptr; if (requestedSearch) { enableNewContact = false; phonebookModel->messagesSelectCallback = [=](gui::PhonebookItem *item) { std::unique_ptr data = std::make_unique(); data->result = item->contact; data->setDescription("PhonebookSearchRequest"); return app::manager::Controller::switchBack( application, std::make_unique(application->GetName(), std::move(data))); }; leftArrowImage->setVisible(false); newContactImage->setVisible(false); } } void PhonebookMainWindow::HandleFilteringByLetter(const InputEvent &inputEvent) { auto code = translator.handle(inputEvent.key, inputMode ? inputMode->get() : ""); if (code != Profile::none_key) { LOG_INFO("char=' %c'", static_cast(code)); char letter = static_cast(code); std::string filterLetter; filterLetter.push_back(letter); LOG_DEBUG("Number of favourites contacts : %" PRIu32, phonebookModel->letterMap.favouritesCount); uint32_t dataOffset = phonebookModel->letterMap.firstLetterDictionary[filterLetter]; if (dataOffset != phonebookContactsMap::NO_MATCH_FOUND) { LOG_DEBUG("PhoneBook Data Offset : %" PRIu32, dataOffset); phonebookModel->setDisplayMode(static_cast(ContactDisplayMode::SortedByLetter)); contactsList->rebuildList(style::listview::RebuildType::OnOffset, dataOffset); } } } bool PhonebookMainWindow::onInput(const InputEvent &inputEvent) { // process only if key is released if (inputEvent.state == InputEvent::State::keyReleasedShort) { switch (inputEvent.keyCode) { case KeyCode::KEY_LEFT: { if (enableNewContact) { std::unique_ptr data = std::make_unique(); application->switchWindow( gui::window::name::new_contact, gui::ShowMode::GUI_SHOW_INIT, std::move(data)); } } return true; case KeyCode::KEY_RIGHT: application->switchWindow("Search"); return true; default: HandleFilteringByLetter(inputEvent); break; } } // check if any of the lower inheritance onInput methods catch the event return AppWindow::onInput(inputEvent); } bool PhonebookMainWindow::onDatabaseMessage(sys::Message *msgl) { auto *msgNotification = dynamic_cast(msgl); if (msgNotification != nullptr) { if (msgNotification->interface == db::Interface::Name::Contact) { if (msgNotification->dataModified()) { phonebookModel->letterMap = phonebookModel->requestLetterMap(); rebuild(); return true; } } } return false; } bool PhonebookMainWindow::isSearchRequested() const { return requestedSearch; } } /* namespace gui */