M changelog.md => changelog.md +1 -1
@@ 5,7 5,7 @@
### Added
* Add hardware in the loop tests.
-* Add empty APN settings window.
+* Add APN settings window.
* Add New/Edit APN window
* Add APN options window
M module-apps/application-settings-new/ApplicationSettings.cpp => module-apps/application-settings-new/ApplicationSettings.cpp +13 -2
@@ 39,9 39,9 @@
#include <service-bluetooth/service-bluetooth/messages/Status.hpp>
#include <service-bluetooth/messages/BondedDevices.hpp>
#include <service-bluetooth/messages/DeviceName.hpp>
-#include <application-settings-new/data/BondedDevicesData.hpp>
-#include <application-settings-new/data/PhoneNameData.hpp>
#include <service-db/agents/settings/SystemSettings.hpp>
+#include <application-settings-new/data/ApnListData.hpp>
+#include <application-settings-new/data/BondedDevicesData.hpp>
#include <application-settings-new/data/PhoneNameData.hpp>
#include <module-services/service-db/agents/settings/SystemSettings.hpp>
#include <service-db/Settings.hpp>
@@ 147,6 147,17 @@ namespace app
return sys::MessageNone{};
});
+ connect(typeid(CellularGetAPNResponse), [&](sys::Message *msg) {
+ if (gui::window::name::apn_settings == getCurrentWindow()->getName()) {
+ auto apns = dynamic_cast<CellularGetAPNResponse *>(msg);
+ if (apns != nullptr) {
+ auto apnsData = std::make_unique<gui::ApnListData>(apns->getAPNs());
+ switchWindow(gui::window::name::apn_settings, std::move(apnsData));
+ }
+ }
+ return sys::MessageNone{};
+ });
+
createUserInterface();
setActiveWindow(gui::name::window::main_window);
M module-apps/application-settings-new/CMakeLists.txt => module-apps/application-settings-new/CMakeLists.txt +2 -1
@@ 15,6 15,8 @@ target_sources( ${PROJECT_NAME}
PRIVATE
ApplicationSettings.cpp
+ models/ApnSettingsModel.cpp
+ models/NewApnModel.cpp
widgets/timeWidget.cpp
widgets/ChangePasscodeLockHandler.cpp
widgets/QuoteWidget.cpp
@@ 45,7 47,6 @@ target_sources( ${PROJECT_NAME}
windows/SecurityMainWindow.cpp
windows/ChangePasscodeWindow.cpp
windows/NewApnWindow.cpp
- models/NewApnModel.cpp
widgets/SpinBox.cpp
widgets/SpinBoxOptionSetting.cpp
windows/SystemMainWindow.cpp
A module-apps/application-settings-new/data/ApnListData.hpp => module-apps/application-settings-new/data/ApnListData.hpp +27 -0
@@ 0,0 1,27 @@
+// 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-cellular/PacketDataTypes.hpp>
+#include <SwitchData.hpp>
+
+#include <vector>
+
+namespace gui
+{
+
+ class ApnListData : public SwitchData
+ {
+ public:
+ explicit ApnListData(std::vector<std::shared_ptr<packet_data::APN::Config>> apns) : apns(std::move(apns))
+ {}
+ [[nodiscard]] auto getAPNs() const noexcept -> const std::vector<std::shared_ptr<packet_data::APN::Config>> &
+ {
+ return apns;
+ }
+
+ private:
+ std::vector<std::shared_ptr<packet_data::APN::Config>> apns;
+ };
+} // namespace gui
M module-apps/application-settings-new/data/QuoteSwitchData.hpp => module-apps/application-settings-new/data/QuoteSwitchData.hpp +2 -2
@@ 3,9 3,9 @@
#pragma once
-#include "application-settings-new/model/QuotesModel.hpp"
+#include "application-settings-new/models/QuotesModel.hpp"
-#include <module-gui/gui/SwitchData.hpp>
+#include <SwitchData.hpp>
#include <json/json11.hpp>
#include <utility>
A module-apps/application-settings-new/models/ApnSettingsModel.cpp => module-apps/application-settings-new/models/ApnSettingsModel.cpp +28 -0
@@ 0,0 1,28 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#include "ApnSettingsModel.hpp"
+#include <service-cellular/PacketDataCellularMessage.hpp>
+#include <service-cellular/ServiceCellular.hpp>
+
+ApnSettingsModel::ApnSettingsModel(app::Application *application) : application{application}
+{}
+
+void ApnSettingsModel::requestAPNList()
+{
+ sys::Bus::SendUnicast(std::make_shared<CellularGetAPNMessage>(), ServiceCellular::serviceName, application);
+}
+
+void ApnSettingsModel::saveAPN(std::shared_ptr<packet_data::APN::Config> apn)
+{
+ sys::Bus::SendUnicast(std::make_shared<CellularSetAPNMessage>(apn), ServiceCellular::serviceName, application);
+}
+
+void ApnSettingsModel::removeAPN(std::shared_ptr<packet_data::APN::Config> apn)
+{}
+
+void ApnSettingsModel::setAsDefaultAPN(std::shared_ptr<packet_data::APN::Config> apn)
+{
+ apn->apnType = packet_data::APN::APNType::Default;
+ sys::Bus::SendUnicast(std::make_shared<CellularSetAPNMessage>(apn), ServiceCellular::serviceName, application);
+}
A module-apps/application-settings-new/models/ApnSettingsModel.hpp => module-apps/application-settings-new/models/ApnSettingsModel.hpp +21 -0
@@ 0,0 1,21 @@
+// 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-cellular/PacketDataTypes.hpp>
+#include <module-apps/Application.hpp>
+
+class ApnSettingsModel
+{
+ public:
+ ApnSettingsModel(app::Application *application);
+
+ void requestAPNList();
+ void saveAPN(std::shared_ptr<packet_data::APN::Config> apn);
+ void removeAPN(std::shared_ptr<packet_data::APN::Config> apn);
+ void setAsDefaultAPN(std::shared_ptr<packet_data::APN::Config> apn);
+
+ private:
+ app::Application *application = nullptr;
+};
M module-apps/application-settings-new/models/NewApnModel.cpp => module-apps/application-settings-new/models/NewApnModel.cpp +0 -7
@@ 3,9 3,7 @@
#include "NewApnModel.hpp"
-#include "AppWindow.hpp"
#include "application-settings-new/widgets/ApnInputWidget.hpp"
-#include <service-cellular/service-cellular/CellularServiceAPI.hpp>
#include <ListView.hpp>
#include <time/ScopedTime.hpp>
@@ 133,8 131,3 @@ void NewApnModel::apnDataChanged()
application->getCurrentWindow()->setBottomBarActive(gui::BottomBar::Side::CENTER, false); // SAVE button
return;
}
-
-void NewApnModel::apnSendRecord(packet_data::APN::Config apnRecord)
-{
- CellularServiceAPI::SetAPN(application, apnRecord);
-}
M module-apps/application-settings-new/models/NewApnModel.hpp => module-apps/application-settings-new/models/NewApnModel.hpp +0 -1
@@ 32,5 32,4 @@ class NewApnModel : public app::InternalModel<gui::ApnListItem *>, public gui::L
void requestRecords(const uint32_t offset, const uint32_t limit) override;
void apnDataChanged();
- void apnSendRecord(packet_data::APN::Config apnRecord);
};
R module-apps/application-settings-new/model/QuotesModel.cpp => module-apps/application-settings-new/models/QuotesModel.cpp +2 -3
@@ 3,9 3,8 @@
#include "application-settings-new/windows/QuotesMainWindow.hpp"
#include "application-settings-new/ApplicationSettings.hpp"
-#include "application-settings-new/model/QuotesRepository.hpp"
-#include "application-settings-new/model/QuotesModel.hpp"
-#include "application-settings-new/model/QuotesModel.hpp"
+#include "QuotesRepository.hpp"
+#include "QuotesModel.hpp"
#include <InputEvent.hpp>
#include <i18n/i18n.hpp>
R module-apps/application-settings-new/model/QuotesModel.hpp => module-apps/application-settings-new/models/QuotesModel.hpp +0 -0
R module-apps/application-settings-new/model/QuotesRepository.cpp => module-apps/application-settings-new/models/QuotesRepository.cpp +0 -3
@@ 1,9 1,6 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
-// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
-// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
-
#include "QuotesRepository.hpp"
#include <module-utils/gsl/gsl_util>
R module-apps/application-settings-new/model/QuotesRepository.hpp => module-apps/application-settings-new/models/QuotesRepository.hpp +0 -0
M module-apps/application-settings-new/windows/ApnOptionsWindow.cpp => module-apps/application-settings-new/windows/ApnOptionsWindow.cpp +4 -2
@@ 5,6 5,7 @@
#include "application-settings-new/ApplicationSettings.hpp"
#include "application-settings-new/data/SettingsItemData.hpp"
+#include "application-settings-new/models/ApnSettingsModel.hpp"
#include "OptionSetting.hpp"
namespace gui
@@ 12,6 13,7 @@ namespace gui
ApnOptionsWindow::ApnOptionsWindow(app::Application *app) : BaseSettingsWindow(app, window::name::apn_options)
{
setTitle(utils::localize.get("app_settings_apn_options"));
+ apnSettingsModel = new ApnSettingsModel(application);
}
auto ApnOptionsWindow::buildOptionsList() -> std::list<gui::Option>
@@ 31,7 33,7 @@ namespace gui
optionsList.emplace_back(std::make_unique<gui::option::OptionSettings>(
utils::localize.get("app_settings_apn_options_delete"),
[=](gui::Item &item) {
- // request delete APN
+ apnSettingsModel->removeAPN(apn);
return true;
},
nullptr,
@@ 40,7 42,7 @@ namespace gui
optionsList.emplace_back(std::make_unique<gui::option::OptionSettings>(
utils::localize.get("app_settings_apn_options_set_as_default"),
[=](gui::Item &item) {
- // set APN as default
+ apnSettingsModel->setAsDefaultAPN(apn);
return true;
},
nullptr,
M module-apps/application-settings-new/windows/ApnOptionsWindow.hpp => module-apps/application-settings-new/windows/ApnOptionsWindow.hpp +2 -0
@@ 3,6 3,7 @@
#pragma once
+#include "application-settings-new/models/ApnSettingsModel.hpp"
#include "BaseSettingsWindow.hpp"
#include <service-cellular/PacketDataTypes.hpp>
@@ 19,5 20,6 @@ namespace gui
auto buildOptionsList() -> std::list<gui::Option> override;
auto handleSwitchData(SwitchData *data) -> bool override;
std::shared_ptr<packet_data::APN::Config> apn;
+ ApnSettingsModel *apnSettingsModel = nullptr;
};
} // namespace gui
M module-apps/application-settings-new/windows/ApnSettingsWindow.cpp => module-apps/application-settings-new/windows/ApnSettingsWindow.cpp +88 -13
@@ 3,6 3,8 @@
#include "ApnSettingsWindow.hpp"
#include "application-settings-new/ApplicationSettings.hpp"
+#include "application-settings-new/data/ApnListData.hpp"
+#include "application-settings-new/models/ApnSettingsModel.hpp"
#include "application-settings-new/widgets/SettingsStyle.hpp"
#include "application-settings-new/data/SettingsItemData.hpp"
#include "OptionSetting.hpp"
@@ 17,19 19,6 @@ namespace gui
buildInterface();
}
- auto ApnSettingsWindow::onInput(const InputEvent &inputEvent) -> bool
- {
- if (inputEvent.isShortPress()) {
- if (inputEvent.is(KeyCode::KEY_LEFT)) {
- auto apnRecord = std::make_shared<packet_data::APN::Config>();
- std::unique_ptr<gui::SwitchData> data = std::make_unique<ApnItemData>(apnRecord);
- application->switchWindow(gui::window::name::new_apn, gui::ShowMode::GUI_SHOW_INIT, std::move(data));
- return true;
- }
- }
- return AppWindow::onInput(inputEvent);
- }
-
void ApnSettingsWindow::buildInterface()
{
setTitle(utils::localize.get("app_settings_network_apn_settings"));
@@ 54,7 43,93 @@ namespace gui
"phonebook_empty_grey_circle_W_G",
utils::localize.get("app_settings_apn_settings_no_apns"));
+ bottomBar->setText(BottomBar::Side::LEFT, utils::localize.get(style::strings::common::options));
+
+ auto apnSettingsModel = new ApnSettingsModel(application);
+ apnSettingsModel->requestAPNList();
+ }
+ auto ApnSettingsWindow::handleSwitchData(SwitchData *data) -> bool
+ {
+ if (data == nullptr) {
+ LOG_ERROR("Received nullptr");
+ return false;
+ }
+
+ const auto newData = dynamic_cast<ApnListData *>(data);
+ if (newData == nullptr) {
+ LOG_ERROR("Received nullptr");
+ return false;
+ }
+
+ apns = newData->getAPNs();
+ if (apns.empty()) {
+ emptyListIcon->setVisible(true);
+ return false;
+ }
+
+ return true;
+ }
+
+ void ApnSettingsWindow::onBeforeShow(ShowMode mode, SwitchData *data)
+ {
+ clearOptions();
+ bottomBar->setActive(gui::BottomBar::Side::LEFT, false);
bottomBar->setActive(gui::BottomBar::Side::CENTER, false);
+ emptyListIcon->setVisible(false);
+
+ if (apns.empty()) {
+ return;
+ }
+
+ addOptions(optionsList(apns));
+ bottomBar->setActive(gui::BottomBar::Side::LEFT, true);
+ bottomBar->setActive(gui::BottomBar::Side::CENTER, true);
+ }
+
+ auto ApnSettingsWindow::onInput(const InputEvent &inputEvent) -> bool
+ {
+ if (AppWindow::onInput(inputEvent)) {
+ return true;
+ }
+ if (!inputEvent.isShortPress()) {
+ return false;
+ }
+ if (inputEvent.is(gui::KeyCode::KEY_LEFT)) {
+ auto apnRecord = std::make_shared<packet_data::APN::Config>();
+ std::unique_ptr<gui::SwitchData> data = std::make_unique<ApnItemData>(apnRecord);
+ application->switchWindow(gui::window::name::new_apn, gui::ShowMode::GUI_SHOW_INIT, std::move(data));
+ return true;
+ }
+ if (inputEvent.is(gui::KeyCode::KEY_LF)) {
+ auto apnRecord = std::make_shared<packet_data::APN::Config>();
+ std::unique_ptr<gui::SwitchData> data = std::make_unique<ApnItemData>(apnRecord);
+ application->switchWindow(gui::window::name::apn_options, gui::ShowMode::GUI_SHOW_INIT, std::move(data));
+ return true;
+ }
+
+ return false;
+ }
+
+ auto ApnSettingsWindow::optionsList(std::vector<std::shared_ptr<packet_data::APN::Config>> apnsList)
+ -> std::list<Option>
+ {
+ std::list<gui::Option> optionsList;
+
+ for (const auto &apn : apnsList) {
+ optionsList.emplace_back(std::make_unique<gui::option::OptionSettings>(
+ (apn->apnType == packet_data::APN::APNType::Default) ? "<b>" + apn->apn + "</b>" : apn->apn,
+ [=](gui::Item &item) {
+ LOG_DEBUG("APN: %s", apn->apn.c_str());
+ std::unique_ptr<gui::SwitchData> apnData = std::make_unique<ApnItemData>(apn);
+ application->switchWindow(
+ gui::window::name::new_apn, gui::ShowMode::GUI_SHOW_INIT, std::move(apnData));
+ return true;
+ },
+ nullptr,
+ nullptr));
+ }
+
+ return optionsList;
}
} // namespace gui
M module-apps/application-settings-new/windows/ApnSettingsWindow.hpp => module-apps/application-settings-new/windows/ApnSettingsWindow.hpp +5 -0
@@ 5,6 5,7 @@
#include "OptionWindow.hpp"
#include <Icon.hpp>
+#include <service-cellular/PacketDataTypes.hpp>
namespace gui
{
@@ 15,10 16,14 @@ namespace gui
private:
void buildInterface() override;
+ auto handleSwitchData(SwitchData *data) -> bool override;
+ void onBeforeShow(ShowMode mode, SwitchData *data) override;
auto onInput(const InputEvent &inputEvent) -> bool override;
+ auto optionsList(std::vector<std::shared_ptr<packet_data::APN::Config>> vector) -> std::list<Option>;
Image *leftArrowImage = nullptr;
Image *crossImage = nullptr;
Icon *emptyListIcon = nullptr;
+ std::vector<std::shared_ptr<packet_data::APN::Config>> apns;
};
}; // namespace gui
M module-apps/application-settings-new/windows/NewApnWindow.cpp => module-apps/application-settings-new/windows/NewApnWindow.cpp +14 -11
@@ 38,6 38,7 @@ namespace gui
style::settings::window::newApn::h,
newApnModel);
setFocusItem(list);
+ apnSettingsModel = new ApnSettingsModel(application);
}
void NewApnWindow::destroyInterface()
@@ 89,13 90,15 @@ namespace gui
auto NewApnWindow::onInput(const InputEvent &inputEvent) -> bool
{
- if (inputEvent.isShortPress()) {
- if (inputEvent.is(KeyCode::KEY_ENTER)) {
- if (apn != nullptr)
- newApnModel->saveData(apn);
- verifyAndSave();
- return true;
+ if (!inputEvent.isShortPress()) {
+ return false;
+ }
+ if (inputEvent.is(gui::KeyCode::KEY_ENTER)) {
+ if (apn != nullptr) {
+ newApnModel->saveData(apn);
}
+ verifyAndSave();
+ return true;
}
return AppWindow::onInput(inputEvent);
@@ 103,12 106,12 @@ namespace gui
auto NewApnWindow::verifyAndSave() -> bool
{
- if (apn != nullptr) {
- newApnModel->apnSendRecord(*apn);
- LOG_DEBUG("APN record saved : \"%s\" ", apn->apn.c_str());
- }
- else
+ if (apn == nullptr) {
LOG_DEBUG("APN record not found");
+ return false;
+ }
+ apnSettingsModel->saveAPN(apn);
+ LOG_DEBUG("APN record saved : \"%s\" ", apn->apn.c_str());
return true;
}
M module-apps/application-settings-new/windows/NewApnWindow.hpp => module-apps/application-settings-new/windows/NewApnWindow.hpp +3 -1
@@ 3,6 3,7 @@
#pragma once
+#include "application-settings-new/models/ApnSettingsModel.hpp"
#include "application-settings-new/models/NewApnModel.hpp"
#include <AppWindow.hpp>
@@ 27,7 28,8 @@ namespace gui
void setSaveButtonVisible(bool visible);
std::shared_ptr<packet_data::APN::Config> apn;
std::shared_ptr<NewApnModel> newApnModel;
- gui::ListView *list = nullptr;
+ ApnSettingsModel *apnSettingsModel = nullptr;
+ gui::ListView *list = nullptr;
};
} /* namespace gui */
M module-apps/application-settings-new/windows/QuotesAddWindow.cpp => module-apps/application-settings-new/windows/QuotesAddWindow.cpp +1 -1
@@ 6,7 6,7 @@
#include "application-settings-new/ApplicationSettings.hpp"
#include "application-settings-new/data/QuoteSwitchData.hpp"
-#include "application-settings-new/model/QuotesRepository.hpp"
+#include "application-settings-new/models/QuotesRepository.hpp"
#include <i18n/i18n.hpp>
#include <widgets/Text.hpp>
M module-apps/application-settings-new/windows/QuotesAddWindow.hpp => module-apps/application-settings-new/windows/QuotesAddWindow.hpp +1 -1
@@ 5,7 5,7 @@
#include "BaseSettingsWindow.hpp"
#include "QuotesMainWindow.hpp"
-#include "application-settings-new/model/QuotesModel.hpp"
+#include "application-settings-new/models/QuotesModel.hpp"
namespace gui
{
M module-apps/application-settings-new/windows/QuotesMainWindow.cpp => module-apps/application-settings-new/windows/QuotesMainWindow.cpp +2 -2
@@ 2,8 2,8 @@
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "QuotesMainWindow.hpp"
-#include "application-settings-new/model/QuotesRepository.hpp"
-#include "application-settings-new/model/QuotesModel.hpp"
+#include "application-settings-new/models/QuotesRepository.hpp"
+#include "application-settings-new/models/QuotesModel.hpp"
#include "application-settings-new/ApplicationSettings.hpp"
#include "application-settings-new/widgets/SettingsStyle.hpp"
#include "OptionSetting.hpp"
M module-apps/application-settings-new/windows/QuotesMainWindow.hpp => module-apps/application-settings-new/windows/QuotesMainWindow.hpp +1 -1
@@ 5,7 5,7 @@
#include "BaseSettingsWindow.hpp"
#include "application-settings-new/widgets/QuoteWidget.hpp"
-#include "application-settings-new/model/QuotesModel.hpp"
+#include "application-settings-new/models/QuotesModel.hpp"
#include <purefs/filesystem_paths.hpp>
#include <module-gui/gui/widgets/ListView.hpp>
M module-apps/application-settings-new/windows/QuotesOptionsWindow.cpp => module-apps/application-settings-new/windows/QuotesOptionsWindow.cpp +2 -2
@@ 3,11 3,11 @@
#include "QuotesOptionsWindow.hpp"
#include "OptionSetting.hpp"
-#include "application-settings-new/model/QuotesRepository.hpp"
+#include "application-settings-new/models/QuotesRepository.hpp"
#include "application-settings-new/ApplicationSettings.hpp"
#include "DialogMetadataMessage.hpp"
#include "QuotesMainWindow.hpp"
-#include "application-settings-new/model/QuotesRepository.hpp"
+#include "application-settings-new/models/QuotesRepository.hpp"
#include "application-settings-new/ApplicationSettings.hpp"
#include "application-settings-new/widgets/QuoteWidget.hpp"