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 35 namespace OHOS { 36 namespace PowerMgr { 37 38 using WakeupListener = std::function<void(WakeupDeviceType)>; 39 using namespace OHOS::MMI; 40 class WakeupMonitor; 41 class WakeupController : public std::enable_shared_from_this<WakeupController> { 42 public: 43 explicit WakeupController(std::shared_ptr<PowerStateMachine>& stateMachine); 44 ~WakeupController(); 45 void Init(); 46 void Cancel(); 47 void RegisterSettingsObserver(); 48 void UnregisterSettingsObserver(); 49 void ExecWakeupMonitorByReason(WakeupDeviceType reason); 50 void Wakeup(); 51 void NotifyDisplayActionDone(uint32_t event); 52 void SetOriginSettingValue(WakeupSource& source); 53 #ifdef POWER_MANAGER_WAKEUP_ACTION 54 bool IsLowCapacityWakeup(WakeupDeviceType reason); 55 void ProcessLowCapacityWakeup(); 56 #endif 57 static int32_t SetWakeupDoubleClickSensor(bool enable); 58 static void ChangeWakeupSourceConfig(bool updateEnable); 59 static void ChangePickupWakeupSourceConfig(bool updataEnable); 60 static void PickupConnectMotionConfig(bool databaseSwitchValue); 61 static void ChangeLidWakeupSourceConfig(bool updataEnable); GetStateMachine()62 std::shared_ptr<PowerStateMachine> GetStateMachine() 63 { 64 return stateMachine_; 65 } GetLastReason()66 WakeupDeviceType GetLastReason() const 67 { 68 return wakeupReason_; 69 } 70 bool CheckEventReciveTime(WakeupDeviceType wakeupType); 71 72 private: 73 class SleepGuard final { 74 public: 75 explicit SleepGuard(const sptr<PowerMgrService>& pms); 76 ~SleepGuard(); 77 SleepGuard(const SleepGuard&) = delete; 78 SleepGuard(SleepGuard&&) = delete; 79 SleepGuard& operator=(const SleepGuard&) = delete; 80 SleepGuard& operator=(SleepGuard&&) = delete; 81 82 private: 83 sptr<IRemoteObject> token_; 84 sptr<PowerMgrService> pms_; 85 }; 86 87 void ControlListener(WakeupDeviceType reason); 88 std::vector<WakeupSource> sourceList_; 89 std::map<WakeupDeviceType, std::shared_ptr<WakeupMonitor>> monitorMap_; 90 std::map<WakeupDeviceType, int64_t> eventHandleMap_; 91 std::shared_ptr<PowerStateMachine> stateMachine_; 92 WakeupDeviceType wakeupReason_ {0}; 93 std::mutex mutex_; 94 std::mutex monitorMutex_; 95 std::mutex eventHandleMutex_; 96 static std::mutex sourceUpdateMutex_; 97 int32_t monitorId_ {-1}; 98 }; 99 100 #ifdef HAS_MULTIMODALINPUT_INPUT_PART 101 class InputCallback : public IInputEventConsumer { 102 public: 103 virtual void OnInputEvent(std::shared_ptr<KeyEvent> keyEvent) const; 104 virtual void OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent) const; 105 virtual void OnInputEvent(std::shared_ptr<AxisEvent> axisEvent) const; 106 bool NonWindowEvent(const std::shared_ptr<PointerEvent>& pointerEvent) const; 107 108 private: 109 bool IsRemoteEvent(std::shared_ptr<InputEvent> event) const; 110 bool isKeyboardKeycode(int32_t keyCode) const; 111 }; 112 #endif 113 114 class WakeupMonitor : public std::enable_shared_from_this<WakeupMonitor> { 115 public: 116 static std::shared_ptr<WakeupMonitor> CreateMonitor(WakeupSource& source); 117 static constexpr int32_t POWER_KEY_PRESS_DELAY_MS = 10000; 118 119 virtual ~WakeupMonitor() = default; 120 virtual bool Init() = 0; 121 virtual void Cancel() = 0; HandleEvent(uint32_t eventId)122 virtual void HandleEvent(uint32_t eventId) 123 { 124 // do nothing in base class 125 } 126 GetReason()127 WakeupDeviceType GetReason() const 128 { 129 return reason_; 130 } 131 RegisterListener(WakeupListener listener)132 void RegisterListener(WakeupListener listener) 133 { 134 listener_ = listener; 135 } 136 Notify()137 void Notify() 138 { 139 listener_(reason_); 140 } 141 142 protected: WakeupMonitor(WakeupSource & source)143 explicit WakeupMonitor(WakeupSource& source) 144 { 145 reason_ = source.GetReason(); 146 } 147 148 WakeupDeviceType reason_; 149 WakeupListener listener_; 150 }; 151 152 class PowerkeyWakeupMonitor : public WakeupMonitor { 153 public: PowerkeyWakeupMonitor(WakeupSource & source)154 explicit PowerkeyWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 155 ~PowerkeyWakeupMonitor() override = default; 156 bool Init() override; 157 void Cancel() override; 158 159 private: 160 int32_t powerkeyShortPressId_ {-1}; 161 }; 162 163 class KeyboardWakeupMonitor : public WakeupMonitor { 164 public: KeyboardWakeupMonitor(WakeupSource & source)165 explicit KeyboardWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 166 ~KeyboardWakeupMonitor() override = default; 167 bool Init() override; 168 void Cancel() override; 169 }; 170 171 class MousekeyWakeupMonitor : public WakeupMonitor { 172 public: MousekeyWakeupMonitor(WakeupSource & source)173 explicit MousekeyWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 174 ~MousekeyWakeupMonitor() override = default; 175 bool Init() override; 176 void Cancel() override; 177 }; 178 179 class TouchpadWakeupMonitor : public WakeupMonitor { 180 public: TouchpadWakeupMonitor(WakeupSource & source)181 explicit TouchpadWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 182 ~TouchpadWakeupMonitor() override = default; 183 bool Init() override; 184 void Cancel() override; 185 }; 186 187 class PenWakeupMonitor : public WakeupMonitor { 188 public: PenWakeupMonitor(WakeupSource & source)189 explicit PenWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 190 ~PenWakeupMonitor() override = default; 191 bool Init() override; 192 void Cancel() override; 193 }; 194 195 class SingleClickWakeupMonitor : public WakeupMonitor { 196 public: SingleClickWakeupMonitor(WakeupSource & source)197 explicit SingleClickWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 198 ~SingleClickWakeupMonitor() override = default; 199 bool Init() override; 200 void Cancel() override; 201 }; 202 203 class DoubleClickWakeupMonitor : public WakeupMonitor { 204 public: DoubleClickWakeupMonitor(WakeupSource & source)205 explicit DoubleClickWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 206 ~DoubleClickWakeupMonitor() override = default; 207 bool Init() override; 208 void Cancel() override; 209 }; 210 211 class LidWakeupMonitor : public WakeupMonitor { 212 public: LidWakeupMonitor(WakeupSource & source)213 explicit LidWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 214 ~LidWakeupMonitor() override = default; 215 bool Init() override; 216 void Cancel() override; 217 }; 218 219 class SwitchWakeupMonitor : public WakeupMonitor { 220 public: SwitchWakeupMonitor(WakeupSource & source)221 explicit SwitchWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 222 ~SwitchWakeupMonitor() override = default; 223 bool Init() override; 224 void Cancel() override; 225 }; 226 227 class PickupWakeupMonitor : public WakeupMonitor { 228 public: PickupWakeupMonitor(WakeupSource & source)229 explicit PickupWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {} 230 ~PickupWakeupMonitor() override = default; 231 bool Init() override; 232 void Cancel() override; 233 }; 234 235 } // namespace PowerMgr 236 } // namespace OHOS 237 238 #endif