mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-04-18 14:07:49 -04:00
183 lines
6.6 KiB
C++
183 lines
6.6 KiB
C++
// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved.
|
|
// For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md
|
|
|
|
#include "ApplicationCall.hpp"
|
|
#include "CallAppStyle.hpp"
|
|
#include "CallSwitchData.hpp"
|
|
#include "NumberWindow.hpp"
|
|
|
|
#include <gui/widgets/text/Label.hpp>
|
|
#include <gui/widgets/Window.hpp>
|
|
#include <i18n/i18n.hpp>
|
|
#include <text/modes/InputMode.hpp>
|
|
#include <service-appmgr/Controller.hpp>
|
|
|
|
#include <cassert>
|
|
|
|
namespace gui
|
|
{
|
|
NumberWindow::NumberWindow(app::ApplicationCommon *app,
|
|
app::EnterNumberWindowInterface *interface,
|
|
std::string windowName)
|
|
: AppWindow(app, std::move(windowName)), interface(interface), currentCountry(defaultCountry),
|
|
numberUtil(*PhoneNumberUtil::GetInstance())
|
|
{
|
|
assert(interface != nullptr);
|
|
assert(app != nullptr);
|
|
switchFormatter(utils::country::getAlpha2Code(currentCountry));
|
|
}
|
|
|
|
void NumberWindow::setNumberLabel(const std::string &num)
|
|
{
|
|
numberLabel->setText(num);
|
|
|
|
if (num.empty()) {
|
|
navBar->setText(nav_bar::Side::Right, utils::translate(style::strings::common::back));
|
|
return;
|
|
}
|
|
navBar->setText(nav_bar::Side::Right, utils::translate("app_call_clear"));
|
|
}
|
|
|
|
void NumberWindow::buildInterface()
|
|
{
|
|
using namespace callAppStyle;
|
|
using namespace callAppStyle::enterNumberWindow;
|
|
AppWindow::buildInterface();
|
|
|
|
navBar->setActive(nav_bar::Side::Left, true);
|
|
navBar->setActive(nav_bar::Side::Center, true);
|
|
navBar->setActive(nav_bar::Side::Right, true);
|
|
|
|
navBar->setText(nav_bar::Side::Left, utils::translate(callAppStyle::strings::call));
|
|
|
|
numberLabel = new gui::Label(this, numberLabel::x, numberLabel::y, numberLabel::w, numberLabel::h);
|
|
numberLabel->setPenWidth(numberLabel::borderW);
|
|
numberLabel->setFont(style::window::font::largelight);
|
|
numberLabel->setEdges(RectangleEdge::Bottom);
|
|
numberLabel->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Top));
|
|
numberLabel->setTextEllipsisType(TextEllipsis::Left);
|
|
numberLabel->setCursorStartPosition(CursorStartPosition::DocumentEnd);
|
|
|
|
numberDescriptionLabel = new gui::Label(this,
|
|
numberDescriptionLabel::x,
|
|
numberDescriptionLabel::y,
|
|
numberDescriptionLabel::w,
|
|
numberDescriptionLabel::h);
|
|
numberDescriptionLabel->setFont(style::window::font::mediumlight);
|
|
numberDescriptionLabel->setAlignment(
|
|
gui::Alignment{gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Top});
|
|
numberDescriptionLabel->setEdges(RectangleEdge::None);
|
|
}
|
|
|
|
void NumberWindow::destroyInterface()
|
|
{
|
|
erase();
|
|
}
|
|
|
|
bool NumberWindow::onInput(const InputEvent &inputEvent)
|
|
{
|
|
const auto code = translator.handle(inputEvent.getRawKey(), InputMode({InputMode::phone}).get());
|
|
|
|
if (inputEvent.isShortRelease()) {
|
|
// Call function
|
|
if (inputEvent.is(KeyCode::KEY_LF)) {
|
|
if (enteredNumber.empty()) {
|
|
return false;
|
|
}
|
|
interface->handleCallEvent(enteredNumber);
|
|
return true;
|
|
}
|
|
|
|
// Clear/back function
|
|
if (inputEvent.is(KeyCode::KEY_RF)) {
|
|
// if there isn't any char in phone number field return to previous application
|
|
if (enteredNumber.empty()) {
|
|
formatter->Clear();
|
|
app::manager::Controller::switchBack(application);
|
|
}
|
|
// if there is the last char just clear input
|
|
else if (enteredNumber.size() == 1) {
|
|
clearInput();
|
|
}
|
|
else {
|
|
// remove last digit and reformat entered number otherwise
|
|
enteredNumber = enteredNumber.substr(0, enteredNumber.size() - 1);
|
|
initFormatterInput(enteredNumber);
|
|
setNumberLabel(formattedNumber);
|
|
|
|
application->refreshWindow(RefreshModes::GUI_REFRESH_FAST);
|
|
}
|
|
return true;
|
|
}
|
|
else if (code != 0) {
|
|
addDigit(code);
|
|
return true;
|
|
}
|
|
}
|
|
else if (inputEvent.isLongRelease()) {
|
|
// erase all characters from phone number
|
|
if (inputEvent.is(KeyCode::KEY_RF)) {
|
|
// if there isn't any char in phone number field return to previous application
|
|
if (enteredNumber.empty()) {
|
|
app::manager::Controller::switchBack(application);
|
|
return true;
|
|
}
|
|
clearInput();
|
|
return true;
|
|
}
|
|
|
|
// long press of '0' key is translated to '+'
|
|
if (inputEvent.is(KeyCode::KEY_0)) {
|
|
addDigit('+');
|
|
return true;
|
|
}
|
|
|
|
// prevent locking the phone by long pound press
|
|
if (inputEvent.is(KeyCode::KEY_PND)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
// check if any of the lower inheritance onInput methods catch the event
|
|
return AppWindow::onInput(inputEvent);
|
|
}
|
|
|
|
void NumberWindow::switchFormatter(const std::string ®ionCode)
|
|
{
|
|
auto newFormatter = std::unique_ptr<Formatter>(numberUtil.GetAsYouTypeFormatter(regionCode));
|
|
formatter.swap(newFormatter);
|
|
LOG_INFO("Switched formatter to new region");
|
|
}
|
|
|
|
void NumberWindow::initFormatterInput(const std::string &number)
|
|
{
|
|
enteredNumber = number;
|
|
formatter->Clear();
|
|
for (auto c : number) {
|
|
formatter->InputDigit(c, &formattedNumber);
|
|
}
|
|
}
|
|
|
|
void NumberWindow::addDigit(const std::string::value_type &digit)
|
|
{
|
|
enteredNumber += digit;
|
|
formatter->InputDigit(digit, &formattedNumber);
|
|
setNumberLabel(formattedNumber);
|
|
application->refreshWindow(RefreshModes::GUI_REFRESH_FAST);
|
|
}
|
|
|
|
const std::string &NumberWindow::getEnteredNumber() const noexcept
|
|
{
|
|
return enteredNumber;
|
|
}
|
|
|
|
void NumberWindow::clearInput()
|
|
{
|
|
enteredNumber.clear();
|
|
formattedNumber.clear();
|
|
formatter->Clear();
|
|
setNumberLabel("");
|
|
application->refreshWindow(RefreshModes::GUI_REFRESH_FAST);
|
|
}
|
|
} /* namespace gui */
|