~aleteoryx/muditaos

fda5e8bdd72c3cff95cc2dee7fce85900289108d — Pawel Paprocki 5 years ago 8be15b9
[EGD-4466] Create USSD communication window (#1117)

M changelog.md => changelog.md +2 -0
@@ 2,6 2,7 @@

### Added
* `[cellular]` SIM API for change pin, set/reset sim lock, switch sim card
* `[notes]`    MMI/USSD communication window

[Current release]



@@ 9,6 10,7 @@
* `[notes]` Notes application implemented.
* `[notes]` Notes search engine implemented.


### Changed

* `[desktop]` Windows refactor

M image/assets/lang/English.json => image/assets/lang/English.json +2 -0
@@ 152,6 152,7 @@
  "app_desktop_lock": "LOCK",
  "app_desktop_menu": "MENU",
  "app_desktop_emergency": "SOS",
  "app_desktop_info": "Info",
  "app_desktop_screen_enter_passcode": "Enter passcode",
  "app_desktop_screen_wrong_pin": "Wrong passcode",
  "app_desktop_screen_allowed_attempts": "Allowed unlock attempts",


@@ 200,6 201,7 @@
  "app_desktop_calls": "CALLS",
  "app_desktop_clear": "CLEAR",
  "app_desktop_clear_all": "CLEAR ALL",
  "app_desktop_replay": "REPLY",
  "app_call_call": "CALL",
  "app_call_clear": "CLEAR",
  "app_call_reject": "REJECT",

M module-apps/application-desktop/ApplicationDesktop.cpp => module-apps/application-desktop/ApplicationDesktop.cpp +9 -0
@@ 11,6 11,7 @@
#include "windows/LockedInfoWindow.hpp"
#include "windows/Reboot.hpp"
#include "windows/Update.hpp"
#include "windows/MmiPullWindow.hpp"
#include "AppWindow.hpp"
#include "data/LockPhoneData.hpp"



@@ 63,6 64,11 @@ namespace app
            lockHandler.handleCMEError(std::move(data));
            return msgHandled();
        });

        addActionReceiver(app::manager::actions::ShowMMIResponse, [this](auto &&data) {
            switchWindow(app::window::name::desktop_mmi_pull, std::move(data));
            return msgHandled();
        });
    }

    ApplicationDesktop::~ApplicationDesktop()


@@ 327,6 333,9 @@ namespace app
        windowsFactory.attach(desktop_update, [](Application *app, const std::string newname) {
            return std::make_unique<gui::UpdateWindow>(app);
        });
        windowsFactory.attach(desktop_mmi_pull, [](Application *app, const std::string newname) {
            return std::make_unique<gui::MmiPullWindow>(app, desktop_mmi_pull);
        });
    }

    void ApplicationDesktop::destroyUserInterface()

M module-apps/application-desktop/ApplicationDesktop.hpp => module-apps/application-desktop/ApplicationDesktop.hpp +1 -0
@@ 100,6 100,7 @@ namespace app
                     manager::actions::RequestPinChange,
                     manager::actions::UnlockSim,
                     manager::actions::BlockSim,
                     manager::actions::ShowMMIResponse,
                     manager::actions::DisplayCMEError}};
        }
    };

