1 /* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef POWERMGR_WAKEUP_CONTROLLER_H 17 #define POWERMGR_WAKEUP_CONTROLLER_H 18 19 #include <functional> 20 #include <memory> 21 #include <mutex> 22 #include <vector> 23 24 #ifdef HAS_MULTIMODALINPUT_INPUT_PART 25 #include "i_input_event_consumer.h" 26 #endif 27 #include "power_state_machine.h" 28 #include "system_ability.h" 29 #ifdef HAS_SENSORS_SENSOR_PART 30 #include "sensor_agent.h" 31 #endif 32 #include "wakeup_sources.h" 33 #include "wakeup_source_parser.h" 34 #include "ffrt_utils.h" 35 36 namespace OHOS { 37 namespace PowerMgr { 38 39 using WakeupListener = std::function<void(WakeupDeviceType)>; 40 using namespace OHOS::MMI; 41 class WakeupMonitor; 42 class WakeupController : public std::enable_shared_from_this<WakeupController> { 43 public: 44 explicit WakeupController(std::shared_ptr<PowerStateMachine>& stateMachine); 45 ~WakeupController(); 46 void Init(); 47 void Cancel(); 48 void RegisterSettingsObserver(); 49 void ExecWakeupMonitorByReason(WakeupDeviceType reason); 50 void Wakeup(); 51 void NotifyDisplayActionDone(uint32_t event); 52 bool IsHandleSysfreeze(); GetStateMachine()53 std::shared_ptr<PowerStateMachine> GetStateMachine() 54 { 55 return stateMachine_; 56 } GetLastReason()57 WakeupDeviceType GetLastReason() const 58 { 59 return wakeupReason_; 60 } 61 bool CheckEventReciveTime(WakeupDeviceType wakeupType); 62 void Reset(); 63 64 private: 65 void ControlListener(WakeupDeviceType reason); 66 void StartWakeupTimer(); 67 void HandleScreenOnTimeout(); 68 std::vector<WakeupSource> sourceList_; 69 std::map<WakeupDeviceType, std::shared_ptr<WakeupMonitor>> monitorMap_; 70 std::map<WakeupDeviceType, int64_t> eventHandleMap_; 71 std::shared_ptr<PowerStateMachine> stateMachine_; 72 WakeupDeviceType wakeupReason_ {0}; 73 std::mutex mutex_; 74 std::mutex monitorMutex_; 75 std::mutex eventHandleMutex_; 76 int32_t monitorId_ {-1}; 77 std::shared_ptr<FFRTQueue> queue_; 78 }; 79 80 #ifdef HAS_MULTIMODALINPUT_INPUT_PART 81 class InputCallback : public IInputEventConsumer { 82 public: 83 virtual void OnInputEvent(std::shared_ptr<KeyEvent> keyEvent) const; 84 virtual void OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent) const; 85 virtual void OnInputEvent(std::shared_ptr<AxisEvent> axisEvent) const; 86 bool NeedHandle(std::shared_ptr<PointerEvent>& pointerEvent, sptr<PowerMgrService>& pms) const; 87 }; 88 #endif 89 90 class WakeupMonitor { 91 public: 92 static std::shared_ptr<WakeupMonitor> CreateMonitor(WakeupSource& source); 93 static constexpr int32_t POWER_KEY_PRESS_DELAY_MS = 10000; 94 95 virtual ~WakeupMonitor() = default; 96 virtual bool Init() = 0; 97 virtual void Cancel() = 0; HandleEvent(uint32_t eventId)98 virtual void HandleEvent(uint32_t eventId) 99 { 100 // do nothing in base class 101 } 102 GetReason()103 WakeupDeviceType GetReason() const 104 { 105 return reason_; 106 } 107 RegisterListener(WakeupListener listener)108 void RegisterListener(WakeupListener listener) 109 { 110 listener_ = listener; 111 } 112 Notify()113 void Notify() 114 { 115 listener_(reason_); 116 } 117 118 protected: WakeupMonitor(WakeupSource & source)119 explicit WakeupMonitor(WakeupSource& source) 120 { 121 reason_ = source.GetReason(); 122 } 123 124 WakeupDeviceType reason_; 125 WakeupListener listener_; 126 }; 127 128 class PowerkeyWakeupMonitor : public WakeupMonitor { 129 public: PowerkeyWakeupMonitor(WakeupSource & source)130 explicit PowerkeyWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 131 ~PowerkeyWakeupMonitor() override = default; 132 bool Init() override; 133 void Cancel() override; 134 135 private: 136 int32_t powerkeyShortPressId_ {-1}; 137 }; 138 139 class KeyboardWakeupMonitor : public WakeupMonitor { 140 public: KeyboardWakeupMonitor(WakeupSource & source)141 explicit KeyboardWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 142 ~KeyboardWakeupMonitor() override = default; 143 bool Init() override; 144 void Cancel() override; 145 }; 146 147 class MousekeyWakeupMonitor : public WakeupMonitor { 148 public: MousekeyWakeupMonitor(WakeupSource & source)149 explicit MousekeyWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 150 ~MousekeyWakeupMonitor() override = default; 151 bool Init() override; 152 void Cancel() override; 153 }; 154 155 class TouchpadWakeupMonitor : public WakeupMonitor { 156 public: TouchpadWakeupMonitor(WakeupSource & source)157 explicit TouchpadWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 158 ~TouchpadWakeupMonitor() override = default; 159 bool Init() override; 160 void Cancel() override; 161 }; 162 163 class PenWakeupMonitor : public WakeupMonitor { 164 public: PenWakeupMonitor(WakeupSource & source)165 explicit PenWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 166 ~PenWakeupMonitor() override = default; 167 bool Init() override; 168 void Cancel() override; 169 }; 170 171 class SingleClickWakeupMonitor : public WakeupMonitor { 172 public: SingleClickWakeupMonitor(WakeupSource & source)173 explicit SingleClickWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 174 ~SingleClickWakeupMonitor() override = default; 175 bool Init() override; 176 void Cancel() override; 177 }; 178 179 class DoubleClickWakeupMonitor : public WakeupMonitor { 180 public: DoubleClickWakeupMonitor(WakeupSource & source)181 explicit DoubleClickWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 182 ~DoubleClickWakeupMonitor() override = default; 183 bool Init() override; 184 void Cancel() override; 185 }; 186 187 class LidWakeupMonitor : public WakeupMonitor { 188 public: LidWakeupMonitor(WakeupSource & source)189 explicit LidWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 190 ~LidWakeupMonitor() override = default; 191 bool Init() override; 192 void Cancel() override; 193 }; 194 195 class SwitchWakeupMonitor : public WakeupMonitor { 196 public: SwitchWakeupMonitor(WakeupSource & source)197 explicit SwitchWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 198 ~SwitchWakeupMonitor() override = default; 199 bool Init() override; 200 void Cancel() override; 201 }; 202 203 } // namespace PowerMgr 204 } // namespace OHOS 205 206 #endif