1 /*
2 * Copyright (c) 2021-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 "power_mgr_service.h"
17
18 #include <datetime_ex.h>
19 #include <file_ex.h>
20 #include <hisysevent.h>
21 #include <if_system_ability_manager.h>
22 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
23 #include <input_manager.h>
24 #endif
25 #include <ipc_skeleton.h>
26 #include <iservice_registry.h>
27 #include <securec.h>
28 #include <string_ex.h>
29 #include <system_ability_definition.h>
30 #include <sys_mgr_client.h>
31 #include <bundle_mgr_client.h>
32 #include <unistd.h>
33
34 #include "ability_connect_callback_stub.h"
35 #include "ability_manager_client.h"
36 #include "ffrt_utils.h"
37 #include "permission.h"
38 #include "power_common.h"
39 #include "power_mgr_dumper.h"
40 #include "power_vibrator.h"
41 #include "sysparam.h"
42 #include "system_suspend_controller.h"
43 #include "xcollie/watchdog.h"
44
45 #include "errors.h"
46 #ifdef HAS_DEVICE_STANDBY_PART
47 #include "standby_service_client.h"
48 #endif
49
50 using namespace OHOS::AppExecFwk;
51 using namespace OHOS::AAFwk;
52
53 namespace OHOS {
54 namespace PowerMgr {
55 namespace {
56 const std::string POWERMGR_SERVICE_NAME = "PowerMgrService";
57 const std::string REASON_POWER_KEY = "power_key";
58 static std::string g_wakeupReason = "";
59 const std::string POWER_VIBRATOR_CONFIG_FILE = "etc/power_config/power_vibrator.json";
60 const std::string VENDOR_POWER_VIBRATOR_CONFIG_FILE = "/vendor/etc/power_config/power_vibrator.json";
61 const std::string SYSTEM_POWER_VIBRATOR_CONFIG_FILE = "/system/etc/power_config/power_vibrator.json";
62 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
63 const bool G_REGISTER_RESULT = SystemAbility::MakeAndRegisterAbility(pms.GetRefPtr());
64 SysParam::BootCompletedCallback g_bootCompletedCallback;
65 bool g_inLidMode = false;
66 } // namespace
67
68 std::atomic_bool PowerMgrService::isBootCompleted_ = false;
69 using namespace MMI;
70
PowerMgrService()71 PowerMgrService::PowerMgrService() : SystemAbility(POWER_MANAGER_SERVICE_ID, true) {}
72
~PowerMgrService()73 PowerMgrService::~PowerMgrService() {}
74
OnStart()75 void PowerMgrService::OnStart()
76 {
77 POWER_HILOGD(COMP_SVC, "Power Management startup");
78 if (ready_) {
79 POWER_HILOGW(COMP_SVC, "OnStart is ready, nothing to do");
80 return;
81 }
82 if (!Init()) {
83 POWER_HILOGE(COMP_SVC, "Call init fail");
84 return;
85 }
86 AddSystemAbilityListener(DEVICE_STANDBY_SERVICE_SYSTEM_ABILITY_ID);
87 AddSystemAbilityListener(DISPLAY_MANAGER_SERVICE_ID);
88 SystemSuspendController::GetInstance().RegisterHdiStatusListener();
89 if (!Publish(DelayedSpSingleton<PowerMgrService>::GetInstance())) {
90 POWER_HILOGE(COMP_SVC, "Register to system ability manager failed");
91 return;
92 }
93 ready_ = true;
94 POWER_HILOGI(COMP_SVC, "Add system ability success");
95 }
96
Init()97 bool PowerMgrService::Init()
98 {
99 POWER_HILOGI(COMP_SVC, "Init start");
100 if (!runningLockMgr_) {
101 runningLockMgr_ = std::make_shared<RunningLockMgr>(pms);
102 }
103 if (!runningLockMgr_->Init()) {
104 POWER_HILOGE(COMP_SVC, "Running lock init fail");
105 return false;
106 }
107 if (!shutdownController_) {
108 shutdownController_ = std::make_shared<ShutdownController>();
109 }
110 if (!PowerStateMachineInit()) {
111 POWER_HILOGE(COMP_SVC, "Power state machine init fail");
112 }
113
114 POWER_HILOGI(COMP_SVC, "Init success");
115 return true;
116 }
117
RegisterBootCompletedCallback()118 void PowerMgrService::RegisterBootCompletedCallback()
119 {
120 g_bootCompletedCallback = []() {
121 POWER_HILOGI(COMP_SVC, "BootCompletedCallback triggered");
122 auto power = DelayedSpSingleton<PowerMgrService>::GetInstance();
123 if (power == nullptr) {
124 POWER_HILOGI(COMP_SVC, "get PowerMgrService fail");
125 return;
126 }
127 if (DelayedSpSingleton<PowerSaveMode>::GetInstance()) {
128 auto& powerModeModule = power->GetPowerModeModule();
129 powerModeModule.EnableMode(powerModeModule.GetModeItem(), true);
130 }
131 auto powerStateMachine = power->GetPowerStateMachine();
132 powerStateMachine->RegisterDisplayOffTimeObserver();
133 powerStateMachine->InitState();
134 #ifdef POWER_MANAGER_POWER_DIALOG
135 power->GetShutdownDialog().LoadDialogConfig();
136 power->GetShutdownDialog().KeyMonitorInit();
137 #endif
138 #ifndef CONFIG_FACTORY_MODE
139 power->HallSensorSubscriberInit();
140 POWER_HILOGI(COMP_SVC, "Subscribe Hall sensor");
141 #else
142 POWER_HILOGI(COMP_SVC, "Disabled Hall sensor");
143 #endif
144 power->SwitchSubscriberInit();
145 power->InputMonitorInit();
146 power->SuspendControllerInit();
147 power->WakeupControllerInit();
148 #ifdef POWER_MANAGER_WAKEUP_ACTION
149 power->WakeupActionControllerInit();
150 #endif
151 power->VibratorInit();
152 isBootCompleted_ = true;
153 };
154 WakeupRunningLock::Create();
155 SysParam::RegisterBootCompletedCallback(g_bootCompletedCallback);
156 }
157
PowerStateMachineInit()158 bool PowerMgrService::PowerStateMachineInit()
159 {
160 if (powerStateMachine_ == nullptr) {
161 powerStateMachine_ = std::make_shared<PowerStateMachine>(pms);
162 if (!(powerStateMachine_->Init())) {
163 POWER_HILOGE(COMP_SVC, "Power state machine start fail!");
164 return false;
165 }
166 }
167 if (powerMgrNotify_ == nullptr) {
168 powerMgrNotify_ = std::make_shared<PowerMgrNotify>();
169 powerMgrNotify_->RegisterPublishEvents();
170 }
171 return true;
172 }
173
KeyMonitorCancel()174 void PowerMgrService::KeyMonitorCancel()
175 {
176 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
177 POWER_HILOGI(FEATURE_INPUT, "Unsubscribe key information");
178 InputManager* inputManager = InputManager::GetInstance();
179 if (inputManager == nullptr) {
180 POWER_HILOGI(FEATURE_INPUT, "InputManager is null");
181 return;
182 }
183 shutdownDialog_.KeyMonitorCancel();
184 if (doubleClickId_ >= 0) {
185 inputManager->UnsubscribeKeyEvent(doubleClickId_);
186 }
187 if (monitorId_ >= 0) {
188 inputManager->RemoveMonitor(monitorId_);
189 }
190 #endif
191 }
192
HallSensorSubscriberInit()193 void PowerMgrService::HallSensorSubscriberInit()
194 {
195 #ifdef HAS_SENSORS_SENSOR_PART
196 if (!IsSupportSensor(SENSOR_TYPE_ID_HALL)) {
197 POWER_HILOGW(FEATURE_INPUT, "SENSOR_TYPE_ID_HALL sensor not support");
198 return;
199 }
200 if (strcpy_s(sensorUser_.name, sizeof(sensorUser_.name), "PowerManager") != EOK) {
201 POWER_HILOGW(FEATURE_INPUT, "strcpy_s error");
202 return;
203 }
204 sensorUser_.userData = nullptr;
205 sensorUser_.callback = &HallSensorCallback;
206 SubscribeSensor(SENSOR_TYPE_ID_HALL, &sensorUser_);
207 SetBatch(SENSOR_TYPE_ID_HALL, &sensorUser_, HALL_SAMPLING_RATE, HALL_REPORT_INTERVAL);
208 ActivateSensor(SENSOR_TYPE_ID_HALL, &sensorUser_);
209 #endif
210 }
211
212 #ifdef HAS_SENSORS_SENSOR_PART
IsSupportSensor(SensorTypeId typeId)213 bool PowerMgrService::IsSupportSensor(SensorTypeId typeId)
214 {
215 bool isSupport = false;
216 SensorInfo* sensorInfo = nullptr;
217 int32_t count;
218 int32_t ret = GetAllSensors(&sensorInfo, &count);
219 if (ret != 0 || sensorInfo == nullptr) {
220 POWER_HILOGW(FEATURE_INPUT, "Get sensors fail, ret=%{public}d", ret);
221 return isSupport;
222 }
223 for (int32_t i = 0; i < count; i++) {
224 if (sensorInfo[i].sensorTypeId == typeId) {
225 isSupport = true;
226 break;
227 }
228 }
229 return isSupport;
230 }
231
HallSensorCallback(SensorEvent * event)232 void PowerMgrService::HallSensorCallback(SensorEvent* event)
233 {
234 if (event == nullptr || event->sensorTypeId != SENSOR_TYPE_ID_HALL || event->data == nullptr) {
235 POWER_HILOGW(FEATURE_INPUT, "Hall sensor event is invalid");
236 return;
237 }
238
239 std::shared_ptr<SuspendController> suspendController = pms->GetSuspendController();
240 if (suspendController == nullptr) {
241 POWER_HILOGE(FEATURE_INPUT, "get suspendController instance error");
242 return;
243 }
244
245 std::shared_ptr<WakeupController> wakeupController = pms->GetWakeupController();
246 if (wakeupController == nullptr) {
247 POWER_HILOGE(FEATURE_INPUT, "wakeupController is not init");
248 return;
249 }
250 const uint32_t LID_CLOSED_HALL_FLAG = 0x1;
251 auto data = reinterpret_cast<HallData*>(event->data);
252 auto status = static_cast<uint32_t>(data->status);
253
254 if (status & LID_CLOSED_HALL_FLAG) {
255 POWER_HILOGI(FEATURE_SUSPEND, "Lid close event received, begin to suspend");
256 g_inLidMode = true;
257 SuspendDeviceType reason = SuspendDeviceType::SUSPEND_DEVICE_REASON_LID;
258 suspendController->ExecSuspendMonitorByReason(reason);
259 } else {
260 if (!g_inLidMode) {
261 return;
262 }
263 POWER_HILOGI(FEATURE_WAKEUP, "Lid open event received, begin to wakeup");
264 g_inLidMode = false;
265 WakeupDeviceType reason = WakeupDeviceType::WAKEUP_DEVICE_LID;
266 wakeupController->ExecWakeupMonitorByReason(reason);
267 }
268 }
269 #endif
270
HallSensorSubscriberCancel()271 void PowerMgrService::HallSensorSubscriberCancel()
272 {
273 #ifdef HAS_SENSORS_SENSOR_PART
274 if (IsSupportSensor(SENSOR_TYPE_ID_HALL)) {
275 DeactivateSensor(SENSOR_TYPE_ID_HALL, &sensorUser_);
276 UnsubscribeSensor(SENSOR_TYPE_ID_HALL, &sensorUser_);
277 }
278 #endif
279 }
280
CheckDialogFlag()281 bool PowerMgrService::CheckDialogFlag()
282 {
283 bool isLongPress = shutdownDialog_.IsLongPress();
284 if (isLongPress) {
285 shutdownDialog_.ResetLongPressFlag();
286 }
287 return true;
288 }
289
CheckDialogAndShuttingDown()290 bool PowerMgrService::CheckDialogAndShuttingDown()
291 {
292 bool isShuttingDown = shutdownController_->IsShuttingDown();
293 bool isLongPress = shutdownDialog_.IsLongPress();
294 if (isLongPress || isShuttingDown) {
295 POWER_HILOGW(
296 FEATURE_INPUT, "isLongPress: %{public}d, isShuttingDown: %{public}d", isLongPress, isShuttingDown);
297 shutdownDialog_.ResetLongPressFlag();
298 return true;
299 }
300 return false;
301 }
302
SwitchSubscriberInit()303 void PowerMgrService::SwitchSubscriberInit()
304 {
305 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
306 POWER_HILOGW(FEATURE_INPUT, "Initialize the subscription switch");
307 switchId_ =
308 InputManager::GetInstance()->SubscribeSwitchEvent([this](std::shared_ptr<OHOS::MMI::SwitchEvent> switchEvent) {
309 POWER_HILOGI(FEATURE_WAKEUP, "switch event received");
310 std::shared_ptr<SuspendController> suspendController = pms->GetSuspendController();
311 if (suspendController == nullptr) {
312 POWER_HILOGE(FEATURE_INPUT, "get suspendController instance error");
313 return;
314 }
315 std::shared_ptr<WakeupController> wakeupController = pms->GetWakeupController();
316 if (wakeupController == nullptr) {
317 POWER_HILOGE(FEATURE_INPUT, "wakeupController is not init");
318 return;
319 }
320 if (switchEvent->GetSwitchValue() == SwitchEvent::SWITCH_OFF) {
321 POWER_HILOGI(FEATURE_SUSPEND, "Switch close event received, begin to suspend");
322 SuspendDeviceType reason = SuspendDeviceType::SUSPEND_DEVICE_REASON_SWITCH;
323 suspendController->ExecSuspendMonitorByReason(reason);
324 } else {
325 POWER_HILOGI(FEATURE_WAKEUP, "Switch open event received, begin to wakeup");
326 WakeupDeviceType reason = WakeupDeviceType::WAKEUP_DEVICE_SWITCH;
327 wakeupController->ExecWakeupMonitorByReason(reason);
328 }
329 });
330 #endif
331 }
332
SwitchSubscriberCancel()333 void PowerMgrService::SwitchSubscriberCancel()
334 {
335 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
336 POWER_HILOGI(FEATURE_INPUT, "Unsubscribe switch information");
337 if (switchId_ >= 0) {
338 InputManager::GetInstance()->UnsubscribeSwitchEvent(switchId_);
339 switchId_ = -1;
340 }
341 #endif
342 }
343
InputMonitorInit()344 void PowerMgrService::InputMonitorInit()
345 {
346 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
347 POWER_HILOGI(FEATURE_INPUT, "PowerMgr service input monitor init");
348 std::shared_ptr<PowerMgrInputMonitor> inputMonitor = std::make_shared<PowerMgrInputMonitor>();
349 if (inputMonitorId_ < 0) {
350 inputMonitorId_ =
351 InputManager::GetInstance()->AddMonitor(std::static_pointer_cast<IInputEventConsumer>(inputMonitor));
352 }
353 #endif
354 }
355
InputMonitorCancel()356 void PowerMgrService::InputMonitorCancel()
357 {
358 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
359 POWER_HILOGI(FEATURE_INPUT, "PowerMgr service input monitor cancel");
360 InputManager* inputManager = InputManager::GetInstance();
361 if (inputMonitorId_ >= 0) {
362 inputManager->RemoveMonitor(inputMonitorId_);
363 inputMonitorId_ = -1;
364 }
365 #endif
366 }
367
HandleKeyEvent(int32_t keyCode)368 void PowerMgrService::HandleKeyEvent(int32_t keyCode)
369 {
370 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
371 POWER_HILOGD(FEATURE_INPUT, "keyCode: %{public}d", keyCode);
372 int64_t now = static_cast<int64_t>(time(nullptr));
373 if (IsScreenOn()) {
374 this->RefreshActivity(now, UserActivityType::USER_ACTIVITY_TYPE_BUTTON, false);
375 } else {
376 if (keyCode == KeyEvent::KEYCODE_F1) {
377 POWER_HILOGI(FEATURE_WAKEUP, "Wakeup by double click");
378 std::string reason = "double click";
379 reason.append(std::to_string(keyCode));
380 this->WakeupDevice(now, WakeupDeviceType::WAKEUP_DEVICE_DOUBLE_CLICK, reason);
381 } else if (keyCode >= KeyEvent::KEYCODE_0 && keyCode <= KeyEvent::KEYCODE_NUMPAD_RIGHT_PAREN) {
382 POWER_HILOGI(FEATURE_WAKEUP, "Wakeup by keyboard");
383 std::string reason = "keyboard:";
384 reason.append(std::to_string(keyCode));
385 this->WakeupDevice(now, WakeupDeviceType::WAKEUP_DEVICE_KEYBOARD, reason);
386 }
387 }
388 #endif
389 }
390
HandlePointEvent(int32_t type)391 void PowerMgrService::HandlePointEvent(int32_t type)
392 {
393 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
394 POWER_HILOGD(FEATURE_INPUT, "type: %{public}d", type);
395 int64_t now = static_cast<int64_t>(time(nullptr));
396 if (this->IsScreenOn()) {
397 this->RefreshActivity(now, UserActivityType::USER_ACTIVITY_TYPE_ATTENTION, false);
398 } else {
399 if (type == PointerEvent::SOURCE_TYPE_MOUSE) {
400 std::string reason = "mouse click";
401 POWER_HILOGI(FEATURE_WAKEUP, "Wakeup by mouse");
402 this->WakeupDevice(now, WakeupDeviceType::WAKEUP_DEVICE_MOUSE, reason);
403 }
404 }
405 #endif
406 }
407
OnStop()408 void PowerMgrService::OnStop()
409 {
410 POWER_HILOGW(COMP_SVC, "Stop service");
411 if (!ready_) {
412 return;
413 }
414 powerStateMachine_->CancelDelayTimer(PowerStateMachine::CHECK_USER_ACTIVITY_TIMEOUT_MSG);
415 powerStateMachine_->CancelDelayTimer(PowerStateMachine::CHECK_USER_ACTIVITY_OFF_TIMEOUT_MSG);
416 powerStateMachine_->UnregisterDisplayOffTimeObserver();
417 if (suspendController_) {
418 suspendController_->StopSleep();
419 }
420
421 SystemSuspendController::GetInstance().UnRegisterPowerHdiCallback();
422
423 KeyMonitorCancel();
424 HallSensorSubscriberCancel();
425 SwitchSubscriberCancel();
426 InputMonitorCancel();
427 ready_ = false;
428 isBootCompleted_ = false;
429 RemoveSystemAbilityListener(DEVICE_STANDBY_SERVICE_SYSTEM_ABILITY_ID);
430 RemoveSystemAbilityListener(DISPLAY_MANAGER_SERVICE_ID);
431 }
432
Reset()433 void PowerMgrService::Reset()
434 {
435 POWER_HILOGW(COMP_SVC, "start destruct ffrt_queue");
436 powerStateMachine_->Reset();
437 wakeupController_->Reset();
438 suspendController_->Reset();
439 }
440
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)441 void PowerMgrService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
442 {
443 POWER_HILOGI(COMP_SVC, "systemAbilityId=%{public}d, deviceId=%{private}s", systemAbilityId, deviceId.c_str());
444 if (systemAbilityId == DEVICE_STANDBY_SERVICE_SYSTEM_ABILITY_ID) {
445 std::lock_guard lock(lockMutex_);
446 runningLockMgr_->ResetRunningLocks();
447 }
448 }
449
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)450 void PowerMgrService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
451 {
452 POWER_HILOGI(COMP_SVC, "systemAbilityId=%{public}d, deviceId=%{private}s Add",
453 systemAbilityId, deviceId.c_str());
454 if (systemAbilityId == DISPLAY_MANAGER_SERVICE_ID) {
455 RegisterBootCompletedCallback();
456 }
457 }
458
Dump(int32_t fd,const std::vector<std::u16string> & args)459 int32_t PowerMgrService::Dump(int32_t fd, const std::vector<std::u16string>& args)
460 {
461 if (!isBootCompleted_) {
462 return ERR_NO_INIT;
463 }
464 if (!Permission::IsSystem()) {
465 return ERR_PERMISSION_DENIED;
466 }
467 std::vector<std::string> argsInStr;
468 std::transform(args.begin(), args.end(), std::back_inserter(argsInStr), [](const std::u16string& arg) {
469 std::string ret = Str16ToStr8(arg);
470 POWER_HILOGI(COMP_SVC, "arg: %{public}s", ret.c_str());
471 return ret;
472 });
473 std::string result;
474 PowerMgrDumper::Dump(argsInStr, result);
475 if (!SaveStringToFd(fd, result)) {
476 POWER_HILOGE(COMP_SVC, "Dump failed, save to fd failed.");
477 POWER_HILOGE(COMP_SVC, "Dump Info:\n");
478 POWER_HILOGE(COMP_SVC, "%{public}s", result.c_str());
479 return ERR_OK;
480 }
481 return ERR_OK;
482 }
483
RebootDevice(const std::string & reason)484 PowerErrors PowerMgrService::RebootDevice(const std::string& reason)
485 {
486 if (!Permission::IsSystem()) {
487 return PowerErrors::ERR_SYSTEM_API_DENIED;
488 }
489 return RebootDeviceForDeprecated(reason);
490 }
491
RebootDeviceForDeprecated(const std::string & reason)492 PowerErrors PowerMgrService::RebootDeviceForDeprecated(const std::string& reason)
493 {
494 std::lock_guard lock(shutdownMutex_);
495 pid_t pid = IPCSkeleton::GetCallingPid();
496 auto uid = IPCSkeleton::GetCallingUid();
497 if (!Permission::IsPermissionGranted("ohos.permission.REBOOT")) {
498 return PowerErrors::ERR_PERMISSION_DENIED;
499 }
500 POWER_HILOGI(FEATURE_SHUTDOWN, "Cancel auto sleep timer");
501 powerStateMachine_->CancelDelayTimer(PowerStateMachine::CHECK_USER_ACTIVITY_TIMEOUT_MSG);
502 powerStateMachine_->CancelDelayTimer(PowerStateMachine::CHECK_USER_ACTIVITY_OFF_TIMEOUT_MSG);
503 if (suspendController_) {
504 suspendController_->StopSleep();
505 }
506 POWER_HILOGI(FEATURE_SHUTDOWN, "Do reboot, called pid: %{public}d, uid: %{public}d", pid, uid);
507 shutdownController_->Reboot(reason);
508 return PowerErrors::ERR_OK;
509 }
510
ShutDownDevice(const std::string & reason)511 PowerErrors PowerMgrService::ShutDownDevice(const std::string& reason)
512 {
513 auto now = static_cast<int64_t>(time(nullptr));
514 if (!Permission::IsSystem()) {
515 return PowerErrors::ERR_SYSTEM_API_DENIED;
516 }
517 if (!Permission::IsPermissionGranted("ohos.permission.REBOOT")) {
518 return PowerErrors::ERR_PERMISSION_DENIED;
519 }
520 if (reason == SHUTDOWN_FAST_REASON) {
521 g_wakeupReason = reason;
522 POWER_HILOGD(FEATURE_SHUTDOWN, "Calling Fast ShutDownDevice success");
523 return SuspendDevice(now, SuspendDeviceType::SUSPEND_DEVICE_REASON_STR, true);
524 }
525 g_wakeupReason = "";
526 std::lock_guard lock(shutdownMutex_);
527 pid_t pid = IPCSkeleton::GetCallingPid();
528 auto uid = IPCSkeleton::GetCallingUid();
529 POWER_HILOGI(FEATURE_SHUTDOWN, "Cancel auto sleep timer");
530 powerStateMachine_->CancelDelayTimer(PowerStateMachine::CHECK_USER_ACTIVITY_TIMEOUT_MSG);
531 powerStateMachine_->CancelDelayTimer(PowerStateMachine::CHECK_USER_ACTIVITY_OFF_TIMEOUT_MSG);
532 if (suspendController_) {
533 suspendController_->StopSleep();
534 }
535
536 POWER_HILOGI(FEATURE_SHUTDOWN, "Do shutdown, called pid: %{public}d, uid: %{public}d", pid, uid);
537 shutdownController_->Shutdown(reason);
538 return PowerErrors::ERR_OK;
539 }
540
SuspendDevice(int64_t callTimeMs,SuspendDeviceType reason,bool suspendImmed)541 PowerErrors PowerMgrService::SuspendDevice(int64_t callTimeMs, SuspendDeviceType reason, bool suspendImmed)
542 {
543 std::lock_guard lock(suspendMutex_);
544 pid_t pid = IPCSkeleton::GetCallingPid();
545 auto uid = IPCSkeleton::GetCallingUid();
546 if (!Permission::IsSystem()) {
547 return PowerErrors::ERR_SYSTEM_API_DENIED;
548 }
549 if (shutdownController_->IsShuttingDown()) {
550 POWER_HILOGW(FEATURE_SUSPEND, "System is shutting down, can't suspend");
551 return PowerErrors::ERR_OK;
552 }
553 POWER_HILOGI(FEATURE_SUSPEND, "Try to suspend device, pid: %{public}d, uid: %{public}d", pid, uid);
554 powerStateMachine_->SuspendDeviceInner(pid, callTimeMs, reason, suspendImmed);
555 return PowerErrors::ERR_OK;
556 }
557
WakeupDevice(int64_t callTimeMs,WakeupDeviceType reason,const std::string & details)558 PowerErrors PowerMgrService::WakeupDevice(int64_t callTimeMs, WakeupDeviceType reason, const std::string& details)
559 {
560 std::lock_guard lock(wakeupMutex_);
561 if (!Permission::IsSystem()) {
562 return PowerErrors::ERR_SYSTEM_API_DENIED;
563 }
564 pid_t pid = IPCSkeleton::GetCallingPid();
565 auto uid = IPCSkeleton::GetCallingUid();
566 POWER_HILOGI(FEATURE_WAKEUP, "Try to wakeup device, pid: %{public}d, uid: %{public}d", pid, uid);
567 WakeupRunningLock::Lock();
568 powerStateMachine_->WakeupDeviceInner(pid, callTimeMs, reason, details, "OHOS");
569 WakeupRunningLock::Unlock();
570 return PowerErrors::ERR_OK;
571 }
572
RefreshActivity(int64_t callTimeMs,UserActivityType type,bool needChangeBacklight)573 bool PowerMgrService::RefreshActivity(int64_t callTimeMs, UserActivityType type, bool needChangeBacklight)
574 {
575 std::lock_guard lock(screenMutex_);
576 if (powerStateMachine_->CheckRefreshTime()) {
577 return false;
578 }
579 if (!Permission::IsPermissionGranted("ohos.permission.REFRESH_USER_ACTION") || !Permission::IsSystem()) {
580 return false;
581 }
582 pid_t pid = IPCSkeleton::GetCallingPid();
583 auto uid = IPCSkeleton::GetCallingUid();
584 POWER_HILOGD(FEATURE_ACTIVITY, "Try to refresh activity, pid: %{public}d, uid: %{public}d", pid, uid);
585 powerStateMachine_->RefreshActivityInner(pid, callTimeMs, type, needChangeBacklight);
586 return true;
587 }
588
OverrideScreenOffTime(int64_t timeout)589 bool PowerMgrService::OverrideScreenOffTime(int64_t timeout)
590 {
591 std::lock_guard lock(screenMutex_);
592 if (!Permission::IsSystem()) {
593 return false;
594 }
595 POWER_HILOGD(COMP_SVC, "Try to override screen off time");
596 return powerStateMachine_->OverrideScreenOffTimeInner(timeout);
597 }
598
RestoreScreenOffTime()599 bool PowerMgrService::RestoreScreenOffTime()
600 {
601 std::lock_guard lock(screenMutex_);
602 if (!Permission::IsSystem()) {
603 return false;
604 }
605 POWER_HILOGD(COMP_SVC, "Try to restore screen off time");
606 return powerStateMachine_->RestoreScreenOffTimeInner();
607 }
608
GetState()609 PowerState PowerMgrService::GetState()
610 {
611 std::lock_guard lock(stateMutex_);
612 auto state = powerStateMachine_->GetState();
613 POWER_HILOGD(FEATURE_POWER_STATE, "state: %{public}d", state);
614 return state;
615 }
616
IsScreenOn()617 bool PowerMgrService::IsScreenOn()
618 {
619 std::lock_guard lock(stateMutex_);
620 auto isScreenOn = powerStateMachine_->IsScreenOn();
621 POWER_HILOGI(COMP_SVC, "isScreenOn: %{public}d", isScreenOn);
622 return isScreenOn;
623 }
624
ForceSuspendDevice(int64_t callTimeMs)625 bool PowerMgrService::ForceSuspendDevice(int64_t callTimeMs)
626 {
627 std::lock_guard lock(suspendMutex_);
628 pid_t pid = IPCSkeleton::GetCallingPid();
629 auto uid = IPCSkeleton::GetCallingUid();
630 if (!Permission::IsSystem()) {
631 return false;
632 }
633 if (shutdownController_->IsShuttingDown()) {
634 POWER_HILOGI(FEATURE_SUSPEND, "System is shutting down, can't force suspend");
635 return false;
636 }
637 POWER_HILOGI(FEATURE_SUSPEND, "Try to force suspend device, pid: %{public}d, uid: %{public}d", pid, uid);
638 return powerStateMachine_->ForceSuspendDeviceInner(pid, callTimeMs);
639 }
640
GetBundleNameByUid(const int32_t uid)641 std::string PowerMgrService::GetBundleNameByUid(const int32_t uid)
642 {
643 std::string tempBundleName = "";
644 if (uid < OHOS::AppExecFwk::Constants::BASE_APP_UID) {
645 return tempBundleName;
646 }
647 BundleMgrClient bundleObj;
648
649 std::string identity = IPCSkeleton::ResetCallingIdentity();
650 ErrCode res = bundleObj.GetNameForUid(uid, tempBundleName);
651 IPCSkeleton::SetCallingIdentity(identity);
652 if (res != ERR_OK) {
653 POWER_HILOGE(FEATURE_RUNNING_LOCK, "Failed to get bundle name for uid=%{public}d, ErrCode=%{public}d",
654 uid, static_cast<int32_t>(res));
655 }
656 POWER_HILOGI(FEATURE_RUNNING_LOCK, "bundle name for uid=%{public}d, name=%{public}s", uid, tempBundleName.c_str());
657 return tempBundleName;
658 }
659
FillRunningLockParam(const RunningLockInfo & info,int32_t timeOutMS)660 RunningLockParam PowerMgrService::FillRunningLockParam(const RunningLockInfo& info, int32_t timeOutMS)
661 {
662 RunningLockParam filledParam {};
663 filledParam.name = info.name;
664 filledParam.type = info.type;
665 filledParam.timeoutMs = timeOutMS;
666 filledParam.pid = IPCSkeleton::GetCallingPid();
667 filledParam.uid = IPCSkeleton::GetCallingUid();
668 filledParam.bundleName = GetBundleNameByUid(filledParam.uid);
669 return filledParam;
670 }
671
CreateRunningLock(const sptr<IRemoteObject> & remoteObj,const RunningLockInfo & runningLockInfo)672 PowerErrors PowerMgrService::CreateRunningLock(
673 const sptr<IRemoteObject>& remoteObj, const RunningLockInfo& runningLockInfo)
674 {
675 std::lock_guard lock(lockMutex_);
676 if (!Permission::IsPermissionGranted("ohos.permission.RUNNING_LOCK")) {
677 return PowerErrors::ERR_PERMISSION_DENIED;
678 }
679 if (!IsRunningLockTypeSupported(runningLockInfo.type)) {
680 POWER_HILOGW(FEATURE_RUNNING_LOCK,
681 "runninglock type is not supported, name=%{public}s, type=%{public}d",
682 runningLockInfo.name.c_str(), runningLockInfo.type);
683 return PowerErrors::ERR_PARAM_INVALID;
684 }
685
686 RunningLockParam runningLockParam = FillRunningLockParam(runningLockInfo);
687 POWER_HILOGI(FEATURE_RUNNING_LOCK, "name: %{public}s, type: %{public}d, bundleName: %{public}s",
688 runningLockParam.name.c_str(), runningLockParam.type, runningLockParam.bundleName.c_str());
689
690 runningLockMgr_->CreateRunningLock(remoteObj, runningLockParam);
691 return PowerErrors::ERR_OK;
692 }
693
ReleaseRunningLock(const sptr<IRemoteObject> & remoteObj)694 bool PowerMgrService::ReleaseRunningLock(const sptr<IRemoteObject>& remoteObj)
695 {
696 std::lock_guard lock(lockMutex_);
697 bool result = false;
698 if (!Permission::IsPermissionGranted("ohos.permission.RUNNING_LOCK")) {
699 return result;
700 }
701
702 result = runningLockMgr_->ReleaseLock(remoteObj);
703 return result;
704 }
705
IsRunningLockTypeSupported(RunningLockType type)706 bool PowerMgrService::IsRunningLockTypeSupported(RunningLockType type)
707 {
708 if (Permission::IsHap()) {
709 return type <= RunningLockType::RUNNINGLOCK_PROXIMITY_SCREEN_CONTROL;
710 }
711 return type == RunningLockType::RUNNINGLOCK_SCREEN ||
712 type == RunningLockType::RUNNINGLOCK_BACKGROUND || // this will be instead by BACKGROUND_XXX types.
713 type == RunningLockType::RUNNINGLOCK_PROXIMITY_SCREEN_CONTROL ||
714 type == RunningLockType::RUNNINGLOCK_COORDINATION ||
715 type == RunningLockType::RUNNINGLOCK_BACKGROUND_PHONE ||
716 type == RunningLockType::RUNNINGLOCK_BACKGROUND_NOTIFICATION ||
717 type == RunningLockType::RUNNINGLOCK_BACKGROUND_AUDIO ||
718 type == RunningLockType::RUNNINGLOCK_BACKGROUND_SPORT ||
719 type == RunningLockType::RUNNINGLOCK_BACKGROUND_NAVIGATION ||
720 type == RunningLockType::RUNNINGLOCK_BACKGROUND_TASK;
721 }
722
Lock(const sptr<IRemoteObject> & remoteObj,int32_t timeOutMS)723 bool PowerMgrService::Lock(const sptr<IRemoteObject>& remoteObj, int32_t timeOutMS)
724 {
725 std::lock_guard lock(lockMutex_);
726 if (!Permission::IsPermissionGranted("ohos.permission.RUNNING_LOCK")) {
727 return false;
728 }
729
730 runningLockMgr_->Lock(remoteObj, timeOutMS);
731 return true;
732 }
733
UnLock(const sptr<IRemoteObject> & remoteObj)734 bool PowerMgrService::UnLock(const sptr<IRemoteObject>& remoteObj)
735 {
736 std::lock_guard lock(lockMutex_);
737 if (!Permission::IsPermissionGranted("ohos.permission.RUNNING_LOCK")) {
738 return false;
739 }
740 runningLockMgr_->UnLock(remoteObj);
741 return true;
742 }
743
QueryRunningLockLists(std::map<std::string,RunningLockInfo> & runningLockLists)744 bool PowerMgrService::QueryRunningLockLists(std::map<std::string, RunningLockInfo>& runningLockLists)
745 {
746 std::lock_guard lock(lockMutex_);
747 if (!Permission::IsPermissionGranted("ohos.permission.RUNNING_LOCK")) {
748 return false;
749 }
750 runningLockMgr_->QueryRunningLockLists(runningLockLists);
751 return true;
752 }
753
ForceUnLock(const sptr<IRemoteObject> & remoteObj)754 void PowerMgrService::ForceUnLock(const sptr<IRemoteObject>& remoteObj)
755 {
756 std::lock_guard lock(lockMutex_);
757 runningLockMgr_->UnLock(remoteObj);
758 runningLockMgr_->ReleaseLock(remoteObj);
759 }
760
IsUsed(const sptr<IRemoteObject> & remoteObj)761 bool PowerMgrService::IsUsed(const sptr<IRemoteObject>& remoteObj)
762 {
763 std::lock_guard lock(lockMutex_);
764 auto isUsed = runningLockMgr_->IsUsed(remoteObj);
765 POWER_HILOGD(FEATURE_RUNNING_LOCK, "RunningLock is Used: %{public}d", isUsed);
766 return isUsed;
767 }
768
NotifyRunningLockChanged(bool isUnLock)769 void PowerMgrService::NotifyRunningLockChanged(bool isUnLock)
770 {
771 if (isUnLock) {
772 // When unlock we try to suspend
773 if (!runningLockMgr_->ExistValidRunningLock() && !powerStateMachine_->IsScreenOn()) {
774 // runninglock is empty and Screen is off,
775 // so we try to suspend device from Z side.
776 POWER_HILOGI(FEATURE_RUNNING_LOCK, "RunningLock is empty, try to suspend");
777 powerStateMachine_->SuspendDeviceInner(
778 getpid(), GetTickCount(), SuspendDeviceType::SUSPEND_DEVICE_REASON_MIN, true, true);
779 }
780 }
781 }
782
ProxyRunningLock(bool isProxied,pid_t pid,pid_t uid)783 bool PowerMgrService::ProxyRunningLock(bool isProxied, pid_t pid, pid_t uid)
784 {
785 std::lock_guard lock(lockMutex_);
786 if (!Permission::IsSystem()) {
787 return false;
788 }
789 return runningLockMgr_->ProxyRunningLock(isProxied, pid, uid);
790 }
791
ProxyRunningLocks(bool isProxied,const std::vector<std::pair<pid_t,pid_t>> & processInfos)792 bool PowerMgrService::ProxyRunningLocks(bool isProxied, const std::vector<std::pair<pid_t, pid_t>>& processInfos)
793 {
794 if (!Permission::IsSystem()) {
795 return false;
796 }
797 std::lock_guard lock(lockMutex_);
798 runningLockMgr_->ProxyRunningLocks(isProxied, processInfos);
799 return true;
800 }
801
ResetRunningLocks()802 bool PowerMgrService::ResetRunningLocks()
803 {
804 if (!Permission::IsSystem()) {
805 return false;
806 }
807 std::lock_guard lock(lockMutex_);
808 runningLockMgr_->ResetRunningLocks();
809 return true;
810 }
811
RegisterPowerStateCallback(const sptr<IPowerStateCallback> & callback)812 bool PowerMgrService::RegisterPowerStateCallback(const sptr<IPowerStateCallback>& callback)
813 {
814 std::lock_guard lock(stateMutex_);
815 pid_t pid = IPCSkeleton::GetCallingPid();
816 auto uid = IPCSkeleton::GetCallingUid();
817 if (!Permission::IsPermissionGranted("ohos.permission.POWER_MANAGER")) {
818 return false;
819 }
820 POWER_HILOGI(FEATURE_POWER_STATE, "pid: %{public}d, uid: %{public}d", pid, uid);
821 powerStateMachine_->RegisterPowerStateCallback(callback);
822 return true;
823 }
824
UnRegisterPowerStateCallback(const sptr<IPowerStateCallback> & callback)825 bool PowerMgrService::UnRegisterPowerStateCallback(const sptr<IPowerStateCallback>& callback)
826 {
827 std::lock_guard lock(stateMutex_);
828 pid_t pid = IPCSkeleton::GetCallingPid();
829 auto uid = IPCSkeleton::GetCallingUid();
830 if (!Permission::IsPermissionGranted("ohos.permission.POWER_MANAGER")) {
831 return false;
832 }
833 POWER_HILOGI(FEATURE_POWER_STATE, "pid: %{public}d, uid: %{public}d", pid, uid);
834 powerStateMachine_->UnRegisterPowerStateCallback(callback);
835 return true;
836 }
837
RegisterSyncSleepCallback(const sptr<ISyncSleepCallback> & callback,SleepPriority priority)838 bool PowerMgrService::RegisterSyncSleepCallback(const sptr<ISyncSleepCallback>& callback, SleepPriority priority)
839 {
840 std::lock_guard lock(suspendMutex_);
841 pid_t pid = IPCSkeleton::GetCallingPid();
842 auto uid = IPCSkeleton::GetCallingUid();
843 if (!Permission::IsPermissionGranted("ohos.permission.POWER_MANAGER")) {
844 return false;
845 }
846 POWER_HILOGI(FEATURE_SUSPEND, "pid: %{public}d, uid: %{public}d", pid, uid);
847 suspendController_->AddCallback(callback, priority);
848 return true;
849 }
850
UnRegisterSyncSleepCallback(const sptr<ISyncSleepCallback> & callback)851 bool PowerMgrService::UnRegisterSyncSleepCallback(const sptr<ISyncSleepCallback>& callback)
852 {
853 std::lock_guard lock(suspendMutex_);
854 pid_t pid = IPCSkeleton::GetCallingPid();
855 auto uid = IPCSkeleton::GetCallingUid();
856 if (!Permission::IsPermissionGranted("ohos.permission.POWER_MANAGER")) {
857 return false;
858 }
859 POWER_HILOGI(FEATURE_SUSPEND, "pid: %{public}d, uid: %{public}d", pid, uid);
860 suspendController_->RemoveCallback(callback);
861 return true;
862 }
863
RegisterPowerModeCallback(const sptr<IPowerModeCallback> & callback)864 bool PowerMgrService::RegisterPowerModeCallback(const sptr<IPowerModeCallback>& callback)
865 {
866 std::lock_guard lock(modeMutex_);
867 pid_t pid = IPCSkeleton::GetCallingPid();
868 auto uid = IPCSkeleton::GetCallingUid();
869 if (!Permission::IsSystem()) {
870 return false;
871 }
872 POWER_HILOGI(FEATURE_POWER_MODE, "pid: %{public}d, uid: %{public}d", pid, uid);
873 powerModeModule_.AddPowerModeCallback(callback);
874 return true;
875 }
876
UnRegisterPowerModeCallback(const sptr<IPowerModeCallback> & callback)877 bool PowerMgrService::UnRegisterPowerModeCallback(const sptr<IPowerModeCallback>& callback)
878 {
879 std::lock_guard lock(modeMutex_);
880 pid_t pid = IPCSkeleton::GetCallingPid();
881 auto uid = IPCSkeleton::GetCallingUid();
882 if (!Permission::IsSystem()) {
883 return false;
884 }
885 POWER_HILOGI(FEATURE_POWER_MODE, "pid: %{public}d, uid: %{public}d", pid, uid);
886 powerModeModule_.DelPowerModeCallback(callback);
887 return true;
888 }
889
SetDisplaySuspend(bool enable)890 bool PowerMgrService::SetDisplaySuspend(bool enable)
891 {
892 std::lock_guard lock(screenMutex_);
893 pid_t pid = IPCSkeleton::GetCallingPid();
894 auto uid = IPCSkeleton::GetCallingUid();
895 if (!Permission::IsSystem()) {
896 return false;
897 }
898 POWER_HILOGI(FEATURE_SUSPEND, "pid: %{public}d, uid: %{public}d, enable: %{public}d", pid, uid, enable);
899 powerStateMachine_->SetDisplaySuspend(enable);
900 return true;
901 }
902
SetDeviceMode(const PowerMode & mode)903 PowerErrors PowerMgrService::SetDeviceMode(const PowerMode& mode)
904 {
905 std::lock_guard lock(modeMutex_);
906 pid_t pid = IPCSkeleton::GetCallingPid();
907 auto uid = IPCSkeleton::GetCallingUid();
908 POWER_HILOGI(FEATURE_POWER_MODE, "pid: %{public}d, uid: %{public}d, mode: %{public}u", pid, uid, mode);
909 if (!Permission::IsSystem()) {
910 return PowerErrors::ERR_SYSTEM_API_DENIED;
911 }
912 if (!Permission::IsPermissionGranted("ohos.permission.POWER_OPTIMIZATION")) {
913 return PowerErrors::ERR_PERMISSION_DENIED;
914 }
915 powerModeModule_.SetModeItem(mode);
916 return PowerErrors::ERR_OK;
917 }
918
GetDeviceMode()919 PowerMode PowerMgrService::GetDeviceMode()
920 {
921 std::lock_guard lock(modeMutex_);
922 pid_t pid = IPCSkeleton::GetCallingPid();
923 auto uid = IPCSkeleton::GetCallingUid();
924 auto mode = powerModeModule_.GetModeItem();
925 POWER_HILOGI(FEATURE_POWER_MODE, "pid: %{public}d, uid: %{public}d, mode: %{public}u", pid, uid, mode);
926 return mode;
927 }
928
ShellDump(const std::vector<std::string> & args,uint32_t argc)929 std::string PowerMgrService::ShellDump(const std::vector<std::string>& args, uint32_t argc)
930 {
931 if (!Permission::IsSystem() || !isBootCompleted_) {
932 return "";
933 }
934 std::lock_guard lock(dumpMutex_);
935 pid_t pid = IPCSkeleton::GetCallingPid();
936 auto uid = IPCSkeleton::GetCallingUid();
937 POWER_HILOGI(COMP_SVC, "pid: %{public}d, uid: %{public}d", pid, uid);
938
939 std::string result;
940 bool ret = PowerMgrDumper::Dump(args, result);
941 POWER_HILOGI(COMP_SVC, "ret :%{public}d", ret);
942 return result;
943 }
944
RegisterShutdownCallback(const sptr<ITakeOverShutdownCallback> & callback,ShutdownPriority priority)945 void PowerMgrService::RegisterShutdownCallback(
946 const sptr<ITakeOverShutdownCallback>& callback, ShutdownPriority priority)
947 {
948 RETURN_IF (callback == nullptr);
949 RETURN_IF (!Permission::IsSystem());
950
951 std::lock_guard lock(shutdownMutex_);
952 shutdownController_->AddCallback(callback, priority);
953 }
954
UnRegisterShutdownCallback(const sptr<ITakeOverShutdownCallback> & callback)955 void PowerMgrService::UnRegisterShutdownCallback(const sptr<ITakeOverShutdownCallback>& callback)
956 {
957 RETURN_IF (callback == nullptr);
958 RETURN_IF (!Permission::IsSystem());
959
960 std::lock_guard lock(shutdownMutex_);
961 shutdownController_->RemoveCallback(callback);
962 }
963
RegisterShutdownCallback(const sptr<IAsyncShutdownCallback> & callback,ShutdownPriority priority)964 void PowerMgrService::RegisterShutdownCallback(
965 const sptr<IAsyncShutdownCallback>& callback, ShutdownPriority priority)
966 {
967 RETURN_IF (callback == nullptr);
968 RETURN_IF (!Permission::IsSystem());
969
970 std::lock_guard lock(shutdownMutex_);
971 shutdownController_->AddCallback(callback, priority);
972 }
973
UnRegisterShutdownCallback(const sptr<IAsyncShutdownCallback> & callback)974 void PowerMgrService::UnRegisterShutdownCallback(const sptr<IAsyncShutdownCallback>& callback)
975 {
976 RETURN_IF (callback == nullptr);
977 RETURN_IF (!Permission::IsSystem());
978
979 std::lock_guard lock(shutdownMutex_);
980 shutdownController_->RemoveCallback(callback);
981 }
982
RegisterShutdownCallback(const sptr<ISyncShutdownCallback> & callback,ShutdownPriority priority)983 void PowerMgrService::RegisterShutdownCallback(
984 const sptr<ISyncShutdownCallback>& callback, ShutdownPriority priority)
985 {
986 RETURN_IF (callback == nullptr);
987 RETURN_IF (!Permission::IsSystem());
988
989 std::lock_guard lock(shutdownMutex_);
990 shutdownController_->AddCallback(callback, priority);
991 }
992
UnRegisterShutdownCallback(const sptr<ISyncShutdownCallback> & callback)993 void PowerMgrService::UnRegisterShutdownCallback(const sptr<ISyncShutdownCallback>& callback)
994 {
995 RETURN_IF (callback == nullptr);
996 RETURN_IF (!Permission::IsSystem());
997
998 std::lock_guard lock(shutdownMutex_);
999 shutdownController_->RemoveCallback(callback);
1000 }
1001
1002 sptr<RunningLockTokenStub> PowerMgrService::WakeupRunningLock::token_;
1003
Create()1004 void PowerMgrService::WakeupRunningLock::Create()
1005 {
1006 token_ = new (std::nothrow) RunningLockTokenStub();
1007 if (!token_) {
1008 POWER_HILOGE(COMP_SVC, "create runninglock token failed");
1009 return;
1010 }
1011 RunningLockInfo info = {"PowerMgrWakeupLock", OHOS::PowerMgr::RunningLockType::RUNNINGLOCK_BACKGROUND_TASK};
1012 pms->CreateRunningLock(token_->AsObject(), info);
1013 }
1014
Lock()1015 void PowerMgrService::WakeupRunningLock::Lock()
1016 {
1017 if (!token_) {
1018 return;
1019 }
1020 pms->Lock(token_->AsObject(), TIMEOUT);
1021 }
1022
Unlock()1023 void PowerMgrService::WakeupRunningLock::Unlock()
1024 {
1025 if (!token_) {
1026 return;
1027 }
1028 pms->UnLock(token_->AsObject());
1029 }
1030
SuspendControllerInit()1031 void PowerMgrService::SuspendControllerInit()
1032 {
1033 if (!suspendController_) {
1034 suspendController_ = std::make_shared<SuspendController>(shutdownController_, powerStateMachine_);
1035 }
1036 suspendController_->Init();
1037 }
1038
WakeupControllerInit()1039 void PowerMgrService::WakeupControllerInit()
1040 {
1041 if (!wakeupController_) {
1042 wakeupController_ = std::make_shared<WakeupController>(powerStateMachine_);
1043 }
1044 wakeupController_->Init();
1045 }
1046
1047 #ifdef POWER_MANAGER_WAKEUP_ACTION
WakeupActionControllerInit()1048 void PowerMgrService::WakeupActionControllerInit()
1049 {
1050 if (!wakeupActionController_) {
1051 wakeupActionController_ = std::make_shared<WakeupActionController>(shutdownController_, powerStateMachine_);
1052 }
1053 wakeupActionController_->Init();
1054 }
1055 #endif
1056
VibratorInit()1057 void PowerMgrService::VibratorInit()
1058 {
1059 std::shared_ptr<PowerVibrator> vibrator = PowerVibrator::GetInstance();
1060 vibrator->LoadConfig(POWER_VIBRATOR_CONFIG_FILE,
1061 VENDOR_POWER_VIBRATOR_CONFIG_FILE, SYSTEM_POWER_VIBRATOR_CONFIG_FILE);
1062 }
1063
IsStandby(bool & isStandby)1064 PowerErrors PowerMgrService::IsStandby(bool& isStandby)
1065 {
1066 #ifdef HAS_DEVICE_STANDBY_PART
1067 DevStandbyMgr::StandbyServiceClient& standbyServiceClient = DevStandbyMgr::StandbyServiceClient::GetInstance();
1068 ErrCode code = standbyServiceClient.IsDeviceInStandby(isStandby);
1069 if (code == ERR_OK) {
1070 return PowerErrors::ERR_OK;
1071 }
1072 return PowerErrors::ERR_CONNECTION_FAIL;
1073 #else
1074 return PowerErrors::ERR_OK;
1075 #endif
1076 }
1077
1078 #ifdef HAS_MULTIMODALINPUT_INPUT_PART
OnInputEvent(std::shared_ptr<KeyEvent> keyEvent) const1079 void PowerMgrInputMonitor::OnInputEvent(std::shared_ptr<KeyEvent> keyEvent) const
1080 {
1081 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
1082 if (pms == nullptr) {
1083 return;
1084 }
1085 auto stateMachine = pms->GetPowerStateMachine();
1086 if (stateMachine == nullptr) {
1087 return;
1088 }
1089 if (keyEvent->HasFlag(InputEvent::EVENT_FLAG_SIMULATE)) {
1090 stateMachine->OverrideScreenOffTimeCoordinated();
1091 POWER_HILOGD(FEATURE_INPUT, "Key event has simulate flag in coordinated state, override screen off time");
1092 }
1093 }
1094
OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent) const1095 void PowerMgrInputMonitor::OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent) const
1096 {
1097 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
1098 if (pms == nullptr) {
1099 return;
1100 }
1101 auto stateMachine = pms->GetPowerStateMachine();
1102 if (stateMachine == nullptr) {
1103 return;
1104 }
1105 if (pointerEvent->HasFlag(InputEvent::EVENT_FLAG_SIMULATE)) {
1106 stateMachine->OverrideScreenOffTimeCoordinated();
1107 POWER_HILOGD(FEATURE_INPUT, "Pointer event has simulate flag in coordinated state, override screen off time");
1108 }
1109 }
1110
OnInputEvent(std::shared_ptr<AxisEvent> axisEvent) const1111 void PowerMgrInputMonitor::OnInputEvent(std::shared_ptr<AxisEvent> axisEvent) const {};
1112 #endif
1113 } // namespace PowerMgr
1114 } // namespace OHOS
1115