~aleteoryx/muditaos

64c6c70a9e7be8ca1d79f50b9208ca568390c55b — Pawel Olejniczak 5 years ago 09d095b
[EGD-5215] Add APNs list

Load APNs from service cellular.
Add ApnSettings model.
Connect ApnOptionWindow with ApnSettingsWindow.
24 files changed, 219 insertions(+), 54 deletions(-)

M changelog.md
M module-apps/application-settings-new/ApplicationSettings.cpp
M module-apps/application-settings-new/CMakeLists.txt
A module-apps/application-settings-new/data/ApnListData.hpp
M module-apps/application-settings-new/data/QuoteSwitchData.hpp
A module-apps/application-settings-new/models/ApnSettingsModel.cpp
A module-apps/application-settings-new/models/ApnSettingsModel.hpp
M module-apps/application-settings-new/models/NewApnModel.cpp
M module-apps/application-settings-new/models/NewApnModel.hpp
R module-apps/application-settings-new/{model => models}/QuotesModel.cpp
R module-apps/application-settings-new/{model => models}/QuotesModel.hpp
R module-apps/application-settings-new/{model => models}/QuotesRepository.cpp
R module-apps/application-settings-new/{model => models}/QuotesRepository.hpp
M module-apps/application-settings-new/windows/ApnOptionsWindow.cpp
M module-apps/application-settings-new/windows/ApnOptionsWindow.hpp
M module-apps/application-settings-new/windows/ApnSettingsWindow.cpp
M module-apps/application-settings-new/windows/ApnSettingsWindow.hpp
M module-apps/application-settings-new/windows/NewApnWindow.cpp
M module-apps/application-settings-new/windows/NewApnWindow.hpp
M module-apps/application-settings-new/windows/QuotesAddWindow.cpp
M module-apps/application-settings-new/windows/QuotesAddWindow.hpp
M module-apps/application-settings-new/windows/QuotesMainWindow.cpp
M module-apps/application-settings-new/windows/QuotesMainWindow.hpp
M module-apps/application-settings-new/windows/QuotesOptionsWindow.cpp
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"