From c5fbf28208a708744b748f8545abce95a501c96d Mon Sep 17 00:00:00 2001 From: Kuba Kleczkowski Date: Fri, 10 Feb 2023 16:33:56 +0100 Subject: [PATCH] [MOS-879] Fixed misleding SMS flow Fixed misleading SMS flow after sending error. When modem was rebooting attempt to send SMS was causing Rejected by no sim popup, which was misleading for user. --- .../service-cellular/ServiceCellular.cpp | 12 +++++++++++- .../service-cellular/src/SMSSendHandler.cpp | 19 ++++++++++++++----- .../service-cellular/src/SMSSendHandler.hpp | 6 ++++-- .../src/ServiceCellularPriv.cpp | 10 ++++++++-- .../tests/unittest_smssendhandler.cpp | 6 ++++-- pure_changelog.md | 1 + 6 files changed, 42 insertions(+), 12 deletions(-) diff --git a/module-services/service-cellular/ServiceCellular.cpp b/module-services/service-cellular/ServiceCellular.cpp index 1a900114c03c3f0d2803b2dc65b91dec3ba52f39..617b92f5f89635b0e6ed389b4f46a964c8655585 100644 --- a/module-services/service-cellular/ServiceCellular.cpp +++ b/module-services/service-cellular/ServiceCellular.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "endpoints/developerMode/event/ATRequest.hpp" @@ -632,7 +632,13 @@ void ServiceCellular::registerMessageHandlers() if (priv->volteHandler->isFunctionalityResetNeeded()) { LOG_INFO("[VoLTE] first run after switching - functionality reset needed"); priv->modemResetHandler->performFunctionalityReset(); + return sys::MessageNone{}; + } + + if (priv->state->get() == State::ST::Ready) { + priv->outSMSHandler.requestNotSendMessage(); } + return sys::MessageNone{}; }); } @@ -941,6 +947,10 @@ bool ServiceCellular::handle_cellular_priv_init() } auto ServiceCellular::handle(db::query::SMSSearchByTypeResult *response) -> bool { + if (priv->state->get() != State::ST::Ready) { + LOG_ERROR("Cellular not ready, skip request"); + return false; + } if (response->getResults().empty()) { priv->outSMSHandler.handleNoMoreDbRecords(); } diff --git a/module-services/service-cellular/src/SMSSendHandler.cpp b/module-services/service-cellular/src/SMSSendHandler.cpp index 29aef1d93ab4fe9e63bcb95c397d94f8e0b760c9..dce107d39639b37a95174ae9942c8c024de03bb6 100644 --- a/module-services/service-cellular/src/SMSSendHandler.cpp +++ b/module-services/service-cellular/src/SMSSendHandler.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "SMSSendHandler.hpp" @@ -51,7 +51,10 @@ namespace cellular::internal::sms { handleStateChange(currentState->handle(SMSRecord{})); } - + void SMSSendHandler::requestNotSendMessage() + { + onSendQuery(db::Interface::Name::SMS, std::make_unique(SMSType::QUEUED, 0, 1)); + } bool State::isNotification(const std::optional record) { return !record; @@ -83,13 +86,19 @@ namespace cellular::internal::sms return std::make_unique(context); } + if (context.onGetModemResetInProgress()) { + LOG_ERROR("Modem is rebooting, skipping SMS sending attempt"); + return {}; + } + if (context.onGetOfflineMode() || context.onSIMNotInitialized()) { + LOG_ERROR("Failed to send SMS"); record->type = SMSType::FAILED; context.onSendQuery(db::Interface::Name::SMS, std::make_unique(std::move(*record))); + return {}; } - else { - context.onSend(*record); - } + + context.onSend(*record); // Check if there are more queued records context.onSendQuery(db::Interface::Name::SMS, diff --git a/module-services/service-cellular/src/SMSSendHandler.hpp b/module-services/service-cellular/src/SMSSendHandler.hpp index 5f1fa8e965a7428bba42f4c264810d2ac779ab4d..95987034573f01e0f0deb7d3934b9deae53e722e 100644 --- a/module-services/service-cellular/src/SMSSendHandler.hpp +++ b/module-services/service-cellular/src/SMSSendHandler.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -58,7 +58,6 @@ namespace cellular::internal::sms { public: SMSSendHandler(); - /** * External action events */ @@ -66,6 +65,7 @@ namespace cellular::internal::sms void handleIncomingDbRecord(SMSRecord &record, bool onDelay); void handleNoMoreDbRecords(); void sendMessageIfDelayed(); + void requestNotSendMessage(); /** * User defined callbacks/events @@ -79,6 +79,8 @@ namespace cellular::internal::sms std::function onGetOfflineMode; /// Called when SMSSendHandler wants to check SIM state std::function onSIMNotInitialized; + /// Called when SMSHandler wants to check if modem is rebooting + std::function onGetModemResetInProgress; private: void handleStateChange(OptionalState state); diff --git a/module-services/service-cellular/src/ServiceCellularPriv.cpp b/module-services/service-cellular/src/ServiceCellularPriv.cpp index 1f0861f5cfe768892582efacd105f6a4ce18b271..c86379418aa189758aa41aaeed07869b3e4962e6 100644 --- a/module-services/service-cellular/src/ServiceCellularPriv.cpp +++ b/module-services/service-cellular/src/ServiceCellularPriv.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "ServiceCellularPriv.hpp" @@ -83,7 +83,6 @@ namespace cellular::internal modemResetHandler->performHardReset(); return; } - owner->bus.sendMulticast(); }; simCard->onNeedPin = [this](unsigned int attempts) { @@ -241,6 +240,8 @@ namespace cellular::internal } return ret; }; + + outSMSHandler.onGetModemResetInProgress = [this]() -> bool { return modemResetHandler->isResetInProgress(); }; } bool ServiceCellularPriv::onSendSMS(SMSRecord &record) @@ -262,6 +263,11 @@ namespace cellular::internal channelSetup = false; } } + else { + LOG_ERROR("No channel provided! SMS sending failed"); + record.type = SMSType::FAILED; + return false; + } if (channelSetup) { auto partHandler = sms::SMSPartsHandler(record.body); diff --git a/module-services/service-cellular/tests/unittest_smssendhandler.cpp b/module-services/service-cellular/tests/unittest_smssendhandler.cpp index 8137fd40d14dc16e436f3c17127472dc37ba0bae..5facecbb613a595fe3b0cdfa2ee362334ca529c1 100644 --- a/module-services/service-cellular/tests/unittest_smssendhandler.cpp +++ b/module-services/service-cellular/tests/unittest_smssendhandler.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include @@ -32,6 +32,8 @@ TEST_CASE("SMSSendHandler functionality") outSMS.onSIMNotInitialized = []() -> bool { return false; }; + outSMS.onGetModemResetInProgress = []() -> bool { return false; }; + SECTION("Schedule standard send SMS procedure") { auto record = buildValidSMSRecord(); @@ -87,7 +89,7 @@ TEST_CASE("SMSSendHandler functionality") outSMS.handleIncomingDbRecord(record, sendOnDelay); CHECK(wasOnSendInvoked == 0); - CHECK(wasOnSendQueryInvoked == 3); + CHECK(wasOnSendQueryInvoked == 2); } SECTION("Delayed send - positive flow") diff --git a/pure_changelog.md b/pure_changelog.md index f6b3774e4da7285062232ebe69642ce41698ea74..f2112b5e240cf2398217a90fca1074778cfa2289 100644 --- a/pure_changelog.md +++ b/pure_changelog.md @@ -76,6 +76,7 @@ * Fixed minor issues in the Calculator Application * Fixed displaying usual SMS template call rejection window when no templates were defined * Fixed going back to wrong window after confirming or cancelling creation of new contact from call log +* Fixed misleading popup on SMS send when modem is rebooting ## [1.5.0 2022-12-20]