~aleteoryx/muditaos

e3d98f5df50afe16570f9581fbe358a6e5f749e8 — Kuba 5 years ago 12dbed3
[EGD-4856] Add Custom MMI message

Adds custom MMI respponse mesage.
It will be used by MMI response window to translate message.
M changelog.md => changelog.md +1 -0
@@ 10,6 10,7 @@
* `[file indexer]` Support for deleting entries in File Indexer DB.
* `[listview]` Added onEmpty list callbacks and implemented them for notes and messages. 
* `[notes]` Added list rebuild on notifications.
* `[cellular]` Custom MMI response message.

### Changed


M module-cellular/at/response.cpp => module-cellular/at/response.cpp +75 -0
@@ 3,6 3,7 @@

#include "response.hpp"
#include <Utils.hpp>
#include <magic_enum.hpp>

#include <algorithm>



@@ 218,5 219,79 @@ namespace at
                return 0;
            }
        } // namespace qnwinfo

        namespace clir
        {
            std::optional<ClirResponse> parseClir(const std::string &response)
            {
                auto constexpr toRemove    = "+CLIR: ";
                auto constexpr emptyString = "";

                auto resp = response;
                utils::findAndReplaceAll(resp, toRemove, emptyString);

                auto tokens = utils::split(resp, ",");
                for (auto &t : tokens) {
                    t = utils::trim(t);
                }
                if (tokens.size() == clirTokens) {
                    int state;
                    int status;

                    if (!utils::toNumeric(tokens[0], state) || !utils::toNumeric(tokens[1], status)) {
                        return std::nullopt;
                    }
                    if (static_cast<unsigned int>(state) < magic_enum::enum_count<ServiceState>() &&
                        static_cast<unsigned int>(status) < magic_enum::enum_count<ServiceStatus>()) {
                        return ClirResponse(static_cast<ServiceState>(state), static_cast<ServiceStatus>(status));
                    }
                }
                return std::nullopt;
            }

            app::manager::actions::IMMICustomResultParams::MMIResultMessage getState(const ServiceState &state)
            {
                using namespace app::manager::actions;

                auto message = IMMICustomResultParams::MMIResultMessage::CommonNoMessage;
                switch (state) {
                case ServiceState::AccordingToSubscription:
                    message = IMMICustomResultParams::MMIResultMessage::ClirAccordingToSubscription;
                    break;
                case ServiceState::ServiceEnabled:
                    message = IMMICustomResultParams::MMIResultMessage::ClirEnabled;
                    break;
                case ServiceState::ServiceDisabled:
                    message = IMMICustomResultParams::MMIResultMessage::ClirDisabled;
                    break;
                }
                return message;
            }

            app::manager::actions::IMMICustomResultParams::MMIResultMessage getStatus(const ServiceStatus &status)
            {
                using namespace app::manager::actions;

                auto message = IMMICustomResultParams::MMIResultMessage::CommonNoMessage;
                switch (status) {
                case ServiceStatus::NotProvisioned:
                    message = IMMICustomResultParams::MMIResultMessage::ClirNotProvisioned;
                    break;
                case ServiceStatus::PermanentProvisioned:
                    message = IMMICustomResultParams::MMIResultMessage::ClirPermanentProvisioned;
                    break;
                case ServiceStatus::Unknown:
                    message = IMMICustomResultParams::MMIResultMessage::ClirUnknown;
                    break;
                case ServiceStatus::TemporaryRestricted:
                    message = IMMICustomResultParams::MMIResultMessage::ClirTemporaryRestricted;
                    break;
                case ServiceStatus::TemporaryAllowed:
                    message = IMMICustomResultParams::MMIResultMessage::ClirTemporaryAllowed;
                    break;
                }
                return message;
            }
        } // namespace clir
    }     // namespace response
} // namespace at

M module-cellular/at/response.hpp => module-cellular/at/response.hpp +39 -0
@@ 9,6 9,8 @@
#include <memory>
#include <string>

#include <service-appmgr/service-appmgr/data/MmiActionsParams.hpp>

namespace at
{
    namespace response


@@ 86,5 88,42 @@ namespace at
            uint32_t parseNumericBandString(std::string &string);
            uint32_t parseLteBandString(std::string &string);
        } // namespace qnwinfo

        namespace clir
        {
            constexpr uint32_t clirTokens = 2;

            enum class ServiceState
            {
                AccordingToSubscription,
                ServiceEnabled,
                ServiceDisabled,
            };

            enum class ServiceStatus
            {
                NotProvisioned,
                PermanentProvisioned,
                Unknown,
                TemporaryRestricted,
                TemporaryAllowed
            };

            class ClirResponse
            {
              public:
                ServiceState serviceState;
                ServiceStatus serviceStatus;

                explicit ClirResponse(const ServiceState &state, const ServiceStatus &status)
                    : serviceState(state), serviceStatus(status)
                {}
            };

            auto parseClir(const std::string &response) -> std::optional<ClirResponse>;
            auto getState(const ServiceState &state) -> app::manager::actions::IMMICustomResultParams::MMIResultMessage;
            auto getStatus(const ServiceStatus &status)
                -> app::manager::actions::IMMICustomResultParams::MMIResultMessage;
        } // namespace clir
    }     // namespace response
} // namespace at

