// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include #include namespace sys::phone_modes { namespace { template void onChanged(const F &onChanged, const Observer::OnFinishedCallbacks &onFinished) { try { onChanged(); if (onFinished.onComplete) { onFinished.onComplete(); } } catch (const std::exception &error) { if (onFinished.onError) { onFinished.onError(error); } throw; } } } // namespace void Observer::connect(Service *owner) { owner->connect(typeid(PhoneModeChanged), [this](sys::Message *request) -> sys::MessagePointer { return handlePhoneModeChange(static_cast(request)); }); owner->connect(typeid(TetheringChanged), [this](sys::Message *request) -> sys::MessagePointer { return handleTetheringChange(static_cast(request)); }); } void Observer::subscribe(OnPhoneModeChangedCallback &&onChange, OnCompleteCallback &&onComplete, OnErrorCallback &&onError) noexcept { onPhoneModeChangedCallback = std::move(onChange); onPhoneModeChangeFinished.onComplete = std::move(onComplete); onPhoneModeChangeFinished.onError = std::move(onError); } void Observer::subscribe(OnTetheringChangedCallback &&onChange, OnCompleteCallback &&onComplete, OnErrorCallback &&onError) noexcept { onTetheringChangedCallback = std::move(onChange); onTetheringChangeFinished.onComplete = std::move(onComplete); onTetheringChangeFinished.onError = std::move(onError); } bool Observer::isInMode(PhoneMode mode) const noexcept { return phoneMode == mode; } PhoneMode Observer::getCurrentPhoneMode() const noexcept { return phoneMode; } bool Observer::isTetheringOn() const noexcept { return tetheringMode == Tethering::On; } sys::MessagePointer Observer::handlePhoneModeChange(PhoneModeChanged *message) { phoneMode = message->getPhoneMode(); if (!onPhoneModeChangedCallback) { LOG_WARN("No subscriber on phone mode change."); return MessageNone{}; } try { onChanged([this]() { onPhoneModeChangedCallback(phoneMode); }, onPhoneModeChangeFinished); } catch (const std::exception &) { return std::make_shared(); } return std::make_shared(); } sys::MessagePointer Observer::handleTetheringChange(TetheringChanged *message) { tetheringMode = message->getTetheringMode(); if (!onTetheringChangedCallback) { LOG_WARN("No subscriber on phone mode change."); return MessageNone{}; } try { onChanged([this]() { onTetheringChangedCallback(tetheringMode); }, onTetheringChangeFinished); } catch (const std::exception &) { return std::make_shared(); } return std::make_shared(); } } // namespace sys::phone_modes