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 #include "suspend_controller.h"
17 #include <datetime_ex.h>
18 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
19 #include <input_manager.h>
20 #endif
21 #include <securec.h>
22 #include <ipc_skeleton.h>
23 #include "power_log.h"
24 #include "power_mgr_service.h"
25 #include "power_state_callback_stub.h"
26 #include "setting_helper.h"
27 #include "system_suspend_controller.h"
28 #include "wakeup_controller.h"
29
30 namespace OHOS {
31 namespace PowerMgr {
32 using namespace OHOS::MMI;
33 namespace {
34 sptr<SettingObserver> g_suspendSourcesKeyObserver = nullptr;
35 FFRTHandle g_sleepTimeoutHandle;
36 FFRTHandle g_forceSleepDelayHandle;
37 FFRTHandle g_userActivityOffTimeoutHandle;
38 FFRTUtils::Mutex g_monitorMutex;
39 const uint32_t SLEEP_DELAY_MS = 5000;
40 } // namespace
41
42 std::atomic_bool onForceSleep = false;
43
44 /** SuspendController Implement */
SuspendController(std::shared_ptr<ShutdownController> & shutdownController,std::shared_ptr<PowerStateMachine> & stateMachine)45 SuspendController::SuspendController(
46 std::shared_ptr<ShutdownController>& shutdownController, std::shared_ptr<PowerStateMachine>& stateMachine)
47 {
48 shutdownController_ = shutdownController;
49 stateMachine_ = stateMachine;
50 }
51
~SuspendController()52 SuspendController::~SuspendController()
53 {
54 if (g_suspendSourcesKeyObserver) {
55 SettingHelper::UnregisterSettingSuspendSourcesObserver(g_suspendSourcesKeyObserver);
56 }
57 }
58
AddCallback(const sptr<ISyncSleepCallback> & callback,SleepPriority priority)59 void SuspendController::AddCallback(const sptr<ISyncSleepCallback>& callback, SleepPriority priority)
60 {
61 RETURN_IF(callback == nullptr)
62 SleepCallbackHolder::GetInstance().AddCallback(callback, priority);
63 POWER_HILOGI(FEATURE_SUSPEND,
64 "sync sleep callback added, priority=%{public}u, pid=%{public}d, uid=%{public}d", priority,
65 IPCSkeleton::GetCallingPid(), IPCSkeleton::GetCallingUid());
66 }
67
RemoveCallback(const sptr<ISyncSleepCallback> & callback)68 void SuspendController::RemoveCallback(const sptr<ISyncSleepCallback>& callback)
69 {
70 RETURN_IF(callback == nullptr)
71 SleepCallbackHolder::GetInstance().RemoveCallback(callback);
72 POWER_HILOGI(FEATURE_SUSPEND,
73 "sync sleep callback removed, pid=%{public}d, uid=%{public}d",
74 IPCSkeleton::GetCallingPid(), IPCSkeleton::GetCallingUid());
75 }
76
TriggerSyncSleepCallback(bool isWakeup)77 void SuspendController::TriggerSyncSleepCallback(bool isWakeup)
78 {
79 POWER_HILOGI(FEATURE_SUSPEND,
80 "TriggerSyncSleepCallback, isWakeup=%{public}d, onForceSleep=%{public}d",
81 isWakeup, onForceSleep == true);
82 auto highPriorityCallbacks = SleepCallbackHolder::GetInstance().GetHighPriorityCallbacks();
83 TriggerSyncSleepCallbackInner(highPriorityCallbacks, isWakeup);
84 auto defaultPriorityCallbacks = SleepCallbackHolder::GetInstance().GetDefaultPriorityCallbacks();
85 TriggerSyncSleepCallbackInner(defaultPriorityCallbacks, isWakeup);
86 auto lowPriorityCallbacks = SleepCallbackHolder::GetInstance().GetLowPriorityCallbacks();
87 TriggerSyncSleepCallbackInner(lowPriorityCallbacks, isWakeup);
88
89 if (isWakeup && onForceSleep) {
90 onForceSleep = false;
91 }
92 }
93
TriggerSyncSleepCallbackInner(std::set<sptr<ISyncSleepCallback>> & callbacks,bool isWakeup)94 void SuspendController::TriggerSyncSleepCallbackInner(std::set<sptr<ISyncSleepCallback>>& callbacks, bool isWakeup)
95 {
96 for (auto &callback : callbacks) {
97 if (callback != nullptr) {
98 int64_t start = GetTickCount();
99 isWakeup ? callback->OnSyncWakeup(onForceSleep) : callback->OnSyncSleep(onForceSleep);
100 int64_t cost = GetTickCount() - start;
101 POWER_HILOGI(FEATURE_SUSPEND, "Trigger sync sleep callback success, cost=%{public}" PRId64 "", cost);
102 }
103 }
104 }
105
106 class SuspendPowerStateCallback : public PowerStateCallbackStub {
107 public:
SuspendPowerStateCallback(std::shared_ptr<SuspendController> controller)108 explicit SuspendPowerStateCallback(std::shared_ptr<SuspendController> controller) : controller_(controller) {};
109 virtual ~SuspendPowerStateCallback() = default;
OnPowerStateChanged(PowerState state)110 void OnPowerStateChanged(PowerState state) override
111 {
112 auto controller = controller_.lock();
113 if (controller == nullptr) {
114 POWER_HILOGI(FEATURE_SUSPEND, "OnPowerStateChanged: No controller");
115 return;
116 }
117 if (state == PowerState::AWAKE) {
118 POWER_HILOGI(FEATURE_SUSPEND, "Turn awake, stop sleep timer");
119 controller->StopSleep();
120 }
121 }
122
123 private:
124 std::weak_ptr<SuspendController> controller_;
125 };
126
Init()127 void SuspendController::Init()
128 {
129 std::lock_guard lock(mutex_);
130 queue_ = std::make_shared<FFRTQueue>("power_suspend_controller");
131 if (queue_ == nullptr) {
132 POWER_HILOGE(FEATURE_SUSPEND, "suspendQueue_ is null");
133 return;
134 }
135 std::shared_ptr<SuspendSources> sources = SuspendSourceParser::ParseSources();
136 sourceList_ = sources->GetSourceList();
137 if (sourceList_.empty()) {
138 POWER_HILOGE(FEATURE_SUSPEND, "InputManager is null");
139 return;
140 }
141
142 for (auto source = sourceList_.begin(); source != sourceList_.end(); source++) {
143 POWER_HILOGI(FEATURE_SUSPEND, "registered type=%{public}u action=%{public}u delayMs=%{public}u",
144 (*source).GetReason(), (*source).GetAction(), (*source).GetDelay());
145 std::shared_ptr<SuspendMonitor> monitor = SuspendMonitor::CreateMonitor(*source);
146 if (monitor != nullptr && monitor->Init()) {
147 POWER_HILOGI(FEATURE_SUSPEND, "register type=%{public}u", (*source).GetReason());
148 monitor->RegisterListener(std::bind(&SuspendController::ControlListener, this, std::placeholders::_1,
149 std::placeholders::_2, std::placeholders::_3));
150 g_monitorMutex.Lock();
151 monitorMap_.emplace(monitor->GetReason(), monitor);
152 g_monitorMutex.Unlock();
153 }
154 }
155 sptr<SuspendPowerStateCallback> callback = new SuspendPowerStateCallback(shared_from_this());
156 if (stateMachine_ == nullptr) {
157 POWER_HILOGE(FEATURE_SUSPEND, "Can't get PowerStateMachine");
158 return;
159 }
160 stateMachine_->RegisterPowerStateCallback(callback);
161 RegisterSettingsObserver();
162 }
163
ExecSuspendMonitorByReason(SuspendDeviceType reason)164 void SuspendController::ExecSuspendMonitorByReason(SuspendDeviceType reason)
165 {
166 g_monitorMutex.Lock();
167 if (monitorMap_.find(reason) != monitorMap_.end()) {
168 auto monitor = monitorMap_[reason];
169 if (monitor == nullptr) {
170 POWER_HILOGI(COMP_SVC, "get monitor fail");
171 g_monitorMutex.Unlock();
172 return;
173 }
174 monitor->Notify();
175 }
176 g_monitorMutex.Unlock();
177 }
178
RegisterSettingsObserver()179 void SuspendController::RegisterSettingsObserver()
180 {
181 if (g_suspendSourcesKeyObserver) {
182 POWER_HILOGE(FEATURE_POWER_STATE, "suspend sources key observer is already registered");
183 return;
184 }
185 SettingObserver::UpdateFunc updateFunc = [&](const std::string&) {
186 POWER_HILOGI(COMP_SVC, "start setting string update");
187 std::lock_guard lock(mutex_);
188 std::string jsonStr = SettingHelper::GetSettingSuspendSources();
189 std::shared_ptr<SuspendSources> sources = SuspendSourceParser::ParseSources(jsonStr);
190 std::vector<SuspendSource> updateSourceList = sources->GetSourceList();
191 if (updateSourceList.size() == 0) {
192 return;
193 }
194 sourceList_ = updateSourceList;
195 POWER_HILOGI(COMP_SVC, "start updateListener");
196 Cancel();
197 for (auto source = sourceList_.begin(); source != sourceList_.end(); source++) {
198 std::shared_ptr<SuspendMonitor> monitor = SuspendMonitor::CreateMonitor(*source);
199 if (monitor != nullptr && monitor->Init()) {
200 monitor->RegisterListener(std::bind(&SuspendController::ControlListener, this, std::placeholders::_1,
201 std::placeholders::_2, std::placeholders::_3));
202 g_monitorMutex.Lock();
203 monitorMap_.emplace(monitor->GetReason(), monitor);
204 g_monitorMutex.Unlock();
205 }
206 }
207 };
208 g_suspendSourcesKeyObserver = SettingHelper::RegisterSettingSuspendSourcesObserver(updateFunc);
209 POWER_HILOGI(FEATURE_POWER_STATE, "register setting observer fin");
210 }
211
Execute()212 void SuspendController::Execute()
213 {
214 HandleAction(GetLastReason(), GetLastAction());
215 }
216
Cancel()217 void SuspendController::Cancel()
218 {
219 g_monitorMutex.Lock();
220 for (auto monitor = monitorMap_.begin(); monitor != monitorMap_.end(); monitor++) {
221 monitor->second->Cancel();
222 }
223 monitorMap_.clear();
224 g_monitorMutex.Unlock();
225 }
226
StopSleep()227 void SuspendController::StopSleep()
228 {
229 if (sleepAction_ != static_cast<uint32_t>(SuspendAction::ACTION_NONE)) {
230 FFRTUtils::CancelTask(g_sleepTimeoutHandle, queue_);
231 FFRTUtils::CancelTask(g_forceSleepDelayHandle, queue_);
232 sleepTime_ = -1;
233 sleepAction_ = static_cast<uint32_t>(SuspendAction::ACTION_NONE);
234 }
235 }
236
HandleEvent(int64_t delayTime)237 void SuspendController::HandleEvent(int64_t delayTime)
238 {
239 FFRTTask task = [&]() {
240 g_monitorMutex.Lock();
241 auto timeoutSuspendMonitor = monitorMap_.find(SuspendDeviceType::SUSPEND_DEVICE_REASON_TIMEOUT);
242 if (timeoutSuspendMonitor == monitorMap_.end()) {
243 g_monitorMutex.Unlock();
244 return;
245 }
246
247 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
248 if (pms != nullptr) {
249 if (pms->CheckDialogFlag()) {
250 POWER_HILOGI(FEATURE_SUSPEND, "Reset long press flag before suspending device by timeout");
251 }
252 }
253 if (stateMachine_ != nullptr) {
254 int32_t timeout = stateMachine_->GetDisplayOffTime();
255 POWER_HILOGI(FEATURE_INPUT, "This time of timeout is %{public}d ms", timeout);
256 }
257 g_monitorMutex.Unlock();
258 auto monitor = timeoutSuspendMonitor->second;
259 monitor->HandleEvent();
260 };
261 g_userActivityOffTimeoutHandle = FFRTUtils::SubmitDelayTask(task, delayTime, queue_);
262 }
263
CancelEvent()264 void SuspendController::CancelEvent()
265 {
266 FFRTUtils::CancelTask(g_userActivityOffTimeoutHandle, queue_);
267 }
268
RecordPowerKeyDown()269 void SuspendController::RecordPowerKeyDown()
270 {
271 if (stateMachine_ == nullptr) {
272 POWER_HILOGE(FEATURE_SUSPEND, "Can't get PowerStateMachine");
273 return;
274 }
275 bool isScreenOn = stateMachine_->IsScreenOn();
276 POWER_HILOGI(FEATURE_SUSPEND, "Suspend record key down action isScreenOn=%{public}d", isScreenOn);
277 if (!isScreenOn) {
278 powerkeyDownWhenScreenOff_ = true;
279 } else {
280 powerkeyDownWhenScreenOff_ = false;
281 }
282
283 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
284 if (pms == nullptr) {
285 return;
286 }
287
288 if (pms->CheckDialogFlag()) {
289 return;
290 }
291 }
292
GetPowerkeyDownWhenScreenOff()293 bool SuspendController::GetPowerkeyDownWhenScreenOff()
294 {
295 bool powerKeyDown = powerkeyDownWhenScreenOff_;
296 powerkeyDownWhenScreenOff_ = false;
297 return powerKeyDown;
298 }
299
SuspendWhenScreenOff(SuspendDeviceType reason,uint32_t action,uint32_t delay)300 void SuspendController::SuspendWhenScreenOff(SuspendDeviceType reason, uint32_t action, uint32_t delay)
301 {
302 if (reason != SuspendDeviceType::SUSPEND_DEVICE_REASON_SWITCH) {
303 POWER_HILOGI(FEATURE_SUSPEND, "Do nothing for reason %{public}d", reason);
304 return;
305 }
306 if (stateMachine_ == nullptr) {
307 return;
308 }
309
310 POWER_HILOGI(FEATURE_SUSPEND,
311 "Suspend when screen off, reason=%{public}d, action=%{public}u, "
312 "delay=%{public}u" PRId32 " ,state=%{public}d, type=%{public}u",
313 reason, action, delay, stateMachine_->GetState(), sleepType_);
314 switch (stateMachine_->GetState()) {
315 case PowerState::INACTIVE:
316 StopSleep();
317 StartSleepTimer(reason, action, delay);
318 break;
319 case PowerState::SLEEP:
320 if (action != static_cast<uint32_t>(SuspendAction::ACTION_FORCE_SUSPEND)) {
321 break;
322 }
323 if (sleepType_ == static_cast<uint32_t>(SuspendAction::ACTION_AUTO_SUSPEND)) {
324 SystemSuspendController::GetInstance().Wakeup();
325 StartSleepTimer(reason, action, 0);
326 } else if (sleepType_ == static_cast<uint32_t>(SuspendAction::ACTION_FORCE_SUSPEND)) {
327 SystemSuspendController::GetInstance().Wakeup();
328 SystemSuspendController::GetInstance().Suspend([]() {}, []() {}, true);
329 } else {
330 POWER_HILOGD(FEATURE_SUSPEND, "Nothing to do for no suspend");
331 }
332 break;
333 default:
334 break;
335 }
336 }
337
ControlListener(SuspendDeviceType reason,uint32_t action,uint32_t delay)338 void SuspendController::ControlListener(SuspendDeviceType reason, uint32_t action, uint32_t delay)
339 {
340 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
341 if (pms == nullptr) {
342 return;
343 }
344
345 if (pms->CheckDialogAndShuttingDown()) {
346 return;
347 }
348
349 if (!pms->IsScreenOn()) {
350 SuspendWhenScreenOff(reason, action, delay);
351 return;
352 }
353
354 pid_t pid = IPCSkeleton::GetCallingPid();
355 auto uid = IPCSkeleton::GetCallingUid();
356 POWER_HILOGI(FEATURE_SUSPEND,
357 "Try to suspend device, pid=%{public}d, uid=%{public}d, reason=%{public}d, action=%{public}u, "
358 "delay=%{public}u" PRId32 "",
359 pid, uid, reason, action, delay);
360 bool force = true;
361 if (reason == SuspendDeviceType::SUSPEND_DEVICE_REASON_TIMEOUT) {
362 force = false;
363 }
364 if (stateMachine_ == nullptr) {
365 POWER_HILOGE(FEATURE_SUSPEND, "Can't get PowerStateMachine");
366 return;
367 }
368 bool ret = stateMachine_->SetState(
369 PowerState::INACTIVE, stateMachine_->GetReasionBySuspendType(static_cast<SuspendDeviceType>(reason)), force);
370 if (ret) {
371 StartSleepTimer(reason, action, delay);
372 }
373 }
374
StartSleepTimer(SuspendDeviceType reason,uint32_t action,uint32_t delay)375 void SuspendController::StartSleepTimer(SuspendDeviceType reason, uint32_t action, uint32_t delay)
376 {
377 if (static_cast<SuspendAction>(action) == SuspendAction::ACTION_AUTO_SUSPEND) {
378 delay = delay + SLEEP_DELAY_MS;
379 }
380 const int64_t& tmpRef = delay;
381 int64_t timeout = GetTickCount() + tmpRef;
382 if ((timeout > sleepTime_) && (sleepTime_ != -1)) {
383 POWER_HILOGI(FEATURE_SUSPEND, "already have a sleep event (%{public}" PRId64 " > %{public}" PRId64 ")", timeout,
384 sleepTime_);
385 return;
386 }
387 sleepTime_ = timeout;
388 sleepReason_ = reason;
389 sleepAction_ = action;
390 sleepDuration_ = delay;
391 sleepType_ = action;
392 if (delay == 0) {
393 HandleAction(reason, action);
394 } else {
395 FFRTTask task = [this] {
396 HandleAction(GetLastReason(), GetLastAction());
397 };
398 g_sleepTimeoutHandle = FFRTUtils::SubmitDelayTask(task, delay, queue_);
399 }
400 }
401
HandleAction(SuspendDeviceType reason,uint32_t action)402 void SuspendController::HandleAction(SuspendDeviceType reason, uint32_t action)
403 {
404 switch (static_cast<SuspendAction>(action)) {
405 case SuspendAction::ACTION_AUTO_SUSPEND:
406 HandleAutoSleep(reason);
407 break;
408 case SuspendAction::ACTION_FORCE_SUSPEND:
409 HandleForceSleep(reason);
410 break;
411 case SuspendAction::ACTION_HIBERNATE:
412 HandleHibernate(reason);
413 break;
414 case SuspendAction::ACTION_SHUTDOWN:
415 HandleShutdown(reason);
416 break;
417 case SuspendAction::ACTION_NONE:
418 default:
419 break;
420 }
421 if (static_cast<SuspendAction>(action) != SuspendAction::ACTION_FORCE_SUSPEND) {
422 sleepTime_ = -1;
423 sleepAction_ = static_cast<uint32_t>(SuspendAction::ACTION_NONE);
424 }
425 }
426
HandleAutoSleep(SuspendDeviceType reason)427 void SuspendController::HandleAutoSleep(SuspendDeviceType reason)
428 {
429 POWER_HILOGI(FEATURE_SUSPEND, "auto suspend by reason=%{public}d", reason);
430
431 if (stateMachine_ == nullptr) {
432 POWER_HILOGE(FEATURE_SUSPEND, "Can't get PowerStateMachine");
433 return;
434 }
435 bool ret = stateMachine_->SetState(
436 PowerState::SLEEP, stateMachine_->GetReasionBySuspendType(reason));
437 if (ret) {
438 POWER_HILOGI(FEATURE_SUSPEND, "State changed, set sleep timer");
439 TriggerSyncSleepCallback(false);
440 SystemSuspendController::GetInstance().Suspend([]() {}, []() {}, false);
441 } else {
442 POWER_HILOGI(FEATURE_SUSPEND, "auto suspend: State change failed");
443 }
444 }
445
HandleForceSleep(SuspendDeviceType reason)446 void SuspendController::HandleForceSleep(SuspendDeviceType reason)
447 {
448 POWER_HILOGI(FEATURE_SUSPEND, "force suspend by reason=%{public}d", reason);
449 if (stateMachine_ == nullptr) {
450 POWER_HILOGE(FEATURE_SUSPEND, "Can't get PowerStateMachine");
451 return;
452 }
453 bool ret = stateMachine_->SetState(
454 PowerState::SLEEP, stateMachine_->GetReasionBySuspendType(reason), true);
455 if (ret) {
456 POWER_HILOGI(FEATURE_SUSPEND, "State changed, system suspend");
457 onForceSleep = true;
458 TriggerSyncSleepCallback(false);
459
460 FFRTTask task = [this] {
461 SystemSuspendController::GetInstance().Suspend([]() {}, []() {}, true);
462 sleepTime_ = -1;
463 sleepAction_ = static_cast<uint32_t>(SuspendAction::ACTION_NONE);
464 };
465 g_forceSleepDelayHandle = FFRTUtils::SubmitDelayTask(task, FORCE_SLEEP_DELAY_MS, queue_);
466 } else {
467 POWER_HILOGI(FEATURE_SUSPEND, "force suspend: State change failed");
468 }
469 }
470
HandleHibernate(SuspendDeviceType reason)471 void SuspendController::HandleHibernate(SuspendDeviceType reason)
472 {
473 POWER_HILOGI(FEATURE_SUSPEND, "force suspend by reason=%{public}d", reason);
474 if (stateMachine_ == nullptr) {
475 POWER_HILOGE(FEATURE_SUSPEND, "Can't get PowerStateMachine");
476 return;
477 }
478 bool ret = stateMachine_->SetState(
479 PowerState::HIBERNATE, stateMachine_->GetReasionBySuspendType(reason), true);
480 if (ret) {
481 POWER_HILOGI(FEATURE_SUSPEND, "State changed, call hibernate");
482 } else {
483 POWER_HILOGI(FEATURE_SUSPEND, "Hibernate: State change failed");
484 }
485 }
486
HandleShutdown(SuspendDeviceType reason)487 void SuspendController::HandleShutdown(SuspendDeviceType reason)
488 {
489 POWER_HILOGI(FEATURE_SUSPEND, "shutdown by reason=%{public}d", reason);
490 shutdownController_->Shutdown(std::to_string(static_cast<uint32_t>(reason)));
491 }
492
Reset()493 void SuspendController::Reset()
494 {
495 queue_.reset();
496 }
497
CreateMonitor(SuspendSource & source)498 const std::shared_ptr<SuspendMonitor> SuspendMonitor::CreateMonitor(SuspendSource& source)
499 {
500 SuspendDeviceType reason = source.GetReason();
501 POWER_HILOGI(FEATURE_SUSPEND, "CreateMonitor reason=%{public}d", reason);
502 std::shared_ptr<SuspendMonitor> monitor = nullptr;
503 switch (reason) {
504 case SuspendDeviceType::SUSPEND_DEVICE_REASON_POWER_KEY:
505 monitor = std::static_pointer_cast<SuspendMonitor>(std::make_shared<PowerKeySuspendMonitor>(source));
506 break;
507 case SuspendDeviceType::SUSPEND_DEVICE_REASON_TIMEOUT:
508 monitor = std::static_pointer_cast<SuspendMonitor>(std::make_shared<TimeoutSuspendMonitor>(source));
509 break;
510 case SuspendDeviceType::SUSPEND_DEVICE_REASON_LID:
511 monitor = std::static_pointer_cast<SuspendMonitor>(std::make_shared<LidSuspendMonitor>(source));
512 break;
513 case SuspendDeviceType::SUSPEND_DEVICE_REASON_SWITCH:
514 monitor = std::static_pointer_cast<SuspendMonitor>(std::make_shared<SwitchSuspendMonitor>(source));
515 break;
516 default:
517 POWER_HILOGE(FEATURE_SUSPEND, "CreateMonitor : Invalid reason=%{public}d", reason);
518 break;
519 }
520 return monitor;
521 }
522
523 /** PowerKeySuspendMonitor Implement */
Init()524 bool PowerKeySuspendMonitor::Init()
525 {
526 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
527 if (powerkeyReleaseId_ >= 0) {
528 return true;
529 }
530 std::shared_ptr<OHOS::MMI::KeyOption> keyOption = std::make_shared<OHOS::MMI::KeyOption>();
531 std::set<int32_t> preKeys;
532
533 keyOption.reset();
534 keyOption = std::make_shared<OHOS::MMI::KeyOption>();
535 keyOption->SetPreKeys(preKeys);
536 keyOption->SetFinalKey(OHOS::MMI::KeyEvent::KEYCODE_POWER);
537 keyOption->SetFinalKeyDown(false);
538 keyOption->SetFinalKeyDownDuration(0);
539 powerkeyReleaseId_ = InputManager::GetInstance()->SubscribeKeyEvent(
540 keyOption, [this](std::shared_ptr<OHOS::MMI::KeyEvent> keyEvent) {
541 POWER_HILOGI(FEATURE_SUSPEND, "Receive key on notify");
542 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
543 if (pms == nullptr) {
544 return;
545 }
546 std::shared_ptr<SuspendController> suspendController = pms->GetSuspendController();
547 if (suspendController->GetPowerkeyDownWhenScreenOff()) {
548 POWER_HILOGI(FEATURE_SUSPEND, "no action suspend");
549 return;
550 }
551 Notify();
552 });
553 POWER_HILOGI(FEATURE_SUSPEND, "powerkeyReleaseId_=%{public}d", powerkeyReleaseId_);
554 return powerkeyReleaseId_ >= 0 ? true : false;
555 #else
556 return false;
557 #endif
558 }
559
Cancel()560 void PowerKeySuspendMonitor::Cancel()
561 {
562 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
563 if (powerkeyReleaseId_ >= 0) {
564 POWER_HILOGI(FEATURE_SUSPEND, "UnsubscribeKeyEvent: PowerKeySuspendMonitor");
565 InputManager::GetInstance()->UnsubscribeKeyEvent(powerkeyReleaseId_);
566 powerkeyReleaseId_ = -1;
567 }
568 #endif
569 }
570
571 /** Timeout Implement */
Init()572 bool TimeoutSuspendMonitor::Init()
573 {
574 return true;
575 }
576
Cancel()577 void TimeoutSuspendMonitor::Cancel() {}
578
HandleEvent()579 void TimeoutSuspendMonitor::HandleEvent()
580 {
581 POWER_HILOGI(FEATURE_INPUT, "TimeoutSuspendMonitor HandleEvent.");
582 Notify();
583 }
584
585 /** LidSuspendMonitor Implement */
586
Init()587 bool LidSuspendMonitor::Init()
588 {
589 return true;
590 }
591
Cancel()592 void LidSuspendMonitor::Cancel() {}
593
594 /** SwitchSuspendMonitor Implement */
595
Init()596 bool SwitchSuspendMonitor::Init()
597 {
598 return true;
599 }
600
Cancel()601 void SwitchSuspendMonitor::Cancel() {}
602
603 } // namespace PowerMgr
604 } // namespace OHOS
605