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