From 1f9f429b0b4e5f6c04942a144f158a9795050793 Mon Sep 17 00:00:00 2001 From: Mateusz Grzegorzek Date: Tue, 20 Apr 2021 17:11:25 +0200 Subject: [PATCH] [EGD-5773] Device becomes not responsive when opening settings Use asynchronous communication with service cellular to obtain own number. --- .../ApplicationSettings.cpp | 8 +++-- .../service-cellular/CellularServiceAPI.cpp | 33 +++++++++---------- .../service-cellular/ServiceCellular.cpp | 4 +-- .../service-cellular/CellularMessage.hpp | 8 +++++ .../service-cellular/CellularServiceAPI.hpp | 11 +++++-- 5 files changed, 40 insertions(+), 24 deletions(-) diff --git a/module-apps/application-settings-new/ApplicationSettings.cpp b/module-apps/application-settings-new/ApplicationSettings.cpp index e894634760ba692435815cccb209fb16fb4ed745..6a81acfbee9346c8b9ccafaac5b99fc69d82f8b7 100644 --- a/module-apps/application-settings-new/ApplicationSettings.cpp +++ b/module-apps/application-settings-new/ApplicationSettings.cpp @@ -100,9 +100,13 @@ namespace app StartInBackground startInBackground) : Application(std::move(name), std::move(parent), mode, startInBackground), AsyncCallbackReceiver{this} { + CellularServiceAPI::SubscribeForOwnNumber(this, [&](const std::string &number) { + selectedSimNumber = number; + LOG_DEBUG("Sim number changed: %s", selectedSimNumber.c_str()); + }); if ((Store::GSM::SIM::SIM1 == selectedSim || Store::GSM::SIM::SIM2 == selectedSim) && Store::GSM::get()->sim == selectedSim) { - selectedSimNumber = CellularServiceAPI::GetOwnNumber(this); + CellularServiceAPI::RequestForOwnNumber(this); } } @@ -123,7 +127,7 @@ namespace app if (auto phoneMsg = dynamic_cast(msgl); nullptr != phoneMsg) { selectedSim = Store::GSM::get()->selected; if (CellularNotificationMessage::Content::SIM_READY == phoneMsg->content) { - selectedSimNumber = CellularServiceAPI::GetOwnNumber(this); + CellularServiceAPI::RequestForOwnNumber(this); } else if (CellularNotificationMessage::Content::SIM_NOT_READY == phoneMsg->content) { selectedSimNumber = {}; diff --git a/module-services/service-cellular/CellularServiceAPI.cpp b/module-services/service-cellular/CellularServiceAPI.cpp index e6d0e37442664b99238056ee9737c59b861ddae2..6bef0d179947b3eb76f7642c0d3e006a7bea0ec8 100644 --- a/module-services/service-cellular/CellularServiceAPI.cpp +++ b/module-services/service-cellular/CellularServiceAPI.cpp @@ -70,25 +70,24 @@ std::string CellularServiceAPI::GetIMSI(sys::Service *serv, bool getFullIMSINumb } } -std::string CellularServiceAPI::GetOwnNumber(sys::Service *serv) +void CellularServiceAPI::SubscribeForOwnNumber(sys::Service *serv, std::function callback) { - auto msg = std::make_shared(); - - auto ret = serv->bus.sendUnicastSync(msg, ServiceCellular::serviceName, 5000); - CellularResponseMessage *response = dynamic_cast(ret.second.get()); - - if (response == nullptr) { - LOG_ERROR("CellularServiceAPI::GetOwnNumber failed"); - return std::string(); - } + serv->connect(typeid(CellularGetOwnNumberResponseMessage), [callback](sys::Message *msg) { + auto response = dynamic_cast(msg); + if (response != nullptr && response->retCode) { + callback(response->data); + } + else { + LOG_ERROR("Getting own number failed"); + callback(std::string()); + } + return sys::MessageNone{}; + }); +} - if ((ret.first == sys::ReturnCodes::Success) && (response->retCode == true)) { - return response->data; - } - else { - LOG_ERROR("CellularServiceAPI::GetOwnNumber failed"); - return std::string(); - } +void CellularServiceAPI::RequestForOwnNumber(sys::Service *serv) +{ + serv->bus.sendUnicast(std::make_shared(), ServiceCellular::serviceName); } void CellularServiceAPI::GetNetworkInfo(sys::Service *serv) diff --git a/module-services/service-cellular/ServiceCellular.cpp b/module-services/service-cellular/ServiceCellular.cpp index 891b7205a403de08df4435f0dbcaa0ca6fd47265..ad904b50b12f14cd8763b603880a1560981b74f9 100644 --- a/module-services/service-cellular/ServiceCellular.cpp +++ b/module-services/service-cellular/ServiceCellular.cpp @@ -2412,9 +2412,9 @@ auto ServiceCellular::handleCellularGetOwnNumberMessage(sys::Message *msg) -> st { std::string temp; if (getOwnNumber(temp)) { - return std::make_shared(true, temp); + return std::make_shared(true, temp); } - return std::make_shared(false); + return std::make_shared(false); } auto ServiceCellular::handleCellularGetNetworkInfoMessage(sys::Message *msg) -> std::shared_ptr diff --git a/module-services/service-cellular/service-cellular/CellularMessage.hpp b/module-services/service-cellular/service-cellular/CellularMessage.hpp index e15039d05c10b11501c7c81bb4fa6e1ef3729245..52007e6f9de04b3f41939735ffc125fa16528d94 100644 --- a/module-services/service-cellular/service-cellular/CellularMessage.hpp +++ b/module-services/service-cellular/service-cellular/CellularMessage.hpp @@ -705,6 +705,14 @@ class CellularSimCardLockResponseMessage : public CellularResponseMessage } }; +class CellularGetOwnNumberResponseMessage : public CellularResponseMessage +{ + public: + CellularGetOwnNumberResponseMessage(bool retCode, std::string number = std::string()) + : CellularResponseMessage(retCode, std::move(number)) + {} +}; + class CellularAntennaResponseMessage : public CellularResponseMessage { public: diff --git a/module-services/service-cellular/service-cellular/CellularServiceAPI.hpp b/module-services/service-cellular/service-cellular/CellularServiceAPI.hpp index 5fdba57d0b7a3a134797103c220eabf1a6f8397b..639087a6fa19096dd90eb1fc78dda114e75c777a 100644 --- a/module-services/service-cellular/service-cellular/CellularServiceAPI.hpp +++ b/module-services/service-cellular/service-cellular/CellularServiceAPI.hpp @@ -35,11 +35,16 @@ namespace CellularServiceAPI */ std::string GetIMSI(sys::Service *serv, bool getFullIMSINumber = false); /* - * @brief Its calls sercive-cellular for selected SIM own phone number. + * @brief Its subscribes service-cellular for selected SIM own phone number response messages. * @param serv pointer to caller service. - * #return SIM own number when succeeds, empty string when fails + * @param callback called on response message receive event. */ - std::string GetOwnNumber(sys::Service *serv); + void SubscribeForOwnNumber(sys::Service *serv, std::function callback); + /* + * @brief Its calls service-cellular for selected SIM own phone number. + * @param serv pointer to caller service. + */ + void RequestForOwnNumber(sys::Service *serv); /* * @brief It calls service-cellulat fo newtwork info * @param serv pointer to caller service.