M module-apps/application-desktop/CMakeLists.txt => module-apps/application-desktop/CMakeLists.txt +4 -0
@@ 18,6 18,7 @@ target_sources( ${PROJECT_NAME}
		"${CMAKE_CURRENT_LIST_DIR}/widgets/PinLock.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/widgets/PinLockHandler.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/widgets/NotificationsBox.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/widgets/DesktopInputWidget.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/DesktopMainWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/PinLockBaseWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/ScreenLockBox.cpp"


@@ 29,12 30,14 @@ target_sources( ${PROJECT_NAME}
		"${CMAKE_CURRENT_LIST_DIR}/windows/LockedInfoWindow.cpp"
        "${CMAKE_CURRENT_LIST_DIR}/windows/Reboot.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/Update.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/MmiPullWindow.cpp"
	PUBLIC
		"${CMAKE_CURRENT_LIST_DIR}/ApplicationDesktop.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/data/LockPhoneData.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/data/Style.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/widgets/PinHash.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/widgets/PinLock.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/widgets/DesktopInputWidget.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/widgets/PinLockHandler.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/widgets/NotificationsBox.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/DesktopMainWindow.hpp"


@@ 50,6 53,7 @@ target_sources( ${PROJECT_NAME}
        "${CMAKE_CURRENT_LIST_DIR}/windows/Reboot.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/Update.hpp"
        "${CMAKE_CURRENT_LIST_DIR}/windows/Names.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/MmiPullWindow.hpp"
)

target_link_libraries(${PROJECT_NAME}

A module-apps/application-desktop/widgets/DesktopInputWidget.cpp => module-apps/application-desktop/widgets/DesktopInputWidget.cpp +101 -0
@@ 0,0 1,101 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "DesktopInputWidget.hpp"
#include "AppWindow.hpp"
#include "application-messages/data/MessagesStyle.hpp"
#include <service-cellular/CellularServiceAPI.hpp>

#include <Style.hpp>
#include <Font.hpp>
#include <algorithm>

namespace style::desktop
{
    namespace inputWidget
    {
        constexpr gui::Length min_h           = 40;
        constexpr gui::Length max_h           = 50;
        constexpr gui::Length vertical_spacer = 25;
    } // namespace inputWidget

    namespace inputText
    {
        constexpr gui::Length default_input_w = 395;
        constexpr gui::Length max_input_h     = 125;
        constexpr gui::Length default_input_h = 30;
        constexpr gui::Length bottom_padding  = 5;
        constexpr gui::Length left_padding    = 5;
    } // namespace inputText

    namespace body
    {
        constexpr gui::Length body_height = 40;
    } // namespace body

} // namespace style::desktop

namespace gui
{

    DesktopInputWidget::DesktopInputWidget(
        app::Application *application, Item *parent, uint32_t x, uint32_t y, uint32_t w, uint32_t h)
        : HBox(parent, x, y, w, h), application(application)
    {
        setMinimumSize(style::window::default_body_width, style::desktop::inputWidget::min_h);
        setMargins(Margins(0, style::desktop::inputWidget::vertical_spacer, 0, 0));
        setEdges(gui::RectangleEdge::None);

        body = new HBox(this, 0, 0, 0, 0);
        body->setEdges(RectangleEdge::Bottom);
        body->setMaximumSize(style::window::default_body_width, style::desktop::body::body_height);
        inputText = new gui::Text(body, 0, 0, 0, 0, "", ExpandMode::EXPAND_NONE);
        inputText->setMaximumSize(style::desktop::inputText::default_input_w, style::desktop::inputText::max_input_h);
        inputText->setMinimumSize(style::desktop::inputText::default_input_w,
                                  style::desktop::inputText::default_input_h);
        inputText->setFont(style::window::font::small);
        inputText->setPadding(
            Padding(style::desktop::inputText::left_padding, 0, 0, style::desktop::inputText::bottom_padding));
        inputText->setPenFocusWidth(style::window::default_border_focus_w);
        inputText->setPenWidth(style::window::default_border_focus_w);
        inputText->setEdges(gui::RectangleEdge::None);
        inputText->setEditMode(EditMode::EDIT);
        setFocusItem(inputText);

        inputText->activatedCallback = [=](gui::Item &) {
            std::string data = inputText->getText().c_str();
            CellularServiceAPI::USSDRequest(
                this->application, CellularUSSDMessage::RequestType::pullSesionRequest, data);
            inputText->clear();
            application->returnToPreviousWindow();
            return true;
        };

        replyImage = new Image(body, 0, 0, "messages_reply");
        replyImage->setAlignment(Alignment(gui::Alignment::Vertical::Center));
        replyImage->setMargins(Margins(0, 0, 0, 0));
        replyImage->activeItem = false;
    }

    auto DesktopInputWidget::onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim) -> bool
    {
        body->setPosition(0, 0);
        body->setSize(newDim.w, newDim.h);

        return true;
    }

    auto DesktopInputWidget::handleRequestResize([[maybe_unused]] const Item *child,
                                                 unsigned short request_w,
                                                 unsigned short request_h) -> Size
    {
        request_h = std::clamp(
            static_cast<Length>(request_h), style::desktop::inputWidget::min_h, style::desktop::inputWidget::max_h);
        setMinimumHeight(request_h);
        if (parent != nullptr) {
            requestSize(request_w, request_h);
        }
        return Size(request_w, request_h);
    }

} /* namespace gui */

A module-apps/application-desktop/widgets/DesktopInputWidget.hpp => module-apps/application-desktop/widgets/DesktopInputWidget.hpp +34 -0
@@ 0,0 1,34 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include "Application.hpp"
#include <AppWindow.hpp>

#include "Text.hpp"
#include "Image.hpp"
#include "ListItem.hpp"
#include <BoxLayout.hpp>

namespace gui
{

    // class DesktopInputWidget : public ListItem
    class DesktopInputWidget : public HBox
    {
        app::Application *application = nullptr;
        HBox *body                    = nullptr;
        gui::Image *replyImage        = nullptr;

      public:
        gui::Text *inputText = nullptr;

        DesktopInputWidget(app::Application *application, Item *parent, uint32_t x, uint32_t y, uint32_t w, uint32_t h);
        ~DesktopInputWidget() override = default;

        auto onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim) -> bool override;
        auto handleRequestResize(const Item *, unsigned short request_w, unsigned short request_h) -> Size override;
    };

} /* namespace gui */

A module-apps/application-desktop/windows/MmiPullWindow.cpp => module-apps/application-desktop/windows/MmiPullWindow.cpp +101 -0
@@ 0,0 1,101 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "MmiPullWindow.hpp"
#include "application-desktop/widgets/DesktopInputWidget.hpp"
#include <service-appmgr/model/ApplicationManager.hpp>
#include <service-appmgr/data/MmiActionsParams.hpp>

#include <i18n/i18n.hpp>
#include <string>

using namespace gui;

// move to style
namespace style::desktop
{
    namespace text
    {
        constexpr uint32_t x = 30;
        constexpr uint32_t y = 120;
        constexpr uint32_t w = 440;
        constexpr uint32_t h = 320;
    } // namespace text

    namespace inputWidget
    {
        constexpr uint32_t x = 30;
        constexpr uint32_t y = 450;
        constexpr uint32_t w = 450;
        constexpr uint32_t h = 50;
    } // namespace inputWidget

} // namespace style::desktop

MmiPullWindow::MmiPullWindow(app::Application *app, const std::string &name) : gui::AppWindow(app, name)
{
    AppWindow::buildInterface();

    topBar->setActive(TopBar::Elements::TIME, true);
    topBar->setActive(TopBar::Elements::SIM, false);
    bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get("app_desktop_replay"));
    bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back));
    text = new Text(
        this, style::desktop::text::x, style::desktop::text::y, style::desktop::text::w, style::desktop::text::h);
    text->setTextType(TextType::MULTI_LINE);
    text->setEditMode(EditMode::BROWSE);
    text->setEdges(RectangleEdge::None);
    text->setFont(style::window::font::medium);
    text->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Top));
    setTitle(utils::localize.get("app_desktop_info"));

    InputBox = new DesktopInputWidget(application,
                                      this,
                                      style::desktop::inputWidget::x,
                                      style::desktop::inputWidget::y,
                                      style::desktop::inputWidget::w,
                                      style::desktop::inputWidget::h);

    InputBox->inputText->setInputMode(new InputMode(
        {InputMode::digit},
        [=](const UTF8 &text1) { bottomBarTemporaryMode(text1); },
        [=]() { bottomBarRestoreFromTemporaryMode(); },
        [=]() { selectSpecialCharacter(); }));

    addWidget(InputBox);
}

