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