• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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