std::string MmiPullWindow::removePhrase(std::string str, std::string phrase)
{
    auto find_pos = str.find(phrase);
    while (find_pos != std::string::npos) {
        str.replace(find_pos, phrase.size(), "");
        find_pos = str.find(phrase, find_pos);
    }
    return str;
}

void MmiPullWindow::onBeforeShow(ShowMode mode, SwitchData *data)
{
    auto metadata = dynamic_cast<app::manager::actions::MMIParams *>(data);
    if (metadata != nullptr) {
        text->setText(removePhrase(metadata->getData(), "\r"));
    }
    InputBox->setVisible(true);
    setFocusItem(InputBox->inputText);
}

bool MmiPullWindow::onInput(const InputEvent &inputEvent)
{
    return AppWindow::onInput(inputEvent);
}

void MmiPullWindow::destroyInterface()
{
    erase();
}

MmiPullWindow::~MmiPullWindow()
{
    destroyInterface();
}

A module-apps/application-desktop/windows/MmiPullWindow.hpp => module-apps/application-desktop/windows/MmiPullWindow.hpp +32 -0
@@ 0,0 1,32 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include "application-desktop/widgets/DesktopInputWidget.hpp"

#include <AppWindow.hpp>
#include <Text.hpp>
#include <functional>
#include <DialogMetadata.hpp>

namespace gui
{
    class DesktopInputWidget;

    class MmiPullWindow : public AppWindow
    {
      protected:
        Text *text                   = nullptr;
        DesktopInputWidget *InputBox = nullptr;

      public:
        MmiPullWindow(app::Application *app, const std::string &name);
        ~MmiPullWindow() override;
        void onBeforeShow(ShowMode mode, SwitchData *data) override;
        bool onInput(const InputEvent &inputEvent) override;
        void destroyInterface() override;
        std::string removePhrase(std::string str, std::string phrase);
    };

}; // namespace gui

M module-apps/application-desktop/windows/Names.hpp => module-apps/application-desktop/windows/Names.hpp +1 -0
@@ 13,4 13,5 @@ namespace app::window::name
    inline constexpr auto desktop_pin_lock    = "PinLockWindow";
    inline constexpr auto desktop_locked      = "LockedInfoWindow";
    inline constexpr auto desktop_update      = "Update";
    inline constexpr auto desktop_mmi_pull    = "MmiPullWindow";
}; // namespace app::window::name