• 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 #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