• 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_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