• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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