M module-services/service-appmgr/data/MmiActionsParams.cpp => module-services/service-appmgr/data/MmiActionsParams.cpp +23 -0
@@ 5,6 5,21 @@

using namespace app::manager::actions;

void MMICustomResultParams::addMessage(const MMIResultMessage &message)
{
    messages.push_back(message);
}

auto MMICustomResultParams::getMessage() -> std::vector<MMIResultMessage>
{
    return std::move(messages);
}

auto MMICustomResultParams::getType() -> MMIType
{
    return type;
}

MMIParams::MMIParams(std::string mmiData) : mmiData{std::move(mmiData)}
{}



@@ 16,7 31,15 @@ std::string MMIParams::getData() const
MMIResultParams::MMIResultParams(MMIResult result) : result(result)
{}

MMIResultParams::MMIResultParams(std::shared_ptr<IMMICustomResultParams> cResult) : customResult(cResult)
{}

MMIResultParams::MMIResult MMIResultParams::getData() const noexcept
{
    return result;
}

auto MMIResultParams::getCustomMessage() const noexcept -> std::shared_ptr<IMMICustomResultParams>
{
    return customResult;
}

M module-services/service-appmgr/service-appmgr/data/MmiActionsParams.hpp => module-services/service-appmgr/service-appmgr/data/MmiActionsParams.hpp +83 -0
@@ 7,6 7,86 @@

namespace app::manager::actions
{
    class IMMICustomResultParams
    {
      public:
        enum class MMIType
        {
            NoneSpecified,
            CallForwardingNotification,
            CallForwardingData,
            Clir
        };

        enum class MMIResultMessage
        {
            NoneSpecifiedSuccess,
            NoneSpecifiedFailed,
            CommonFailure,
            CommonNoMessage,

            ClirAccordingToSubscription,
            ClirEnabled,
            ClirDisabled,
            ClirNotProvisioned,
            ClirPermanentProvisioned,
            ClirUnknown,
            ClirTemporaryRestricted,
            ClirTemporaryAllowed,

            RegistrationSuccessful,
            RegistrationFailed,
            ErasureSuccessful,
            ErasureFailed,
            DisablingSuccessful,
            DisablingFailed,
            EnablingSuccessful,
            EnablingFailed
        };
        virtual auto getMessage() -> std::vector<MMIResultMessage> = 0;
        virtual void addMessage(const MMIResultMessage &message)   = 0;
        virtual auto getType() -> MMIType                          = 0;
    };

    class MMICustomResultParams : public IMMICustomResultParams
    {
      public:
        MMICustomResultParams(MMIType resultType) : type(resultType){};
        void addMessage(const MMIResultMessage &message) override;
        auto getMessage() -> std::vector<MMIResultMessage> override;
        auto getType() -> MMIType override;

      protected:
        MMIType type;
        std::vector<MMIResultMessage> messages;
    };

    class MMINoneSpecifiedResult : public MMICustomResultParams
    {
      public:
        MMINoneSpecifiedResult() : MMICustomResultParams(MMIType::NoneSpecified)
        {}
    };

    class MMICallForwardingResult : public MMICustomResultParams
    {
      public:
        MMICallForwardingResult() : MMICustomResultParams(MMIType::CallForwardingData)
        {}

      private:
        std::string voice;
        std::string fax;
        std::string sync;
        std::string async;
    };

    class MMIClirResult : public MMICustomResultParams
    {
      public:
        MMIClirResult() : MMICustomResultParams(MMIType::Clir)
        {}
    };

    class MMIParams : public ActionParams
    {


@@ 28,9 108,12 @@ namespace app::manager::actions
            Failed
        };
        explicit MMIResultParams(MMIResult result);
        explicit MMIResultParams(std::shared_ptr<IMMICustomResultParams> cParams);
        [[nodiscard]] MMIResult getData() const noexcept;
        [[nodiscard]] auto getCustomMessage() const noexcept -> std::shared_ptr<IMMICustomResultParams>;

      private:
        MMIResult result;
        std::shared_ptr<IMMICustomResultParams> customResult = nullptr;
    };
} // namespace app::manager::actions

M module-services/service-cellular/CellularRequestHandler.cpp => module-services/service-cellular/CellularRequestHandler.cpp +35 -0
@@ 17,6 17,10 @@
#include "service-cellular/requests/UssdRequest.hpp"

#include <service-appmgr/model/ApplicationManager.hpp>
#include "service-cellular/service-cellular/requests/ClirRequest.hpp"
#include "service-cellular/service-cellular/requests/SupplementaryServicesRequest.hpp"

#include <module-cellular/at/response.hpp>

