15ccb8f90Sopenharmony_ci/* 25ccb8f90Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 35ccb8f90Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 45ccb8f90Sopenharmony_ci * you may not use this file except in compliance with the License. 55ccb8f90Sopenharmony_ci * You may obtain a copy of the License at 65ccb8f90Sopenharmony_ci * 75ccb8f90Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 85ccb8f90Sopenharmony_ci * 95ccb8f90Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 105ccb8f90Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 115ccb8f90Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 125ccb8f90Sopenharmony_ci * See the License for the specific language governing permissions and 135ccb8f90Sopenharmony_ci * limitations under the License. 145ccb8f90Sopenharmony_ci */ 155ccb8f90Sopenharmony_ci 165ccb8f90Sopenharmony_ci#ifndef POWERMGR_WAKEUP_CONTROLLER_H 175ccb8f90Sopenharmony_ci#define POWERMGR_WAKEUP_CONTROLLER_H 185ccb8f90Sopenharmony_ci 195ccb8f90Sopenharmony_ci#include <functional> 205ccb8f90Sopenharmony_ci#include <memory> 215ccb8f90Sopenharmony_ci#include <mutex> 225ccb8f90Sopenharmony_ci#include <vector> 235ccb8f90Sopenharmony_ci 245ccb8f90Sopenharmony_ci#ifdef HAS_MULTIMODALINPUT_INPUT_PART 255ccb8f90Sopenharmony_ci#include "i_input_event_consumer.h" 265ccb8f90Sopenharmony_ci#endif 275ccb8f90Sopenharmony_ci#include "power_state_machine.h" 285ccb8f90Sopenharmony_ci#include "system_ability.h" 295ccb8f90Sopenharmony_ci#ifdef HAS_SENSORS_SENSOR_PART 305ccb8f90Sopenharmony_ci#include "sensor_agent.h" 315ccb8f90Sopenharmony_ci#endif 325ccb8f90Sopenharmony_ci#include "wakeup_sources.h" 335ccb8f90Sopenharmony_ci#include "wakeup_source_parser.h" 345ccb8f90Sopenharmony_ci 355ccb8f90Sopenharmony_cinamespace OHOS { 365ccb8f90Sopenharmony_cinamespace PowerMgr { 375ccb8f90Sopenharmony_ci 385ccb8f90Sopenharmony_ciusing WakeupListener = std::function<void(WakeupDeviceType)>; 395ccb8f90Sopenharmony_ciusing namespace OHOS::MMI; 405ccb8f90Sopenharmony_ciclass WakeupMonitor; 415ccb8f90Sopenharmony_ciclass WakeupController : public std::enable_shared_from_this<WakeupController> { 425ccb8f90Sopenharmony_cipublic: 435ccb8f90Sopenharmony_ci explicit WakeupController(std::shared_ptr<PowerStateMachine>& stateMachine); 445ccb8f90Sopenharmony_ci ~WakeupController(); 455ccb8f90Sopenharmony_ci void Init(); 465ccb8f90Sopenharmony_ci void Cancel(); 475ccb8f90Sopenharmony_ci void RegisterSettingsObserver(); 485ccb8f90Sopenharmony_ci void UnregisterSettingsObserver(); 495ccb8f90Sopenharmony_ci void ExecWakeupMonitorByReason(WakeupDeviceType reason); 505ccb8f90Sopenharmony_ci void Wakeup(); 515ccb8f90Sopenharmony_ci void NotifyDisplayActionDone(uint32_t event); 525ccb8f90Sopenharmony_ci void SetOriginSettingValue(WakeupSource& source); 535ccb8f90Sopenharmony_ci#ifdef POWER_MANAGER_WAKEUP_ACTION 545ccb8f90Sopenharmony_ci bool IsLowCapacityWakeup(WakeupDeviceType reason); 555ccb8f90Sopenharmony_ci void ProcessLowCapacityWakeup(); 565ccb8f90Sopenharmony_ci#endif 575ccb8f90Sopenharmony_ci static int32_t SetWakeupDoubleClickSensor(bool enable); 585ccb8f90Sopenharmony_ci static void ChangeWakeupSourceConfig(bool updateEnable); 595ccb8f90Sopenharmony_ci static void ChangePickupWakeupSourceConfig(bool updataEnable); 605ccb8f90Sopenharmony_ci static void PickupConnectMotionConfig(bool databaseSwitchValue); 615ccb8f90Sopenharmony_ci static void ChangeLidWakeupSourceConfig(bool updataEnable); 625ccb8f90Sopenharmony_ci std::shared_ptr<PowerStateMachine> GetStateMachine() 635ccb8f90Sopenharmony_ci { 645ccb8f90Sopenharmony_ci return stateMachine_; 655ccb8f90Sopenharmony_ci } 665ccb8f90Sopenharmony_ci WakeupDeviceType GetLastReason() const 675ccb8f90Sopenharmony_ci { 685ccb8f90Sopenharmony_ci return wakeupReason_; 695ccb8f90Sopenharmony_ci } 705ccb8f90Sopenharmony_ci bool CheckEventReciveTime(WakeupDeviceType wakeupType); 715ccb8f90Sopenharmony_ci#ifdef POWER_MANAGER_ENABLE_EXTERNAL_SCREEN_MANAGEMENT 725ccb8f90Sopenharmony_ci void PowerOnInternalScreen(WakeupDeviceType type); 735ccb8f90Sopenharmony_ci void PowerOnAllScreens(WakeupDeviceType type); 745ccb8f90Sopenharmony_ci#endif 755ccb8f90Sopenharmony_ci 765ccb8f90Sopenharmony_ciprivate: 775ccb8f90Sopenharmony_ci class SleepGuard final { 785ccb8f90Sopenharmony_ci public: 795ccb8f90Sopenharmony_ci explicit SleepGuard(const sptr<PowerMgrService>& pms); 805ccb8f90Sopenharmony_ci ~SleepGuard(); 815ccb8f90Sopenharmony_ci SleepGuard(const SleepGuard&) = delete; 825ccb8f90Sopenharmony_ci SleepGuard(SleepGuard&&) = delete; 835ccb8f90Sopenharmony_ci SleepGuard& operator=(const SleepGuard&) = delete; 845ccb8f90Sopenharmony_ci SleepGuard& operator=(SleepGuard&&) = delete; 855ccb8f90Sopenharmony_ci 865ccb8f90Sopenharmony_ci private: 875ccb8f90Sopenharmony_ci sptr<IRemoteObject> token_; 885ccb8f90Sopenharmony_ci sptr<PowerMgrService> pms_; 895ccb8f90Sopenharmony_ci }; 905ccb8f90Sopenharmony_ci 915ccb8f90Sopenharmony_ci#ifdef POWER_MANAGER_ENABLE_EXTERNAL_SCREEN_MANAGEMENT 925ccb8f90Sopenharmony_ci bool IsPowerOnInernalScreenOnlyScene(WakeupDeviceType reason) const; 935ccb8f90Sopenharmony_ci void ProcessPowerOnInternalScreenOnly(const sptr<PowerMgrService>& pms, WakeupDeviceType reason); 945ccb8f90Sopenharmony_ci#endif 955ccb8f90Sopenharmony_ci bool NeedToSkipCurrentWakeup(const sptr<PowerMgrService>& pms, WakeupDeviceType reason) const; 965ccb8f90Sopenharmony_ci void HandleWakeup(const sptr<PowerMgrService>& pms, WakeupDeviceType reason); 975ccb8f90Sopenharmony_ci void ControlListener(WakeupDeviceType reason); 985ccb8f90Sopenharmony_ci 995ccb8f90Sopenharmony_ci std::vector<WakeupSource> sourceList_; 1005ccb8f90Sopenharmony_ci std::map<WakeupDeviceType, std::shared_ptr<WakeupMonitor>> monitorMap_; 1015ccb8f90Sopenharmony_ci std::map<WakeupDeviceType, int64_t> eventHandleMap_; 1025ccb8f90Sopenharmony_ci std::shared_ptr<PowerStateMachine> stateMachine_; 1035ccb8f90Sopenharmony_ci WakeupDeviceType wakeupReason_ {0}; 1045ccb8f90Sopenharmony_ci std::mutex mutex_; 1055ccb8f90Sopenharmony_ci std::mutex monitorMutex_; 1065ccb8f90Sopenharmony_ci std::mutex eventHandleMutex_; 1075ccb8f90Sopenharmony_ci static std::mutex sourceUpdateMutex_; 1085ccb8f90Sopenharmony_ci int32_t monitorId_ {-1}; 1095ccb8f90Sopenharmony_ci}; 1105ccb8f90Sopenharmony_ci 1115ccb8f90Sopenharmony_ci#ifdef HAS_MULTIMODALINPUT_INPUT_PART 1125ccb8f90Sopenharmony_ciclass InputCallback : public IInputEventConsumer { 1135ccb8f90Sopenharmony_cipublic: 1145ccb8f90Sopenharmony_ci virtual void OnInputEvent(std::shared_ptr<KeyEvent> keyEvent) const; 1155ccb8f90Sopenharmony_ci virtual void OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent) const; 1165ccb8f90Sopenharmony_ci virtual void OnInputEvent(std::shared_ptr<AxisEvent> axisEvent) const; 1175ccb8f90Sopenharmony_ci bool NonWindowEvent(const std::shared_ptr<PointerEvent>& pointerEvent) const; 1185ccb8f90Sopenharmony_ciprivate: 1195ccb8f90Sopenharmony_ci bool isRemoteEvent(std::shared_ptr<InputEvent> event) const; 1205ccb8f90Sopenharmony_ci bool isKeyboardKeycode(int32_t keyCode) const; 1215ccb8f90Sopenharmony_ci}; 1225ccb8f90Sopenharmony_ci#endif 1235ccb8f90Sopenharmony_ci 1245ccb8f90Sopenharmony_ciclass WakeupMonitor { 1255ccb8f90Sopenharmony_cipublic: 1265ccb8f90Sopenharmony_ci static std::shared_ptr<WakeupMonitor> CreateMonitor(WakeupSource& source); 1275ccb8f90Sopenharmony_ci static constexpr int32_t POWER_KEY_PRESS_DELAY_MS = 10000; 1285ccb8f90Sopenharmony_ci 1295ccb8f90Sopenharmony_ci virtual ~WakeupMonitor() = default; 1305ccb8f90Sopenharmony_ci virtual bool Init() = 0; 1315ccb8f90Sopenharmony_ci virtual void Cancel() = 0; 1325ccb8f90Sopenharmony_ci virtual void HandleEvent(uint32_t eventId) 1335ccb8f90Sopenharmony_ci { 1345ccb8f90Sopenharmony_ci // do nothing in base class 1355ccb8f90Sopenharmony_ci } 1365ccb8f90Sopenharmony_ci 1375ccb8f90Sopenharmony_ci WakeupDeviceType GetReason() const 1385ccb8f90Sopenharmony_ci { 1395ccb8f90Sopenharmony_ci return reason_; 1405ccb8f90Sopenharmony_ci } 1415ccb8f90Sopenharmony_ci 1425ccb8f90Sopenharmony_ci void RegisterListener(WakeupListener listener) 1435ccb8f90Sopenharmony_ci { 1445ccb8f90Sopenharmony_ci listener_ = listener; 1455ccb8f90Sopenharmony_ci } 1465ccb8f90Sopenharmony_ci 1475ccb8f90Sopenharmony_ci void Notify() 1485ccb8f90Sopenharmony_ci { 1495ccb8f90Sopenharmony_ci listener_(reason_); 1505ccb8f90Sopenharmony_ci } 1515ccb8f90Sopenharmony_ci 1525ccb8f90Sopenharmony_ciprotected: 1535ccb8f90Sopenharmony_ci explicit WakeupMonitor(WakeupSource& source) 1545ccb8f90Sopenharmony_ci { 1555ccb8f90Sopenharmony_ci reason_ = source.GetReason(); 1565ccb8f90Sopenharmony_ci } 1575ccb8f90Sopenharmony_ci 1585ccb8f90Sopenharmony_ci WakeupDeviceType reason_; 1595ccb8f90Sopenharmony_ci WakeupListener listener_; 1605ccb8f90Sopenharmony_ci}; 1615ccb8f90Sopenharmony_ci 1625ccb8f90Sopenharmony_ciclass PowerkeyWakeupMonitor : public WakeupMonitor { 1635ccb8f90Sopenharmony_cipublic: 1645ccb8f90Sopenharmony_ci explicit PowerkeyWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 1655ccb8f90Sopenharmony_ci ~PowerkeyWakeupMonitor() override = default; 1665ccb8f90Sopenharmony_ci bool Init() override; 1675ccb8f90Sopenharmony_ci void Cancel() override; 1685ccb8f90Sopenharmony_ci 1695ccb8f90Sopenharmony_ciprivate: 1705ccb8f90Sopenharmony_ci int32_t powerkeyShortPressId_ {-1}; 1715ccb8f90Sopenharmony_ci}; 1725ccb8f90Sopenharmony_ci 1735ccb8f90Sopenharmony_ciclass KeyboardWakeupMonitor : public WakeupMonitor { 1745ccb8f90Sopenharmony_cipublic: 1755ccb8f90Sopenharmony_ci explicit KeyboardWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 1765ccb8f90Sopenharmony_ci ~KeyboardWakeupMonitor() override = default; 1775ccb8f90Sopenharmony_ci bool Init() override; 1785ccb8f90Sopenharmony_ci void Cancel() override; 1795ccb8f90Sopenharmony_ci}; 1805ccb8f90Sopenharmony_ci 1815ccb8f90Sopenharmony_ciclass MousekeyWakeupMonitor : public WakeupMonitor { 1825ccb8f90Sopenharmony_cipublic: 1835ccb8f90Sopenharmony_ci explicit MousekeyWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 1845ccb8f90Sopenharmony_ci ~MousekeyWakeupMonitor() override = default; 1855ccb8f90Sopenharmony_ci bool Init() override; 1865ccb8f90Sopenharmony_ci void Cancel() override; 1875ccb8f90Sopenharmony_ci}; 1885ccb8f90Sopenharmony_ci 1895ccb8f90Sopenharmony_ciclass TouchpadWakeupMonitor : public WakeupMonitor { 1905ccb8f90Sopenharmony_cipublic: 1915ccb8f90Sopenharmony_ci explicit TouchpadWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 1925ccb8f90Sopenharmony_ci ~TouchpadWakeupMonitor() override = default; 1935ccb8f90Sopenharmony_ci bool Init() override; 1945ccb8f90Sopenharmony_ci void Cancel() override; 1955ccb8f90Sopenharmony_ci}; 1965ccb8f90Sopenharmony_ci 1975ccb8f90Sopenharmony_ciclass PenWakeupMonitor : public WakeupMonitor { 1985ccb8f90Sopenharmony_cipublic: 1995ccb8f90Sopenharmony_ci explicit PenWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 2005ccb8f90Sopenharmony_ci ~PenWakeupMonitor() override = default; 2015ccb8f90Sopenharmony_ci bool Init() override; 2025ccb8f90Sopenharmony_ci void Cancel() override; 2035ccb8f90Sopenharmony_ci}; 2045ccb8f90Sopenharmony_ci 2055ccb8f90Sopenharmony_ciclass SingleClickWakeupMonitor : public WakeupMonitor { 2065ccb8f90Sopenharmony_cipublic: 2075ccb8f90Sopenharmony_ci explicit SingleClickWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 2085ccb8f90Sopenharmony_ci ~SingleClickWakeupMonitor() override = default; 2095ccb8f90Sopenharmony_ci bool Init() override; 2105ccb8f90Sopenharmony_ci void Cancel() override; 2115ccb8f90Sopenharmony_ci}; 2125ccb8f90Sopenharmony_ci 2135ccb8f90Sopenharmony_ciclass DoubleClickWakeupMonitor : public WakeupMonitor { 2145ccb8f90Sopenharmony_cipublic: 2155ccb8f90Sopenharmony_ci explicit DoubleClickWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 2165ccb8f90Sopenharmony_ci ~DoubleClickWakeupMonitor() override = default; 2175ccb8f90Sopenharmony_ci bool Init() override; 2185ccb8f90Sopenharmony_ci void Cancel() override; 2195ccb8f90Sopenharmony_ci}; 2205ccb8f90Sopenharmony_ci 2215ccb8f90Sopenharmony_ciclass LidWakeupMonitor : public WakeupMonitor { 2225ccb8f90Sopenharmony_cipublic: 2235ccb8f90Sopenharmony_ci explicit LidWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 2245ccb8f90Sopenharmony_ci ~LidWakeupMonitor() override = default; 2255ccb8f90Sopenharmony_ci bool Init() override; 2265ccb8f90Sopenharmony_ci void Cancel() override; 2275ccb8f90Sopenharmony_ci}; 2285ccb8f90Sopenharmony_ci 2295ccb8f90Sopenharmony_ciclass SwitchWakeupMonitor : public WakeupMonitor { 2305ccb8f90Sopenharmony_cipublic: 2315ccb8f90Sopenharmony_ci explicit SwitchWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 2325ccb8f90Sopenharmony_ci ~SwitchWakeupMonitor() override = default; 2335ccb8f90Sopenharmony_ci bool Init() override; 2345ccb8f90Sopenharmony_ci void Cancel() override; 2355ccb8f90Sopenharmony_ci}; 2365ccb8f90Sopenharmony_ci 2375ccb8f90Sopenharmony_ciclass PickupWakeupMonitor : public WakeupMonitor { 2385ccb8f90Sopenharmony_cipublic: 2395ccb8f90Sopenharmony_ci explicit PickupWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 2405ccb8f90Sopenharmony_ci ~PickupWakeupMonitor() override = default; 2415ccb8f90Sopenharmony_ci bool Init() override; 2425ccb8f90Sopenharmony_ci void Cancel() override; 2435ccb8f90Sopenharmony_ci}; 2445ccb8f90Sopenharmony_ci 2455ccb8f90Sopenharmony_ci} // namespace PowerMgr 2465ccb8f90Sopenharmony_ci} // namespace OHOS 2475ccb8f90Sopenharmony_ci 2485ccb8f90Sopenharmony_ci#endif