1 /*
2 * Copyright (c) 2021 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 "running_lock_mgr.h"
17
18 #include <cinttypes>
19
20 #include <datetime_ex.h>
21 #include <hisysevent.h>
22 #include <securec.h>
23 #include <string_ex.h>
24
25 #include "power_common.h"
26 #include "power_mgr_factory.h"
27 #include "power_mgr_service.h"
28
29 using namespace std;
30
31 namespace OHOS {
32 namespace PowerMgr {
33 namespace {
34 const string TASK_RUNNINGLOCK_FORCEUNLOCK = "RunningLock_ForceUnLock";
35 }
36
~RunningLockMgr()37 RunningLockMgr::~RunningLockMgr() {}
38
Init()39 bool RunningLockMgr::Init()
40 {
41 POWER_HILOGI(MODULE_SERVICE, "RunningLockMgr::Init start");
42 std::lock_guard<std::mutex> lock(mutex_);
43 if (runningLockDeathRecipient_ == nullptr) {
44 runningLockDeathRecipient_ = new RunningLockDeathRecipient();
45 }
46 if (runningLockAction_ == nullptr) {
47 runningLockAction_ = PowerMgrFactory::GetRunningLockAction();
48 if (!runningLockAction_) {
49 POWER_HILOGE(MODULE_SERVICE,
50 "RunningLockMgr::Init create RunningLockMgr fail");
51 return false;
52 }
53 }
54 auto pmsptr = pms_.promote();
55 if (pmsptr == nullptr) {
56 return false;
57 }
58 handler_ = pmsptr->GetHandler();
59
60 systemLocks_.emplace(SystemLockType::SYSTEM_LOCK_APP,
61 std::make_shared<SystemLock>(runningLockAction_, LOCK_TAG_APP));
62 systemLocks_.emplace(SystemLockType::SYSTEM_LOCK_DISPLAY,
63 std::make_shared<SystemLock>(runningLockAction_, LOCK_TAG_DISPLAY));
64
65 bool ret = InitLocks();
66
67 POWER_HILOGI(MODULE_SERVICE, "RunningLockMgr::Init success");
68 return ret;
69 }
70
InitLocks()71 bool RunningLockMgr::InitLocks()
72 {
73 InitLocksTypeScreen();
74 InitLocksTypeBackground();
75 InitLocksTypeProximity();
76 return true;
77 }
78
InitLocksTypeScreen()79 void RunningLockMgr::InitLocksTypeScreen()
80 {
81 lockCounters_.emplace(RunningLockType::RUNNINGLOCK_SCREEN,
82 std::make_shared<LockCounter>(
83 RunningLockType::RUNNINGLOCK_SCREEN, [this](bool active) {
84 POWER_HILOGI(MODULE_SERVICE, "RUNNINGLOCK_SCREEN action start!");
85 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
86 if (pms == nullptr) {
87 return;
88 }
89 auto stateMachine = pms->GetPowerStateMachine();
90 if (stateMachine == nullptr) {
91 return;
92 }
93 if (active) {
94 POWER_HILOGI(MODULE_SERVICE, "RUNNINGLOCK_SCREEN active!");
95 stateMachine->SetState(PowerState::AWAKE,
96 StateChangeReason::STATE_CHANGE_REASON_RUNNING_LOCK);
97 stateMachine->CancelDelayTimer(
98 PowermsEventHandler::CHECK_USER_ACTIVITY_TIMEOUT_MSG);
99 stateMachine->CancelDelayTimer(
100 PowermsEventHandler::CHECK_USER_ACTIVITY_OFF_TIMEOUT_MSG);
101 } else {
102 POWER_HILOGI(MODULE_SERVICE, "RUNNINGLOCK_SCREEN inactive!");
103 if (stateMachine->GetState() == PowerState::AWAKE) {
104 stateMachine->ResetInactiveTimer();
105 } else {
106 POWER_HILOGD(MODULE_SERVICE,
107 "Screen On unlock in state: %{public}d",
108 stateMachine->GetState());
109 }
110 }
111 })
112 );
113 }
114
InitLocksTypeBackground()115 void RunningLockMgr::InitLocksTypeBackground()
116 {
117 lockCounters_.emplace(RunningLockType::RUNNINGLOCK_BACKGROUND,
118 std::make_shared<LockCounter>(
119 RunningLockType::RUNNINGLOCK_BACKGROUND, [this](bool active) {
120 POWER_HILOGI(MODULE_SERVICE, "RUNNINGLOCK_BACKGROUND action start!");
121 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
122 if (pms == nullptr) {
123 return;
124 }
125 auto stateMachine = pms->GetPowerStateMachine();
126 if (stateMachine == nullptr) {
127 return;
128 }
129 auto iterator = systemLocks_.find(SystemLockType::SYSTEM_LOCK_APP);
130 if (iterator == systemLocks_.end()) {
131 return;
132 }
133 std::shared_ptr<SystemLock> pSysLock = iterator->second;
134 if (active) {
135 POWER_HILOGI(MODULE_SERVICE, "RUNNINGLOCK_BACKGROUND active!");
136 stateMachine->CancelDelayTimer(
137 PowermsEventHandler::CHECK_USER_ACTIVITY_SLEEP_TIMEOUT_MSG);
138 pSysLock->Lock();
139 } else {
140 POWER_HILOGI(MODULE_SERVICE, "RUNNINGLOCK_BACKGROUND inactive!");
141 if (stateMachine->GetState() == PowerState::INACTIVE) {
142 stateMachine->ResetSleepTimer();
143 } else {
144 POWER_HILOGD(MODULE_SERVICE,
145 "Background unlock in state: %{public}d",
146 stateMachine->GetState());
147 }
148 pSysLock->Unlock();
149 }
150 })
151 );
152 }
153
InitLocksTypeProximity()154 void RunningLockMgr::InitLocksTypeProximity()
155 {
156 lockCounters_.emplace(RunningLockType::RUNNINGLOCK_PROXIMITY_SCREEN_CONTROL,
157 std::make_shared<LockCounter>(
158 RunningLockType::RUNNINGLOCK_PROXIMITY_SCREEN_CONTROL, [this](bool active) {
159 POWER_HILOGI(MODULE_SERVICE,
160 "RUNNINGLOCK_PROXIMITY_SCREEN_CONTROL action start!");
161 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
162 if (pms == nullptr) {
163 return;
164 }
165 auto stateMachine = pms->GetPowerStateMachine();
166 if (stateMachine == nullptr) {
167 return;
168 }
169 auto iterator = systemLocks_.find(SystemLockType::SYSTEM_LOCK_APP);
170 if (iterator == systemLocks_.end()) {
171 return;
172 }
173 std::shared_ptr<SystemLock> pSysLock = iterator->second;
174 if (active) {
175 POWER_HILOGI(MODULE_SERVICE,
176 "RUNNINGLOCK_PROXIMITY_SCREEN_CONTROL active!");
177 proximityController_.Enable();
178 if (proximityController_.IsClose()) {
179 POWER_HILOGI(MODULE_SERVICE, "INACTIVE when close");
180 stateMachine->SetState(PowerState::INACTIVE,
181 StateChangeReason::STATE_CHANGE_REASON_RUNNING_LOCK, true);
182 } else {
183 POWER_HILOGI(MODULE_SERVICE, "AWAKE when away");
184 stateMachine->SetState(PowerState::AWAKE,
185 StateChangeReason::STATE_CHANGE_REASON_RUNNING_LOCK, true);
186 }
187 stateMachine->CancelDelayTimer(
188 PowermsEventHandler::CHECK_USER_ACTIVITY_TIMEOUT_MSG);
189 stateMachine->CancelDelayTimer(
190 PowermsEventHandler::CHECK_USER_ACTIVITY_OFF_TIMEOUT_MSG);
191 pSysLock->Lock();
192 } else {
193 POWER_HILOGI(MODULE_SERVICE,
194 "RUNNINGLOCK_PROXIMITY_SCREEN_CONTROL inactive!");
195 stateMachine->SetState(PowerState::AWAKE,
196 StateChangeReason::STATE_CHANGE_REASON_RUNNING_LOCK);
197 stateMachine->ResetInactiveTimer();
198 pSysLock->Unlock();
199 proximityController_.Disable();
200 }
201 })
202 );
203 }
204
GetRunningLockInner(const sptr<IRemoteObject> & token)205 std::shared_ptr<RunningLockInner> RunningLockMgr::GetRunningLockInner(
206 const sptr<IRemoteObject>& token)
207 {
208 std::lock_guard<std::mutex> lock(mutex_);
209 auto iterator = runningLocks_.find(token);
210 if (iterator != runningLocks_.end()) {
211 POWER_HILOGD(MODULE_SERVICE, "RunningLockMgr::%{public}s :find by token.", __func__);
212 return iterator->second;
213 }
214 return nullptr;
215 }
216
CreateRunningLock(const sptr<IRemoteObject> & token,const RunningLockInfo & runningLockInfo,const UserIPCInfo & userIPCinfo)217 std::shared_ptr<RunningLockInner> RunningLockMgr::CreateRunningLock(
218 const sptr<IRemoteObject>& token,
219 const RunningLockInfo& runningLockInfo,
220 const UserIPCInfo& userIPCinfo)
221 {
222 auto lockInner = RunningLockInner::CreateRunningLockInner(runningLockInfo, userIPCinfo);
223 if (lockInner == nullptr) {
224 return nullptr;
225 }
226 POWER_HILOGD(MODULE_SERVICE,
227 "RunningLockMgr::%{public}s : ok,name = %{public}s,type = %{public}d",
228 __func__,
229 runningLockInfo.name.c_str(),
230 runningLockInfo.type);
231
232 mutex_.lock();
233 runningLocks_.emplace(token, lockInner);
234 mutex_.unlock();
235 token->AddDeathRecipient(runningLockDeathRecipient_);
236 return lockInner;
237 }
238
ReleaseLock(const sptr<IRemoteObject> token)239 void RunningLockMgr::ReleaseLock(const sptr<IRemoteObject> token)
240 {
241 POWER_HILOGI(MODULE_SERVICE, "RunningLockMgr::%{public}s :token = %{public}p",
242 __func__, token.GetRefPtr());
243 auto lockInner = GetRunningLockInner(token);
244 if (lockInner == nullptr) {
245 return;
246 }
247 if (!lockInner->GetDisabled()) {
248 UnLock(token);
249 }
250 mutex_.lock();
251 runningLocks_.erase(token);
252 mutex_.unlock();
253 token->RemoveDeathRecipient(runningLockDeathRecipient_);
254 }
255
RemoveAndPostUnlockTask(const sptr<IRemoteObject> & token,uint32_t timeOutMS)256 void RunningLockMgr::RemoveAndPostUnlockTask(
257 const sptr<IRemoteObject>& token, uint32_t timeOutMS)
258 {
259 auto handler = handler_.lock();
260 if (handler == nullptr) {
261 return;
262 }
263 const string& tokenStr = to_string(reinterpret_cast<uintptr_t>(token.GetRefPtr()));
264 POWER_HILOGI(MODULE_SERVICE,
265 "RunningLockMgr::%{public}s :token = %p,tokenStr = %s,timeOutMS = %d",
266 __func__,
267 token.GetRefPtr(),
268 tokenStr.c_str(),
269 timeOutMS);
270 handler->RemoveTask(tokenStr);
271 if (timeOutMS != 0) {
272 std::function<void()> unLockFunc = std::bind(&RunningLockMgr::UnLock, this, token);
273 handler->PostTask(unLockFunc, tokenStr, timeOutMS);
274 }
275 }
276
Lock(const sptr<IRemoteObject> & token,const RunningLockInfo & runningLockInfo,const UserIPCInfo & userIPCinfo,uint32_t timeOutMS)277 void RunningLockMgr::Lock(const sptr<IRemoteObject>& token,
278 const RunningLockInfo& runningLockInfo,
279 const UserIPCInfo& userIPCinfo, uint32_t timeOutMS)
280 {
281 POWER_HILOGI(MODULE_SERVICE,
282 "RunningLockMgr::%{public}s :token = %p,name = %s,type = %d",
283 __func__,
284 token.GetRefPtr(),
285 runningLockInfo.name.c_str(),
286 runningLockInfo.type);
287
288 auto lockInner = GetRunningLockInner(token);
289 if (lockInner == nullptr) {
290 POWER_HILOGD(MODULE_SERVICE, "RunningLockMgr::Lock failed, can't find %{public}p",
291 token.GetRefPtr());
292 return;
293 }
294 if (!lockInner->GetDisabled()) {
295 POWER_HILOGD(MODULE_SERVICE, "RunningLockMgr::Lock, this lock(%s) is already on",
296 lockInner->GetRunningLockName().c_str());
297 return;
298 }
299 lockInner->SetDisabled(false);
300
301 auto iterator = lockCounters_.find(lockInner->GetRunningLockType());
302 if (iterator == lockCounters_.end()) {
303 POWER_HILOGD(MODULE_SERVICE,
304 "RunningLockMgr::Lock failed, unsupported type %{public}d",
305 lockInner->GetRunningLockType());
306 return;
307 }
308 std::shared_ptr<LockCounter> counter = iterator->second;
309 counter->Increase();
310 POWER_HILOGD(MODULE_SERVICE,
311 "LockCounter: %{public}d, %{public}d",
312 lockInner->GetRunningLockType(),
313 counter->GetCount());
314 if (timeOutMS > 0) {
315 RemoveAndPostUnlockTask(token, timeOutMS);
316 }
317 }
318
UnLock(const sptr<IRemoteObject> token)319 void RunningLockMgr::UnLock(const sptr<IRemoteObject> token)
320 {
321 POWER_HILOGI(MODULE_SERVICE, "RunningLockMgr::%{public}s :token = %p",
322 __func__, token.GetRefPtr());
323
324 auto lockInner = GetRunningLockInner(token);
325 if (lockInner == nullptr) {
326 return;
327 }
328 if (lockInner->GetDisabled()) {
329 POWER_HILOGD(MODULE_SERVICE,
330 "RunningLockMgr::Unlock, this lock(%{public}s) is already off",
331 lockInner->GetRunningLockName().c_str());
332 return;
333 }
334 lockInner->SetDisabled(true);
335 RemoveAndPostUnlockTask(token);
336
337 auto iterator = lockCounters_.find(lockInner->GetRunningLockType());
338 if (iterator == lockCounters_.end()) {
339 POWER_HILOGD(MODULE_SERVICE,
340 "RunningLockMgr::Unlock failed, unsupported type %{public}d",
341 lockInner->GetRunningLockType());
342 return;
343 }
344 std::shared_ptr<LockCounter> counter = iterator->second;
345 counter->Decrease();
346 }
347
IsUsed(const sptr<IRemoteObject> & token)348 bool RunningLockMgr::IsUsed(const sptr<IRemoteObject>& token)
349 {
350 auto lockInner = GetRunningLockInner(token);
351 if (lockInner == nullptr || lockInner->GetDisabled()) {
352 return false;
353 }
354 return true;
355 }
356
GetRunningLockNum(RunningLockType type)357 uint32_t RunningLockMgr::GetRunningLockNum(RunningLockType type)
358 {
359 std::lock_guard<std::mutex> lock(mutex_);
360 if (type == RunningLockType::RUNNINGLOCK_BUTT) {
361 return runningLocks_.size();
362 }
363 return std::count_if(runningLocks_.begin(), runningLocks_.end(),
364 [&type](const auto& pair) {
365 return pair.second->GetRunningLockType() == type;
366 });
367 }
368
GetValidRunningLockNum(RunningLockType type)369 uint32_t RunningLockMgr::GetValidRunningLockNum(RunningLockType type)
370 {
371 auto iterator = lockCounters_.find(type);
372 if (iterator == lockCounters_.end()) {
373 POWER_HILOGD(MODULE_SERVICE,
374 "GetValidRunningLockNum failed, unsupported type %d", type);
375 return 0;
376 }
377 std::shared_ptr<LockCounter> counter = iterator->second;
378
379 return counter->GetCount();
380 }
381
ExistValidRunningLock()382 bool RunningLockMgr::ExistValidRunningLock()
383 {
384 std::lock_guard<std::mutex> lock(mutex_);
385 for (auto it = runningLocks_.begin(); it != runningLocks_.end(); it++) {
386 auto& lockinner = it->second;
387 if (lockinner->GetDisabled() == false) {
388 return true;
389 }
390 }
391 return false;
392 }
393
SetWorkTriggerList(const sptr<IRemoteObject> & token,const WorkTriggerList & workTriggerList)394 void RunningLockMgr::SetWorkTriggerList(const sptr<IRemoteObject>& token,
395 const WorkTriggerList& workTriggerList)
396 {
397 POWER_HILOGI(MODULE_SERVICE, "RunningLockMgr::%{public}s :token = %p",
398 __func__,
399 token.GetRefPtr());
400
401 auto lockInner = GetRunningLockInner(token);
402 if (lockInner == nullptr) {
403 return;
404 }
405 lockInner->SetWorkTriggerList(workTriggerList);
406 NotifyRunningLockChanged(token, lockInner, NOTIFY_RUNNINGLOCK_WORKTRIGGER_CHANGED);
407 // After update triggerlist, maybe need disabled the lock or enable the lock.
408 SetRunningLockDisableFlag(lockInner);
409 // If enabled, we really lock here.
410 LockReally(token, lockInner);
411 // If disabled, we really unlock here.
412 UnLockReally(token, lockInner);
413 }
414
NotifyHiViewRunningLockInfo(const string & tokenStr,const RunningLockInner & lockInner,RunningLockChangedType changeType) const415 void RunningLockMgr::NotifyHiViewRunningLockInfo(const string& tokenStr,
416 const RunningLockInner& lockInner,
417 RunningLockChangedType changeType) const
418 {
419 string lockName = lockInner.GetRunningLockName().empty()
420 ? "NULL" : lockInner.GetRunningLockName();
421 string msg = "token=" + tokenStr + " lockName=" + lockName + " type=" +
422 to_string(ToUnderlying(lockInner.GetRunningLockType()));
423 auto MakeNotifyInfo = [](int uid, int pid, const string& tag) {
424 return (" uid=" + to_string(uid) + " pid=" + to_string(pid) + " tag=" + tag);
425 };
426
427 auto& list = lockInner.GetRunningLockInfo().workTriggerlist;
428 if (list.empty()) {
429 const UserIPCInfo& ipcInfo = lockInner.GetUserIPCInfo();
430 msg += MakeNotifyInfo(ipcInfo.uid, ipcInfo.pid, lockName);
431 } else {
432 for (auto& worker : list) {
433 string workName = worker->GetName().empty() ? "NULL" : worker->GetName();
434 msg += MakeNotifyInfo(worker->GetUid(), worker->GetPid(), workName);
435 }
436 }
437 NotifyHiView(changeType, msg);
438 }
439
CheckOverTime()440 void RunningLockMgr::CheckOverTime()
441 {
442 auto handler = handler_.lock();
443 if (handler == nullptr) {
444 return;
445 }
446 handler->RemoveEvent(PowermsEventHandler::CHECK_RUNNINGLOCK_OVERTIME_MSG);
447 if (runningLocks_.empty()) {
448 return;
449 }
450 int64_t curTime = GetTickCount();
451 int64_t detectTime = curTime - CHECK_TIMEOUT_INTERVAL_MS;
452 POWER_HILOGI(MODULE_SERVICE,
453 "RunningLockMgr::%{public}s :cur = %" PRId64 " detectTime=%" PRId64 "",
454 __func__,
455 curTime,
456 detectTime);
457 if (detectTime < 0) {
458 return;
459 }
460 int64_t nextDetectTime = INT_MAX;
461 for (auto& it : runningLocks_) {
462 auto lockInner = it.second;
463 if (!lockInner->GetDisabled() && (!lockInner->GetOverTimeFlag())) {
464 if (lockInner->GetLockTimeMs() < detectTime) {
465 lockInner->SetOverTimeFlag(true);
466 NotifyRunningLockChanged(it.first, lockInner, NOTIFY_RUNNINGLOCK_OVERTIME);
467 } else {
468 if (lockInner->GetLockTimeMs() < nextDetectTime) {
469 nextDetectTime = lockInner->GetLockTimeMs();
470 }
471 }
472 }
473 }
474 if (nextDetectTime != INT_MAX) {
475 detectTime = nextDetectTime - curTime + CHECK_TIMEOUT_INTERVAL_MS;
476 SendCheckOverTimeMsg(detectTime);
477 }
478 }
479
SendCheckOverTimeMsg(int64_t delayTime)480 void RunningLockMgr::SendCheckOverTimeMsg(int64_t delayTime)
481 {
482 auto handler = handler_.lock();
483 if (handler == nullptr) {
484 return;
485 }
486 POWER_HILOGI(MODULE_SERVICE, "RunningLockMgr::%{public}s ,delay = %" PRId64 "",
487 __func__,
488 delayTime);
489 handler->SendEvent(PowermsEventHandler::CHECK_RUNNINGLOCK_OVERTIME_MSG, 0, delayTime);
490 }
491
NotifyRunningLockChanged(const sptr<IRemoteObject> & token,std::shared_ptr<RunningLockInner> & lockInner,RunningLockChangedType changeType)492 void RunningLockMgr::NotifyRunningLockChanged(const sptr<IRemoteObject>& token,
493 std::shared_ptr<RunningLockInner>& lockInner, RunningLockChangedType changeType)
494 {
495 if (changeType >= RUNNINGLOCK_CHANGED_BUTT) {
496 return;
497 }
498 const string& tokenStr = to_string(reinterpret_cast<uintptr_t>(token.GetRefPtr()));
499 switch (changeType) {
500 case NOTIFY_RUNNINGLOCK_ADD: {
501 NotifyHiViewRunningLockInfo(tokenStr, *lockInner, changeType);
502 SendCheckOverTimeMsg(CHECK_TIMEOUT_INTERVAL_MS);
503 break;
504 }
505 case NOTIFY_RUNNINGLOCK_REMOVE: {
506 string str = "token=" + tokenStr;
507 NotifyHiView(changeType, str);
508 break;
509 }
510 case NOTIFY_RUNNINGLOCK_WORKTRIGGER_CHANGED: {
511 NotifyHiViewRunningLockInfo(tokenStr, *lockInner, changeType);
512 break;
513 }
514 case NOTIFY_RUNNINGLOCK_OVERTIME: {
515 POWER_HILOGI(MODULE_SERVICE, "RunningLockMgr::%{public}s :%s token=%s",
516 __func__,
517 runninglockNotifyStr_.at(changeType).c_str(),
518 tokenStr.c_str());
519 break;
520 }
521 default: {
522 break;
523 }
524 }
525 }
MatchProxyMap(const UserIPCInfo & userIPCinfo)526 bool RunningLockMgr::MatchProxyMap(const UserIPCInfo& userIPCinfo)
527 {
528 if (proxyMap_.empty()) {
529 POWER_HILOGD(MODULE_SERVICE,
530 "%{public}s ret false by proxyMap_.empty(), useripcinfo uid = %d pid = %d.",
531 __func__,
532 userIPCinfo.uid,
533 userIPCinfo.pid);
534 return false;
535 }
536 auto it = proxyMap_.find(userIPCinfo.uid);
537 // 1. Find pidset by uid.
538 if (it == proxyMap_.end()) {
539 POWER_HILOGD(MODULE_SERVICE,
540 "%{public}s not find uidmap, useripcinfo uid = %d pid = %d.",
541 __func__,
542 userIPCinfo.uid,
543 userIPCinfo.pid);
544 return false;
545 }
546 auto& pidset = it->second;
547 // 2. Count by owner pid.
548 if (pidset.count(userIPCinfo.pid) > 0) {
549 POWER_HILOGD(MODULE_SERVICE,
550 "%{public}s find uidmap and count pid > 1, useripcinfo uid = %d pid = %d.",
551 __func__,
552 userIPCinfo.uid,
553 userIPCinfo.pid);
554 return true;
555 }
556 POWER_HILOGD(MODULE_SERVICE,
557 "%{public}s find uidmap and count pid = 0,count(-1) = %d, useripcinfo uid = %d "
558 "pid = %d.", __func__,
559 static_cast<unsigned int>(pidset.count(INVALID_PID)),
560 userIPCinfo.uid,
561 userIPCinfo.pid);
562 // 3. Count by INVALID_PID, return true when proxy (uid, -1).
563 return (pidset.count(INVALID_PID) > 0);
564 }
565
SetRunningLockDisableFlag(std::shared_ptr<RunningLockInner> & lockInner,bool forceRefresh)566 void RunningLockMgr::SetRunningLockDisableFlag(
567 std::shared_ptr<RunningLockInner>& lockInner,
568 bool forceRefresh)
569 {
570 if (proxyMap_.empty() && (!forceRefresh)) {
571 /**
572 * Generally when proxymap empty keep the default value false.
573 * When PGManager cancel proxy uid and pid,
574 * because we update the proxy map before, so we should refresh
575 * all of the runninglock disable flag always.
576 */
577 POWER_HILOGD(MODULE_SERVICE,
578 "%{public}s ret false by proxyMap_.empty() and forceRefresh = false", __func__);
579 lockInner->SetDisabled(false);
580 return;
581 }
582 const UserIPCInfo& userIPCinfo = lockInner->GetUserIPCInfo();
583 bool matched = MatchProxyMap(userIPCinfo);
584 if (matched) {
585 // Matched the lock owner useripcinfo, set disabled directly.
586 lockInner->SetDisabled(true);
587 POWER_HILOGD(MODULE_SERVICE,
588 "%{public}s MatchProxyMap matched by useripcinfo uid = %d pid = %d.",
589 __func__, userIPCinfo.uid, userIPCinfo.pid);
590 return;
591 }
592 const RunningLockInfo& runningLockInfo = lockInner->GetRunningLockInfo();
593 const WorkTriggerList& list = runningLockInfo.workTriggerlist;
594 if (list.empty()) {
595 // Not matched, and no trigger list.
596 lockInner->SetDisabled(false);
597 POWER_HILOGD(MODULE_SERVICE,
598 "%{public}s useripcinfo not matched and list is empty().", __func__);
599 return;
600 }
601 bool triggerMatched = true;
602 // Have trigger list, need to judge whether or not all of the list matched,
603 // otherwise we should hold the lock.
604 for (auto& workTrigger : list) {
605 UserIPCInfo triggerIPCInfo {workTrigger->GetUid(), workTrigger->GetPid()};
606 if (!MatchProxyMap(triggerIPCInfo)) {
607 triggerMatched = false;
608 POWER_HILOGD(MODULE_SERVICE,
609 "%{public}s workTrigger not matched uid = %d, pid = %d.",
610 __func__,
611 triggerIPCInfo.uid,
612 triggerIPCInfo.pid);
613 break;
614 }
615 }
616 lockInner->SetDisabled(triggerMatched);
617 POWER_HILOGD(MODULE_SERVICE,
618 "%{public}s useripcinfo uid = %d pid = %d, triggerMatched = %d.",
619 __func__,
620 userIPCinfo.uid,
621 userIPCinfo.pid,
622 triggerMatched);
623 }
624
LockReally(const sptr<IRemoteObject> & token,std::shared_ptr<RunningLockInner> & lockInner)625 void RunningLockMgr::LockReally(const sptr<IRemoteObject>& token,
626 std::shared_ptr<RunningLockInner>& lockInner)
627 {
628 if (lockInner->GetReallyLocked()) {
629 POWER_HILOGD(MODULE_SERVICE,
630 "%{public}s :return by lockInner->GetReallyLocked() == true.", __func__);
631 return;
632 }
633 if (lockInner->GetDisabled()) {
634 POWER_HILOGD(MODULE_SERVICE,
635 "%{public}s :return by lockInner->GetDisabled() == true.", __func__);
636 return;
637 }
638 runningLockAction_->Acquire(lockInner->GetRunningLockType());
639 lockInner->SetReallyLocked(true);
640 NotifyRunningLockChanged(token, lockInner, NOTIFY_RUNNINGLOCK_ADD);
641 POWER_HILOGD(MODULE_SERVICE, "%{public}s :called end.", __func__);
642 }
UnLockReally(const sptr<IRemoteObject> & token,std::shared_ptr<RunningLockInner> & lockInner)643 void RunningLockMgr::UnLockReally(const sptr<IRemoteObject>& token,
644 std::shared_ptr<RunningLockInner>& lockInner)
645 {
646 /**
647 * Case 1: Firstly PGManager ProxyRunningLock by uid and pid,
648 * secondly application lock by the same uid and
649 * pid, when call Lock() we matched the proxymap, and no really locked to kernel.
650 * So we don't need to unlocked to kernel.
651 * Case 2: Firstly application create the runninglock and call Lock(),
652 * and then PGManager Proxyed it,
653 * At this time, lock should be unlocked to kernel because we have locked to kernel for it.
654 */
655 if (!lockInner->GetReallyLocked()) {
656 POWER_HILOGD(MODULE_SERVICE,
657 "%{public}s :return by lockInner->GetReallyLocked() == false.", __func__);
658 return;
659 }
660 // If disabled, unlock to the kernel.
661 if (!lockInner->GetDisabled()) {
662 POWER_HILOGD(MODULE_SERVICE,
663 "%{public}s :return by lockInner->GetDisabled() == false.", __func__);
664 return;
665 }
666 runningLockAction_->Release(lockInner->GetRunningLockType());
667 lockInner->SetReallyLocked(false);
668 NotifyRunningLockChanged(token, lockInner, NOTIFY_RUNNINGLOCK_REMOVE);
669 POWER_HILOGD(MODULE_SERVICE, "%{public}s :called end.", __func__);
670 }
671
ProxyRunningLockInner(bool proxyLock)672 void RunningLockMgr::ProxyRunningLockInner(bool proxyLock)
673 {
674 if (proxyLock) {
675 for (auto& it : runningLocks_) {
676 SetRunningLockDisableFlag(it.second);
677 UnLockReally(it.first, it.second);
678 }
679 } else {
680 for (auto& it : runningLocks_) {
681 SetRunningLockDisableFlag(it.second, true);
682 LockReally(it.first, it.second);
683 }
684 }
685 }
686
ProxyRunningLock(bool proxyLock,pid_t uid,pid_t pid)687 void RunningLockMgr::ProxyRunningLock(bool proxyLock, pid_t uid, pid_t pid)
688 {
689 POWER_HILOGD(MODULE_SERVICE,
690 "%{public}s :proxyLock = %d, uid = %d, pid = %d", __func__,
691 proxyLock, uid, pid);
692 auto it = proxyMap_.find(uid);
693 if (proxyLock) {
694 // PGManager insert proxy info.
695 if (it == proxyMap_.end()) {
696 unordered_set<pid_t> pidset({pid});
697 proxyMap_.emplace(uid, pidset);
698 POWER_HILOGD(MODULE_SERVICE,
699 "%{public}s :proxyLock = true first emplace {uid = %d, pid = %d}",
700 __func__, uid, pid);
701 } else {
702 if (pid == INVALID_PID) {
703 // Insert uid, pid = -1,remove other pid
704 proxyMap_.erase(uid);
705 unordered_set<pid_t> pidset({pid});
706 proxyMap_.emplace(uid, pidset);
707 } else {
708 auto& pidset = it->second;
709 pidset.insert(pid);
710 }
711 POWER_HILOGD(MODULE_SERVICE,
712 "%{public}s :proxyLock = true uid = %d exist insert pid = %d",
713 __func__, uid, pid);
714 }
715 // 1. Set the matched runninglock inner disabled flag.
716 } else {
717 if (it == proxyMap_.end()) {
718 // No insert proxy info, nothing to erase.
719 POWER_HILOGD(MODULE_SERVICE,
720 "%{public}s :proxyLock = false not find by uid = %d",
721 __func__, uid);
722 return;
723 }
724 // 1. Clear the runninglock inner disabled flag 2.removed from proxyMap_
725 if (pid == INVALID_PID) {
726 proxyMap_.erase(uid);
727 POWER_HILOGD(MODULE_SERVICE,
728 "%{public}s :proxyLock = false pid = -1 rmv uid = %d map",
729 __func__, uid);
730 } else {
731 auto& pidset = it->second;
732 pidset.erase(pid);
733 POWER_HILOGD(MODULE_SERVICE,
734 "%{public}s :proxyLock = false uid = %d erase single pid = %d",
735 __func__, uid, pid);
736 if (pidset.size() == 0) {
737 proxyMap_.erase(uid);
738 POWER_HILOGD(MODULE_SERVICE,
739 "%{public}s :pidset.size()=0 erase uid keymap", __func__);
740 }
741 }
742 }
743 ProxyRunningLockInner(proxyLock);
744 }
745
NotifyHiView(RunningLockChangedType changeType,const std::string & msg) const746 void RunningLockMgr::NotifyHiView(RunningLockChangedType changeType,
747 const std::string& msg) const
748 {
749 if (msg.empty()) {
750 return;
751 }
752 const int logLevel = 2;
753 const string &tag = runninglockNotifyStr_.at(changeType);
754 HiviewDFX::HiSysEvent::Write(HiviewDFX::HiSysEvent::Domain::POWERMGR, "POWER_RUNNINGLOCK",
755 HiviewDFX::HiSysEvent::EventType::FAULT,
756 "LOG_LEVEL",
757 logLevel,
758 "TAG",
759 tag,
760 "MESSAGE",
761 msg);
762 POWER_HILOGI(MODULE_SERVICE, "RunningLockMgr::%{public}s: %s %s",
763 __func__,
764 tag.c_str(),
765 msg.c_str());
766 }
767
EnableMock(IRunningLockAction * mockAction)768 void RunningLockMgr::EnableMock(IRunningLockAction* mockAction)
769 {
770 // reset lock list
771 runningLocks_.clear();
772 for (auto it = lockCounters_.begin(); it != lockCounters_.end(); it++) {
773 it->second->Clear();
774 }
775 proximityController_.Clear();
776
777 std::shared_ptr<IRunningLockAction> mock(mockAction);
778 for (auto it = systemLocks_.begin(); it != systemLocks_.end(); it++) {
779 it->second->EnableMock(mock);
780 }
781 runningLockAction_ = mock;
782 }
783
GetRunningLockTypeString(RunningLockType type)784 static const std::string GetRunningLockTypeString(RunningLockType type)
785 {
786 switch (type) {
787 case RunningLockType::RUNNINGLOCK_SCREEN:
788 return "SCREEN";
789 case RunningLockType::RUNNINGLOCK_BACKGROUND:
790 return "BACKGROUND";
791 case RunningLockType::RUNNINGLOCK_PROXIMITY_SCREEN_CONTROL:
792 return "PROXIMITY_SCREEN_CONTROL";
793 case RunningLockType::RUNNINGLOCK_BUTT:
794 return "BUTT";
795 default:
796 break;
797 }
798
799 return "UNKNOWN";
800 }
801
DumpInfo(std::string & result)802 void RunningLockMgr::DumpInfo(std::string& result)
803 {
804 auto validSize = GetValidRunningLockNum();
805 std::lock_guard<std::mutex> lock(mutex_);
806
807 result.append("POWER MANAGER DUMP (hidumper -runninglock):\n");
808 result.append(" totalSize=").append(ToString(runningLocks_.size()))
809 .append(" validSize=").append(ToString(validSize)).append("\n");
810 result.append("Summary By Type: \n");
811 for (auto it = lockCounters_.begin(); it != lockCounters_.end(); it++) {
812 result.append(GetRunningLockTypeString(it->first))
813 .append(": ")
814 .append(ToString(it->second->GetCount()))
815 .append("\n");
816 }
817
818 if (runningLocks_.empty()) {
819 result.append("Lock List is Empty. \n");
820 return;
821 }
822
823 result.append("Dump Lock List: \n");
824 auto curTick = GetTickCount();
825 int index = 0;
826 for (auto& it : runningLocks_) {
827 if (index++ == MAX_DUMP_NUM) {
828 break;
829 }
830 auto lockInner = it.second;
831 if (lockInner == nullptr) {
832 return;
833 }
834 auto& lockinfo = lockInner->GetRunningLockInfo();
835 auto& ipcinfo = lockInner->GetUserIPCInfo();
836 result.append(" index=").append(ToString(index))
837 .append(" time=").append(ToString(curTick - lockInner->GetLockTimeMs()))
838 .append(" type=").append(GetRunningLockTypeString(lockinfo.type))
839 .append(" name=").append(lockinfo.name)
840 .append(" uid=").append(ToString(ipcinfo.uid))
841 .append(" pid=").append(ToString(ipcinfo.pid))
842 .append(" disable=").append(ToString(lockInner->GetDisabled()))
843 .append("\n");
844 }
845
846 result.append("Peripherals Info: \n")
847 .append("Proximity: ")
848 .append("Enabled: ")
849 .append(ToString(proximityController_.IsEnabled()))
850 .append("Status: ")
851 .append(ToString(proximityController_.GetStatus()))
852 .append("\n");
853 }
854
OnRemoteDied(const wptr<IRemoteObject> & remote)855 void RunningLockMgr::RunningLockDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remote)
856 {
857 if (remote.promote() == nullptr) {
858 return;
859 }
860 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
861 if (pms == nullptr) {
862 return;
863 }
864 auto handler = pms->GetHandler();
865 if (handler == nullptr) {
866 return;
867 }
868 std::function<void()> forceUnLockFunc = std::bind(&PowerMgrService::ForceUnLock, pms,
869 remote.promote());
870 POWER_HILOGI(MODULE_SERVICE,
871 "RunningLockDeathRecipient::%{public}s :remote.promote() = %p",
872 __func__,
873 remote.promote().GetRefPtr());
874 handler->PostTask(forceUnLockFunc, TASK_RUNNINGLOCK_FORCEUNLOCK);
875 }
876
Lock()877 void RunningLockMgr::SystemLock::Lock()
878 {
879 if (!locking_) {
880 action_->Lock(RunningLockType::RUNNINGLOCK_BUTT, tag_.c_str());
881 locking_ = true;
882 }
883 }
884
Unlock()885 void RunningLockMgr::SystemLock::Unlock()
886 {
887 if (locking_) {
888 action_->Unlock(RunningLockType::RUNNINGLOCK_BUTT, tag_.c_str());
889 locking_ = false;
890 }
891 }
892
Increase()893 uint32_t RunningLockMgr::LockCounter::Increase()
894 {
895 ++counter_;
896 if (counter_ == 1) {
897 activate_(true);
898 }
899 return counter_;
900 }
901
Decrease()902 uint32_t RunningLockMgr::LockCounter::Decrease()
903 {
904 --counter_;
905 if (counter_ == 0) {
906 activate_(false);
907 }
908 return counter_;
909 }
910
Clear()911 void RunningLockMgr::LockCounter::Clear()
912 {
913 counter_ = 0;
914 }
915
RecordSensorCallback(SensorEvent * event)916 void RunningLockMgr::ProximityController::RecordSensorCallback(SensorEvent *event)
917 {
918 POWER_HILOGD(MODULE_SERVICE, "Sensor Callback come in");
919 if (event == nullptr) {
920 POWER_HILOGE(MODULE_SERVICE, "SensorEvent *event is nullptr");
921 return;
922 }
923 if (event->sensorTypeId != SENSOR_TYPE_ID_PROXIMITY) {
924 POWER_HILOGE(MODULE_SERVICE, "Sensor Callback is not PROXIMITY");
925 return;
926 }
927 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
928 if (pms == nullptr) {
929 POWER_HILOGE(MODULE_SERVICE, "PowerMgrService::GetInstance()");
930 return;
931 }
932 auto runningLock = pms->GetRunningLockMgr();
933 ProximityData* data = (ProximityData*)event->data;
934
935 POWER_HILOGD(MODULE_SERVICE, "Sensor Callback %{public}d", data->scalar);
936 if (data->scalar == PROXIMITY_CLOSE_SCALAR) {
937 runningLock->SetProximity(PROXIMITY_CLOSE);
938 } else if (data->scalar == PROXIMITY_AWAY_SCALAR) {
939 runningLock->SetProximity(PROXIMITY_AWAY);
940 }
941 }
942
ProximityController()943 RunningLockMgr::ProximityController::ProximityController()
944 {
945 POWER_HILOGD(MODULE_SERVICE, "ProximityController Create");
946 SensorInfo* sensorInfo = nullptr;
947 int32_t count;
948 int ret = GetAllSensors(&sensorInfo, &count);
949 if (ret != 0 || sensorInfo == nullptr) {
950 POWER_HILOGE(MODULE_SERVICE, "Can't get sensors");
951 return;
952 }
953 for (int32_t i = 0; i < count; i++) {
954 if (sensorInfo[i].sensorId == SENSOR_TYPE_ID_PROXIMITY) {
955 POWER_HILOGD(MODULE_SERVICE, "ProximityController Support");
956 support_ = true;
957 break;
958 }
959 }
960 if (!support_) {
961 POWER_HILOGE(MODULE_SERVICE, "ProximityController not support");
962 free(sensorInfo);
963 return;
964 }
965 if (strcpy_s(user_.name, sizeof(user_.name), "RunningLock") != EOK) {
966 POWER_HILOGE(MODULE_SERVICE, "ProximityController strcpy_s err");
967 return;
968 }
969 user_.userData = nullptr;
970 user_.callback = &RecordSensorCallback;
971 SubscribeSensor(SENSOR_TYPE_ID_PROXIMITY, &user_);
972 free(sensorInfo);
973 }
974
~ProximityController()975 RunningLockMgr::ProximityController::~ProximityController()
976 {
977 if (support_) {
978 UnsubscribeSensor(SENSOR_TYPE_ID_PROXIMITY, &user_);
979 }
980 }
981
Enable()982 void RunningLockMgr::ProximityController::Enable()
983 {
984 POWER_HILOGD(MODULE_SERVICE, "ProximityController Enable");
985 enabled_ = true;
986 if (!support_) {
987 POWER_HILOGE(MODULE_SERVICE, "ProximityController not support");
988 return;
989 }
990
991 SetBatch(SENSOR_TYPE_ID_PROXIMITY, &user_, SAMPLING_RATE, SAMPLING_RATE);
992 ActivateSensor(SENSOR_TYPE_ID_PROXIMITY, &user_);
993 SetMode(SENSOR_TYPE_ID_PROXIMITY, &user_, SENSOR_ON_CHANGE);
994 }
995
Disable()996 void RunningLockMgr::ProximityController::Disable()
997 {
998 POWER_HILOGD(MODULE_SERVICE, "ProximityController Disable");
999 enabled_ = false;
1000 if (!support_) {
1001 POWER_HILOGE(MODULE_SERVICE, "ProximityController not support");
1002 return;
1003 }
1004
1005 DeactivateSensor(SENSOR_TYPE_ID_PROXIMITY, &user_);
1006 }
1007
IsClose()1008 bool RunningLockMgr::ProximityController::IsClose()
1009 {
1010 POWER_HILOGD(MODULE_SERVICE, "IsClose:%{public}d", isClose);
1011 return isClose;
1012 }
1013
OnClose()1014 void RunningLockMgr::ProximityController::OnClose()
1015 {
1016 if (!enabled_ || IsClose()) {
1017 return;
1018 }
1019 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
1020 if (pms == nullptr) {
1021 return;
1022 }
1023 auto stateMachine = pms->GetPowerStateMachine();
1024 if (stateMachine == nullptr) {
1025 return;
1026 }
1027 isClose = true;
1028 auto runningLock = pms->GetRunningLockMgr();
1029 if (runningLock->GetValidRunningLockNum(
1030 RunningLockType::RUNNINGLOCK_PROXIMITY_SCREEN_CONTROL) > 0) {
1031 POWER_HILOGD(MODULE_SERVICE, "Change to INACITVE when come close");
1032 stateMachine->SetState(PowerState::INACTIVE,
1033 StateChangeReason::STATE_CHANGE_REASON_SENSOR,
1034 true);
1035 }
1036 }
1037
OnAway()1038 void RunningLockMgr::ProximityController::OnAway()
1039 {
1040 if (!enabled_ || !IsClose()) {
1041 return;
1042 }
1043 auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance();
1044 if (pms == nullptr) {
1045 return;
1046 }
1047 auto stateMachine = pms->GetPowerStateMachine();
1048 if (stateMachine == nullptr) {
1049 return;
1050 }
1051 isClose = false;
1052 auto runningLock = pms->GetRunningLockMgr();
1053 if (runningLock->GetValidRunningLockNum(
1054 RunningLockType::RUNNINGLOCK_PROXIMITY_SCREEN_CONTROL) > 0) {
1055 POWER_HILOGD(MODULE_SERVICE, "Change to AWAKE when go away");
1056 stateMachine->SetState(PowerState::AWAKE,
1057 StateChangeReason::STATE_CHANGE_REASON_SENSOR,
1058 true);
1059 }
1060 }
1061
Clear()1062 void RunningLockMgr::ProximityController::Clear()
1063 {
1064 isClose = false;
1065 }
1066
SetProximity(uint32_t status)1067 void RunningLockMgr::SetProximity(uint32_t status)
1068 {
1069 switch (status) {
1070 case PROXIMITY_CLOSE:
1071 proximityController_.OnClose();
1072 break;
1073 case PROXIMITY_AWAY:
1074 proximityController_.OnAway();
1075 break;
1076 default:
1077 break;
1078 }
1079 }
1080 } // namespace PowerMgr
1081 } // namespace OHOS
1082