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_client.h"
17
18 #include <cinttypes>
19 #include <mutex>
20 #include <memory>
21 #include <unistd.h>
22 #include <vector>
23 #include <datetime_ex.h>
24 #include <thread>
25 #include <chrono>
26 #include <if_system_ability_manager.h>
27 #include <iservice_registry.h>
28 #include <system_ability_definition.h>
29 #include "new"
30 #include "refbase.h"
31 #include "ipower_mgr.h"
32 #include "ipower_mode_callback.h"
33 #include "ipower_state_callback.h"
34 #include "ipower_runninglock_callback.h"
35 #include "iremote_broker.h"
36 #include "iremote_object.h"
37 #include "iscreen_off_pre_callback.h"
38 #include "power_log.h"
39 #include "power_common.h"
40 #include "running_lock_info.h"
41 #include "power_mgr_async_reply_stub.h"
42
43 namespace OHOS {
44 namespace PowerMgr {
45 std::vector<std::weak_ptr<RunningLock>> PowerMgrClient::runningLocks_;
46 std::mutex PowerMgrClient::runningLocksMutex_;
47 std::mutex g_instanceMutex;
48 constexpr int32_t MAX_VERSION_STRING_SIZE = 4;
49 constexpr uint32_t PARAM_MAX_NUM = 10;
50
PowerMgrClient()51 PowerMgrClient::PowerMgrClient()
52 {
53 token_ = sptr<IPCObjectStub>::MakeSptr(u"ohos.powermgr.ClientAlivenessToken");
54 }
55
~PowerMgrClient()56 PowerMgrClient::~PowerMgrClient()
57 {
58 if (proxy_ != nullptr) {
59 auto remoteObject = proxy_->AsObject();
60 if (remoteObject != nullptr) {
61 remoteObject->RemoveDeathRecipient(deathRecipient_);
62 }
63 }
64 }
65
GetInstance()66 PowerMgrClient& PowerMgrClient::GetInstance()
67 {
68 static PowerMgrClient* instance = nullptr;
69 if (instance == nullptr) {
70 std::lock_guard<std::mutex> lock(g_instanceMutex);
71 if (instance == nullptr) {
72 instance = new PowerMgrClient();
73 }
74 }
75 return *instance;
76 }
77
Connect()78 ErrCode PowerMgrClient::Connect()
79 {
80 return ERR_OK;
81 }
82
GetPowerMgrProxy()83 sptr<IPowerMgr> PowerMgrClient::GetPowerMgrProxy()
84 {
85 std::lock_guard<std::mutex> lock(mutex_);
86 if (proxy_ != nullptr) {
87 return proxy_;
88 }
89
90 sptr<ISystemAbilityManager> sam = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
91 if (sam == nullptr) {
92 POWER_HILOGE(COMP_FWK, "Failed to obtain SystemAbilityMgr");
93 return proxy_;
94 }
95 sptr<IRemoteObject> remoteObject_ = sam->CheckSystemAbility(POWER_MANAGER_SERVICE_ID);
96 if (remoteObject_ == nullptr) {
97 POWER_HILOGE(COMP_FWK, "Check SystemAbility failed");
98 return proxy_;
99 }
100
101 sptr<IRemoteObject::DeathRecipient> drt = new(std::nothrow) PowerMgrDeathRecipient(*this);
102 if (drt == nullptr) {
103 POWER_HILOGE(COMP_FWK, "Failed to create PowerMgrDeathRecipient");
104 return proxy_;
105 }
106 if ((remoteObject_->IsProxyObject()) && (!remoteObject_->AddDeathRecipient(drt))) {
107 POWER_HILOGE(COMP_FWK, "Add death recipient to PowerMgr service failed");
108 return proxy_;
109 }
110
111 proxy_ = iface_cast<IPowerMgr>(remoteObject_);
112 deathRecipient_ = drt;
113 POWER_HILOGI(COMP_FWK, "Connecting PowerMgrService success, pid=%{public}d", getpid());
114 return proxy_;
115 }
116
OnRemoteDied(const wptr<IRemoteObject> & remote)117 void PowerMgrClient::PowerMgrDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remote)
118 {
119 POWER_HILOGW(COMP_FWK, "Recv death notice, PowerMgr Death");
120 client_.ResetProxy(remote);
121
122 // wait for powermgr service restart
123 ErrCode ret = E_GET_POWER_SERVICE_FAILED;
124 uint32_t retryCount = 0;
125 while (++retryCount <= CONNECT_RETRY_COUNT) {
126 usleep(CONNECT_RETRY_MS);
127 sptr<IPowerMgr> proxy = client_.GetPowerMgrProxy();
128 if (proxy != nullptr) {
129 POWER_HILOGI(COMP_FWK, "retry connect success, count %{public}d", retryCount);
130 ret = ERR_OK;
131 break;
132 }
133 POWER_HILOGI(COMP_FWK, "retry connect failed, count %{public}d", retryCount);
134 }
135 if (ret != ERR_OK) {
136 return;
137 }
138
139 // recover running lock info
140 client_.RecoverRunningLocks();
141 }
142
RecoverRunningLocks()143 void PowerMgrClient::RecoverRunningLocks()
144 {
145 POWER_HILOGI(COMP_FWK, "start to recover running locks");
146 std::lock_guard<std::mutex> lock(runningLocksMutex_);
147 for (auto runningLock : runningLocks_) {
148 if (runningLock.expired()) {
149 continue;
150 }
151 std::shared_ptr<RunningLock> lock = runningLock.lock();
152 if (lock != nullptr) {
153 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
154 RETURN_IF(proxy == nullptr);
155 lock->Recover(proxy);
156 }
157 }
158 }
159
ResetProxy(const wptr<IRemoteObject> & remote)160 void PowerMgrClient::ResetProxy(const wptr<IRemoteObject>& remote)
161 {
162 if (remote == nullptr) {
163 POWER_HILOGE(COMP_FWK, "OnRemoteDied failed, remote is nullptr");
164 return;
165 }
166
167 std::lock_guard<std::mutex> lock(mutex_);
168 RETURN_IF(proxy_ == nullptr);
169
170 auto serviceRemote = proxy_->AsObject();
171 if ((serviceRemote != nullptr) && (serviceRemote == remote.promote())) {
172 serviceRemote->RemoveDeathRecipient(deathRecipient_);
173 proxy_ = nullptr;
174 }
175 }
176
RebootDevice(const std::string & reason)177 PowerErrors PowerMgrClient::RebootDevice(const std::string& reason)
178 {
179 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
180 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
181 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
182 proxy->RebootDeviceIpc(reason, powerError);
183 return static_cast<PowerErrors>(powerError);
184 }
185
RebootDeviceForDeprecated(const std::string & reason)186 PowerErrors PowerMgrClient::RebootDeviceForDeprecated(const std::string& reason)
187 {
188 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
189 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
190 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
191 proxy->RebootDeviceForDeprecatedIpc(reason, powerError);
192 return static_cast<PowerErrors>(powerError);
193 }
194
ShutDownDevice(const std::string & reason)195 PowerErrors PowerMgrClient::ShutDownDevice(const std::string& reason)
196 {
197 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
198 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
199 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
200 proxy->ShutDownDeviceIpc(reason, powerError);
201 return static_cast<PowerErrors>(powerError);
202 }
203
SetSuspendTag(const std::string & tag)204 PowerErrors PowerMgrClient::SetSuspendTag(const std::string &tag)
205 {
206 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
207 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
208 POWER_HILOGI(FEATURE_SUSPEND, "Set suspend tag: %{public}s", tag.c_str());
209 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
210 proxy->SetSuspendTagIpc(tag, powerError);
211 return static_cast<PowerErrors>(powerError);
212 }
213
SuspendDevice(SuspendDeviceType reason,bool suspendImmed,const std::string & apiVersion)214 PowerErrors PowerMgrClient::SuspendDevice(
215 SuspendDeviceType reason, bool suspendImmed, const std::string& apiVersion)
216 {
217 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
218 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
219 POWER_HILOGD(FEATURE_SUSPEND, " Calling SuspendDevice success");
220 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
221 int32_t reasonValue = static_cast<int32_t>(reason);
222 RETURN_IF_WITH_RET(apiVersion.size() >= MAX_VERSION_STRING_SIZE, PowerErrors::ERR_PARAM_INVALID);
223 proxy->SuspendDeviceIpc(GetTickCount(), reasonValue, suspendImmed, apiVersion, powerError);
224 return static_cast<PowerErrors>(powerError);
225 }
226
WakeupDevice(WakeupDeviceType reason,const std::string & detail,const std::string & apiVersion)227 PowerErrors PowerMgrClient::WakeupDevice(
228 WakeupDeviceType reason, const std::string& detail, const std::string& apiVersion)
229 {
230 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
231 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
232 POWER_HILOGD(FEATURE_WAKEUP, " Calling WakeupDevice success");
233 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
234 int32_t reasonValue = static_cast<int32_t>(reason);
235 RETURN_IF_WITH_RET(apiVersion.size() >= MAX_VERSION_STRING_SIZE, PowerErrors::ERR_PARAM_INVALID);
236 proxy->WakeupDeviceIpc(GetTickCount(), reasonValue, detail, apiVersion, powerError);
237 return static_cast<PowerErrors>(powerError);
238 }
239
WakeupDeviceAsync(WakeupDeviceType reason,const std::string & detail)240 void PowerMgrClient::WakeupDeviceAsync(WakeupDeviceType reason, const std::string& detail)
241 {
242 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
243 RETURN_IF(proxy == nullptr);
244 POWER_HILOGD(FEATURE_WAKEUP, " Calling WakeupDeviceAsync success");
245 int32_t reasonValue = static_cast<int32_t>(reason);
246 std::string apiVersion;
247 proxy->WakeupDeviceAsyncIpc(GetTickCount(), reasonValue, detail, apiVersion);
248 return;
249 }
250
RefreshActivity(UserActivityType type)251 bool PowerMgrClient::RefreshActivity(UserActivityType type)
252 {
253 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
254 RETURN_IF_WITH_RET(proxy == nullptr, false);
255 bool ret = false;
256 int32_t activityType = static_cast<int32_t>(type);
257 int32_t result = proxy->RefreshActivityIpc(GetTickCount(), activityType, true);
258 if (result == ERR_OK) {
259 ret = true;
260 }
261 POWER_HILOGD(FEATURE_ACTIVITY, "Calling RefreshActivity Success");
262 return ret;
263 }
264
OverrideScreenOffTime(int64_t timeout,const std::string & apiVersion)265 PowerErrors PowerMgrClient::OverrideScreenOffTime(int64_t timeout, const std::string& apiVersion)
266 {
267 if (timeout <= 0) {
268 POWER_HILOGW(COMP_FWK, "Invalid timeout, timeout=%{public}" PRId64 "", timeout);
269 return PowerErrors::ERR_PARAM_INVALID;
270 }
271 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
272 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
273 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
274 RETURN_IF_WITH_RET(apiVersion.size() >= MAX_VERSION_STRING_SIZE, PowerErrors::ERR_PARAM_INVALID);
275 proxy->OverrideScreenOffTimeIpc(timeout, apiVersion, powerError);
276 PowerErrors ret = static_cast<PowerErrors>(powerError);
277 POWER_HILOGD(COMP_FWK, "Calling OverrideScreenOffTime Success");
278 return ret;
279 }
280
RestoreScreenOffTime(const std::string & apiVersion)281 PowerErrors PowerMgrClient::RestoreScreenOffTime(const std::string& apiVersion)
282 {
283 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
284 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
285 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
286 RETURN_IF_WITH_RET(apiVersion.size() >= MAX_VERSION_STRING_SIZE, PowerErrors::ERR_PARAM_INVALID);
287 proxy->RestoreScreenOffTimeIpc(apiVersion, powerError);
288 PowerErrors ret = static_cast<PowerErrors>(powerError);
289 POWER_HILOGD(COMP_FWK, "Calling RestoreScreenOffTime Success");
290 return ret;
291 }
292
IsRunningLockTypeSupported(RunningLockType type)293 bool PowerMgrClient::IsRunningLockTypeSupported(RunningLockType type)
294 {
295 POWER_HILOGD(FEATURE_RUNNING_LOCK, "RunningLockType=%{public}u", type);
296 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
297 RETURN_IF_WITH_RET(proxy == nullptr, false);
298 bool lockSupported = false;
299 int32_t lockType = static_cast<int32_t>(type);
300 proxy->IsRunningLockTypeSupportedIpc(lockType, lockSupported);
301 return lockSupported;
302 }
303
ForceSuspendDevice(const std::string & apiVersion)304 PowerErrors PowerMgrClient::ForceSuspendDevice(const std::string& apiVersion)
305 {
306 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
307 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
308 sptr<PowerMgrStubAsync> asyncCallback = new PowerMgrStubAsync();
309 sptr<IPowerMgrAsync> powerProxy = iface_cast<IPowerMgrAsync>(asyncCallback);
310 RETURN_IF_WITH_RET(apiVersion.size() >= MAX_VERSION_STRING_SIZE, PowerErrors::ERR_PARAM_INVALID);
311 int32_t result = proxy->ForceSuspendDeviceIpc(GetTickCount(), apiVersion, powerProxy);
312 RETURN_IF_WITH_RET(result != ERR_OK, PowerErrors::ERR_CONNECTION_FAIL);
313 // Wait for the asynchronous callback to return, with a timeout of 100 milliseconds
314 PowerErrors ret = static_cast<PowerErrors>(asyncCallback->WaitForAsyncReply(100));
315 POWER_HILOGD(FEATURE_SUSPEND, "Calling ForceSuspendDevice Success");
316 return ret;
317 }
318
IsScreenOn(bool needPrintLog)319 bool PowerMgrClient::IsScreenOn(bool needPrintLog)
320 {
321 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
322 RETURN_IF_WITH_RET(proxy == nullptr, false);
323 bool ret = false;
324 proxy->IsScreenOnIpc(needPrintLog, ret);
325 if (needPrintLog) {
326 POWER_HILOGI(COMP_FWK, "IsScreenOn=%{public}d, caller pid=%{public}d", ret, getpid());
327 } else {
328 POWER_HILOGD(COMP_FWK, "IsScreenOn=%{public}d, caller pid=%{public}d", ret, getpid());
329 }
330 return ret;
331 }
332
IsFoldScreenOn()333 bool PowerMgrClient::IsFoldScreenOn()
334 {
335 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
336 RETURN_IF_WITH_RET(proxy == nullptr, false);
337 bool ret = false;
338 proxy->IsFoldScreenOnIpc(ret);
339 POWER_HILOGI(COMP_FWK, "IsFoldScreenOn=%{public}d, caller pid=%{public}d", ret, getpid());
340 return ret;
341 }
342
IsCollaborationScreenOn()343 bool PowerMgrClient::IsCollaborationScreenOn()
344 {
345 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
346 RETURN_IF_WITH_RET(proxy == nullptr, false);
347 bool ret = false;
348 proxy->IsCollaborationScreenOnIpc(ret);
349 POWER_HILOGI(COMP_FWK, "IsCollaborationScreenOn=%{public}d, caller pid=%{public}d", ret, getpid());
350 return ret;
351 }
352
IsForceSleeping()353 bool PowerMgrClient::IsForceSleeping()
354 {
355 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
356 RETURN_IF_WITH_RET(proxy == nullptr, false);
357 bool ret = false;
358 proxy->IsForceSleepingIpc(ret);
359 POWER_HILOGD(COMP_FWK, "IsForceSleeping=%{public}d, caller pid=%{public}d", ret, getpid());
360 return ret;
361 }
362
GetState()363 PowerState PowerMgrClient::GetState()
364 {
365 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
366 RETURN_IF_WITH_RET(proxy == nullptr, PowerState::UNKNOWN);
367 int32_t powerState = static_cast<int32_t>(PowerErrors::ERR_FAILURE);
368 proxy->GetStateIpc(powerState);
369 return static_cast<PowerState>(powerState);
370 }
371
CreateRunningLock(const std::string & name,RunningLockType type)372 std::shared_ptr<RunningLock> PowerMgrClient::CreateRunningLock(const std::string& name, RunningLockType type)
373 {
374 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
375 RETURN_IF_WITH_RET(proxy == nullptr, nullptr);
376
377 uint32_t nameLen = (name.size() > RunningLock::MAX_NAME_LEN) ? RunningLock::MAX_NAME_LEN : name.size();
378 std::string nameExt = name.substr(0, nameLen) + "_" + std::to_string(GetTickCount());
379 std::shared_ptr<RunningLock> runningLock = std::make_shared<RunningLock>(proxy, nameExt, type);
380 if (runningLock == nullptr) {
381 POWER_HILOGE(FEATURE_RUNNING_LOCK, "Failed to create RunningLock record");
382 return nullptr;
383 }
384 // Client CreateRunningLock
385 POWER_HILOGI(COMP_LOCK, "CrtN:%{public}s,T=%{public}d", name.c_str(), type);
386 auto error = runningLock->Init();
387 if (error != PowerErrors::ERR_OK) {
388 POWER_HILOGE(FEATURE_RUNNING_LOCK, "RunningLock init failed");
389 error_ = error;
390 return nullptr;
391 }
392
393 std::lock_guard<std::mutex> lock(runningLocksMutex_);
394 runningLocks_.push_back(std::weak_ptr<RunningLock>(runningLock));
395 return runningLock;
396 }
397
ProxyRunningLock(bool isProxied,pid_t pid,pid_t uid)398 bool PowerMgrClient::ProxyRunningLock(bool isProxied, pid_t pid, pid_t uid)
399 {
400 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
401 RETURN_IF_WITH_RET(proxy == nullptr, false);
402 bool result = false;
403 int32_t ret = proxy->ProxyRunningLockIpc(isProxied, pid, uid);
404 if (ret == ERR_OK) {
405 result = true;
406 }
407 return result;
408 }
409
ProxyRunningLocks(bool isProxied,const std::vector<std::pair<pid_t,pid_t>> & processInfos)410 bool PowerMgrClient::ProxyRunningLocks(bool isProxied, const std::vector<std::pair<pid_t, pid_t>>& processInfos)
411 {
412 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
413 RETURN_IF_WITH_RET(proxy == nullptr, false);
414 VectorPair vectorPairInfos;
415 vectorPairInfos.SetProcessInfos(processInfos);
416 int32_t ret = proxy->ProxyRunningLocksIpc(isProxied, vectorPairInfos);
417 return ret == ERR_OK;
418 }
419
ResetRunningLocks()420 bool PowerMgrClient::ResetRunningLocks()
421 {
422 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
423 RETURN_IF_WITH_RET(proxy == nullptr, false);
424 int32_t ret = proxy->ResetRunningLocksIpc();
425 return ret == ERR_OK;
426 }
427
RegisterPowerStateCallback(const sptr<IPowerStateCallback> & callback,bool isSync)428 bool PowerMgrClient::RegisterPowerStateCallback(const sptr<IPowerStateCallback>& callback, bool isSync)
429 {
430 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
431 RETURN_IF_WITH_RET((callback == nullptr) || (proxy == nullptr), false);
432 int32_t ret = proxy->RegisterPowerStateCallbackIpc(callback, isSync);
433 return ret == ERR_OK;
434 }
435
UnRegisterPowerStateCallback(const sptr<IPowerStateCallback> & callback)436 bool PowerMgrClient::UnRegisterPowerStateCallback(const sptr<IPowerStateCallback>& callback)
437 {
438 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
439 RETURN_IF_WITH_RET((callback == nullptr) || (proxy == nullptr), false);
440 int32_t ret = proxy->UnRegisterPowerStateCallbackIpc(callback);
441 return ret == ERR_OK;
442 }
443
RegisterSyncSleepCallback(const sptr<ISyncSleepCallback> & callback,SleepPriority priority)444 bool PowerMgrClient::RegisterSyncSleepCallback(const sptr<ISyncSleepCallback>& callback, SleepPriority priority)
445 {
446 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
447 RETURN_IF_WITH_RET((callback == nullptr) || (proxy == nullptr), false);
448 int32_t priorityValue = static_cast<int32_t>(priority);
449 int32_t ret = proxy->RegisterSyncSleepCallbackIpc(callback, priorityValue);
450 return ret == ERR_OK;
451 }
452
UnRegisterSyncSleepCallback(const sptr<ISyncSleepCallback> & callback)453 bool PowerMgrClient::UnRegisterSyncSleepCallback(const sptr<ISyncSleepCallback>& callback)
454 {
455 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
456 RETURN_IF_WITH_RET((callback == nullptr) || (proxy == nullptr), false);
457 int32_t ret = proxy->UnRegisterSyncSleepCallbackIpc(callback);
458 return ret == ERR_OK;
459 }
460
RegisterSuspendTakeoverCallback(const sptr<ITakeOverSuspendCallback> & callback,TakeOverSuspendPriority priority)461 bool PowerMgrClient::RegisterSuspendTakeoverCallback(const sptr<ITakeOverSuspendCallback>& callback,
462 TakeOverSuspendPriority priority)
463 {
464 POWER_HILOGI(FEATURE_SUSPEND, "%{public}s start", __func__);
465 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
466 if ((callback == nullptr) || (proxy == nullptr)) {
467 POWER_HILOGE(FEATURE_SUSPEND, "%{public}s callback or proxy is nullptr", __func__);
468 return false;
469 }
470 int32_t ret = proxy->RegisterSuspendTakeoverCallbackIpc(callback, static_cast<int>(priority));
471 return ret == ERR_OK;
472 }
473
UnRegisterSuspendTakeoverCallback(const sptr<ITakeOverSuspendCallback> & callback)474 bool PowerMgrClient::UnRegisterSuspendTakeoverCallback(const sptr<ITakeOverSuspendCallback>& callback)
475 {
476 POWER_HILOGI(FEATURE_SUSPEND, "%{public}s start", __func__);
477 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
478 if ((callback == nullptr) || (proxy == nullptr)) {
479 POWER_HILOGE(FEATURE_SUSPEND, "%{public}s callback or proxy is nullptr", __func__);
480 return false;
481 }
482 int32_t ret = proxy->UnRegisterSuspendTakeoverCallbackIpc(callback);
483 return ret == ERR_OK;
484 }
485
RegisterSyncHibernateCallback(const sptr<ISyncHibernateCallback> & callback)486 bool PowerMgrClient::RegisterSyncHibernateCallback(const sptr<ISyncHibernateCallback>& callback)
487 {
488 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
489 RETURN_IF_WITH_RET((callback == nullptr) || (proxy == nullptr), false);
490 int32_t ret = proxy->RegisterSyncHibernateCallbackIpc(callback);
491 return ret == ERR_OK;
492 }
493
UnRegisterSyncHibernateCallback(const sptr<ISyncHibernateCallback> & callback)494 bool PowerMgrClient::UnRegisterSyncHibernateCallback(const sptr<ISyncHibernateCallback>& callback)
495 {
496 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
497 RETURN_IF_WITH_RET((callback == nullptr) || (proxy == nullptr), false);
498 int32_t ret = proxy->UnRegisterSyncHibernateCallbackIpc(callback);
499 return ret == ERR_OK;
500 }
501
RegisterPowerModeCallback(const sptr<IPowerModeCallback> & callback)502 bool PowerMgrClient::RegisterPowerModeCallback(const sptr<IPowerModeCallback>& callback)
503 {
504 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
505 RETURN_IF_WITH_RET((callback == nullptr) || (proxy == nullptr), false);
506 int32_t ret = proxy->RegisterPowerModeCallbackIpc(callback);
507 return ret == ERR_OK;
508 }
509
UnRegisterPowerModeCallback(const sptr<IPowerModeCallback> & callback)510 bool PowerMgrClient::UnRegisterPowerModeCallback(const sptr<IPowerModeCallback>& callback)
511 {
512 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
513 RETURN_IF_WITH_RET((callback == nullptr) || (proxy == nullptr), false);
514 int32_t ret = proxy->UnRegisterPowerModeCallbackIpc(callback);
515 return ret == ERR_OK;
516 }
517
RegisterScreenStateCallback(int32_t remainTime,const sptr<IScreenOffPreCallback> & callback)518 bool PowerMgrClient::RegisterScreenStateCallback(int32_t remainTime, const sptr<IScreenOffPreCallback>& callback)
519 {
520 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
521 RETURN_IF_WITH_RET((remainTime <= 0) || (callback == nullptr) || (proxy == nullptr), false);
522 POWER_HILOGI(FEATURE_SCREEN_OFF_PRE, "Register screen off pre Callback by client");
523 int32_t ret = proxy->RegisterScreenStateCallbackIpc(remainTime, callback);
524 return ret == ERR_OK;
525 }
526
UnRegisterScreenStateCallback(const sptr<IScreenOffPreCallback> & callback)527 bool PowerMgrClient::UnRegisterScreenStateCallback(const sptr<IScreenOffPreCallback>& callback)
528 {
529 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
530 RETURN_IF_WITH_RET((callback == nullptr) || (proxy == nullptr), false);
531 POWER_HILOGI(FEATURE_SCREEN_OFF_PRE, "Unregister screen off pre Callback by client");
532 int32_t ret = proxy->UnRegisterScreenStateCallbackIpc(callback);
533 return ret == ERR_OK;
534 }
535
RegisterRunningLockCallback(const sptr<IPowerRunninglockCallback> & callback)536 bool PowerMgrClient::RegisterRunningLockCallback(const sptr<IPowerRunninglockCallback>& callback)
537 {
538 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
539 RETURN_IF_WITH_RET((callback == nullptr) || (proxy == nullptr), false);
540 POWER_HILOGI(FEATURE_RUNNING_LOCK, "Register running lock Callback by client");
541 int32_t ret = proxy->RegisterRunningLockCallbackIpc(callback);
542 return ret == ERR_OK;
543 }
544
UnRegisterRunningLockCallback(const sptr<IPowerRunninglockCallback> & callback)545 bool PowerMgrClient::UnRegisterRunningLockCallback(const sptr<IPowerRunninglockCallback>& callback)
546 {
547 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
548 RETURN_IF_WITH_RET((callback == nullptr) || (proxy == nullptr), false);
549 POWER_HILOGI(FEATURE_RUNNING_LOCK, "Unregister running lock Callback by client");
550 int32_t ret = proxy->UnRegisterRunningLockCallbackIpc(callback);
551 return ret == ERR_OK;
552 }
553
SetDisplaySuspend(bool enable)554 bool PowerMgrClient::SetDisplaySuspend(bool enable)
555 {
556 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
557 RETURN_IF_WITH_RET(proxy == nullptr, false);
558 int32_t ret = proxy->SetDisplaySuspendIpc(enable);
559 return ret == ERR_OK;
560 }
561
Hibernate(bool clearMemory,const std::string & reason,const std::string & apiVersion)562 PowerErrors PowerMgrClient::Hibernate(bool clearMemory, const std::string& reason, const std::string& apiVersion)
563 {
564 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
565 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
566 sptr<PowerMgrStubAsync> asyncCallback = new PowerMgrStubAsync();
567 sptr<IPowerMgrAsync> powerProxy = iface_cast<IPowerMgrAsync>(asyncCallback);
568 RETURN_IF_WITH_RET(apiVersion.size() >= MAX_VERSION_STRING_SIZE, PowerErrors::ERR_PARAM_INVALID);
569 int32_t result = proxy->HibernateIpc(clearMemory, reason, apiVersion, powerProxy);
570 RETURN_IF_WITH_RET(result != ERR_OK, PowerErrors::ERR_CONNECTION_FAIL);
571 // Wait for the asynchronous callback to return, with a timeout of 100 milliseconds
572 PowerErrors ret = static_cast<PowerErrors>(asyncCallback->WaitForAsyncReply(100));
573 return ret;
574 }
575
SetDeviceMode(const PowerMode mode)576 PowerErrors PowerMgrClient::SetDeviceMode(const PowerMode mode)
577 {
578 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
579 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
580 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
581 int32_t modeValue = static_cast<int32_t>(mode);
582 proxy->SetDeviceModeIpc(modeValue, powerError);
583 return static_cast<PowerErrors>(powerError);
584 }
585
GetDeviceMode()586 PowerMode PowerMgrClient::GetDeviceMode()
587 {
588 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
589 RETURN_IF_WITH_RET(proxy == nullptr, static_cast<PowerMode>(0));
590 int32_t powerMode = 0;
591 proxy->GetDeviceModeIpc(powerMode);
592 return static_cast<PowerMode>(powerMode);
593 }
594
Dump(const std::vector<std::string> & args)595 std::string PowerMgrClient::Dump(const std::vector<std::string>& args)
596 {
597 std::string error = "can't connect service";
598 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
599 RETURN_IF_WITH_RET(proxy == nullptr, error);
600 std::string returnDump = "remote error";
601 uint32_t argc = args.size();
602 if (argc >= PARAM_MAX_NUM) {
603 POWER_HILOGW(COMP_FWK, "params exceed limit, argc=%{public}u", argc);
604 return returnDump;
605 }
606 proxy->ShellDumpIpc(args, argc, returnDump);
607 return returnDump;
608 }
609
GetError()610 PowerErrors PowerMgrClient::GetError()
611 {
612 auto temp = error_;
613 error_ = PowerErrors::ERR_OK;
614 return temp;
615 }
616
IsStandby(bool & isStandby)617 PowerErrors PowerMgrClient::IsStandby(bool& isStandby)
618 {
619 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
620 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
621 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
622 proxy->IsStandbyIpc(isStandby, powerError);
623 return static_cast<PowerErrors>(powerError);
624 }
625
QueryRunningLockLists(std::map<std::string,RunningLockInfo> & runningLockLists)626 bool PowerMgrClient::QueryRunningLockLists(std::map<std::string, RunningLockInfo>& runningLockLists)
627 {
628 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
629 RETURN_IF_WITH_RET(proxy == nullptr, false);
630 POWER_HILOGD(FEATURE_RUNNING_LOCK, "Query running lock lists by client");
631 int32_t ret = proxy->QueryRunningLockListsIpc(runningLockLists);
632 return ret == ERR_OK;
633 }
634
SetForceTimingOut(bool enabled)635 PowerErrors PowerMgrClient::SetForceTimingOut(bool enabled)
636 {
637 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
638 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
639 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
640 proxy->SetForceTimingOutIpc(enabled, token_, powerError);
641 PowerErrors ret = static_cast<PowerErrors>(powerError);
642 return ret;
643 }
644
LockScreenAfterTimingOut(bool enabledLockScreen,bool checkLock,bool sendScreenOffEvent)645 PowerErrors PowerMgrClient::LockScreenAfterTimingOut(bool enabledLockScreen, bool checkLock, bool sendScreenOffEvent)
646 {
647 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
648 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
649 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
650 proxy->LockScreenAfterTimingOutIpc(enabledLockScreen, checkLock, sendScreenOffEvent, token_, powerError);
651 PowerErrors ret = static_cast<PowerErrors>(powerError);
652 return ret;
653 }
654
IsRunningLockEnabled(const RunningLockType type,bool & result)655 PowerErrors PowerMgrClient::IsRunningLockEnabled(const RunningLockType type, bool& result)
656 {
657 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
658 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
659 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
660 int32_t lockType = static_cast<int32_t>(type);
661 proxy->IsRunningLockEnabledIpc(lockType, result, powerError);
662 return static_cast<PowerErrors>(powerError);
663 }
664
RefreshActivity(UserActivityType type,const std::string & refreshReason)665 PowerErrors PowerMgrClient::RefreshActivity(UserActivityType type, const std::string& refreshReason)
666 {
667 sptr<IPowerMgr> proxy = GetPowerMgrProxy();
668 RETURN_IF_WITH_RET(proxy == nullptr, PowerErrors::ERR_CONNECTION_FAIL);
669 int32_t activityType = static_cast<int32_t>(type);
670 int32_t powerError = static_cast<int32_t>(PowerErrors::ERR_CONNECTION_FAIL);
671 proxy->RefreshActivityIpc(GetTickCount(), activityType, refreshReason, powerError);
672 return static_cast<PowerErrors>(powerError);
673 }
674 } // namespace PowerMgr
675 } // namespace OHOS
676