// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "SettingsChange.hpp" #include "../ApplicationSettings.hpp" #include "i18/i18.hpp" #include "tools/Common.hpp" #include #include #include #include #include #include #include namespace style::option { const inline gui::Length text_left_padding = 10; } namespace gui { class PinChange : public gui::Text { public: PinChange() = default; }; } // namespace gui namespace gui::option { class ChangePin : public Base { private: app::Application *app = nullptr; app::PinLockSetter *setter = nullptr; unsigned int lockHash = 0; public: ChangePin(app::Application *app, app::PinLockSetter *setter, unsigned int lockHash) : app(app), setter(setter), lockHash(lockHash) {} void setLockHash(unsigned int hash) { lockHash = hash; } [[nodiscard]] auto build() const -> Item * override { auto *rect = new gui::HBox(nullptr, style::window::default_left_margin, 0, style::window::default_body_width, style::window::label::big_h); auto font = FontManager::getInstance().getFont(style::window::font::medium); auto font_bold = FontManager::getInstance().getFont(style::window::font::mediumbold); rect->setEdges(RectangleEdge::None); rect->setReverseOrder(true); auto text = new TextFixedSize(nullptr, style::option::text_left_padding, 0, 0, 0); text->setMaximumSize(rect->getWidth(), rect->getHeight()); text->setUnderline(false); text->setEditMode(EditMode::BROWSE); text->setFont(font_bold); text->setText("Change PIN"); text->setAlignment(Alignment(Alignment::Vertical::Center)); text->activeItem = false; text->setPenWidth(0); auto pin_text = new PinChange(); pin_text->setMargins(Margins(0, 0, 0, 0)); pin_text->setMinimumSize(60, rect->getHeight()); pin_text->setMaximumSize(200, rect->getHeight()); pin_text->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center)); pin_text->setEditMode(EditMode::EDIT); pin_text->setFont(font); pin_text->setText(std::to_string(lockHash)); pin_text->setPenWidth(0); pin_text->setInputMode(new InputMode( {InputMode::digit}, [=](const UTF8 &text) {}, [=]() {}, [=]() {})); pin_text->setEdges(RectangleEdge::All); pin_text->activatedCallback = [pin_text, this](gui::Item &item) { auto text = pin_text->getText(); if (text.length() == 0) { LOG_DEBUG("remove pin"); setter->clearPin(); } else if (text.length() != 4) { pin_text->setText("bad value - needs 4 digits"); } else { auto value = std::stoi(text); LOG_DEBUG("setting pin to: %d", value); setter->setPin(value); } return true; }; rect->addWidget(pin_text); rect->addWidget(text); return rect; } }; } // namespace gui::option std::list settingsChangeWindow(app::Application *app, app::PinLockSetter *setter, unsigned int lockHash) { std::list list; list.emplace_back(std::make_unique(app, setter, lockHash)); return list; }