M image/assets/lang/English.json => image/assets/lang/English.json +4 -2
@@ 246,6 246,8 @@
"sim_setup_wrong_puk_last_attempt_warning": "<text>If the code is wrong this time, the<br></br>SIM card will be blocked and you'll<br></br>have to contact the operator.</text>",
"sim_card_pin_disabled": "SIM card pin disabled",
"sim_card_pin_enabled": "SIM card pin enabled",
+ "sim_card_cant_connect": "<text>Cannot connect to <token>$SIM</token> card.<br></br>Please insert card.</text>",
+ "sim_card_not_ready": "<text>Waiting for Modem to start.<br></br>This may take a moment.</text>",
"app_desktop_press_to_unlock": "<text font='gt_pressura' size='27'>Press <b>Unlock</b> and then <b>#</b></text>",
"app_desktop_unread_messages": "<text>Unread <b>messages</b></text>",
"app_desktop_missed_calls": "<text>Missed <b>calls</b></text>",
@@ 318,8 320,8 @@
"app_onboarding_title_configuration": "Configuration",
"app_onboarding_title_update_info": "MuditaOS update",
"app_onboarding_skip_confirm": "<text>Sim setup is required for network connection. Skip the setup anyway? </text>",
- "app_onboarding_configuration_successful": "<text>Your Pure was configured</text><br></br><text>successfully.</text>",
- "app_onboarding_no_configuration": "<text>Your Pure is not configured.</text><br></br><text>You can go to Settings to.</text><br></br><text>configure it.</text>",
+ "app_onboarding_configuration_successful": "<text>Your Mudita Pure<br></br>is ready to use.</text>",
+ "app_onboarding_no_configuration": "<text>Your Mudita Pure has not been<br></br>configured. You can go to<br></br>Settings to set it up.</text>",
"app_onboarding_update_info": "<text>New Mudita OS version is available.</text><br></br><text>To update your Pure Phone, please</text><br></br><text>visit: </text><text font='gt_pressura' weight='bold' size='27'>www.mudita.com/updateos</text><br></br><text>and follow the instructions.</text>",
"app_settings_title_main": "Advanced",
"app_settings_title_main_new": "Settings",
M image/user/db/settings_v2_002.sql => image/user/db/settings_v2_002.sql +1 -1
@@ 19,7 19,7 @@ INSERT OR IGNORE INTO settings_tab (path, value) VALUES
('gs_display_language', 'English'),
('gs_input_language', 'English'),
('gs_eula_accepted', '0'),
- ('gs_onboarding_done', '0'),
+ ('gs_onboarding_done', '1'),
('gs_usb_security', '1'),
('gs_usb_devices', ''),
('gs_os_update_version', '0.00.0'),
M module-apps/Application.cpp => module-apps/Application.cpp +6 -0
@@ 51,6 51,7 @@
#include <popups/lock-popups/PhoneLockChangeInfoWindow.hpp>
#include <popups/lock-popups/SimLockInputWindow.hpp>
#include <popups/lock-popups/SimInfoWindow.hpp>
+#include <popups/lock-popups/SimNotReadyWindow.hpp>
#include <popups/data/PopupData.hpp>
#include <popups/data/PopupRequestParams.hpp>
#include <popups/data/PhoneModeParams.hpp>
@@ 774,6 775,7 @@ namespace app
break;
case ID::PhoneLock:
case ID::PhoneLockInput:
+ case ID::PhoneLockInfo:
case ID::PhoneLockChangeInfo:
windowsFactory.attach(window::phone_lock_window, [](Application *app, const std::string &name) {
return std::make_unique<gui::PhoneLockedWindow>(app, window::phone_lock_window);
@@ 796,12 798,16 @@ namespace app
break;
case ID::SimLock:
case ID::SimInfo:
+ case ID::SimNotReady:
windowsFactory.attach(window::sim_unlock_window, [](Application *app, const std::string &name) {
return std::make_unique<gui::SimLockInputWindow>(app, window::sim_unlock_window);
});
windowsFactory.attach(window::sim_info_window, [](Application *app, const std::string &name) {
return std::make_unique<gui::SimInfoWindow>(app, window::sim_info_window);
});
+ windowsFactory.attach(window::sim_not_ready_window, [](Application *app, const std::string &name) {
+ return std::make_unique<gui::SimNotReadyWindow>(app, window::sim_not_ready_window);
+ });
break;
}
}
M module-apps/CMakeLists.txt => module-apps/CMakeLists.txt +1 -0
@@ 37,6 37,7 @@ set( SOURCES
"widgets/ActiveIconFactory.cpp"
"widgets/TextWithIconsWidget.cpp"
"widgets/DateWidget.cpp"
+ "widgets/IceBox.cpp"
"widgets/TimeWidget.cpp"
"widgets/WidgetsUtils.cpp"
"notifications/NotificationListItem.cpp"
M module-apps/application-onboarding/ApplicationOnBoarding.cpp => module-apps/application-onboarding/ApplicationOnBoarding.cpp +32 -11
@@ 5,7 5,7 @@
#include "ApplicationOnBoarding.hpp"
-#include "windows/OnBoardingMainWindow.hpp"
+#include "data/OnBoardingMessages.hpp"
#include "windows/StartConfigurationWindow.hpp"
#include "windows/OnBoardingLanguagesWindow.hpp"
#include "windows/EULALicenseWindow.hpp"
@@ 23,6 23,8 @@
#include <module-services/service-db/agents/settings/SystemSettings.hpp>
#include <module-apps/application-settings-new/windows/ChangeTimeZone.hpp>
#include <module-apps/locks/data/PhoneLockMessages.hpp>
+#include <module-apps/locks/data/SimLockMessages.hpp>
+#include <service-appmgr/service-appmgr/model/ApplicationManager.hpp>
namespace app
{
@@ 42,6 44,7 @@ namespace app
bus.channels.push_back(sys::BusChannel::ServiceDBNotifications);
bus.channels.push_back(sys::BusChannel::PhoneLockChanges);
+ bus.channels.push_back(sys::BusChannel::ServiceCellularNotifications);
}
// Invoked upon receiving data message
@@ 85,12 88,27 @@ namespace app
return sys::msgHandled();
});
+ connect(typeid(cellular::msg::notification::SimReady), [&](sys::Message *msg) {
+ if (getCurrentWindow()->getName() == gui::window::name::onBoarding_sim_select) {
+ phoneLockSubject.setPhoneLock();
+ return sys::msgHandled();
+ }
+ return sys::msgNotHandled();
+ });
+
return ret;
}
void ApplicationOnBoarding::acceptEULA()
{
- settings->setValue(settings::SystemProperties::eulaAccepted, "1", settings::SettingsScope::Global);
+ settings->setValue(
+ settings::SystemProperties::eulaAccepted, utils::to_string(true), settings::SettingsScope::Global);
+ }
+
+ void ApplicationOnBoarding::finalizeOnBoarding()
+ {
+ bus.sendUnicast(std::make_shared<onBoarding::FinalizeOnBoarding>(),
+ app::manager::ApplicationManager::ServiceName);
}
sys::ReturnCodes ApplicationOnBoarding::DeinitHandler()
@@ 106,9 124,6 @@ namespace app
void ApplicationOnBoarding::createUserInterface()
{
windowsFactory.attach(gui::name::window::main_window, [](Application *app, const std::string &name) {
- return std::make_unique<app::onBoarding::OnBoardingMainWindow>(app);
- });
- windowsFactory.attach(gui::window::name::onBoarding_languages, [](Application *app, const std::string &name) {
return std::make_unique<app::onBoarding::OnBoardingLanguagesWindow>(app);
});
windowsFactory.attach(gui::window::name::onBoarding_start_configuration,
@@ 122,7 137,8 @@ namespace app
return std::make_unique<app::onBoarding::EULALicenseWindow>(app, std::move(presenter));
});
windowsFactory.attach(gui::window::name::onBoarding_sim_select, [](Application *app, const std::string &name) {
- return std::make_unique<gui::OnBoardingSimSelectWindow>(app, gui::window::name::onBoarding_sim_select);
+ return std::make_unique<app::onBoarding::OnBoardingSimSelectWindow>(
+ app, gui::window::name::onBoarding_sim_select);
});
windowsFactory.attach(gui::window::name::onBoarding_no_sim_selected,
[](Application *app, const std::string &name) {
@@ 136,8 152,10 @@ namespace app
[](Application *app, const std::string &name) {
return std::make_unique<app::onBoarding::NoConfigurationDialogWindow>(app);
});
- windowsFactory.attach(gui::window::name::onBoarding_update, [](Application *app, const std::string &name) {
- return std::make_unique<app::onBoarding::UpdateDialogWindow>(app);
+ windowsFactory.attach(gui::window::name::onBoarding_update, [&](Application *app, const std::string &name) {
+ auto presenter =
+ std::make_unique<app::onBoarding::OnBoardingFinalizeWindowPresenter>([&]() { finalizeOnBoarding(); });
+ return std::make_unique<app::onBoarding::UpdateDialogWindow>(app, std::move(presenter));
});
windowsFactory.attach(gui::window::name::onBoarding_skip, [](Application *app, const std::string &name) {
return std::make_unique<app::onBoarding::SkipDialogWindow>(app);
@@ 148,7 166,7 @@ namespace app
});
windowsFactory.attach(gui::window::name::onBoarding_change_date_and_time,
[](Application *app, const std::string &name) {
- return std::make_unique<gui::OnBoardingChangeDateAndTimeWindow>(app);
+ return std::make_unique<app::onBoarding::OnBoardingChangeDateAndTimeWindow>(app);
});
windowsFactory.attach(gui::window::name::change_time_zone, [](Application *app, const std::string &name) {
return std::make_unique<gui::ChangeTimeZone>(app);
@@ 157,8 175,11 @@ namespace app
return std::make_unique<gui::DialogConfirm>(app, gui::window::name::dialog_confirm);
});
- attachPopups(
- {gui::popup::ID::Volume, gui::popup::ID::Tethering, gui::popup::ID::PhoneModes, gui::popup::ID::PhoneLock});
+ attachPopups({gui::popup::ID::Volume,
+ gui::popup::ID::Tethering,
+ gui::popup::ID::PhoneModes,
+ gui::popup::ID::PhoneLock,
+ gui::popup::ID::SimLock});
}
void ApplicationOnBoarding::destroyUserInterface()
M module-apps/application-onboarding/ApplicationOnBoarding.hpp => module-apps/application-onboarding/ApplicationOnBoarding.hpp +1 -0
@@ 38,6 38,7 @@ namespace app
sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override;
void acceptEULA();
+ void finalizeOnBoarding();
void createUserInterface() override;
void destroyUserInterface() override;
M module-apps/application-onboarding/CMakeLists.txt => module-apps/application-onboarding/CMakeLists.txt +3 -2
@@ 12,11 12,11 @@ target_sources(${PROJECT_NAME}
PRIVATE
"${CMAKE_CURRENT_LIST_DIR}/ApplicationOnBoarding.cpp"
- "${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingMainWindow.cpp"
"${CMAKE_CURRENT_LIST_DIR}/windows/StartConfigurationWindow.cpp"
"${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingLanguagesWindow.cpp"
"${CMAKE_CURRENT_LIST_DIR}/windows/EULALicenseWindow.cpp"
"${CMAKE_CURRENT_LIST_DIR}/presenter/EULALicenseWindowPresenter.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/presenter/OnBoardingFinalizeWindowPresenter.cpp"
"${CMAKE_CURRENT_LIST_DIR}/model/EULARepository.cpp"
"${CMAKE_CURRENT_LIST_DIR}/windows/ConfigurationSuccessfulDialogWindow.cpp"
"${CMAKE_CURRENT_LIST_DIR}/windows/NoConfigurationDialogWindow.cpp"
@@ 28,12 28,13 @@ target_sources(${PROJECT_NAME}
"${CMAKE_CURRENT_LIST_DIR}/windows/NoSimSelectedDialogWindow.cpp"
PUBLIC
"${CMAKE_CURRENT_LIST_DIR}/ApplicationOnBoarding.hpp"
- "${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingMainWindow.hpp"
"${CMAKE_CURRENT_LIST_DIR}/windows/StartConfigurationWindow.hpp"
"${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingLanguagesWindow.hpp"
"${CMAKE_CURRENT_LIST_DIR}/data/OnBoardingSwitchData.hpp"
+ "${CMAKE_CURRENT_LIST_DIR}/data/OnBoardingMessages.hpp"
"${CMAKE_CURRENT_LIST_DIR}/windows/EULALicenseWindow.hpp"
"${CMAKE_CURRENT_LIST_DIR}/presenter/EULALicenseWindowPresenter.hpp"
+ "${CMAKE_CURRENT_LIST_DIR}/presenter/OnBoardingFinalizeWindowPresenter.hpp"
"${CMAKE_CURRENT_LIST_DIR}/model/EULARepository.hpp"
"${CMAKE_CURRENT_LIST_DIR}/windows/ConfigurationSuccessfulDialogWindow.hpp"
"${CMAKE_CURRENT_LIST_DIR}/windows/NoConfigurationDialogWindow.hpp"
A module-apps/application-onboarding/data/OnBoardingMessages.hpp => module-apps/application-onboarding/data/OnBoardingMessages.hpp +12 -0
@@ 0,0 1,12 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#pragma once
+
+#include <Service/Message.hpp>
+
+namespace app::onBoarding
+{
+ class FinalizeOnBoarding : public sys::DataMessage
+ {};
+} // namespace app::onBoarding
A module-apps/application-onboarding/presenter/OnBoardingFinalizeWindowPresenter.cpp => module-apps/application-onboarding/presenter/OnBoardingFinalizeWindowPresenter.cpp +17 -0
@@ 0,0 1,17 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#include "OnBoardingFinalizeWindowPresenter.hpp"
+
+namespace app::onBoarding
+{
+ OnBoardingFinalizeWindowPresenter::OnBoardingFinalizeWindowPresenter(Function finalizeOnBoarding)
+ : finalizeOnBoardingApp(std::move(finalizeOnBoarding))
+ {}
+
+ void OnBoardingFinalizeWindowPresenter::finalizeOnBoarding()
+ {
+ finalizeOnBoardingApp();
+ }
+
+} // namespace app::onBoarding
A module-apps/application-onboarding/presenter/OnBoardingFinalizeWindowPresenter.hpp => module-apps/application-onboarding/presenter/OnBoardingFinalizeWindowPresenter.hpp +41 -0
@@ 0,0 1,41 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#pragma once
+
+#include "functional"
+#include "string"
+#include "BasePresenter.hpp"
+
+using Function = std::function<void()>;
+
+namespace app::onBoarding
+{
+ class OnBoardingFinalizeContract
+ {
+ public:
+ class View
+ {
+ public:
+ virtual ~View() noexcept = default;
+ };
+ class Presenter : public BasePresenter<OnBoardingFinalizeContract::View>
+ {
+ public:
+ ~Presenter() noexcept override = default;
+
+ virtual void finalizeOnBoarding() = 0;
+ };
+ };
+
+ class OnBoardingFinalizeWindowPresenter : public OnBoardingFinalizeContract::Presenter
+ {
+ public:
+ explicit OnBoardingFinalizeWindowPresenter(Function finalizeOnBoarding);
+
+ void finalizeOnBoarding() override;
+
+ private:
+ std::function<void()> finalizeOnBoardingApp;
+ };
+} // namespace app::onBoarding
M module-apps/application-onboarding/windows/ConfigurationSuccessfulDialogWindow.cpp => module-apps/application-onboarding/windows/ConfigurationSuccessfulDialogWindow.cpp +14 -3
@@ 3,12 3,14 @@
#include "ConfigurationSuccessfulDialogWindow.hpp"
-#include <i18n/i18n.hpp>
-#include <Style.hpp>
-
#include <module-apps/application-onboarding/ApplicationOnBoarding.hpp>
#include <module-apps/application-onboarding/data/OnBoardingSwitchData.hpp>
#include <module-apps/messages/DialogMetadataMessage.hpp>
+#include <widgets/IceBox.hpp>
+#include <service-appmgr/Controller.hpp>
+
+#include <i18n/i18n.hpp>
+#include <Style.hpp>
namespace app::onBoarding
{
@@ 17,6 19,8 @@ namespace app::onBoarding
{
bottomBar->setText(gui::BottomBar::Side::CENTER, utils::translate(style::strings::common::start));
bottomBar->setActive(gui::BottomBar::Side::RIGHT, false);
+
+ new gui::IceBox(this);
}
bool ConfigurationSuccessfulDialogWindow::onInput(const gui::InputEvent &inputEvent)
@@ 37,6 41,13 @@ namespace app::onBoarding
if (inputEvent.is(gui::KeyCode::KEY_RF)) {
return true;
}
+
+ if (inputEvent.is(gui::KeyCode::KEY_LEFT)) {
+ app::manager::Controller::sendAction(application,
+ app::manager::actions::EmergencyDial,
+ std::make_unique<gui::SwitchData>(),
+ app::manager::OnSwitchBehaviour::RunInBackground);
+ }
}
return AppWindow::onInput(inputEvent);
}
M module-apps/application-onboarding/windows/NoConfigurationDialogWindow.cpp => module-apps/application-onboarding/windows/NoConfigurationDialogWindow.cpp +15 -3
@@ 3,12 3,14 @@
#include "NoConfigurationDialogWindow.hpp"
-#include <i18n/i18n.hpp>
-#include <Style.hpp>
-
#include <module-apps/application-onboarding/ApplicationOnBoarding.hpp>
#include <module-apps/application-onboarding/data/OnBoardingSwitchData.hpp>
#include <module-apps/messages/DialogMetadataMessage.hpp>
+#include <widgets/IceBox.hpp>
+#include <service-appmgr/Controller.hpp>
+
+#include <i18n/i18n.hpp>
+#include <Style.hpp>
namespace app::onBoarding
{
@@ 17,6 19,8 @@ namespace app::onBoarding
{
bottomBar->setText(gui::BottomBar::Side::CENTER, utils::translate(style::strings::common::start));
bottomBar->setActive(gui::BottomBar::Side::RIGHT, false);
+
+ new gui::IceBox(this);
}
bool NoConfigurationDialogWindow::onInput(const gui::InputEvent &inputEvent)
@@ 37,6 41,14 @@ namespace app::onBoarding
if (inputEvent.is(gui::KeyCode::KEY_RF)) {
return true;
}
+
+ if (inputEvent.is(gui::KeyCode::KEY_LEFT)) {
+ app::manager::Controller::sendAction(application,
+ app::manager::actions::EmergencyDial,
+ std::make_unique<gui::SwitchData>(),
+ app::manager::OnSwitchBehaviour::RunInBackground);
+ return true;
+ }
}
return AppWindow::onInput(inputEvent);
}
M module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.cpp => module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.cpp +2 -2
@@ 5,7 5,7 @@
#include <module-apps/application-onboarding/ApplicationOnBoarding.hpp>
#include <InputEvent.hpp>
-namespace gui
+namespace app::onBoarding
{
OnBoardingChangeDateAndTimeWindow::OnBoardingChangeDateAndTimeWindow(app::Application *app)
: ChangeDateAndTimeWindow(app, gui::window::name::onBoarding_change_date_and_time)
@@ 22,4 22,4 @@ namespace gui
return ChangeDateAndTimeWindow::onInput(inputEvent);
}
-} /* namespace gui */
+} // namespace app::onBoarding
M module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.hpp => module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.hpp +4 -4
@@ 6,13 6,13 @@
#include <application-settings-new/windows/ChangeDateAndTimeWindow.hpp>
#include <application-settings-new/models/DateAndTimeModel.hpp>
-namespace gui
+namespace app::onBoarding
{
- class OnBoardingChangeDateAndTimeWindow : public ChangeDateAndTimeWindow
+ class OnBoardingChangeDateAndTimeWindow : public gui::ChangeDateAndTimeWindow
{
public:
explicit OnBoardingChangeDateAndTimeWindow(app::Application *app);
- bool onInput(const InputEvent &inputEvent) override;
+ bool onInput(const gui::InputEvent &inputEvent) override;
};
-} /* namespace gui */
+} // namespace app::onBoarding
M module-apps/application-onboarding/windows/OnBoardingDateAndTimeWindow.cpp => module-apps/application-onboarding/windows/OnBoardingDateAndTimeWindow.cpp +12 -2
@@ 8,11 8,13 @@
#include <module-gui/gui/input/InputEvent.hpp>
#include <module-apps/application-onboarding/data/OnBoardingSwitchData.hpp>
#include <module-apps/messages/DialogMetadataMessage.hpp>
-#include <module-apps/application-settings-new/data/ChangePasscodeData.hpp>
+#include <widgets/IceBox.hpp>
+#include <service-appmgr/Controller.hpp>
namespace app::onBoarding
{
- OnBoardingDateAndTimeWindow::OnBoardingDateAndTimeWindow(app::Application *app) : DateAndTimeMainWindow(app)
+ OnBoardingDateAndTimeWindow::OnBoardingDateAndTimeWindow(app::Application *app)
+ : DateAndTimeMainWindow(app, gui::window::name::onBoarding_date_and_time)
{
changeDateAndTimeWindow = gui::window::name::onBoarding_change_date_and_time;
}
@@ 25,6 27,7 @@ namespace app::onBoarding
void OnBoardingDateAndTimeWindow::onBeforeShow(gui::ShowMode mode, gui::SwitchData *data)
{
DateAndTimeMainWindow::onBeforeShow(mode, data);
+ new gui::IceBox(this);
bottomBar->setText(gui::BottomBar::Side::CENTER, utils::translate(style::strings::common::save));
bottomBar->setText(gui::BottomBar::Side::LEFT, utils::translate(style::strings::common::Switch));
@@ 48,6 51,13 @@ namespace app::onBoarding
std::move(metaData));
return true;
}
+ else if (inputEvent.isShortRelease(gui::KeyCode::KEY_LEFT)) {
+ app::manager::Controller::sendAction(application,
+ app::manager::actions::EmergencyDial,
+ std::make_unique<gui::SwitchData>(),
+ app::manager::OnSwitchBehaviour::RunInBackground);
+ return true;
+ }
else {
return DateAndTimeMainWindow::onInput(inputEvent);
}
M module-apps/application-onboarding/windows/OnBoardingLanguagesWindow.cpp => module-apps/application-onboarding/windows/OnBoardingLanguagesWindow.cpp +13 -2
@@ 1,9 1,12 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
-#include "application-onboarding/ApplicationOnBoarding.hpp"
#include "OnBoardingLanguagesWindow.hpp"
+#include <application-onboarding/ApplicationOnBoarding.hpp>
+
+#include <widgets/IceBox.hpp>
#include <module-gui/gui/input/InputEvent.hpp>
+#include <service-appmgr/Controller.hpp>
namespace app::onBoarding
{
@@ 14,6 17,7 @@ namespace app::onBoarding
void OnBoardingLanguagesWindow::onBeforeShow(gui::ShowMode mode, gui::SwitchData *data)
{
bottomBar->setActive(gui::BottomBar::Side::RIGHT, false);
+ new gui::IceBox(this);
LanguagesWindow::onBeforeShow(mode, data);
}
@@ 23,8 27,15 @@ namespace app::onBoarding
if (inputEvent.isShortRelease(gui::KeyCode::KEY_RF)) {
return true;
}
+ else if (inputEvent.isShortRelease(gui::KeyCode::KEY_LEFT)) {
+ app::manager::Controller::sendAction(application,
+ app::manager::actions::EmergencyDial,
+ std::make_unique<gui::SwitchData>(),
+ app::manager::OnSwitchBehaviour::RunInBackground);
+ return true;
+ }
else {
return LanguagesWindow::onInput(inputEvent);
}
}
-} /* namespace gui */
+} // namespace app::onBoarding
D module-apps/application-onboarding/windows/OnBoardingMainWindow.cpp => module-apps/application-onboarding/windows/OnBoardingMainWindow.cpp +0 -52
@@ 1,52 0,0 @@
-// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
-// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
-
-#include <i18n/i18n.hpp>
-#include <Style.hpp>
-
-#include <InputEvent.hpp>
-
-#include <module-apps/application-onboarding/ApplicationOnBoarding.hpp>
-
-#include "module-apps/application-onboarding/data/OnBoardingSwitchData.hpp"
-#include "OnBoardingMainWindow.hpp"
-
-namespace app::onBoarding
-{
- OnBoardingMainWindow::OnBoardingMainWindow(app::Application *app) : AppWindow(app, gui::name::window::main_window)
- {
- buildInterface();
- }
-
- void OnBoardingMainWindow::buildInterface()
- {
- AppWindow::buildInterface();
-
- bottomBar->setActive(gui::BottomBar::Side::CENTER, true);
- bottomBar->setText(gui::BottomBar::Side::CENTER, utils::translate(::style::strings::common::start));
-
- new gui::Image(this, 0, 0, 0, 0, "logo");
- }
-
- gui::top_bar::Configuration OnBoardingMainWindow::configureTopBar(gui::top_bar::Configuration appConfiguration)
- {
- appConfiguration.setIndicator(gui::top_bar::Indicator::Time, false);
- appConfiguration.setIndicator(gui::top_bar::Indicator::Battery, false);
- appConfiguration.setIndicator(gui::top_bar::Indicator::SimCard, false);
- appConfiguration.setIndicator(gui::top_bar::Indicator::Signal, false);
- return appConfiguration;
- }
-
- bool OnBoardingMainWindow::onInput(const gui::InputEvent &inputEvent)
- {
- if (inputEvent.isShortRelease(gui::KeyCode::KEY_ENTER)) {
- application->switchWindow(gui::window::name::onBoarding_languages,
- gui::ShowMode::GUI_SHOW_INIT,
- std::make_unique<OnBoardingSwitchData>());
-
- return true;
- }
- return AppWindow::onInput(inputEvent);
- }
-
-} // namespace gui
M module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.cpp => module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.cpp +15 -9
@@ 7,9 7,11 @@
#include <application-onboarding/style/OnBoardingStyle.hpp>
#include <OptionSetting.hpp>
+#include <widgets/IceBox.hpp>
+#include <service-appmgr/Controller.hpp>
#include <module-apps/messages/DialogMetadataMessage.hpp>
-namespace gui
+namespace app::onBoarding
{
OnBoardingSimSelectWindow::OnBoardingSimSelectWindow(app::Application *app, std::string name)
: BaseSettingsWindow(app, std::move(name))
@@ 25,6 27,8 @@ namespace gui
bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::translate(::style::strings::common::back));
bottomBar->setText(gui::BottomBar::Side::LEFT, utils::translate(::style::strings::common::skip));
+ new gui::IceBox(this);
+
descriptionText = new gui::Text(this,
style::window::default_left_margin,
style::onboarding::sim_select::description_y,
@@ 33,17 37,12 @@ namespace gui
descriptionText->setFont(style::window::font::medium);
descriptionText->setAlignment(
gui::Alignment{gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Top});
- descriptionText->setEdges(RectangleEdge::Top);
+ descriptionText->setEdges(gui::RectangleEdge::Top);
descriptionText->setPenWidth(style::window::default_border_rect_no_focus);
- descriptionText->setPadding(Padding(0, style::onboarding::sim_select::description_top_padding, 0, 0));
+ descriptionText->setPadding(gui::Padding(0, style::onboarding::sim_select::description_top_padding, 0, 0));
descriptionText->setRichText(utils::translate("app_onboarding_select_sim_description"));
}
- void OnBoardingSimSelectWindow::onBeforeShow(ShowMode mode, SwitchData *data)
- {
- refreshOptionsList();
- }
-
auto OnBoardingSimSelectWindow::buildOptionsList() -> std::list<gui::Option>
{
std::list<gui::Option> options;
@@ 97,6 96,13 @@ namespace gui
gui::window::name::onBoarding_skip, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
return true;
}
+ else if (inputEvent.isShortRelease(gui::KeyCode::KEY_LEFT)) {
+ app::manager::Controller::sendAction(application,
+ app::manager::actions::EmergencyDial,
+ std::make_unique<gui::SwitchData>(),
+ app::manager::OnSwitchBehaviour::RunInBackground);
+ return true;
+ }
return AppWindow::onInput(inputEvent);
}
-} /* namespace gui */
+} // namespace app::onBoarding
M module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.hpp => module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.hpp +4 -5
@@ 6,9 6,9 @@
#include <application-settings-new/windows/BaseSettingsWindow.hpp>
#include <Text.hpp>
-namespace gui
+namespace app::onBoarding
{
- class OnBoardingSimSelectWindow : public BaseSettingsWindow
+ class OnBoardingSimSelectWindow : public gui::BaseSettingsWindow
{
public:
explicit OnBoardingSimSelectWindow(app::Application *app, std::string name);
@@ 17,8 17,7 @@ namespace gui
private:
gui::Text *descriptionText = nullptr;
- auto buildOptionsList() -> std::list<Option> override;
- void onBeforeShow(ShowMode mode, SwitchData *data) override;
+ auto buildOptionsList() -> std::list<gui::Option> override;
bool onInput(const gui::InputEvent &inputEvent) override;
};
-} /* namespace gui */
+} // namespace app::onBoarding
M module-apps/application-onboarding/windows/StartConfigurationWindow.cpp => module-apps/application-onboarding/windows/StartConfigurationWindow.cpp +9 -0
@@ 8,6 8,8 @@
#include <module-apps/windows/DialogMetadata.hpp>
#include <module-apps/messages/DialogMetadataMessage.hpp>
+#include <widgets/IceBox.hpp>
+#include <service-appmgr/Controller.hpp>
#include <i18n/i18n.hpp>
#include <Style.hpp>
@@ 29,6 31,7 @@ namespace app::onBoarding
bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::translate(::style::strings::common::back));
bottomBar->setText(gui::BottomBar::Side::LEFT, utils::translate(::style::strings::common::skip));
+ new gui::IceBox(this);
new gui::Icon(this,
0,
0,
@@ 51,6 54,12 @@ namespace app::onBoarding
gui::ShowMode::GUI_SHOW_INIT,
std::make_unique<OnBoardingSwitchData>());
}
+ if (inputEvent.is(gui::KeyCode::KEY_LEFT)) {
+ app::manager::Controller::sendAction(application,
+ app::manager::actions::EmergencyDial,
+ std::make_unique<gui::SwitchData>(),
+ app::manager::OnSwitchBehaviour::RunInBackground);
+ }
if (inputEvent.is(gui::KeyCode::KEY_LF)) {
auto metaData = std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{
M module-apps/application-onboarding/windows/UpdateDialogWindow.cpp => module-apps/application-onboarding/windows/UpdateDialogWindow.cpp +7 -8
@@ 6,26 6,25 @@
#include <i18n/i18n.hpp>
#include <Style.hpp>
-#include <module-apps/application-onboarding/ApplicationOnBoarding.hpp>
-#include <module-apps/application-onboarding/data/OnBoardingSwitchData.hpp>
-#include <module-apps/messages/DialogMetadataMessage.hpp>
+#include <application-onboarding/ApplicationOnBoarding.hpp>
+#include <service-appmgr/service-appmgr/Controller.hpp>
namespace app::onBoarding
{
- UpdateDialogWindow::UpdateDialogWindow(app::Application *app)
- : gui::Dialog(app, gui::window::name::onBoarding_update)
+ UpdateDialogWindow::UpdateDialogWindow(app::Application *app,
+ std::unique_ptr<OnBoardingFinalizeContract::Presenter> &&windowPresenter)
+ : gui::Dialog(app, gui::window::name::onBoarding_update), presenter(std::move(windowPresenter))
{
bottomBar->setText(gui::BottomBar::Side::CENTER, utils::translate(style::strings::common::ok));
bottomBar->setActive(gui::BottomBar::Side::RIGHT, false);
+ presenter->attach(this);
}
bool UpdateDialogWindow::onInput(const gui::InputEvent &inputEvent)
{
if (inputEvent.isShortRelease()) {
if (inputEvent.is(gui::KeyCode::KEY_ENTER)) {
- application->switchWindow(gui::window::name::onBoarding_start_configuration,
- gui::ShowMode::GUI_SHOW_INIT,
- std::make_unique<OnBoardingSwitchData>());
+ presenter->finalizeOnBoarding();
return true;
}
if (inputEvent.is(gui::KeyCode::KEY_RF)) {
M module-apps/application-onboarding/windows/UpdateDialogWindow.hpp => module-apps/application-onboarding/windows/UpdateDialogWindow.hpp +8 -7
@@ 5,18 5,19 @@
#include "Dialog.hpp"
-#include <module-apps/application-onboarding/presenter/EULALicenseWindowPresenter.hpp>
-
-#include <module-gui/gui/widgets/Label.hpp>
-#include <module-gui/gui/widgets/Text.hpp>
-#include <module-gui/gui/input/InputEvent.hpp>
+#include <application-onboarding/presenter/EULALicenseWindowPresenter.hpp>
+#include <application-onboarding/presenter/OnBoardingFinalizeWindowPresenter.hpp>
namespace app::onBoarding
{
- class UpdateDialogWindow : public gui::Dialog
+ class UpdateDialogWindow : public gui::Dialog, public OnBoardingFinalizeContract::View
{
+ private:
+ std::unique_ptr<OnBoardingFinalizeContract::Presenter> presenter;
+
public:
- explicit UpdateDialogWindow(app::Application *app);
+ UpdateDialogWindow(app::Application *app,
+ std::unique_ptr<OnBoardingFinalizeContract::Presenter> &&windowPresenter);
bool onInput(const gui::InputEvent &inputEvent) override;
};
M module-apps/application-settings-new/ApplicationSettings.cpp => module-apps/application-settings-new/ApplicationSettings.cpp +7 -2
@@ 147,7 147,7 @@ namespace app
return ret;
}
connect(typeid(cellular::msg::notification::SimReady), [&](sys::Message *) {
- selectedSim = Store::GSM::get()->selected;
+ selectedSim = Store::GSM::get()->selected;
CellularServiceAPI::RequestForOwnNumber(this);
auto currentWindow = getCurrentWindow();
if (gui::window::name::network == currentWindow->getName()) {
@@ 440,7 440,7 @@ namespace app
return std::make_unique<gui::LanguagesWindow>(app);
});
windowsFactory.attach(gui::window::name::date_and_time, [](Application *app, const std::string &name) {
- return std::make_unique<gui::DateAndTimeMainWindow>(app);
+ return std::make_unique<gui::DateAndTimeMainWindow>(app, gui::window::name::date_and_time);
});
windowsFactory.attach(gui::window::name::about_your_pure, [](Application *app, const std::string &name) {
return std::make_unique<gui::AboutYourPureWindow>(app);
@@ 524,6 524,11 @@ namespace app
getSimLockSubject().setSim(arg);
}
+ void ApplicationSettingsNew::updateSim()
+ {
+ selectedSim = Store::GSM::get()->selected;
+ }
+
Store::GSM::SIM ApplicationSettingsNew::getSim()
{
return selectedSim;
M module-apps/application-settings-new/ApplicationSettings.hpp => module-apps/application-settings-new/ApplicationSettings.hpp +2 -0
@@ 90,6 90,7 @@ namespace app
public:
virtual ~SimParams() = default;
virtual void setSim(Store::GSM::SIM sim) = 0;
+ virtual void updateSim() = 0;
virtual Store::GSM::SIM getSim() = 0;
virtual std::string getNumber() = 0;
};
@@ 201,6 202,7 @@ namespace app
void createUserInterface() override;
void destroyUserInterface() override;
void setSim(Store::GSM::SIM sim) override;
+ void updateSim() override;
Store::GSM::SIM getSim() override;
std::string getNumber() override;
M module-apps/application-settings-new/windows/DateAndTimeMainWindow.cpp => module-apps/application-settings-new/windows/DateAndTimeMainWindow.cpp +2 -2
@@ 10,8 10,8 @@
namespace gui
{
- DateAndTimeMainWindow::DateAndTimeMainWindow(app::Application *app)
- : BaseSettingsWindow(app, window::name::date_and_time)
+ DateAndTimeMainWindow::DateAndTimeMainWindow(app::Application *app, std::string name)
+ : BaseSettingsWindow(app, std::move(name))
{
setTitle(utils::translate("app_settings_date_and_time"));
automaticDateAndTimeIsOn = utils::dateAndTimeSettings.isAutomaticDateAndTimeOn();
M module-apps/application-settings-new/windows/DateAndTimeMainWindow.hpp => module-apps/application-settings-new/windows/DateAndTimeMainWindow.hpp +1 -1
@@ 11,7 11,7 @@ namespace gui
class DateAndTimeMainWindow : public BaseSettingsWindow
{
public:
- explicit DateAndTimeMainWindow(app::Application *app);
+ DateAndTimeMainWindow(app::Application *app, std::string name);
protected:
auto buildOptionsList() -> std::list<Option> override;
M module-apps/application-settings-new/windows/NetworkWindow.cpp => module-apps/application-settings-new/windows/NetworkWindow.cpp +6 -0
@@ 18,6 18,12 @@ namespace gui
operatorsSettings(operatorsSettings)
{}
+ void NetworkWindow::onBeforeShow(ShowMode mode, SwitchData *data)
+ {
+ simParams->updateSim();
+ BaseSettingsWindow::onBeforeShow(mode, data);
+ }
+
auto NetworkWindow::buildOptionsList() -> std::list<gui::Option>
{
std::list<gui::Option> optList;
M module-apps/application-settings-new/windows/NetworkWindow.hpp => module-apps/application-settings-new/windows/NetworkWindow.hpp +3 -1
@@ 23,7 23,7 @@ namespace gui
class NetworkWindow : public BaseSettingsWindow
{
private:
- auto buildOptionsList() -> std::list<Option>;
+ auto buildOptionsList() -> std::list<Option> override;
app::settingsInterface::SimParams *simParams;
app::settingsInterface::OperatorsSettings *operatorsSettings;
@@ 31,5 31,7 @@ namespace gui
NetworkWindow(app::Application *app,
app::settingsInterface::SimParams *simParams,
app::settingsInterface::OperatorsSettings *operatorsSettings);
+
+ void onBeforeShow(ShowMode mode, SwitchData *data) override;
};
} // namespace gui
M module-apps/locks/data/LockStyle.hpp => module-apps/locks/data/LockStyle.hpp +0 -16
@@ 22,22 22,6 @@ namespace style::window::lock_input
constexpr inline auto top_margin = 30;
} // namespace pin_label
- namespace ice
- {
- constexpr inline auto x = style::window::default_left_margin;
- constexpr inline auto y = 60;
- constexpr inline auto w = 60;
- constexpr inline auto h = 50;
-
- constexpr inline auto margin = 3;
-
- namespace text
- {
- constexpr inline auto w = 40;
- }
-
- } // namespace ice
-
namespace primary_text
{
constexpr inline auto h = 60;
M module-apps/locks/handlers/PhoneLockHandler.cpp => module-apps/locks/handlers/PhoneLockHandler.cpp +4 -0
@@ 66,6 66,10 @@ namespace locks
app::manager::Controller::sendAction(owner,
app::manager::actions::AbortPopup,
std::make_unique<gui::PopupRequestParams>(gui::popup::ID::PhoneLock));
+ app::manager::Controller::sendAction(
+ owner,
+ app::manager::actions::AbortPopup,
+ std::make_unique<gui::PopupRequestParams>(gui::popup::ID::PhoneLockInfo));
}
}
M module-apps/locks/handlers/SimLockHandler.cpp => module-apps/locks/handlers/SimLockHandler.cpp +58 -7
@@ 4,13 4,13 @@
#include "SimLockHandler.hpp"
#include <service-appmgr/service-appmgr/Controller.hpp>
-#include <locks/widgets/LockHash.hpp>
#include <Utils.hpp>
#include <memory>
#include <module-apps/popups/data/PopupRequestParams.hpp>
-#include <service-cellular-api>
#include <module-utils/common_data/EventStore.hpp>
+#include <module-sys/Timers/TimerFactory.hpp>
+#include <service-cellular-api>
namespace locks
{
@@ 22,6 22,11 @@ namespace locks
: owner(owner), lock(Lock::LockState::Unlocked, default_attempts)
{
lock.setInputSizeBounds(min_input_size, max_input_size);
+
+ simResponseTimer = sys::TimerFactory::createSingleShotTimer(
+ owner, simResponseTimerName, std::chrono::seconds{1}, [this](sys::Timer &) {
+ handleSimNotRespondingMessage();
+ });
}
void SimLockHandler::clearStoredInputs()
@@ 32,6 37,8 @@ namespace locks
void SimLockHandler::setSimInputTypeAction(SimInputTypeAction _simInputTypeAction)
{
+ simResponseTimer.stop();
+
if (simInputTypeAction != _simInputTypeAction) {
simInputTypeAction = _simInputTypeAction;
lock.lockState = Lock::LockState::Unlocked;
@@ 61,6 68,20 @@ namespace locks
std::make_unique<gui::PopupRequestParams>(gui::popup::ID::SimLock));
}
+ void SimLockHandler::simNotReadyAction()
+ {
+ app::manager::Controller::sendAction(owner,
+ app::manager::actions::ShowPopup,
+ std::make_unique<gui::PopupRequestParams>(gui::popup::ID::SimNotReady));
+ }
+
+ void SimLockHandler::simReadyAction()
+ {
+ app::manager::Controller::sendAction(owner,
+ app::manager::actions::AbortPopup,
+ std::make_unique<gui::PopupRequestParams>(gui::popup::ID::SimNotReady));
+ }
+
void SimLockHandler::simInfoAction()
{
app::manager::Controller::sendAction(
@@ 71,10 92,10 @@ namespace locks
void SimLockHandler::getSettingsSimSelect(const std::string &settingsSim)
{
- auto selectedSim = magic_enum::enum_cast<Store::GSM::SIM>(settingsSim);
- Store::GSM::get()->selected = selectedSim.value();
+ auto selectedSim = magic_enum::enum_cast<Store::GSM::SIM>(settingsSim);
- if ((selectedSim.value() == Store::GSM::SIM::SIM1 || selectedSim.value() == Store::GSM::SIM::SIM2)) {
+ if (selectedSim.has_value() &&
+ (selectedSim.value() == Store::GSM::SIM::SIM1 || selectedSim.value() == Store::GSM::SIM::SIM2)) {
setSim(static_cast<cellular::api::SimSlot>(selectedSim.value()));
}
else {
@@ 84,7 105,14 @@ namespace locks
void SimLockHandler::setSim(cellular::api::SimSlot simSlot)
{
- owner->bus.sendUnicast<cellular::msg::request::sim::SetActiveSim>(simSlot);
+ if (simReady) {
+ simResponseTimer.start();
+ Store::GSM::get()->selected = static_cast<Store::GSM::SIM>(simSlot);
+ owner->bus.sendUnicast<cellular::msg::request::sim::SetActiveSim>(simSlot);
+ }
+ else {
+ simNotReadyAction();
+ }
}
sys::MessagePointer SimLockHandler::handleSimPinRequest(unsigned int attempts)
@@ 147,7 175,7 @@ namespace locks
return sys::msgHandled();
}
- sys::MessagePointer SimLockHandler::handleSimChangedMessage()
+ sys::MessagePointer SimLockHandler::handleSimPinChangedMessage()
{
lock.lockState = Lock::LockState::Unlocked;
simInfoAction();
@@ 240,6 268,22 @@ namespace locks
return sys::msgHandled();
}
+ sys::MessagePointer SimLockHandler::handleSimReadyMessage()
+ {
+ simResponseTimer.stop();
+ return sys::msgHandled();
+ }
+
+ sys::MessagePointer SimLockHandler::handleSimNotRespondingMessage()
+ {
+ setSimInputTypeAction(SimInputTypeAction::Error);
+
+ lock.lockName = utils::enumToString(Store::GSM::get()->selected);
+ simInfoAction();
+
+ return sys::msgHandled();
+ }
+
sys::MessagePointer SimLockHandler::processLockWithNewInput(LockInput inputData)
{
if (lock.isState(Lock::LockState::InputRequired) || (lock.isState(Lock::LockState::InputInvalid))) {
@@ 289,6 333,12 @@ namespace locks
simUnlockBlockOnLockedPhone = true;
}
+ void SimLockHandler::setSimReady()
+ {
+ simReady = true;
+ simReadyAction();
+ }
+
sys::MessagePointer SimLockHandler::releaseSimUnlockBlockOnLockedPhone()
{
if (simUnlockBlockOnLockedPhone) {
@@ 351,4 401,5 @@ namespace locks
pinInputData);
return sys::msgHandled();
}
+
} // namespace locks
M module-apps/locks/handlers/SimLockHandler.hpp => module-apps/locks/handlers/SimLockHandler.hpp +13 -2
@@ 8,10 8,12 @@
#include <locks/data/LockData.hpp>
#include <module-sys/Service/Service.hpp>
+#include <Timers/TimerHandle.hpp>
namespace locks
{
- using StoredLockInput = std::vector<unsigned int>;
+ using StoredLockInput = std::vector<unsigned int>;
+ constexpr auto simResponseTimerName = "SimResponseTimer";
class SimLockHandler
{
@@ 22,9 24,12 @@ namespace locks
SimInputTypeAction simInputTypeAction = SimInputTypeAction::UnlockWithPin;
unsigned int storedErrorCode = 0;
bool simUnlockBlockOnLockedPhone = false;
+ bool simReady = false;
StoredLockInput storedFirstInput;
StoredLockInput storedSecondInput;
+ sys::TimerHandle simResponseTimer;
+
void clearStoredInputs();
void setSimInputTypeAction(SimInputTypeAction _simInputTypeAction);
@@ 32,6 37,8 @@ namespace locks
void simErrorAction(unsigned int errorCode);
void simUnlockAction();
void simInfoAction();
+ void simNotReadyAction();
+ void simReadyAction();
sys::MessagePointer unlockSimWithPin(LockInput pinInputData);
sys::MessagePointer processLockWithNewInput(LockInput inputData);
@@ 45,6 52,8 @@ namespace locks
explicit SimLockHandler(sys::Service *owner);
void setSimUnlockBlockOnLockedPhone();
+ void setSimReady();
+
sys::MessagePointer releaseSimUnlockBlockOnLockedPhone();
sys::MessagePointer verifySimLockInput(LockInput inputData);
@@ 58,8 67,10 @@ namespace locks
sys::MessagePointer handleSimBlockedRequest();
sys::MessagePointer handleCMEErrorRequest(unsigned int errorCode);
sys::MessagePointer handleSimUnlockedMessage();
- sys::MessagePointer handleSimChangedMessage();
+ sys::MessagePointer handleSimPinChangedMessage();
sys::MessagePointer handleSimAvailabilityMessage();
+ sys::MessagePointer handleSimReadyMessage();
+ sys::MessagePointer handleSimNotRespondingMessage();
void getSettingsSimSelect(const std::string &settingsSim);
void setSim(cellular::api::SimSlot simSlot);
M module-apps/locks/widgets/PhoneLockBox.cpp => module-apps/locks/widgets/PhoneLockBox.cpp +1 -1
@@ 36,7 36,7 @@ namespace gui
leftBottomBarState = false;
break;
case locks::PhoneLockInputTypeAction::Set:
- LockWindow->setTitleBar(true, false);
+ LockWindow->setTitleBar(true, true);
LockWindow->setText("phone_lock_configure", LockInputWindow::TextType::Title);
textForInputRequired = "phone_lock_current";
M module-apps/locks/windows/LockInputWindow.cpp => module-apps/locks/windows/LockInputWindow.cpp +7 -19
@@ 72,25 72,7 @@ namespace gui
void LockInputWindow::buildIceBox()
{
- using namespace style::window::lock_input;
-
- iceBox = new gui::HBox(this, ice::x, ice::y, ice::w, ice::h);
- iceBox->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
- iceBox->setEdges(RectangleEdge::None);
- iceBox->setVisible(false);
-
- auto arrow = new gui::Image("left_label_arrow");
- arrow->activeItem = false;
- arrow->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
- arrow->setMargins(Margins(0, 0, ice::margin, 0));
- iceBox->addWidget(arrow);
-
- auto iceText = new gui::Text(nullptr, 0, 0, ice::text::w, ice::h);
- iceText->activeItem = false;
- iceText->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
- iceText->setFont(style::window::font::verysmall);
- iceText->setText(utils::translate("app_desktop_emergency"));
- iceBox->addWidget(iceText);
+ iceBox = new gui::IceBox(this);
}
void LockInputWindow::buildPinBody()
@@ 232,6 214,11 @@ namespace gui
}
}
+ auto LockInputWindow::isIceVisible() const noexcept -> bool
+ {
+ return iceBox->visible;
+ }
+
auto LockInputWindow::isInInputState() const noexcept -> bool
{
return lock && (lock->isState(locks::Lock::LockState::InputRequired) ||
@@ 244,4 231,5 @@ namespace gui
return lock && (lock->isState(locks::Lock::LockState::InputInvalid) ||
lock->isState(locks::Lock::LockState::NewInputInvalid));
}
+
} // namespace gui
M module-apps/locks/windows/LockInputWindow.hpp => module-apps/locks/windows/LockInputWindow.hpp +3 -1
@@ 9,6 9,7 @@
#include <RichTextParser.hpp>
#include <Text.hpp>
#include <ImageBox.hpp>
+#include <widgets/IceBox.hpp>
namespace locks
{
@@ 62,10 63,11 @@ namespace gui
[[nodiscard]] auto isInInputState() const noexcept -> bool;
[[nodiscard]] auto isInInvalidInputState() const noexcept -> bool;
+ [[nodiscard]] auto isIceVisible() const noexcept -> bool;
private:
gui::VBox *body = nullptr;
- gui::HBox *iceBox = nullptr;
+ gui::IceBox *iceBox = nullptr;
gui::ImageBox *infoImage = nullptr;
gui::Text *primaryText = nullptr;
gui::Text *secondaryText = nullptr;
M => +2 -0
@@ 30,6 30,7 @@ target_sources( ${PROJECT_NAME}
"${CMAKE_CURRENT_LIST_DIR}/lock-popups/PhoneLockChangeInfoWindow.cpp"
"${CMAKE_CURRENT_LIST_DIR}/lock-popups/SimLockInputWindow.cpp"
"${CMAKE_CURRENT_LIST_DIR}/lock-popups/SimInfoWindow.cpp"
"${CMAKE_CURRENT_LIST_DIR}/lock-popups/SimNotReadyWindow.cpp"
PRIVATE
"${CMAKE_CURRENT_LIST_DIR}/Popups.hpp"
@@ 48,4 49,5 @@ target_sources( ${PROJECT_NAME}
"${CMAKE_CURRENT_LIST_DIR}/lock-popups/PhoneLockChangeInfoWindow.hpp"
"${CMAKE_CURRENT_LIST_DIR}/lock-popups/SimLockInputWindow.hpp"
"${CMAKE_CURRENT_LIST_DIR}/lock-popups/SimInfoWindow.hpp"
"${CMAKE_CURRENT_LIST_DIR}/lock-popups/SimNotReadyWindow.hpp"
)
M => +4 -0
@@ 22,12 22,16 @@ namespace gui::popup
return gui::popup::window::phone_lock_window;
case ID::PhoneLockInput:
return gui::popup::window::phone_lock_input_window;
case ID::PhoneLockInfo:
return gui::popup::window::phone_lock_info_window;
case ID::PhoneLockChangeInfo:
return gui::popup::window::phone_lock_change_info_window;
case ID::SimLock:
return gui::popup::window::sim_unlock_window;
case ID::SimInfo:
return gui::popup::window::sim_info_window;
case ID::SimNotReady:
return gui::popup::window::sim_not_ready_window;
}
return {};
M => +3 -1
@@ 18,9 18,11 @@ namespace gui
TetheringPhoneModeChangeProhibited,
PhoneLock,
PhoneLockInput,
PhoneLockInfo,
PhoneLockChangeInfo,
SimLock,
SimInfo,
SimNotReady,
};
namespace window
@@ 38,7 40,7 @@ namespace gui
inline constexpr auto power_off_window = "PowerOffPopup";
inline constexpr auto sim_unlock_window = "SimUnlockPopup";
inline constexpr auto sim_info_window = "SimInfoPopup";
inline constexpr auto sim_not_ready_window = "SimNotReadyPopup";
} // namespace window
std::string resolveWindowName(ID id);
M => +7 -1
@@ 101,7 101,6 @@ namespace gui
return true;
}
}
else if (inputEvent.is(KeyCode::KEY_ENTER) && bottomBar->isActive(BottomBar::Side::CENTER)) {
if (lock->isState(locks::Lock::LockState::Blocked)) {
application->returnToPreviousWindow();
@@ 119,6 118,13 @@ namespace gui
lock->clearAttempt();
return true;
}
else if (inputEvent.is(KeyCode::KEY_LEFT) && isIceVisible()) {
app::manager::Controller::sendAction(application,
app::manager::actions::EmergencyDial,
std::make_unique<gui::SwitchData>(),
app::manager::OnSwitchBehaviour::RunInBackground);
return true;
}
// check if any of the lower inheritance onInput methods catch the event
return AppWindow::onInput(inputEvent);
M => +0 -2
@@ 5,7 5,6 @@
#include <service-appmgr/Controller.hpp>
#include <application-desktop/data/DesktopStyle.hpp>
#include <locks/data/LockStyle.hpp>
#include <i18n/i18n.hpp>
@@ 49,7 48,6 @@ top_bar::Configuration PhoneLockedInfoWindow::configureTopBar(top_bar::Configura
void PhoneLockedInfoWindow::buildInterface()
{
namespace lock_style = style::window::lock_input;
AppWindow::buildInterface();
bottomBar->setText(BottomBar::Side::LEFT, utils::translate("app_desktop_emergency"));
M => +6 -0
@@ 44,6 44,12 @@ void SimInfoWindow::onBeforeShow(ShowMode mode, SwitchData *data)
setTitle("");
infoIcon->text->setRichText(utils::translate("sim_card_pin_disabled"));
break;
case locks::SimInputTypeAction::Error:
setTitle(utils::translate("app_settings_net"));
infoIcon->text->setRichText(utils::translate("sim_card_cant_connect"),
{{"$SIM", infoData->getLock().getLockName()}});
infoIcon->image->set("sim_card_W_G");
break;
default:
break;
}
M => +7 -0
@@ 115,6 115,13 @@ namespace gui
}
return true;
}
else if (inputEvent.is(KeyCode::KEY_LEFT) && isIceVisible()) {
app::manager::Controller::sendAction(application,
app::manager::actions::EmergencyDial,
std::make_unique<gui::SwitchData>(),
app::manager::OnSwitchBehaviour::RunInBackground);
return true;
}
// check if any of the lower inheritance onInput methods catch the event
return AppWindow::onInput(inputEvent);
A => +46 -0
@@ 0,0 1,46 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "SimNotReadyWindow.hpp"
#include <service-appmgr/Controller.hpp>
#include <application-desktop/data/DesktopStyle.hpp>
#include <i18n/i18n.hpp>
using namespace gui;
SimNotReadyWindow::SimNotReadyWindow(app::Application *app, const std::string &name) : AppWindow(app, name)
{
buildInterface();
}
top_bar::Configuration SimNotReadyWindow::configureTopBar(top_bar::Configuration appConfiguration)
{
appConfiguration.disable(top_bar::Indicator::NetworkAccessTechnology);
appConfiguration.disable(top_bar::Indicator::Lock);
appConfiguration.enable(top_bar::Indicator::PhoneMode);
appConfiguration.enable(top_bar::Indicator::Time);
appConfiguration.enable(top_bar::Indicator::Battery);
appConfiguration.enable(top_bar::Indicator::Signal);
appConfiguration.enable(top_bar::Indicator::SimCard);
return appConfiguration;
}
void SimNotReadyWindow::buildInterface()
{
AppWindow::buildInterface();
setTitle(utils::translate("app_settings_net"));
bottomBar->setText(BottomBar::Side::RIGHT, utils::translate("common_back"));
infoIcon = new gui::Icon(this,
style::window::default_left_margin,
style::header::height,
style::window::default_body_width,
style::window::default_body_height,
"sim_card_W_G",
utils::translate("sim_card_not_ready"));
infoIcon->setAlignment(Alignment::Horizontal::Center);
}
R module-apps/application-onboarding/windows/OnBoardingMainWindow.hpp => +9 -10
@@ 3,21 3,20 @@
#pragma once
-#include <memory>
-
#include <AppWindow.hpp>
-#include <module-gui/gui/widgets/Image.hpp>
+#include <Text.hpp>
+#include <gui/widgets/Icon.hpp>
-namespace app::onBoarding
+namespace gui
{
- class OnBoardingMainWindow : public gui::AppWindow
+ class SimNotReadyWindow : public AppWindow
{
- public:
- explicit OnBoardingMainWindow(app::Application *app);
+ Icon *infoIcon = nullptr;
- bool onInput(const gui::InputEvent &inputEvent) override;
+ public:
+ SimNotReadyWindow(app::Application *app, const std::string &name);
void buildInterface() override;
- gui::top_bar::Configuration configureTopBar(gui::top_bar::Configuration appConfiguration) override;
+ top_bar::Configuration configureTopBar(top_bar::Configuration appConfiguration) override;
};
-} // namespace gui
+} /* namespace gui */
A module-apps/widgets/IceBox.cpp => module-apps/widgets/IceBox.cpp +30 -0
@@ 0,0 1,30 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#include "IceBox.hpp"
+
+#include <Text.hpp>
+#include <i18n/i18n.hpp>
+
+namespace gui
+{
+ IceBox::IceBox(Item *parent)
+ : HBox(parent, style::window::ice::x, style::window::ice::y, style::window::ice::w, style::window::ice::h)
+ {
+ setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
+ setEdges(RectangleEdge::None);
+
+ auto arrow = new gui::Image("left_label_arrow");
+ arrow->activeItem = false;
+ arrow->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
+ arrow->setMargins(Margins(0, 0, style::window::ice::margin, 0));
+ addWidget(arrow);
+
+ auto iceText = new gui::Text(nullptr, 0, 0, style::window::ice::text::w, style::window::ice::h);
+ iceText->activeItem = false;
+ iceText->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
+ iceText->setFont(style::window::font::verysmall);
+ iceText->setText(utils::translate("app_desktop_emergency"));
+ addWidget(iceText);
+ }
+} // namespace gui
A module-apps/widgets/IceBox.hpp => module-apps/widgets/IceBox.hpp +32 -0
@@ 0,0 1,32 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#pragma once
+
+#include <BoxLayout.hpp>
+#include <Label.hpp>
+#include <Image.hpp>
+
+namespace style::window::ice
+{
+ constexpr inline auto x = 25;
+ constexpr inline auto y = 53;
+ constexpr inline auto w = 60;
+ constexpr inline auto h = 38;
+
+ constexpr inline auto margin = 3;
+
+ namespace text
+ {
+ constexpr inline auto w = 40;
+ }
+} // namespace style::window::ice
+
+namespace gui
+{
+ class IceBox : public HBox
+ {
+ public:
+ explicit IceBox(Item *parent = nullptr);
+ };
+} // namespace gui
M module-services/service-appmgr/model/ApplicationManager.cpp => module-services/service-appmgr/model/ApplicationManager.cpp +32 -3
@@ 17,6 17,8 @@
#include <application-call/ApplicationCall.hpp>
#include <application-special-input/ApplicationSpecialInput.hpp>
#include <application-desktop/ApplicationDesktop.hpp>
+#include <application-onboarding/ApplicationOnBoarding.hpp>
+#include <application-onboarding/data/OnBoardingMessages.hpp>
#include <i18n/i18n.hpp>
#include <log/log.hpp>
#include <service-appmgr/messages/Message.hpp>
@@ 514,7 516,7 @@ namespace app::manager
[&](sys::Message *request) -> sys::MessagePointer {
auto data = static_cast<cellular::msg::request::sim::ChangePin::Response *>(request);
if (data->retCode) {
- return simLockHandler.handleSimChangedMessage();
+ return simLockHandler.handleSimPinChangedMessage();
}
else {
return simLockHandler.handleSimPinChangeFailedRequest();
@@ 568,9 570,12 @@ namespace app::manager
}
return sys::msgNotHandled();
});
+ connect(typeid(cellular::msg::notification::SimReady),
+ [&](sys::Message *request) -> sys::MessagePointer { return simLockHandler.handleSimReadyMessage(); });
connect(typeid(cellular::StateChange), [&](sys::Message *request) -> sys::MessagePointer {
auto data = static_cast<cellular::StateChange *>(request);
if (data->request == cellular::service::State::ST::URCReady) {
+ simLockHandler.setSimReady();
simLockHandler.getSettingsSimSelect(
settings->getValue(settings::SystemProperties::activeSim, settings::SettingsScope::Global));
return sys::msgHandled();
@@ 578,6 583,9 @@ namespace app::manager
return sys::msgNotHandled();
});
+ connect(typeid(onBoarding::FinalizeOnBoarding),
+ [&](sys::Message *request) -> sys::MessagePointer { return handleOnBoardingFinalize(); });
+
connect(typeid(sdesktop::developerMode::DeveloperModeRequest),
[&](sys::Message *request) -> sys::MessagePointer { return handleDeveloperModeRequest(request); });
@@ 785,9 793,9 @@ namespace app::manager
auto ApplicationManager::handleHomeAction(ActionEntry &action) -> ActionProcessStatus
{
- action.setTargetApplication(rootApplicationName);
+ action.setTargetApplication(resolveHomeApplication());
- SwitchRequest switchRequest(ServiceName, rootApplicationName, resolveHomeWindow(), nullptr);
+ SwitchRequest switchRequest(ServiceName, resolveHomeApplication(), resolveHomeWindow(), nullptr);
return handleSwitchApplication(&switchRequest) ? ActionProcessStatus::Accepted : ActionProcessStatus::Dropped;
}
@@ 797,6 805,27 @@ namespace app::manager
: gui::name::window::main_window;
}
+ auto ApplicationManager::handleOnBoardingFinalize() -> sys::MessagePointer
+ {
+ settings->setValue(settings::SystemProperties::onboardingDone, utils::to_string(true));
+ app::manager::Controller::sendAction(this, app::manager::actions::Home);
+ return sys::msgHandled();
+ }
+
+ auto ApplicationManager::checkOnBoarding() -> bool
+ {
+ return not utils::getNumericValue<bool>(settings->getValue(settings::SystemProperties::onboardingDone));
+ }
+
+ auto ApplicationManager::resolveHomeApplication() -> std::string
+ {
+ if (checkOnBoarding()) {
+ phoneLockHandler.handleUnlockRequest();
+ return app::name_onboarding;
+ }
+ return rootApplicationName;
+ }
+
auto ApplicationManager::handleLaunchAction(ActionEntry &action) -> ActionProcessStatus
{
auto launchParams = static_cast<ApplicationLaunchData *>(action.params.get());
M module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp => module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp +3 -0
@@ 129,6 129,9 @@ namespace app::manager
void handleActionRequest(ActionRequest *actionMsg);
auto handleHomeAction(ActionEntry &action) -> ActionProcessStatus;
auto resolveHomeWindow() -> std::string;
+ auto handleOnBoardingFinalize() -> sys::MessagePointer;
+ auto checkOnBoarding() -> bool;
+ auto resolveHomeApplication() -> std::string;
auto handleLaunchAction(ActionEntry &action) -> ActionProcessStatus;
auto handleActionOnFocusedApp(ActionEntry &action) -> ActionProcessStatus;
auto handlePhoneModeChangedAction(ActionEntry &action) -> ActionProcessStatus;
M module-services/service-db/agents/settings/SystemSettings.hpp => module-services/service-db/agents/settings/SystemSettings.hpp +1 -0
@@ 19,6 19,7 @@ namespace settings
constexpr inline auto automaticTimeZoneIsOn = "gs_automatic_time_zone_is_on";
constexpr inline auto timeFormat = "gs_time_format";
constexpr inline auto dateFormat = "gs_date_format";
+ constexpr inline auto onboardingDone = "gs_onboarding_done";
constexpr inline auto eulaAccepted = "gs_eula_accepted";
constexpr inline auto osCurrentVersion = "gs_os_current_version";
constexpr inline auto osUpdateVersion = "gs_os_update_version";