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