void CellularRequestHandler::handle(ImeiRequest &request, at::Result &result)
{


@@ 81,6 85,37 @@ void CellularRequestHandler::handle(PinChangeRequest &request, at::Result &resul
    sendMmiResult(requestHandled);
}

void CellularRequestHandler::handle(ClirRequest &request, at::Result &result)
{
    using namespace app::manager::actions;
    using namespace cellular;
    using namespace at::response;
    auto requestHandled = request.checkModemResponse(result);

    std::shared_ptr<IMMICustomResultParams> response = std::make_shared<MMIClirResult>();
    if (requestHandled) {
        auto procedureType = request.getProcedureType();
        if (procedureType == SupplementaryServicesRequest::ProcedureType::Activation) {
            response->addMessage(IMMICustomResultParams::MMIResultMessage::ClirEnabled);
        }
        else if (procedureType == SupplementaryServicesRequest::ProcedureType::Deactivation) {
            response->addMessage(IMMICustomResultParams::MMIResultMessage::ClirDisabled);
        }
        else if (procedureType == SupplementaryServicesRequest::ProcedureType::Interrogation) {
            auto clirParsed = clir::parseClir(result.response[0]);
            if (clirParsed != std::nullopt) {
                response->addMessage(clir::getStatus(clirParsed->serviceStatus));
                response->addMessage(clir::getState(clirParsed->serviceState));
            }
        }
        else {
            response->addMessage(IMMICustomResultParams::MMIResultMessage::CommonFailure);
        }
    }
    auto msg = std::make_shared<CellularMMIResultMessage>(response);
    sys::Bus::SendUnicast(msg, app::manager::ApplicationManager::ServiceName, &cellular);
    request.setHandled(requestHandled);
}
void CellularRequestHandler::sendMmiResult(bool result)
{
    using namespace app::manager::actions;

M module-services/service-cellular/requests/SupplementaryServicesRequest.cpp => module-services/service-cellular/requests/SupplementaryServicesRequest.cpp +5 -0
@@ 146,4 146,9 @@ namespace cellular
        return utils::to_string(informationClass);
    }

    auto SupplementaryServicesRequest::getProcedureType() -> ProcedureType
    {
        return procedureType;
    }

}; // namespace cellular

M module-services/service-cellular/service-cellular/CellularMessage.hpp => module-services/service-cellular/service-cellular/CellularMessage.hpp +8 -2
@@ 549,7 549,10 @@ class CellularMMIResult : public CellularMessage
  protected:
    app::manager::actions::MMIResultParams params;

    explicit CellularMMIResult(app::manager::actions::MMIResultParams::MMIResult result)
    CellularMMIResult(app::manager::actions::MMIResultParams::MMIResult result)
        : CellularMessage(MessageType::CellularMMIData), params(result)
    {}
    CellularMMIResult(std::shared_ptr<app::manager::actions::IMMICustomResultParams> &result)
        : CellularMessage(MessageType::CellularMMIData), params(result)
    {}
};


@@ 557,7 560,10 @@ class CellularMMIResult : public CellularMessage
class CellularMMIResultMessage : public CellularMMIResult, public app::manager::actions::ConvertibleToAction
{
  public:
    explicit CellularMMIResultMessage(app::manager::actions::MMIResultParams::MMIResult result)
    CellularMMIResultMessage(app::manager::actions::MMIResultParams::MMIResult result) : CellularMMIResult(result)
    {}

    CellularMMIResultMessage(std::shared_ptr<app::manager::actions::IMMICustomResultParams> &result)
        : CellularMMIResult(result)
    {}


M module-services/service-cellular/service-cellular/CellularRequestHandler.hpp => module-services/service-cellular/service-cellular/CellularRequestHandler.hpp +1 -0
@@ 20,6 20,7 @@ class CellularRequestHandler : public RequestHandler
    void handle(PasswordRegistrationRequest &request, at::Result &result) final;
    void handle(SupplementaryServicesRequest &request, at::Result &result) final;
    void handle(PinChangeRequest &request, at::Result &result) final;
    void handle(ClirRequest &request, at::Result &result) final;

  private:
    ServiceCellular &cellular;

M module-services/service-cellular/service-cellular/RequestHandler.hpp => module-services/service-cellular/service-cellular/RequestHandler.hpp +3 -0
@@ 13,6 13,8 @@ namespace cellular
    class SupplementaryServicesRequest;
    class PasswordRegistrationRequest;
    class PinChangeRequest;
    class ClipRequest;
    class ClirRequest;

    class RequestHandler
    {


@@ 23,5 25,6 @@ namespace cellular
        virtual void handle(PasswordRegistrationRequest &request, at::Result &result)  = 0;
        virtual void handle(PinChangeRequest &request, at::Result &result)             = 0;
        virtual void handle(SupplementaryServicesRequest &request, at::Result &result) = 0;
        virtual void handle(ClirRequest &request, at::Result &result)                  = 0;
    };
} // namespace cellular

M module-services/service-cellular/service-cellular/requests/SupplementaryServicesRequest.hpp => module-services/service-cellular/service-cellular/requests/SupplementaryServicesRequest.hpp +2 -0
@@ 44,6 44,8 @@ namespace cellular
            Erasure        ///< MMI string starts with ##
        };

        auto getProcedureType() -> ProcedureType;

      protected:
        std::string request;
        std::string serviceCode;