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