• 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 #include <display_manager_lite.h>
19 #ifdef HAS_HIVIEWDFX_HISYSEVENT_PART
20 #include <hisysevent.h>
21 #endif
22 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
23 #include <input_manager.h>
24 #endif
25 #include <ipc_skeleton.h>
26 #include <securec.h>
27 #ifdef POWER_MANAGER_ENABLE_EXTERNAL_SCREEN_MANAGEMENT
28 #include <screen_manager_lite.h>
29 #endif
30 #include "power_log.h"
31 #include "power_mgr_service.h"
32 #include "power_state_callback_stub.h"
33 #include "power_utils.h"
34 #include "setting_helper.h"
35 #include "system_suspend_controller.h"
36 #include "wakeup_controller.h"
37 
38 namespace OHOS {
39 namespace PowerMgr {
40 using namespace OHOS::MMI;
41 namespace {
42 #ifdef POWER_MANAGER_ENABLE_CHARGING_TYPE_SETTING
43 sptr<SettingObserver> g_suspendSourcesKeyAcObserver = nullptr;
44 sptr<SettingObserver> g_suspendSourcesKeyDcObserver = nullptr;
45 #else
46 sptr<SettingObserver> g_suspendSourcesKeyObserver = nullptr;
47 #endif
48 FFRTMutex g_monitorMutex;
49 constexpr int64_t POWERKEY_MIN_INTERVAL = 350; // ms
50 } // namespace
51 
52 std::atomic_bool onForceSleep = false;
53 
54 /** SuspendController Implement */
SuspendController(const std::shared_ptr<ShutdownController> & shutdownController,const std::shared_ptr<PowerStateMachine> & stateMachine,const std::shared_ptr<FFRTTimer> & ffrtTimer)55 SuspendController::SuspendController(const std::shared_ptr<ShutdownController>& shutdownController,
56     const std::shared_ptr<PowerStateMachine>& stateMachine, const std::shared_ptr<FFRTTimer>& ffrtTimer)
57 {
58     shutdownController_ = shutdownController;
59     stateMachine_ = stateMachine;
60     ffrtTimer_ = ffrtTimer;
61 }
62 
~SuspendController()63 SuspendController::~SuspendController()
64 {
65     UnregisterSettingsObserver();
66     ffrtTimer_.reset();
67 }
68 
AddCallback(const sptr<ISyncSleepCallback> & callback,SleepPriority priority)69 void SuspendController::AddCallback(const sptr<ISyncSleepCallback>& callback, SleepPriority priority)
70 {
71     RETURN_IF(callback == nullptr)
72     SleepCallbackHolder::GetInstance().AddCallback(callback, priority);
73     POWER_HILOGI(FEATURE_SUSPEND,
74         "sync sleep callback added, priority=%{public}u, pid=%{public}d, uid=%{public}d", priority,
75         IPCSkeleton::GetCallingPid(), IPCSkeleton::GetCallingUid());
76 }
77 
RemoveCallback(const sptr<ISyncSleepCallback> & callback)78 void SuspendController::RemoveCallback(const sptr<ISyncSleepCallback>& callback)
79 {
80     RETURN_IF(callback == nullptr)
81     SleepCallbackHolder::GetInstance().RemoveCallback(callback);
82     POWER_HILOGI(FEATURE_SUSPEND,
83         "sync sleep callback removed, pid=%{public}d, uid=%{public}d",
84         IPCSkeleton::GetCallingPid(), IPCSkeleton::GetCallingUid());
85 }
86 
AddCallback(const sptr<ITakeOverSuspendCallback> & callback,TakeOverSuspendPriority priority)87 void SuspendController::AddCallback(const sptr<ITakeOverSuspendCallback>& callback, TakeOverSuspendPriority priority)
88 {
89 #ifdef POWER_MANAGER_TAKEOVER_SUSPEND
90     if (callback == nullptr) {
91         POWER_HILOGE(FEATURE_SUSPEND, "callback is nullptr");
92         return;
93     }
94     TakeOverSuspendCallbackHolder::GetInstance().AddCallback(callback, priority);
95     POWER_HILOGI(FEATURE_SUSPEND,
96         "TakeOver Suspend callback added, priority=%{public}u, pid=%{public}d, uid=%{public}d", priority,
97         IPCSkeleton::GetCallingPid(), IPCSkeleton::GetCallingUid());
98 #endif
99 }
100 
RemoveCallback(const sptr<ITakeOverSuspendCallback> & callback)101 void SuspendController::RemoveCallback(const sptr<ITakeOverSuspendCallback>& callback)
102 {
103 #ifdef POWER_MANAGER_TAKEOVER_SUSPEND
104     if (callback == nullptr) {
105         POWER_HILOGE(FEATURE_SUSPEND, "callback is nullptr");
106         return;
107     }
108     TakeOverSuspendCallbackHolder::GetInstance().RemoveCallback(callback);
109     POWER_HILOGI(FEATURE_SUSPEND,
110         "TakeOver Suspend callback removed, pid=%{public}d, uid=%{public}d",
111         IPCSkeleton::GetCallingPid(), IPCSkeleton::GetCallingUid());
112 #endif
113 }
114 
TriggerSyncSleepCallback(bool isWakeup)115 void SuspendController::TriggerSyncSleepCallback(bool isWakeup)
116 {
117     std::lock_guard lock(sleepCbMutex_);
118     POWER_HILOGI(FEATURE_SUSPEND, "TriggerSyncSleepCallback, isWakeup=%{public}d, onForceSleep=%{public}d", isWakeup,
119         onForceSleep == true);
120     auto highPriorityCallbacks = SleepCallbackHolder::GetInstance().GetHighPriorityCallbacks();
121     TriggerSyncSleepCallbackInner(highPriorityCallbacks, "High", isWakeup);
122     auto defaultPriorityCallbacks = SleepCallbackHolder::GetInstance().GetDefaultPriorityCallbacks();
123     TriggerSyncSleepCallbackInner(defaultPriorityCallbacks, "Default", isWakeup);
124     auto lowPriorityCallbacks = SleepCallbackHolder::GetInstance().GetLowPriorityCallbacks();
125     TriggerSyncSleepCallbackInner(lowPriorityCallbacks, "Low", isWakeup);
126 
127     if (isWakeup && onForceSleep) {
128         onForceSleep = false;
129     }
130 }
131 
TriggerSyncSleepCallbackInner(SleepCallbackHolder::SleepCallbackContainerType & callbacks,const std::string & priority,bool isWakeup)132 void SuspendController::TriggerSyncSleepCallbackInner(
133     SleepCallbackHolder::SleepCallbackContainerType& callbacks, const std::string& priority, bool isWakeup)
134 {
135     uint32_t id = 0;
136     for (auto &callback : callbacks) {
137         auto pidUid = SleepCallbackHolder::GetInstance().FindCallbackPidUid(callback);
138         if (callback != nullptr) {
139             int64_t start = GetTickCount();
140             POWER_HILOGI(FEATURE_SUSPEND, "Sync Sleep Callback, pid=%{public}d", pidUid.first);
141             isWakeup ? callback->OnSyncWakeup(onForceSleep) : callback->OnSyncSleep(onForceSleep);
142             int64_t cost = GetTickCount() - start;
143             POWER_HILOGI(FEATURE_SUSPEND,
144                 "Trigger %{public}s SyncSleepCb[%{public}u] success,P=%{public}dU=%{public}dT=%{public}" PRId64,
145                 priority.c_str(), ++id, pidUid.first, pidUid.second, cost);
146         }
147     }
148 }
149 
150 #ifdef POWER_MANAGER_TAKEOVER_SUSPEND
TriggerTakeOverSuspendCallback(SuspendDeviceType type)151 bool SuspendController::TriggerTakeOverSuspendCallback(SuspendDeviceType type)
152 {
153     bool isTakeover = false;
154     POWER_HILOGI(FEATURE_SUSPEND, "TriggerTakeOverSuspendCallback, type=%{public}d", type);
155     auto highPriorityCallbacks = TakeOverSuspendCallbackHolder::GetInstance().GetHighPriorityCallbacks();
156     isTakeover = TriggerTakeOverSuspendCallbackInner(highPriorityCallbacks, "High", type);
157     RETURN_IF_WITH_RET(isTakeover, true);
158     auto defaultPriorityCallbacks = TakeOverSuspendCallbackHolder::GetInstance().GetDefaultPriorityCallbacks();
159     isTakeover = TriggerTakeOverSuspendCallbackInner(defaultPriorityCallbacks, "Default", type);
160     RETURN_IF_WITH_RET(isTakeover, true);
161     auto lowPriorityCallbacks = TakeOverSuspendCallbackHolder::GetInstance().GetLowPriorityCallbacks();
162     isTakeover = TriggerTakeOverSuspendCallbackInner(lowPriorityCallbacks, "Low", type);
163     return isTakeover;
164 }
165 #endif
166 
167 #ifdef POWER_MANAGER_TAKEOVER_SUSPEND
TriggerTakeOverSuspendCallbackInner(TakeOverSuspendCallbackHolder::TakeoverSuspendCallbackContainerType & callbacks,const std::string & priority,SuspendDeviceType type)168 bool SuspendController::TriggerTakeOverSuspendCallbackInner(
169     TakeOverSuspendCallbackHolder::TakeoverSuspendCallbackContainerType& callbacks,
170     const std::string& priority, SuspendDeviceType type)
171 {
172     uint32_t id = 0;
173     bool isTakeover = false;
174     if (callbacks.size() == 0) {
175         POWER_HILOGI(FEATURE_SUSPEND, "callbacks size is zero");
176         return isTakeover;
177     }
178     for (const auto& callback : callbacks) {
179         auto pidUid = TakeOverSuspendCallbackHolder::GetInstance().FindCallbackPidUid(callback);
180         if (callback == nullptr) {
181             POWER_HILOGE(FEATURE_SUSPEND, "callback is nullptr");
182             continue;
183         }
184         int64_t start = GetTickCount();
185         isTakeover = isTakeover || callback->OnTakeOverSuspend(type);
186         int64_t count = GetTickCount() - start;
187         POWER_HILOGI(FEATURE_SUSPEND,
188             "Trigger %{public}s takeovercb [%{public}u] success, P=%{public}d U=%{public}d T=%{public}" PRId64,
189             priority.c_str(), ++id, pidUid.first, pidUid.second, count);
190     }
191     return isTakeover;
192 }
193 #endif
194 
195 class SuspendPowerStateCallback : public PowerStateCallbackStub {
196 public:
SuspendPowerStateCallback(std::shared_ptr<SuspendController> controller)197     explicit SuspendPowerStateCallback(std::shared_ptr<SuspendController> controller) : controller_(controller) {};
198     virtual ~SuspendPowerStateCallback() = default;
OnPowerStateChanged(PowerState state)199     void OnPowerStateChanged(PowerState state) override
200     {
201         auto controller = controller_.lock();
202         if (controller == nullptr) {
203             POWER_HILOGI(FEATURE_SUSPEND, "OnPowerStateChanged: No controller");
204             return;
205         }
206         if (state == PowerState::AWAKE) {
207             POWER_HILOGI(FEATURE_SUSPEND, "Turn awake, stop sleep timer");
208             controller->StopSleep();
209         }
210     }
211 
212 private:
213     std::weak_ptr<SuspendController> controller_;
214 };
215 
Init()216 void SuspendController::Init()
217 {
218     std::lock_guard lock(mutex_);
219     std::shared_ptr<SuspendSources> sources = SuspendSourceParser::ParseSources();
220     sourceList_ = sources->GetSourceList();
221     if (sourceList_.empty()) {
222         POWER_HILOGE(FEATURE_SUSPEND, "InputManager is null");
223         return;
224     }
225 
226     for (auto source = sourceList_.begin(); source != sourceList_.end(); source++) {
227         POWER_HILOGI(FEATURE_SUSPEND, "registered type=%{public}u action=%{public}u delayMs=%{public}u",
228             (*source).GetReason(), (*source).GetAction(), (*source).GetDelay());
229         std::shared_ptr<SuspendMonitor> monitor = SuspendMonitor::CreateMonitor(*source);
230         if (monitor != nullptr && monitor->Init()) {
231             POWER_HILOGI(FEATURE_SUSPEND, "monitor init success, type=%{public}u", (*source).GetReason());
232             monitor->RegisterListener([this](SuspendDeviceType reason, uint32_t action, uint32_t delay) {
233                 this->ControlListener(reason, action, delay);
234             });
235             g_monitorMutex.lock();
236             monitorMap_.emplace(monitor->GetReason(), monitor);
237             g_monitorMutex.unlock();
238         }
239     }
240     if (stateMachine_ == nullptr) {
241         POWER_HILOGE(FEATURE_SUSPEND, "Can't get PowerStateMachine");
242         return;
243     }
244 
245     sptr<SuspendPowerStateCallback> callback = new SuspendPowerStateCallback(shared_from_this());
246     stateMachine_->RegisterPowerStateCallback(callback);
247     if (suspendPowerStateCallback_ != nullptr) {
248         stateMachine_->UnRegisterPowerStateCallback(suspendPowerStateCallback_);
249     }
250     suspendPowerStateCallback_ = callback;
251 
252     RegisterSettingsObserver();
253 }
254 
ExecSuspendMonitorByReason(SuspendDeviceType reason)255 void SuspendController::ExecSuspendMonitorByReason(SuspendDeviceType reason)
256 {
257     FFRTUtils::SubmitTask([this, reason] {
258         g_monitorMutex.lock();
259         auto suspendMonitor = GetSpecifiedSuspendMonitor(reason);
260         if (suspendMonitor == nullptr) {
261             POWER_HILOGI(COMP_SVC, "get monitor fail, type: %{public}u", reason);
262             g_monitorMutex.unlock();
263             return;
264         }
265         suspendMonitor->Notify();
266         g_monitorMutex.unlock();
267     });
268 }
269 
UpdateSuspendSources()270 void SuspendController::UpdateSuspendSources()
271 {
272     POWER_HILOGI(COMP_SVC, "start setting string update");
273     std::lock_guard lock(mutex_);
274 
275     auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
276     if (pms == nullptr) {
277         POWER_HILOGE(COMP_SVC, "get PowerMgrService fail");
278         return;
279     }
280     std::string jsonStr;
281 #ifdef POWER_MANAGER_ENABLE_CHARGING_TYPE_SETTING
282     if (pms->IsPowerConnected()) {
283         jsonStr = SettingHelper::GetSettingAcSuspendSources();
284     } else {
285         jsonStr = SettingHelper::GetSettingDcSuspendSources();
286     }
287 #else
288     jsonStr = SettingHelper::GetSettingSuspendSources();
289 #endif
290     std::shared_ptr<SuspendSources> sources = SuspendSourceParser::ParseSources(jsonStr);
291     if (sources->GetParseErrorFlag()) {
292         POWER_HILOGI(FEATURE_SUSPEND, "Parse failed, call GetSuspendSourcesByConfig again");
293         jsonStr = SuspendSourceParser::GetSuspendSourcesByConfig();
294         sources = SuspendSourceParser::ParseSources(jsonStr);
295     }
296     if (sources == nullptr) {
297         POWER_HILOGE(COMP_SVC, "get SuspendSources fail");
298         return;
299     }
300     std::vector<SuspendSource> updateSourceList = sources->GetSourceList();
301     if (updateSourceList.size() == 0) {
302         return;
303     }
304     sourceList_ = updateSourceList;
305     POWER_HILOGI(COMP_SVC, "start updateListener");
306     Cancel();
307     uint32_t id = 0;
308     for (auto source = sourceList_.begin(); source != sourceList_.end(); source++, id++) {
309         std::shared_ptr<SuspendMonitor> monitor = SuspendMonitor::CreateMonitor(*source);
310         POWER_HILOGI(FEATURE_SUSPEND, "UpdateFunc CreateMonitor[%{public}u] reason=%{public}d",
311             id, source->GetReason());
312         if (monitor != nullptr && monitor->Init()) {
313             monitor->RegisterListener([this](SuspendDeviceType reason, uint32_t action, uint32_t delay) {
314                 this->ControlListener(reason, action, delay);
315             });
316             g_monitorMutex.lock();
317             monitorMap_.emplace(monitor->GetReason(), monitor);
318             g_monitorMutex.unlock();
319         }
320     }
321 }
322 
RegisterSettingsObserver()323 void SuspendController::RegisterSettingsObserver()
324 {
325 #ifdef POWER_MANAGER_ENABLE_CHARGING_TYPE_SETTING
326     if (g_suspendSourcesKeyAcObserver && g_suspendSourcesKeyDcObserver) {
327 #else
328     if (g_suspendSourcesKeyObserver) {
329 #endif
330         POWER_HILOGE(FEATURE_POWER_STATE, "suspend sources key observer is already registered");
331         return;
332     }
333     SettingObserver::UpdateFunc updateFunc = [&](const std::string&) {
334         SuspendController::UpdateSuspendSources();
335     };
336 #ifdef POWER_MANAGER_ENABLE_CHARGING_TYPE_SETTING
337     if (g_suspendSourcesKeyAcObserver == nullptr) {
338         g_suspendSourcesKeyAcObserver = SettingHelper::RegisterSettingAcSuspendSourcesObserver(updateFunc);
339     }
340     if (g_suspendSourcesKeyDcObserver == nullptr) {
341         g_suspendSourcesKeyDcObserver = SettingHelper::RegisterSettingDcSuspendSourcesObserver(updateFunc);
342     }
343 #else
344     g_suspendSourcesKeyObserver = SettingHelper::RegisterSettingSuspendSourcesObserver(updateFunc);
345 #endif
346     POWER_HILOGI(FEATURE_POWER_STATE, "register setting observer fin");
347 }
348 
349 void SuspendController::UnregisterSettingsObserver()
350 {
351 #ifdef POWER_MANAGER_ENABLE_CHARGING_TYPE_SETTING
352     if (g_suspendSourcesKeyAcObserver) {
353         SettingHelper::UnregisterSettingObserver(g_suspendSourcesKeyAcObserver);
354         g_suspendSourcesKeyAcObserver = nullptr;
355     }
356     if (g_suspendSourcesKeyDcObserver) {
357         SettingHelper::UnregisterSettingObserver(g_suspendSourcesKeyDcObserver);
358         g_suspendSourcesKeyDcObserver = nullptr;
359     }
360 #else
361     if (g_suspendSourcesKeyObserver) {
362         SettingHelper::UnregisterSettingObserver(g_suspendSourcesKeyObserver);
363         g_suspendSourcesKeyObserver = nullptr;
364     }
365 #endif
366 }
367 
368 void SuspendController::Execute()
369 {
370     HandleAction(GetLastReason(), GetLastAction());
371 }
372 
373 void SuspendController::Cancel()
374 {
375     g_monitorMutex.lock();
376     for (auto monitor = monitorMap_.begin(); monitor != monitorMap_.end(); monitor++) {
377         monitor->second->Cancel();
378     }
379     monitorMap_.clear();
380     g_monitorMutex.unlock();
381 }
382 
383 void SuspendController::StopSleep()
384 {
385     if (ffrtTimer_ != nullptr) {
386         ffrtTimer_->CancelTimer(TIMER_ID_SLEEP);
387     }
388     ffrtMutexMap_.Lock(TIMER_ID_SLEEP);
389     sleepTime_ = -1;
390     sleepAction_ = static_cast<uint32_t>(SuspendAction::ACTION_NONE);
391     ffrtMutexMap_.Unlock(TIMER_ID_SLEEP);
392 }
393 
394 void SuspendController::HandleEvent(int64_t delayTime)
395 {
396     FFRTTask task = [&]() {
397         g_monitorMutex.lock();
398         auto timeoutSuspendMonitor = GetSpecifiedSuspendMonitor(SuspendDeviceType::SUSPEND_DEVICE_REASON_TIMEOUT);
399         if (timeoutSuspendMonitor == nullptr) {
400             g_monitorMutex.unlock();
401             return;
402         }
403 
404         auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
405         if (pms != nullptr) {
406             if (pms->CheckDialogFlag()) {
407                 POWER_HILOGI(FEATURE_SUSPEND, "Reset long press flag before suspending device by timeout");
408             }
409         }
410         if (stateMachine_ != nullptr) {
411             int32_t timeout = stateMachine_->GetDisplayOffTime();
412             POWER_HILOGI(FEATURE_INPUT, "This time of timeout is %{public}d ms", timeout);
413         }
414         g_monitorMutex.unlock();
415         timeoutSuspendMonitor->HandleEvent();
416     };
417     if (ffrtTimer_ != nullptr) {
418         ffrtTimer_->SetTimer(TIMER_ID_USER_ACTIVITY_OFF, task, delayTime);
419     } else {
420         POWER_HILOGE(FEATURE_SUSPEND, "%{public}s: SetTimer(%{public}s) failed, timer is null", __func__,
421             std::to_string(delayTime).c_str());
422     }
423 }
424 
425 void SuspendController::CancelEvent()
426 {
427     if (ffrtTimer_ != nullptr) {
428         ffrtTimer_->CancelTimer(TIMER_ID_USER_ACTIVITY_OFF);
429     }
430 }
431 
432 void SuspendController::RecordPowerKeyDown(bool interrupting)
433 {
434     if (stateMachine_ == nullptr) {
435         POWER_HILOGE(FEATURE_SUSPEND, "Can't get PowerStateMachine");
436         return;
437     }
438     bool isScreenOn = stateMachine_->IsScreenOn();
439     POWER_HILOGI(FEATURE_SUSPEND, "Suspend record key down action isScreenOn=%{public}d", isScreenOn);
440     if (!isScreenOn) {
441         powerkeyDownWhenScreenOff_ = true;
442     } else {
443         if (interrupting) {
444             POWER_HILOGI(FEATURE_SUSPEND, "Suspend record key down after interrupting screen off");
445         }
446         powerkeyDownWhenScreenOff_ = interrupting;
447     }
448 
449     auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
450     if (pms == nullptr) {
451         return;
452     }
453 
454     if (pms->CheckDialogFlag()) {
455         return;
456     }
457 }
458 
459 bool SuspendController::GetPowerkeyDownWhenScreenOff()
460 {
461     bool powerKeyDown = powerkeyDownWhenScreenOff_;
462     powerkeyDownWhenScreenOff_ = false;
463     return powerKeyDown;
464 }
465 
466 void SuspendController::SuspendWhenScreenOff(SuspendDeviceType reason, uint32_t action, uint32_t delay)
467 {
468 #ifdef POWER_MANAGER_ENABLE_LID_CHECK
469     if (reason != SuspendDeviceType::SUSPEND_DEVICE_REASON_LID) {
470 #else
471     if (reason != SuspendDeviceType::SUSPEND_DEVICE_REASON_SWITCH) {
472 #endif
473         POWER_HILOGI(FEATURE_SUSPEND, "SuspendWhenScreenOff: Do nothing for reason %{public}u", reason);
474         return;
475     }
476     if (stateMachine_ == nullptr) {
477         return;
478     }
479 
480     POWER_HILOGI(FEATURE_SUSPEND,
481         "Suspend when screen off, reason=%{public}d, action=%{public}u, "
482         "delay=%{public}u, state=%{public}d, type=%{public}u",
483         reason, action, delay, stateMachine_->GetState(), sleepType_);
484     switch (stateMachine_->GetState()) {
485         case PowerState::INACTIVE:
486             StopSleep();
487             StartSleepTimer(reason, action, delay);
488             break;
489         case PowerState::SLEEP:
490             if (action != static_cast<uint32_t>(SuspendAction::ACTION_FORCE_SUSPEND)) {
491                 break;
492             }
493             if (sleepType_ == static_cast<uint32_t>(SuspendAction::ACTION_AUTO_SUSPEND)) {
494                 SystemSuspendController::GetInstance().Wakeup();
495                 StartSleepTimer(reason, action, 0);
496             } else if (sleepType_ == static_cast<uint32_t>(SuspendAction::ACTION_FORCE_SUSPEND)) {
497 #ifdef POWER_MANAGER_ENABLE_LID_CHECK
498                 if (PowerMgrService::isInLidMode_ == false) {
499 #else
500                 if (stateMachine_->IsSwitchOpen()) {
501 #endif
502                     POWER_HILOGI(FEATURE_SUSPEND, "switch off event is ignored.");
503                     return;
504                 }
505                 SystemSuspendController::GetInstance().Wakeup();
506                 SystemSuspendController::GetInstance().Suspend([]() {}, []() {}, true);
507             } else {
508                 POWER_HILOGD(FEATURE_SUSPEND, "Nothing to do for no suspend");
509             }
510             break;
511         default:
512             break;
513     }
514 }
515 
516 void SuspendController::ControlListener(SuspendDeviceType reason, uint32_t action, uint32_t delay)
517 {
518     if (stateMachine_ == nullptr) {
519         POWER_HILOGE(FEATURE_SUSPEND, "get PowerStateMachine instance error");
520         return;
521     }
522 
523     if (NeedToSkipCurrentSuspend(reason, action, delay)) {
524         return;
525     }
526     pid_t pid = IPCSkeleton::GetCallingPid();
527     auto uid = IPCSkeleton::GetCallingUid();
528     POWER_HILOGI(FEATURE_SUSPEND,
529         "[UL_POWER] Try to suspend device, pid=%{public}d, uid=%{public}d, reason=%{public}d, action=%{public}u, "
530         "delay=%{public}u",
531         pid, uid, reason, action, delay);
532     bool force = true;
533     if (reason == SuspendDeviceType::SUSPEND_DEVICE_REASON_TIMEOUT) {
534         force = false;
535     }
536 #ifdef HAS_HIVIEWDFX_HISYSEVENT_PART
537     HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::POWER, "SLEEP_START",
538         HiviewDFX::HiSysEvent::EventType::BEHAVIOR, "TRIGGER_EVENT_TYPE", static_cast<int32_t>(reason),
539         "ACTION_EVENT_TYPE", static_cast<int32_t>(force));
540 #endif
541     bool ret = stateMachine_->SetState(
542         PowerState::INACTIVE, stateMachine_->GetReasonBySuspendType(static_cast<SuspendDeviceType>(reason)), force);
543     if (ret) {
544         StartSleepTimer(reason, action, delay);
545     }
546 }
547 
548 bool SuspendController::NeedToSkipCurrentSuspend(SuspendDeviceType reason, uint32_t action, uint32_t delay)
549 {
550     auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
551     if (pms == nullptr) {
552         POWER_HILOGE(FEATURE_SUSPEND, "get PowerMgrService instance error");
553         return true;
554     }
555     if (pms->CheckDialogAndShuttingDown()) {
556         return true;
557     }
558 
559     if (reason == SuspendDeviceType::SUSPEND_DEVICE_REASON_SWITCH) {
560         stateMachine_->SetSwitchAction(action);
561     }
562     bool isScreenOn = stateMachine_->IsScreenOn();
563     if (!isScreenOn) {
564         SuspendWhenScreenOff(reason, action, delay);
565         return true;
566     }
567     if (pms->IsDuringCallStateEnable()) {
568         if (reason == SuspendDeviceType::SUSPEND_DEVICE_REASON_POWER_KEY &&
569             Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode() == Rosen::FoldDisplayMode::SUB &&
570             stateMachine_->HandleDuringCall(false)) {
571             POWER_HILOGI(FEATURE_SUSPEND, "switch to main display when duringcall mode");
572             return true;
573         }
574     }
575 
576 #ifdef POWER_MANAGER_ENABLE_EXTERNAL_SCREEN_MANAGEMENT
577     if (IsPowerOffInernalScreenOnlyScene(reason, static_cast<SuspendAction>(action), isScreenOn)) {
578         ProcessPowerOffInternalScreenOnly(pms, reason);
579         return true;
580     }
581 #endif
582     return false;
583 }
584 
585 std::shared_ptr<SuspendMonitor> SuspendController::GetSpecifiedSuspendMonitor(SuspendDeviceType type) const
586 {
587     auto iter = monitorMap_.find(type);
588     if (iter == monitorMap_.end()) {
589         return nullptr;
590     }
591     return iter->second;
592 }
593 
594 #ifdef POWER_MANAGER_ENABLE_EXTERNAL_SCREEN_MANAGEMENT
595 void SuspendController::PowerOffInternalScreen(SuspendDeviceType type)
596 {
597     stateMachine_->SetInternalScreenDisplayState(
598         DisplayState::DISPLAY_OFF, stateMachine_->GetReasonBySuspendType(type));
599 }
600 
601 void SuspendController::PowerOffAllScreens(SuspendDeviceType type)
602 {
603     using namespace OHOS::Rosen;
604     auto changeReason = stateMachine_->GetReasonBySuspendType(type);
605     auto dmsReason = PowerUtils::GetDmsReasonByPowerReason(changeReason);
606     bool ret = ScreenManagerLite::GetInstance().SetScreenPowerForAll(ScreenPowerState::POWER_OFF, dmsReason);
607     POWER_HILOGI(
608         FEATURE_SUSPEND, "[UL_POWER] Power off all screens, reason = %{public}u, ret = %{public}d", dmsReason, ret);
609 }
610 
611 bool SuspendController::IsPowerOffInernalScreenOnlyScene(
612     SuspendDeviceType reason, SuspendAction action, bool isScreenOn) const
613 {
614     if (reason == SuspendDeviceType::SUSPEND_DEVICE_REASON_SWITCH && isScreenOn &&
615         action == SuspendAction::ACTION_NONE && stateMachine_->GetExternalScreenNumber() > 0) {
616         return true;
617     }
618     return false;
619 }
620 
621 void SuspendController::ProcessPowerOffInternalScreenOnly(const sptr<PowerMgrService>& pms, SuspendDeviceType reason)
622 {
623     FFRTTask powerOffInternalScreenTask = [this, pms, reason]() {
624         POWER_HILOGI(
625             FEATURE_SUSPEND, "[UL_POWER] Power off internal screen when closing switch is configured as no operation");
626         PowerOffInternalScreen(reason);
627         pms->RefreshActivity(GetTickCount(), UserActivityType::USER_ACTIVITY_TYPE_SWITCH, false);
628     };
629     stateMachine_->SetDelayTimer(0, PowerStateMachine::SET_INTERNAL_SCREEN_STATE_MSG, powerOffInternalScreenTask);
630 }
631 #endif
632 
633 void SuspendController::StartSleepTimer(SuspendDeviceType reason, uint32_t action, uint32_t delay)
634 {
635     if (static_cast<SuspendAction>(action) == SuspendAction::ACTION_AUTO_SUSPEND) {
636         if (stateMachine_->GetSleepTime() < 0) {
637             POWER_HILOGI(FEATURE_SUSPEND, "sleeptime less than zero, no need suspend");
638             return;
639         }
640     }
641 
642     int64_t tick = GetTickCount();
643     int64_t timeout = tick + static_cast<int64_t>(delay);
644     if (timeout < tick) {
645         POWER_HILOGE(FEATURE_SUSPEND, "Sleep timer overflow with tick = %{public}s, delay = %{public}u",
646             std::to_string(tick).c_str(), delay);
647         return;
648     }
649 
650     if ((timeout > sleepTime_) && (sleepTime_ != -1)) {
651         POWER_HILOGI(FEATURE_SUSPEND, "already have a sleep event (%{public}" PRId64 " > %{public}" PRId64 ")", timeout,
652             sleepTime_);
653         return;
654     }
655     ffrtMutexMap_.Lock(TIMER_ID_SLEEP);
656     sleepTime_ = timeout;
657     sleepReason_ = reason;
658     sleepAction_ = action;
659     sleepDuration_ = delay;
660     sleepType_ = action;
661     ffrtMutexMap_.Unlock(TIMER_ID_SLEEP);
662     FFRTTask task = [this, reason, action] {
663         HandleAction(reason, action);
664     };
665 
666     if (ffrtTimer_ != nullptr) {
667         ffrtTimer_->SetTimer(TIMER_ID_SLEEP, task, delay);
668     } else {
669         POWER_HILOGE(FEATURE_SUSPEND, "%{public}s: SetTimer(%{public}u) failed, timer is null", __func__, delay);
670     }
671 }
672 
673 void SuspendController::HandleAction(SuspendDeviceType reason, uint32_t action)
674 {
675     switch (static_cast<SuspendAction>(action)) {
676         case SuspendAction::ACTION_AUTO_SUSPEND:
677             HandleAutoSleep(reason);
678             break;
679         case SuspendAction::ACTION_FORCE_SUSPEND:
680             HandleForceSleep(reason);
681             break;
682         case SuspendAction::ACTION_HIBERNATE:
683             HandleHibernate(reason);
684             break;
685         case SuspendAction::ACTION_SHUTDOWN:
686             HandleShutdown(reason);
687             break;
688         case SuspendAction::ACTION_NONE:
689         default:
690             break;
691     }
692     ffrtMutexMap_.Lock(TIMER_ID_SLEEP);
693     sleepTime_ = -1;
694     sleepAction_ = static_cast<uint32_t>(SuspendAction::ACTION_NONE);
695     ffrtMutexMap_.Unlock(TIMER_ID_SLEEP);
696 }
697 
698 void SuspendController::HandleAutoSleep(SuspendDeviceType reason)
699 {
700     POWER_HILOGI(FEATURE_SUSPEND, "auto suspend by reason=%{public}d", reason);
701 
702     if (stateMachine_ == nullptr) {
703         POWER_HILOGE(FEATURE_SUSPEND, "Can't get PowerStateMachine");
704         return;
705     }
706     bool ret = stateMachine_->SetState(
707         PowerState::SLEEP, stateMachine_->GetReasonBySuspendType(reason));
708     if (ret && stateMachine_->GetState() == PowerState::SLEEP) {
709         POWER_HILOGI(FEATURE_SUSPEND, "State changed, set sleep timer");
710         TriggerSyncSleepCallback(false);
711         SystemSuspendController::GetInstance().Suspend([]() {}, []() {}, false);
712     } else {
713         POWER_HILOGI(FEATURE_SUSPEND, "auto suspend: State change failed");
714     }
715 }
716 
717 void SuspendController::HandleForceSleep(SuspendDeviceType reason)
718 {
719     POWER_HILOGI(FEATURE_SUSPEND, "force suspend by reason=%{public}d", reason);
720     if (stateMachine_ == nullptr) {
721         POWER_HILOGE(FEATURE_SUSPEND, "Can't get PowerStateMachine");
722         return;
723     }
724 
725 #ifdef POWER_MANAGER_ENABLE_FORCE_SLEEP_BROADCAST
726     auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
727     if (pms != nullptr && pms->GetSuspendController() != nullptr) {
728         pms->GetSuspendController()->SetForceSleepingFlag(true);
729         POWER_HILOGI(FEATURE_SUSPEND, "Set flag of force sleeping to true");
730     } else {
731         POWER_HILOGE(FEATURE_SUSPEND, "Failed to set flag of force sleeping, pms or suspendController is nullptr");
732     }
733 #endif
734     bool ret = stateMachine_->SetState(PowerState::SLEEP,
735         stateMachine_->GetReasonBySuspendType(reason), true);
736     if (ret) {
737         POWER_HILOGI(FEATURE_SUSPEND, "State changed, system suspend");
738         onForceSleep = true;
739         TriggerSyncSleepCallback(false);
740 
741         FFRTTask task = [this, reason] {
742             if (stateMachine_->GetState() == PowerState::SLEEP) {
743                 SystemSuspendController::GetInstance().Suspend([]() {}, []() {}, true);
744             } else {
745                 POWER_HILOGE(FEATURE_SUSPEND, "Don't suspend, power state is not sleep");
746             }
747         };
748         if (ffrtTimer_ != nullptr) {
749             ffrtTimer_->SetTimer(TIMER_ID_SLEEP, task, FORCE_SLEEP_DELAY_MS);
750         } else {
751             POWER_HILOGE(FEATURE_SUSPEND, "%{public}s: SetTimer(%{public}d) failed, timer is null",
752                 __func__, FORCE_SLEEP_DELAY_MS);
753         }
754     } else {
755         POWER_HILOGI(FEATURE_SUSPEND, "force suspend: State change failed");
756     }
757 }
758 
759 void SuspendController::HandleHibernate(SuspendDeviceType reason)
760 {
761     POWER_HILOGI(FEATURE_SUSPEND, "force suspend by reason=%{public}d", reason);
762     if (stateMachine_ == nullptr) {
763         POWER_HILOGE(FEATURE_SUSPEND, "Can't get PowerStateMachine");
764         return;
765     }
766     bool ret = stateMachine_->SetState(
767         PowerState::HIBERNATE, stateMachine_->GetReasonBySuspendType(reason), true);
768     if (ret) {
769         POWER_HILOGI(FEATURE_SUSPEND, "State changed, call hibernate");
770     } else {
771         POWER_HILOGI(FEATURE_SUSPEND, "Hibernate: State change failed");
772     }
773 }
774 
775 void SuspendController::HandleShutdown(SuspendDeviceType reason)
776 {
777     POWER_HILOGI(FEATURE_SUSPEND, "shutdown by reason=%{public}d", reason);
778     shutdownController_->Shutdown(std::to_string(static_cast<uint32_t>(reason)));
779 }
780 
781 void SuspendController::Reset()
782 {
783     ffrtTimer_.reset();
784 }
785 
786 #ifdef POWER_MANAGER_WAKEUP_ACTION
787 bool SuspendController::GetLowCapacityPowerKeyFlag()
788 {
789     return isLowCapacityPowerKey_;
790 }
791 
792 void SuspendController::SetLowCapacityPowerKeyFlag(bool flag)
793 {
794     isLowCapacityPowerKey_ = flag;
795 }
796 #endif
797 
798 const std::shared_ptr<SuspendMonitor> SuspendMonitor::CreateMonitor(SuspendSource& source)
799 {
800     SuspendDeviceType reason = source.GetReason();
801     std::shared_ptr<SuspendMonitor> monitor = nullptr;
802     switch (reason) {
803         case SuspendDeviceType::SUSPEND_DEVICE_REASON_POWER_KEY:
804             monitor = std::static_pointer_cast<SuspendMonitor>(std::make_shared<PowerKeySuspendMonitor>(source));
805             break;
806         case SuspendDeviceType::SUSPEND_DEVICE_REASON_TIMEOUT:
807             monitor = std::static_pointer_cast<SuspendMonitor>(std::make_shared<TimeoutSuspendMonitor>(source));
808             break;
809         case SuspendDeviceType::SUSPEND_DEVICE_REASON_LID:
810             monitor = std::static_pointer_cast<SuspendMonitor>(std::make_shared<LidSuspendMonitor>(source));
811             break;
812         case SuspendDeviceType::SUSPEND_DEVICE_REASON_SWITCH:
813             monitor = std::static_pointer_cast<SuspendMonitor>(std::make_shared<SwitchSuspendMonitor>(source));
814             break;
815         case SuspendDeviceType::SUSPEND_DEVICE_REASON_TP_COVER:
816             monitor = std::static_pointer_cast<SuspendMonitor>(std::make_shared<TPCoverSuspendMonitor>(source));
817             break;
818         default:
819             POWER_HILOGE(FEATURE_SUSPEND, "CreateMonitor : Invalid reason=%{public}d", reason);
820             break;
821     }
822     return monitor;
823 }
824 
825 /** PowerKeySuspendMonitor Implement */
826 bool PowerKeySuspendMonitor::Init()
827 {
828 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
829     if (powerkeyReleaseId_ >= 0) {
830         return true;
831     }
832     std::shared_ptr<OHOS::MMI::KeyOption> keyOption = std::make_shared<OHOS::MMI::KeyOption>();
833     std::set<int32_t> preKeys;
834 
835     keyOption.reset();
836     keyOption = std::make_shared<OHOS::MMI::KeyOption>();
837     keyOption->SetPreKeys(preKeys);
838     keyOption->SetFinalKey(OHOS::MMI::KeyEvent::KEYCODE_POWER);
839     keyOption->SetFinalKeyDown(false);
840     keyOption->SetFinalKeyDownDuration(0);
841     auto inputManager = InputManager::GetInstance();
842     if (!inputManager) {
843         POWER_HILOGE(FEATURE_SUSPEND, "PowerKeySuspendMonitorInit inputManager is null");
844         return false;
845     }
846     std::weak_ptr<PowerKeySuspendMonitor> weak = weak_from_this();
847     powerkeyReleaseId_ = inputManager->SubscribeKeyEvent(
848         keyOption, [weak](std::shared_ptr<OHOS::MMI::KeyEvent> keyEvent) {
849             std::shared_ptr<PowerKeySuspendMonitor> strong = weak.lock();
850             if (!strong) {
851                 POWER_HILOGE(FEATURE_SUSPEND, "[UL_POWER] PowerKeySuspendMonitor is invaild, return");
852                 return;
853             }
854 
855             strong->ReceivePowerkeyCallback(keyEvent);
856         });
857     POWER_HILOGI(FEATURE_SUSPEND, "powerkeyReleaseId_=%{public}d", powerkeyReleaseId_);
858     return powerkeyReleaseId_ >= 0 ? true : false;
859 #else
860     return false;
861 #endif
862 }
863 
864 void PowerKeySuspendMonitor::ReceivePowerkeyCallback(std::shared_ptr<OHOS::MMI::KeyEvent> keyEvent)
865 {
866     POWER_HILOGI(FEATURE_SUSPEND, "[UL_POWER] Received powerkey up");
867 
868     auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
869     if (pms == nullptr) {
870         POWER_HILOGE(FEATURE_SUSPEND, "[UL_POWER] PowerMgrService is nullptr");
871         return;
872     }
873     std::shared_ptr<SuspendController> suspendController = pms->GetSuspendController();
874     if (suspendController == nullptr) {
875         POWER_HILOGE(FEATURE_SUSPEND, "[UL_POWER] suspendController is nullptr");
876         return;
877     }
878 
879 #if POWER_MANAGER_WAKEUP_ACTION
880     bool isLowCapacityPowerKey = suspendController->GetLowCapacityPowerKeyFlag();
881     if (isLowCapacityPowerKey) {
882         POWER_HILOGI(FEATURE_SUSPEND, "[UL_POWER] skip low capacity powerkey up");
883         suspendController->SetLowCapacityPowerKeyFlag(false);
884         return;
885     }
886 #endif
887 
888     static int64_t lastPowerkeyUpTime = 0;
889     int64_t currTime = GetTickCount();
890     if (lastPowerkeyUpTime != 0 && currTime - lastPowerkeyUpTime < POWERKEY_MIN_INTERVAL) {
891         POWER_HILOGI(FEATURE_WAKEUP, "[UL_POWER] Last powerkey up within 350ms, skip. "
892             "%{public}" PRId64 ", %{public}" PRId64, currTime, lastPowerkeyUpTime);
893         return;
894     }
895     lastPowerkeyUpTime = currTime;
896 
897     if (suspendController->GetPowerkeyDownWhenScreenOff()) {
898         POWER_HILOGI(FEATURE_SUSPEND,
899             "[UL_POWER] The powerkey was pressed when screenoff, ignore this powerkey up event.");
900         return;
901     }
902     auto powerkeyScreenOffTask = [*this]() mutable {
903         Notify();
904         powerkeyScreenOff_ = false;
905         EndPowerkeyScreenOff();
906     };
907     BeginPowerkeyScreenOff();
908     powerkeyScreenOff_ = true;
909     ffrt::submit(powerkeyScreenOffTask, {}, {&powerkeyScreenOff_});
910     POWER_HILOGI(FEATURE_SUSPEND, "[UL_POWER] submitted screen off ffrt task");
911 }
912 
913 void PowerKeySuspendMonitor::BeginPowerkeyScreenOff() const
914 {
915     auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
916     if (pms == nullptr) {
917         return;
918     }
919     auto stateMachine = pms->GetPowerStateMachine();
920     if (stateMachine == nullptr) {
921         return;
922     }
923     auto stateAction = stateMachine->GetStateAction();
924     if (stateAction == nullptr) {
925         return;
926     }
927     stateAction->BeginPowerkeyScreenOff();
928 }
929 
930 void PowerKeySuspendMonitor::EndPowerkeyScreenOff() const
931 {
932     auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
933     if (pms == nullptr) {
934         return;
935     }
936     auto stateMachine = pms->GetPowerStateMachine();
937     if (stateMachine == nullptr) {
938         return;
939     }
940     auto stateAction = stateMachine->GetStateAction();
941     if (stateAction == nullptr) {
942         return;
943     }
944     stateAction->EndPowerkeyScreenOff();
945 }
946 
947 void PowerKeySuspendMonitor::Cancel()
948 {
949 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
950     auto inputManager = InputManager::GetInstance();
951     if (!inputManager) {
952         POWER_HILOGE(FEATURE_SUSPEND, "PowerKeySuspendMonitorCancel inputManager is null");
953         return;
954     }
955     if (powerkeyReleaseId_ >= 0) {
956         POWER_HILOGI(FEATURE_SUSPEND, "UnsubscribeKeyEvent: PowerKeySuspendMonitor");
957         inputManager->UnsubscribeKeyEvent(powerkeyReleaseId_);
958         powerkeyReleaseId_ = -1;
959     }
960 #endif
961 }
962 
963 /** Timeout Implement */
964 bool TimeoutSuspendMonitor::Init()
965 {
966     return true;
967 }
968 
969 void TimeoutSuspendMonitor::Cancel() {}
970 
971 void TimeoutSuspendMonitor::HandleEvent()
972 {
973     POWER_HILOGI(FEATURE_INPUT, "TimeoutSuspendMonitor HandleEvent.");
974     Notify();
975 }
976 
977 /** LidSuspendMonitor Implement */
978 
979 bool LidSuspendMonitor::Init()
980 {
981     return true;
982 }
983 
984 void LidSuspendMonitor::Cancel() {}
985 
986 /** SwitchSuspendMonitor Implement */
987 
988 bool SwitchSuspendMonitor::Init()
989 {
990     return true;
991 }
992 
993 void SwitchSuspendMonitor::Cancel() {}
994 
995 /** TPCoverSuspendMonitor Implement */
996 
997 bool TPCoverSuspendMonitor::Init()
998 {
999 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
1000     if (TPCoverReleaseId_ >= 0) {
1001         return true;
1002     }
1003     std::shared_ptr<OHOS::MMI::KeyOption> keyOption = std::make_shared<OHOS::MMI::KeyOption>();
1004     std::set<int32_t> preKeys;
1005     keyOption->SetPreKeys(preKeys);
1006     keyOption->SetFinalKey(OHOS::MMI::KeyEvent::KEYCODE_SLEEP);
1007     keyOption->SetFinalKeyDownDuration(0);
1008     auto inputManager = InputManager::GetInstance();
1009     if (!inputManager) {
1010         POWER_HILOGE(FEATURE_SUSPEND, "TPCoverSuspendMonitorInit inputManager is null");
1011         return false;
1012     }
1013     std::weak_ptr<TPCoverSuspendMonitor> weak = weak_from_this();
1014     TPCoverReleaseId_ = inputManager->SubscribeKeyEvent(
1015         keyOption, [weak](std::shared_ptr<OHOS::MMI::KeyEvent> keyEvent) {
1016             std::shared_ptr<TPCoverSuspendMonitor> strong = weak.lock();
1017             if (!strong) {
1018                 POWER_HILOGE(FEATURE_SUSPEND, "[UL_POWER] TPCoverSuspendMonitor is invaild, return");
1019                 return;
1020             }
1021             POWER_HILOGI(FEATURE_SUSPEND, "[UL_POWER] Received TPCover event");
1022             strong->Notify();
1023         });
1024     POWER_HILOGI(FEATURE_SUSPEND, "TPCoverReleaseId_=%{public}d", TPCoverReleaseId_);
1025     return TPCoverReleaseId_ >= 0 ? true : false;
1026 #else
1027     return false;
1028 #endif
1029 }
1030 
1031 void TPCoverSuspendMonitor::Cancel()
1032 {
1033 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
1034     auto inputManager = InputManager::GetInstance();
1035     if (!inputManager) {
1036         POWER_HILOGE(FEATURE_SUSPEND, "TPCoverSuspendMonitorCancel inputManager is null");
1037         return;
1038     }
1039     if (TPCoverReleaseId_ >= 0) {
1040         POWER_HILOGI(FEATURE_SUSPEND, "UnsubscribeKeyEvent: TPCoverSuspendMonitor");
1041         inputManager->UnsubscribeKeyEvent(TPCoverReleaseId_);
1042         TPCoverReleaseId_ = -1;
1043     }
1044 #endif
1045 }
1046 } // namespace PowerMgr
1047 } // namespace OHOS
1048