M changelog.md => changelog.md +1 -0
@@ 4,6 4,7 @@
### Added
* Battery Brownout detection
+* VoLTE ON/OFF switch in Settings Network window
### Changed
M image/assets/lang/English.json => image/assets/lang/English.json +1 -0
@@ 346,6 346,7 @@
"app_settings_network_sim1": "Sim1",
"app_settings_network_sim2": "Sim2",
"app_settings_network_sim_none": "No Sim",
+ "app_settings_network_voice_over_lte" :"VoLTE (experimental)",
"app_settings_toggle_on": "ON",
"app_settings_toggle_off": "OFF",
"app_settings_security_lock_screen_passcode": "Lock screen passcode",
M module-apps/application-settings-new/ApplicationSettings.cpp => module-apps/application-settings-new/ApplicationSettings.cpp +24 -0
@@ 32,6 32,7 @@
#include <service-cellular/CellularServiceAPI.hpp>
#include <service-db/Settings.hpp>
#include <module-services/service-bluetooth/service-bluetooth/messages/Status.hpp>
+#include <service-db/agents/settings/SystemSettings.hpp>
namespace app
{
@@ 51,11 52,15 @@ namespace app
}
settings->registerValueChange(settings::operators_on,
[this](const std::string &value) { operatorOnChanged(value); });
+
+ settings->registerValueChange(::settings::Cellular::volte_on,
+ [this](const std::string &value) { volteChanged(value); });
}
ApplicationSettingsNew::~ApplicationSettingsNew()
{
settings->unregisterValueChange(settings::operators_on);
+ settings->unregisterValueChange(::settings::Cellular::volte_on);
}
// Invoked upon receiving data message
@@ 224,4 229,23 @@ namespace app
operatorsOn = value;
settings->setValue(settings::operators_on, std::to_string(value));
}
+
+ void ApplicationSettingsNew::setVoLTEOn(bool value)
+ {
+ voLteStateOn = value;
+ CellularServiceAPI::SetVoLTE(this, voLteStateOn);
+ };
+
+ bool ApplicationSettingsNew::getVoLTEOn() const noexcept
+ {
+ return voLteStateOn;
+ }
+
+ void ApplicationSettingsNew::volteChanged(const std::string &value)
+ {
+ if (!value.empty()) {
+ voLteStateOn = utils::getNumericValue<bool>(value);
+ }
+ }
+
} /* namespace app */
M module-apps/application-settings-new/ApplicationSettings.hpp => module-apps/application-settings-new/ApplicationSettings.hpp +6 -0
@@ 64,6 64,8 @@ namespace app
virtual ~OperatorsSettings() = default;
virtual void setOperatorsOn(bool value) = 0;
[[nodiscard]] virtual bool getOperatorsOn() const noexcept = 0;
+ virtual void setVoLTEOn(bool value) = 0;
+ [[nodiscard]] virtual bool getVoLTEOn() const noexcept = 0;
};
}; // namespace settingsInterface
@@ 93,12 95,16 @@ namespace app
void operatorOnChanged(const std::string &value);
void setOperatorsOn(bool value) override;
bool getOperatorsOn() const noexcept override;
+ void setVoLTEOn(bool value) override;
+ bool getVoLTEOn() const noexcept override;
+ void volteChanged(const std::string &value);
private:
Store::GSM::SIM selectedSim = Store::GSM::get()->selected;
std::string selectedSimNumber = {};
bsp::Board board = bsp::Board::none;
bool operatorsOn = false;
+ bool voLteStateOn = false;
};
template <> struct ManifestTraits<ApplicationSettingsNew>
M module-apps/application-settings-new/windows/NetworkWindow.cpp => module-apps/application-settings-new/windows/NetworkWindow.cpp +13 -0
@@ 41,6 41,8 @@ namespace gui
break;
}
auto operatorsOn = operatorsSettings->getOperatorsOn();
+ auto voLteOn = operatorsSettings->getVoLTEOn();
+
optList.emplace_back(std::make_unique<gui::OptionSettings>(
utils::translateI18("app_settings_network_active_card") + ":" + simStr + " / " + phoneNumber,
[=](gui::Item &item) {
@@ 97,6 99,17 @@ namespace gui
nullptr,
nullptr));
+ optList.emplace_back(std::make_unique<gui::OptionSettings>(
+ utils::translateI18("app_settings_network_voice_over_lte"),
+ [=](gui::Item &item) {
+ operatorsSettings->setVoLTEOn(!voLteOn);
+ rebuild();
+ return true;
+ },
+ nullptr,
+ nullptr,
+ voLteOn ? RightItem::On : RightItem::Off));
+
bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::select));
topBar->setActive(TopBar::Elements::SIGNAL, false);
M module-apps/application-settings-new/windows/NetworkWindow.hpp => module-apps/application-settings-new/windows/NetworkWindow.hpp +1 -1
@@ 25,7 25,7 @@ namespace gui
private:
auto netOptList() -> std::list<gui::Option>;
app::settingsInterface::SimParams *simParams;
- void rebuild();
+ void rebuild() override;
app::settingsInterface::OperatorsSettings *operatorsSettings;
public:
M module-services/service-cellular/CellularServiceAPI.cpp => module-services/service-cellular/CellularServiceAPI.cpp +6 -0
@@ 341,3 341,9 @@ bool CellularServiceAPI::GetDataTransfer(sys::Service *serv)
return sys::Bus::SendUnicast(
std::make_shared<CellularGetDataTransferMessage>(), ServiceCellular::serviceName, serv);
}
+
+bool CellularServiceAPI::SetVoLTE(sys::Service *serv, bool voLTE)
+{
+ return sys::Bus::SendUnicast(
+ std::make_shared<CellularChangeVoLTEDataMessage>(voLTE), ServiceCellular::serviceName, serv);
+}
M module-services/service-cellular/ServiceCellular.cpp => module-services/service-cellular/ServiceCellular.cpp +21 -1
@@ 198,7 198,8 @@ ServiceCellular::ServiceCellular() : sys::Service(serviceName, "", cellularStack
sys::Bus::SendMulticast(msg.value(), sys::BusChannels::ServiceCellularNotifications, this);
};
registerMessageHandlers();
-
+ settings->registerValueChange(settings::Cellular::volte_on,
+ [this](const std::string &value) { volteChanged(value); });
packetData = std::make_unique<packet_data::PacketData>(*this);
packetData->loadAPNSettings();
}
@@ 206,6 207,7 @@ ServiceCellular::ServiceCellular() : sys::Service(serviceName, "", cellularStack
ServiceCellular::~ServiceCellular()
{
LOG_INFO("[ServiceCellular] Cleaning resources");
+ settings->unregisterValueChange(settings::Cellular::volte_on);
}
// this static function will be replaced by Settings API
@@ 290,10 292,12 @@ void ServiceCellular::registerMessageHandlers()
bsp::cellular::sim::hotswap_trigger();
return std::make_shared<CellularResponseMessage>(true);
});
+
connect(typeid(CellularStartOperatorsScanMessage), [&](sys::Message *request) -> sys::MessagePointer {
auto msg = static_cast<CellularStartOperatorsScanMessage *>(request);
return handleCellularStartOperatorsScan(msg);
});
+
connect(typeid(CellularGetActiveContextsMessage), [&](sys::Message *request) -> sys::MessagePointer {
auto msg = static_cast<CellularGetActiveContextsMessage *>(request);
return handleCellularGetActiveContextsMessage(msg);
@@ 333,6 337,14 @@ void ServiceCellular::registerMessageHandlers()
auto msg = static_cast<CellularGetActiveContextsMessage *>(request);
return handleCellularGetActiveContextsMessage(msg);
});
+
+ connect(typeid(CellularChangeVoLTEDataMessage), [&](sys::Message *request) -> sys::MessagePointer {
+ auto msg = static_cast<CellularChangeVoLTEDataMessage *>(request);
+ volteOn = msg->getVoLTEon();
+ settings->setValue(settings::Cellular::volte_on, std::to_string(volteOn));
+ return std::make_shared<CellularResponseMessage>(true);
+ });
+
handle_CellularGetChannelMessage();
}
@@ 2040,6 2052,7 @@ std::shared_ptr<cellular::RawCommandRespAsync> ServiceCellular::handleCellularSt
sys::Bus::SendUnicast(ret, msg->sender, this);
return ret;
}
+
bool ServiceCellular::handle_apn_conf_procedure()
{
LOG_DEBUG("APN on modem configuration");
@@ 2131,3 2144,10 @@ std::shared_ptr<CellularSetOperatorResponse> ServiceCellular::handleCellularSetO
return std::make_shared<CellularSetOperatorResponse>(
networkSettings.setOperator(msg->getMode(), msg->getFormat(), msg->getName()));
}
+
+void ServiceCellular::volteChanged(const std::string &value)
+{
+ if (!value.empty()) {
+ volteOn = utils::getNumericValue<bool>(value);
+ }
+}
M module-services/service-cellular/service-cellular/CellularMessage.hpp => module-services/service-cellular/service-cellular/CellularMessage.hpp +20 -0
@@ 695,6 695,26 @@ class CellularSetOperatorResponse : public CellularResponseMessage
{}
};
+class CellularVoLTEDataMessage : public CellularMessage
+{
+ bool VoLTEon = false;
+
+ public:
+ explicit CellularVoLTEDataMessage(bool VoLTEon) : CellularMessage{MessageType::CellularSetVoLTE}, VoLTEon{VoLTEon}
+ {}
+ [[nodiscard]] bool getVoLTEon() const noexcept
+ {
+ return VoLTEon;
+ }
+};
+
+class CellularChangeVoLTEDataMessage : public CellularVoLTEDataMessage
+{
+ public:
+ explicit CellularChangeVoLTEDataMessage(bool VoLTEon) : CellularVoLTEDataMessage{VoLTEon}
+ {}
+};
+
namespace cellular
{
M module-services/service-cellular/service-cellular/CellularServiceAPI.hpp => module-services/service-cellular/service-cellular/CellularServiceAPI.hpp +2 -0
@@ 111,4 111,6 @@ namespace CellularServiceAPI
bool SetAPN(sys::Service *serv, packet_data::APN::Config apnConfig);
bool SetDataTransfer(sys::Service *serv, packet_data::DataTransfer dt);
bool GetDataTransfer(sys::Service *serv);
+ bool SetVoLTE(sys::Service *serv, bool value);
+
}; // namespace CellularServiceAPI
M module-services/service-cellular/service-cellular/ServiceCellular.hpp => module-services/service-cellular/service-cellular/ServiceCellular.hpp +3 -0
@@ 293,4 293,7 @@ class ServiceCellular : public sys::Service
friend class NetworkSettings;
friend class packet_data::PDPContext;
friend class packet_data::PacketData;
+
+ void volteChanged(const std::string &value);
+ bool volteOn = false;
};
M module-services/service-db/agents/settings/SystemSettings.hpp => module-services/service-db/agents/settings/SystemSettings.hpp +5 -0
@@ 23,4 23,9 @@ namespace settings
constexpr inline auto bondedDevices = "bt_bonded_devices";
} // namespace Bluetooth
+ namespace Cellular
+ {
+ constexpr inline auto volte_on = "cl_volte_on";
+ } // namespace Cellular
+
}; // namespace settings
M source/MessageType.hpp => source/MessageType.hpp +1 -0
@@ 79,6 79,7 @@ enum class MessageType
CellularSimProcedure, // Broadcast on sim state changed
CellularSimResponse, // Send to PIN window (show, error state, hide)
CellularSimVerifyPinRequest, // Send from PIN window with PIN, PUK, ... number
+ CellularSetVoLTE,
CellularPacketData, ///< for all PacketData messages