M module-apps/apps-common/ApplicationCommon.hpp => module-apps/apps-common/ApplicationCommon.hpp +7 -5
@@ 173,6 173,13 @@ namespace app
using OnActionReceived = std::function<ActionResult(manager::actions::ActionParamsPtr &&)>;
+ protected:
+ virtual sys::MessagePointer handleKBDKeyEvent(sys::Message *msgl);
+ virtual sys::MessagePointer handleApplicationSwitch(sys::Message *msgl);
+ virtual sys::MessagePointer handleAppClose(sys::Message *msgl);
+ virtual sys::MessagePointer handleSwitchWindow(sys::Message *msgl);
+ virtual sys::MessagePointer handleAppFocusLost(sys::Message *msgl);
+
private:
std::string default_window;
State state = State::DEACTIVATED;
@@ 180,20 187,15 @@ namespace app
sys::MessagePointer handleSignalStrengthUpdate(sys::Message *msgl);
sys::MessagePointer handleNetworkAccessTechnologyUpdate(sys::Message *msgl);
sys::MessagePointer handleInputEvent(sys::Message *msgl);
- sys::MessagePointer handleKBDKeyEvent(sys::Message *msgl);
sys::MessagePointer handleBatteryStatusChange();
sys::MessagePointer handleMinuteUpdated(sys::Message *msgl);
sys::MessagePointer handleAction(sys::Message *msgl);
- sys::MessagePointer handleApplicationSwitch(sys::Message *msgl);
sys::MessagePointer handleApplicationSwitchLaunch(sys::Message *msgl);
sys::MessagePointer handleApplicationSwitchOnAction(sys::Message *msgl);
- sys::MessagePointer handleSwitchWindow(sys::Message *msgl);
sys::MessagePointer handleUpdateWindow(sys::Message *msgl);
- sys::MessagePointer handleAppClose(sys::Message *msgl);
sys::MessagePointer handleAppRebuild(sys::Message *msgl);
sys::MessagePointer handleAppRefresh(sys::Message *msgl);
sys::MessagePointer handleGetDOM(sys::Message *msgl);
- sys::MessagePointer handleAppFocusLost(sys::Message *msgl);
sys::MessagePointer handleSimStateUpdateMessage(sys::Message *msgl);
virtual bool isPopupPermitted(gui::popup::ID popupId) const;
M products/BellHybrid/apps/Application.cpp => products/BellHybrid/apps/Application.cpp +56 -0
@@ 5,6 5,7 @@
#include <common/models/AlarmModel.hpp>
+#include <appmgr/messages/IdleTimerMessage.hpp>
#include <common/BellPowerOffPresenter.hpp>
#include <common/popups/presenter/AlarmActivatedPresenter.hpp>
#include <common/popups/AlarmActivatedWindow.hpp>
@@ 13,6 14,7 @@
#include <common/popups/BellRebootWindow.hpp>
#include <common/windows/BellTurnOffWindow.hpp>
#include <common/windows/BellWelcomeWindow.hpp>
+#include <service-appmgr/Constants.hpp>
namespace app
{
@@ 68,4 70,58 @@ namespace app
(isCurrentWindow(gui::popup::resolveWindowName(gui::popup::ID::PowerOff))) ||
(isCurrentWindow(gui::BellTurnOffWindow::name)));
}
+
+ sys::MessagePointer Application::handleKBDKeyEvent(sys::Message *msgl)
+ {
+ onKeyPressed();
+ return ApplicationCommon::handleKBDKeyEvent(msgl);
+ }
+
+ sys::MessagePointer Application::handleApplicationSwitch(sys::Message *msgl)
+ {
+ onStart();
+ return ApplicationCommon::handleApplicationSwitch(msgl);
+ }
+
+ sys::MessagePointer Application::handleAppClose(sys::Message *msgl)
+ {
+ onStop();
+ return ApplicationCommon::handleAppClose(msgl);
+ }
+
+ sys::MessagePointer Application::handleAppFocusLost(sys::Message *msgl)
+ {
+ onStop();
+ return ApplicationCommon::handleAppFocusLost(msgl);
+ }
+
+ void Application::onKeyPressed()
+ {
+ restartIdleTimer();
+ }
+
+ void Application::onStart()
+ {
+ startIdleTimer();
+ }
+
+ void Application::onStop()
+ {
+ stopIdleTimer();
+ }
+
+ void Application::startIdleTimer()
+ {
+ bus.sendUnicast(std::make_shared<StartIdleTimerMessage>(), service::name::appmgr);
+ }
+
+ void Application::restartIdleTimer()
+ {
+ bus.sendUnicast(std::make_shared<RestartIdleTimerMessage>(), service::name::appmgr);
+ }
+
+ void Application::stopIdleTimer()
+ {
+ bus.sendUnicast(std::make_shared<StopIdleTimerMessage>(), service::name::appmgr);
+ }
} // namespace app
M products/BellHybrid/apps/CMakeLists.txt => products/BellHybrid/apps/CMakeLists.txt +1 -0
@@ 16,6 16,7 @@ target_link_libraries(app
PRIVATE
apps-common
bell::app-common
+ bell::appmgr
)
add_subdirectory(application-bell-main)
M products/BellHybrid/apps/application-bell-main/ApplicationBellMain.cpp => products/BellHybrid/apps/application-bell-main/ApplicationBellMain.cpp +21 -0
@@ 9,6 9,7 @@
#include "windows/BellHomeScreenWindow.hpp"
#include "windows/BellMainMenuWindow.hpp"
+#include <apps-common/messages/AppMessage.hpp>
#include <common/models/AlarmModel.hpp>
#include <common/models/TimeModel.hpp>
#include <service-db/DBNotificationMessage.hpp>
@@ 102,4 103,24 @@ namespace app
{
return GetName() == app::applicationBellName && getCurrentWindow()->getName() == gui::name::window::main_window;
}
+
+ // Empty: do not start idleTimer on application run
+ void ApplicationBellMain::onStart()
+ {}
+
+ sys::MessagePointer ApplicationBellMain::handleSwitchWindow(sys::Message *msgl)
+ {
+ auto msg = static_cast<AppSwitchWindowMessage *>(msgl);
+ if (msg) {
+ const auto newWindowName = msg->getWindowName();
+ if (newWindowName == gui::name::window::main_window) {
+ stopIdleTimer();
+ }
+ else if (newWindowName == gui::window::name::bell_main_menu ||
+ newWindowName == gui::window::name::bell_main_menu_dialog) {
+ startIdleTimer();
+ }
+ }
+ return ApplicationCommon::handleSwitchWindow(msgl);
+ }
} // namespace app
M products/BellHybrid/apps/application-bell-main/include/application-bell-main/ApplicationBellMain.hpp => products/BellHybrid/apps/application-bell-main/include/application-bell-main/ApplicationBellMain.hpp +2 -0
@@ 41,6 41,8 @@ namespace app
private:
void showPopup(gui::popup::ID id, const gui::PopupRequestParams *params) override;
auto isHomeScreenFocused() -> bool;
+ void onStart() override;
+ sys::MessagePointer handleSwitchWindow(sys::Message *msgl) override;
};
template <> struct ManifestTraits<ApplicationBellMain>
M products/BellHybrid/apps/application-bell-powernap/ApplicationBellPowerNap.cpp => products/BellHybrid/apps/application-bell-powernap/ApplicationBellPowerNap.cpp +4 -0
@@ 71,4 71,8 @@ namespace app
return handleAsyncResponse(resp);
}
+
+ // Empty: do not start idleTimer on application run
+ void ApplicationBellPowerNap::onStart()
+ {}
} // namespace app
M products/BellHybrid/apps/application-bell-powernap/include/application-bell-powernap/ApplicationBellPowerNap.hpp => products/BellHybrid/apps/application-bell-powernap/include/application-bell-powernap/ApplicationBellPowerNap.hpp +3 -0
@@ 41,6 41,9 @@ namespace app
{
return sys::ReturnCodes::Success;
}
+
+ private:
+ void onStart() override;
};
template <> struct ManifestTraits<ApplicationBellPowerNap>
M products/BellHybrid/apps/include/Application.hpp => products/BellHybrid/apps/include/Application.hpp +13 -0
@@ 15,5 15,18 @@ namespace app
protected:
void attachPopups(const std::vector<gui::popup::ID> &popupsList) override;
bool isPopupPermitted(gui::popup::ID popupId) const override;
+ void startIdleTimer();
+ void restartIdleTimer();
+ void stopIdleTimer();
+
+ private:
+ sys::MessagePointer handleKBDKeyEvent(sys::Message *msgl) override;
+ sys::MessagePointer handleApplicationSwitch(sys::Message *msgl) override;
+ sys::MessagePointer handleAppClose(sys::Message *msgl) override;
+ sys::MessagePointer handleAppFocusLost(sys::Message *msgl) override;
+
+ virtual void onKeyPressed();
+ virtual void onStart();
+ virtual void onStop();
};
} // namespace app
M products/BellHybrid/services/appmgr/ApplicationManager.cpp => products/BellHybrid/services/appmgr/ApplicationManager.cpp +15 -1
@@ 3,6 3,8 @@
#include <appmgr/ApplicationManager.hpp>
#include <appmgr/messages/AlarmMessage.hpp>
+#include <appmgr/messages/IdleTimerMessage.hpp>
+
#include <application-bell-onboarding/BellOnBoardingNames.hpp>
namespace app::manager
@@ 10,7 12,7 @@ namespace app::manager
ApplicationManager::ApplicationManager(const ApplicationName &serviceName,
std::vector<std::unique_ptr<app::ApplicationLauncher>> &&launchers,
const ApplicationName &_rootApplicationName)
- : ApplicationManagerCommon(serviceName, std::move(launchers), _rootApplicationName)
+ : ApplicationManagerCommon(serviceName, std::move(launchers), _rootApplicationName), IdleHandler(this)
{
registerMessageHandlers();
}
@@ 37,6 39,18 @@ namespace app::manager
ApplicationManagerCommon::registerMessageHandlers();
auto convertibleToActionHandler = [this](sys::Message *request) { return handleMessageAsAction(request); };
+ connect(typeid(StartIdleTimerMessage), [this](sys::Message *request) {
+ handleStartIdleTimer(request);
+ return sys::msgHandled();
+ });
+ connect(typeid(RestartIdleTimerMessage), [this](sys::Message *request) {
+ handleRestartIdleTimer(request);
+ return sys::msgHandled();
+ });
+ connect(typeid(StopIdleTimerMessage), [this](sys::Message *request) {
+ handleStopIdleTimer(request);
+ return sys::msgHandled();
+ });
connect(typeid(AlarmActivated), convertibleToActionHandler);
connect(typeid(AlarmDeactivated), convertibleToActionHandler);
}
M products/BellHybrid/services/appmgr/CMakeLists.txt => products/BellHybrid/services/appmgr/CMakeLists.txt +2 -0
@@ 4,9 4,11 @@ add_library(bell::appmgr ALIAS appmgr)
target_sources(appmgr
PRIVATE
ApplicationManager.cpp
+ IdleHandler.cpp
PUBLIC
include/appmgr/messages/AlarmMessage.hpp
include/appmgr/ApplicationManager.hpp
+ include/appmgr/IdleHandler.hpp
include/appmgr/messages/PowerOffPopupRequestParams.hpp
include/appmgr/messages/RebootPopupRequestParams.hpp
)
A products/BellHybrid/services/appmgr/IdleHandler.cpp => products/BellHybrid/services/appmgr/IdleHandler.cpp +41 -0
@@ 0,0 1,41 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#include <appmgr/IdleHandler.hpp>
+#include <appmgr/messages/IdleTimerMessage.hpp>
+
+#include <service-appmgr/Controller.hpp>
+#include <Timers/TimerFactory.hpp>
+
+namespace app::manager
+{
+ IdleHandler::IdleHandler(sys::Service *serv) : serv{serv}
+ {
+ idleTimer = sys::TimerFactory::createPeriodicTimer(
+ serv, "IdleReturn", idleReturnTimeout, [this](sys::Timer &) { idleTimerCallback(); });
+ }
+
+ void IdleHandler::handleStartIdleTimer(sys::Message *request)
+ {
+ idleTimer.restart(idleReturnTimeout);
+ }
+
+ void IdleHandler::handleRestartIdleTimer(sys::Message *request)
+ {
+ if (idleTimer.isActive()) {
+ idleTimer.restart(idleReturnTimeout);
+ }
+ }
+
+ void IdleHandler::handleStopIdleTimer(sys::Message *request)
+ {
+ idleTimer.stop();
+ }
+
+ void IdleHandler::idleTimerCallback()
+ {
+ LOG_INFO("User is idle - going back to home screen");
+ idleTimer.stop();
+ app::manager::Controller::sendAction(serv, app::manager::actions::Home);
+ }
+} // namespace app::manager
M products/BellHybrid/services/appmgr/include/appmgr/ApplicationManager.hpp => products/BellHybrid/services/appmgr/include/appmgr/ApplicationManager.hpp +4 -1
@@ 3,11 3,12 @@
#pragma once
+#include <appmgr/IdleHandler.hpp>
#include <service-appmgr/model/ApplicationManagerCommon.hpp>
namespace app::manager
{
- class ApplicationManager : public ApplicationManagerCommon
+ class ApplicationManager : public ApplicationManagerCommon, public IdleHandler
{
public:
ApplicationManager(const ApplicationName &serviceName,
@@ 15,6 16,8 @@ namespace app::manager
const ApplicationName &_rootApplicationName);
private:
+ sys::TimerHandle idleTimer;
+
auto startApplication(ApplicationHandle &app) -> bool override;
auto resolveHomeApplication() -> std::string override;
void registerMessageHandlers() override;
A products/BellHybrid/services/appmgr/include/appmgr/IdleHandler.hpp => products/BellHybrid/services/appmgr/include/appmgr/IdleHandler.hpp +32 -0
@@ 0,0 1,32 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#pragma once
+
+#include <Service/Service.hpp>
+#include <Service/Message.hpp>
+#include <Timers/TimerHandle.hpp>
+
+#include <chrono>
+
+namespace app::manager
+{
+ constexpr auto idleReturnTimeout = std::chrono::seconds{5};
+ using connectFunction = std::function<bool(const std::type_info &, sys::MessageHandler)>;
+
+ class IdleHandler
+ {
+ public:
+ IdleHandler(sys::Service *serv);
+
+ protected:
+ void handleStartIdleTimer(sys::Message *request);
+ void handleRestartIdleTimer(sys::Message *request);
+ void handleStopIdleTimer(sys::Message *request);
+ void idleTimerCallback();
+
+ private:
+ sys::Service *serv;
+ sys::TimerHandle idleTimer;
+ };
+} // namespace app::manager
A products/BellHybrid/services/appmgr/include/appmgr/messages/IdleTimerMessage.hpp => products/BellHybrid/services/appmgr/include/appmgr/messages/IdleTimerMessage.hpp +31 -0
@@ 0,0 1,31 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#pragma once
+
+#include <Service/Message.hpp>
+#include <popups/AlarmActivatedPopupRequestParams.hpp>
+#include <popups/AlarmDeactivatedPopupRequestParams.hpp>
+#include <service-appmgr/Actions.hpp>
+#include <service-appmgr/messages/ActionRequest.hpp>
+
+class StartIdleTimerMessage : public sys::DataMessage
+{
+ public:
+ StartIdleTimerMessage() : sys::DataMessage{MessageType::MessageTypeUninitialized}
+ {}
+};
+
+class RestartIdleTimerMessage : public sys::DataMessage
+{
+ public:
+ RestartIdleTimerMessage() : sys::DataMessage{MessageType::MessageTypeUninitialized}
+ {}
+};
+
+class StopIdleTimerMessage : public sys::DataMessage
+{
+ public:
+ StopIdleTimerMessage() : sys::DataMessage{MessageType::MessageTypeUninitialized}
+ {}
+};