• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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 #include "screenlock_system_ability.h"
16 
17 #include <cerrno>
18 #include <ctime>
19 #include <string>
20 #include <sys/time.h>
21 #include <unistd.h>
22 
23 #include "core_service_client.h"
24 #include "display_manager.h"
25 #include "ipc_skeleton.h"
26 #include "iservice_registry.h"
27 #include "system_ability_definition.h"
28 #include "system_ability.h"
29 #include "useridm_client.h"
30 #include "os_account_manager.h"
31 
32 #include "sclock_log.h"
33 #include "screenlock_bundlename.h"
34 #include "screenlock_common.h"
35 #include "screenlock_get_info_callback.h"
36 
37 namespace OHOS {
38 namespace ScreenLock {
39 using namespace std;
40 using namespace OHOS::HiviewDFX;
41 using namespace OHOS::Rosen;
42 using namespace OHOS::UserIAM::UserIDM;
43 using namespace OHOS::Telephony;
44 REGISTER_SYSTEM_ABILITY_BY_ID(ScreenLockSystemAbility, SCREENLOCK_SERVICE_ID, true);
45 const std::int64_t INIT_INTERVAL = 5000L;
46 const std::int64_t INTERVAL_ZERO = 0L;
47 std::mutex ScreenLockSystemAbility::instanceLock_;
48 sptr<ScreenLockSystemAbility> ScreenLockSystemAbility::instance_;
49 std::shared_ptr<AppExecFwk::EventHandler> ScreenLockSystemAbility::serviceHandler_;
50 
ScreenLockSystemAbility(int32_t systemAbilityId,bool runOnCreate)51 ScreenLockSystemAbility::ScreenLockSystemAbility(int32_t systemAbilityId, bool runOnCreate)
52     : SystemAbility(systemAbilityId, runOnCreate), state_(ServiceRunningState::STATE_NOT_START)
53 {
54 }
55 
~ScreenLockSystemAbility()56 ScreenLockSystemAbility::~ScreenLockSystemAbility()
57 {
58     SCLOCK_HILOGD("~ScreenLockSystemAbility state_  is %{public}d.", static_cast<int>(state_));
59 }
60 
GetInstance()61 sptr<ScreenLockSystemAbility> ScreenLockSystemAbility::GetInstance()
62 {
63     if (instance_ == nullptr) {
64         std::lock_guard<std::mutex> autoLock(instanceLock_);
65         if (instance_ == nullptr) {
66             instance_ = new ScreenLockSystemAbility(SCREENLOCK_SERVICE_ID, true);
67             SCLOCK_HILOGE("ScreenLockSystemAbility instance_ create,addr=%{public}p", instance_.GetRefPtr());
68         }
69     }
70     return instance_;
71 }
72 
Init()73 int32_t ScreenLockSystemAbility::Init()
74 {
75     bool ret = Publish(ScreenLockSystemAbility::GetInstance());
76     if (!ret) {
77         SCLOCK_HILOGE("ScreenLockSystemAbility Publish failed.");
78         return E_SCREENLOCK_PUBLISH_FAIL;
79     }
80     SCLOCK_HILOGD("state_  is %{public}d.", static_cast<int>(state_));
81     stateValue_.Reset();
82     SCLOCK_HILOGI("Init ScreenLockSystemAbility success.");
83     return ERR_OK;
84 }
85 
OnStart()86 void ScreenLockSystemAbility::OnStart()
87 {
88     SCLOCK_HILOGI("ScreenLockSystemAbility::Enter OnStart.");
89     if (instance_ == nullptr) {
90         instance_ = this;
91     }
92     if (state_ == ServiceRunningState::STATE_RUNNING) {
93         SCLOCK_HILOGI("ScreenLockSystemAbility is already running.");
94         return;
95     }
96     InitServiceHandler();
97     if (Init() != ERR_OK) {
98         auto callback = [=]() { Init(); };
99         serviceHandler_->PostTask(callback, INIT_INTERVAL);
100         SCLOCK_HILOGE("ScreenLockSystemAbility Init failed. Try again 5s later");
101         return;
102     }
103     if (focusChangedListener_ == nullptr) {
104         focusChangedListener_ = new ScreenLockSystemAbility::ScreenLockFocusChangedListener();
105     }
106     if (displayPowerEventListener_ == nullptr) {
107         displayPowerEventListener_ = new ScreenLockSystemAbility::ScreenLockDisplayPowerEventListener();
108     }
109     WindowManager::GetInstance().RegisterFocusChangedListener(focusChangedListener_);
110     int trytime = 3;
111     int minTimeValue = 0;
112     while (trytime > minTimeValue) {
113         flag_ = DisplayManager::GetInstance().RegisterDisplayPowerEventListener(displayPowerEventListener_);
114         if (flag_) {
115             SCLOCK_HILOGI("ScreenLockSystemAbility RegisterDisplayPowerEventListener success.");
116             break;
117         } else {
118             SCLOCK_HILOGI("ScreenLockSystemAbility RegisterDisplayPowerEventListener fail.");
119         }
120         --trytime;
121         sleep(1);
122     }
123     if (flag_) {
124         state_ = ServiceRunningState::STATE_RUNNING;
125         auto callback = [=]() { OnSystemReady(); };
126         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
127     }
128     return;
129 }
130 
InitServiceHandler()131 void ScreenLockSystemAbility::InitServiceHandler()
132 {
133     SCLOCK_HILOGI("InitServiceHandler started.");
134     if (serviceHandler_ != nullptr) {
135         SCLOCK_HILOGI("InitServiceHandler already init.");
136         return;
137     }
138     std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create("ScreenLockSystemAbility");
139     serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
140     SCLOCK_HILOGI("InitServiceHandler succeeded.");
141 }
142 
OnStop()143 void ScreenLockSystemAbility::OnStop()
144 {
145     SCLOCK_HILOGI("OnStop started.");
146     if (state_ != ServiceRunningState::STATE_RUNNING) {
147         return;
148     }
149     serviceHandler_ = nullptr;
150     instance_ = nullptr;
151     state_ = ServiceRunningState::STATE_NOT_START;
152     WindowManager::GetInstance().UnregisterFocusChangedListener(focusChangedListener_);
153     if (focusChangedListener_ != nullptr) {
154         delete focusChangedListener_;
155         focusChangedListener_ = nullptr;
156     }
157     DisplayManager::GetInstance().UnregisterDisplayPowerEventListener(displayPowerEventListener_);
158     if (displayPowerEventListener_ != nullptr) {
159         delete displayPowerEventListener_;
160         displayPowerEventListener_ = nullptr;
161     }
162     SCLOCK_HILOGI("OnStop end.");
163 }
164 
OnFocused(const sptr<Rosen::FocusChangeInfo> & focusChangeInfo)165 void ScreenLockSystemAbility::ScreenLockFocusChangedListener::OnFocused(
166     const sptr<Rosen::FocusChangeInfo> &focusChangeInfo)
167 {
168     SCLOCK_HILOGI("ScreenLockSystemAbility::ScreenLockFocusChangedListener OnFocused");
169     instance_->isFoucs_ = true;
170 }
171 
OnUnfocused(const sptr<Rosen::FocusChangeInfo> & focusChangeInfo)172 void ScreenLockSystemAbility::ScreenLockFocusChangedListener::OnUnfocused(
173     const sptr<Rosen::FocusChangeInfo> &focusChangeInfo)
174 {
175     SCLOCK_HILOGI("ScreenLockSystemAbility::ScreenLockFocusChangedListener OnUnfocused.");
176     instance_->isFoucs_ = false;
177 }
178 
OnDisplayPowerEvent(DisplayPowerEvent event,EventStatus status)179 void ScreenLockSystemAbility::ScreenLockDisplayPowerEventListener::OnDisplayPowerEvent(
180     DisplayPowerEvent event, EventStatus status)
181 {
182     SCLOCK_HILOGI("OnDisplayPowerEvent event=%{public}d", static_cast<int>(event));
183     SCLOCK_HILOGI("OnDisplayPowerEvent status= %{public}d", static_cast<int>(status));
184     if (status == EventStatus::BEGIN) {
185         if (event == DisplayPowerEvent::WAKE_UP) {
186             instance_->OnBeginWakeUp();
187         } else if (event == DisplayPowerEvent::SLEEP) {
188             instance_->OnBeginSleep(0);
189         } else if (event == DisplayPowerEvent::DISPLAY_ON) {
190             instance_->OnBeginScreenOn();
191         } else if (event == DisplayPowerEvent::DISPLAY_OFF) {
192             instance_->OnBeginScreenOff();
193         } else if (event == DisplayPowerEvent::DESKTOP_READY) {
194             instance_->OnExitAnimation();
195         }
196     } else if (status == EventStatus::END) {
197         if (event == DisplayPowerEvent::WAKE_UP) {
198             instance_->OnEndWakeUp();
199         } else if (event == DisplayPowerEvent::SLEEP) {
200             instance_->OnEndSleep(0, 0);
201         } else if (event == DisplayPowerEvent::DISPLAY_ON) {
202             instance_->OnEndScreenOn();
203         } else if (event == DisplayPowerEvent::DISPLAY_OFF) {
204             instance_->OnEndScreenOff();
205         }
206     }
207 }
208 
OnBeginScreenOff()209 void ScreenLockSystemAbility::OnBeginScreenOff()
210 {
211     SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginScreenOff started.");
212     stateValue_.SetScreenState(static_cast<int>(ScreenState::SCREEN_STATE_BEGIN_OFF));
213     std::string type = BEGIN_SCREEN_OFF;
214     auto iter = registeredListeners_.find(type);
215     if (iter != registeredListeners_.end()) {
216         SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginScreenOff started1.");
217         auto callback = [=]() {
218             SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginScreenOff started2.");
219             iter->second->OnCallBack(type);
220         };
221         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
222     }
223 }
224 
OnEndScreenOff()225 void ScreenLockSystemAbility::OnEndScreenOff()
226 {
227     SCLOCK_HILOGI("ScreenLockSystemAbility OnEndScreenOff started.");
228     stateValue_.SetScreenState(static_cast<int>(ScreenState::SCREEN_STATE_END_OFF));
229     std::string type = END_SCREEN_OFF;
230     auto iter = registeredListeners_.find(type);
231     if (iter != registeredListeners_.end()) {
232         SCLOCK_HILOGI("ScreenLockSystemAbility OnEndScreenOff started1.");
233         auto callback = [=]() {
234             SCLOCK_HILOGI("ScreenLockSystemAbility OnEndScreenOff started2.");
235             iter->second->OnCallBack(type);
236         };
237         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
238     }
239 }
240 
OnBeginScreenOn()241 void ScreenLockSystemAbility::OnBeginScreenOn()
242 {
243     SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginScreenOn started.");
244     stateValue_.SetScreenState(static_cast<int>(ScreenState::SCREEN_STATE_BEGIN_ON));
245     std::string type = BEGIN_SCREEN_ON;
246     auto iter = registeredListeners_.find(type);
247     if (iter != registeredListeners_.end()) {
248         SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginScreenOn started1.");
249         auto callback = [=]() {
250             SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginScreenOn started2.");
251             iter->second->OnCallBack(type);
252         };
253         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
254     }
255 }
256 
OnSystemReady()257 void ScreenLockSystemAbility::OnSystemReady()
258 {
259     SCLOCK_HILOGI("ScreenLockSystemAbility OnSystemReady started.");
260     std::string type = SYSTEM_READY;
261     bool isExitFlag = false;
262     int tryTime = 20;
263     int minTryTime = 0;
264     while (!isExitFlag && (tryTime > minTryTime)) {
265         auto iter = registeredListeners_.find(type);
266         if (iter != registeredListeners_.end()) {
267             SCLOCK_HILOGI("ScreenLockSystemAbility OnSystemReady started1.");
268             iter->second->OnCallBack(type);
269             isExitFlag = true;
270         } else {
271             SCLOCK_HILOGI("ScreenLockSystemAbility OnSystemReady type not found., flag_ = %{public}d", flag_);
272             sleep(1);
273         }
274         --tryTime;
275     }
276 }
277 
OnEndScreenOn()278 void ScreenLockSystemAbility::OnEndScreenOn()
279 {
280     SCLOCK_HILOGI("ScreenLockSystemAbility OnEndScreenOn started.");
281     stateValue_.SetScreenState(static_cast<int>(ScreenState::SCREEN_STATE_END_ON));
282     std::string type = END_SCREEN_ON;
283     auto iter = registeredListeners_.find(type);
284     if (iter != registeredListeners_.end()) {
285         SCLOCK_HILOGI("ScreenLockSystemAbility OnEndScreenOn started1.");
286         auto callback = [=]() {
287             SCLOCK_HILOGI("ScreenLockSystemAbility OnEndScreenOn started2.");
288             iter->second->OnCallBack(type);
289         };
290         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
291     }
292 }
293 
OnBeginWakeUp()294 void ScreenLockSystemAbility::OnBeginWakeUp()
295 {
296     SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginWakeUp started.");
297     stateValue_.SetInteractiveState(static_cast<int>(InteractiveState::INTERACTIVE_STATE_BEGIN_WAKEUP));
298     std::string type = BEGIN_WAKEUP;
299     auto iter = registeredListeners_.find(type);
300     if (iter != registeredListeners_.end()) {
301         SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginWakeUp started1.");
302         auto callback = [=]() {
303             SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginWakeUp started2.");
304             iter->second->OnCallBack(type);
305         };
306         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
307     }
308 }
309 
OnEndWakeUp()310 void ScreenLockSystemAbility::OnEndWakeUp()
311 {
312     SCLOCK_HILOGI("ScreenLockSystemAbility OnEndWakeUp started.");
313     stateValue_.SetInteractiveState(static_cast<int>(InteractiveState::INTERACTIVE_STATE_END_WAKEUP));
314     std::string type = END_WAKEUP;
315     auto iter = registeredListeners_.find(type);
316     if (iter != registeredListeners_.end()) {
317         SCLOCK_HILOGI("ScreenLockSystemAbility OnEndWakeUp started1.");
318         auto callback = [=]() {
319             SCLOCK_HILOGI("ScreenLockSystemAbility OnEndWakeUp started2.");
320             iter->second->OnCallBack(type);
321         };
322         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
323     }
324 }
325 
OnBeginSleep(const int why)326 void ScreenLockSystemAbility::OnBeginSleep(const int why)
327 {
328     SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginSleep started.");
329     stateValue_.SetOffReason(why);
330     stateValue_.SetInteractiveState(static_cast<int>(InteractiveState::INTERACTIVE_STATE_BEGIN_SLEEP));
331     std::string type = BEGIN_SLEEP;
332     auto iter = registeredListeners_.find(type);
333     if (iter != registeredListeners_.end()) {
334         SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginSleep started1.");
335         auto callback = [=]() {
336             SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginSleep started2.");
337             iter->second->OnCallBack(type, why);
338         };
339         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
340     }
341 }
342 
OnEndSleep(const int why,const int isTriggered)343 void ScreenLockSystemAbility::OnEndSleep(const int why, const int isTriggered)
344 {
345     SCLOCK_HILOGI("ScreenLockSystemAbility OnEndSleep started.");
346     stateValue_.SetInteractiveState(static_cast<int>(InteractiveState::INTERACTIVE_STATE_END_SLEEP));
347     std::string type = END_SLEEP;
348     auto iter = registeredListeners_.find(type);
349     if (iter != registeredListeners_.end()) {
350         SCLOCK_HILOGI("ScreenLockSystemAbility OnEndSleep started1.");
351         auto callback = [=]() {
352             SCLOCK_HILOGI("ScreenLockSystemAbility OnEndSleep started2.");
353             iter->second->OnCallBack(type, why);
354         };
355         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
356     }
357 }
358 
OnChangeUser(const int newUserId)359 void ScreenLockSystemAbility::OnChangeUser(const int newUserId)
360 {
361     SCLOCK_HILOGI("ScreenLockSystemAbility OnChangeUser started. newUserId---->%{public}d", newUserId);
362     const int minUserId = 0;
363     const int maxUserID = 999999999;
364     if (newUserId < minUserId || newUserId >= maxUserID) {
365         SCLOCK_HILOGI("ScreenLockSystemAbility newUserId invalid.");
366         return;
367     }
368     stateValue_.SetCurrentUser(newUserId);
369     std::string type = CHANGE_USER;
370     auto iter = registeredListeners_.find(type);
371     if (iter != registeredListeners_.end()) {
372         auto callback = [=]() {
373             iter->second->OnCallBack(type, newUserId);
374             SCLOCK_HILOGI("ScreenLockSystemAbility OnChangeUser OnCallBack. newUserId---->%{public}d", newUserId);
375         };
376         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
377     }
378 }
379 
OnScreenlockEnabled(bool enabled)380 void ScreenLockSystemAbility::OnScreenlockEnabled(bool enabled)
381 {
382     SCLOCK_HILOGI("ScreenLockSystemAbility OnScreenlockEnabled started.");
383     stateValue_.SetScreenlockEnabled(enabled);
384     std::string type = SCREENLOCK_ENABLED;
385     auto iter = registeredListeners_.find(type);
386     if (iter != registeredListeners_.end()) {
387         SCLOCK_HILOGI("ScreenLockSystemAbility iter exist.");
388         auto callback = [=]() { iter->second->OnCallBack(type, enabled); };
389         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
390     }
391 }
392 
OnExitAnimation()393 void ScreenLockSystemAbility::OnExitAnimation()
394 {
395     SCLOCK_HILOGI("ScreenLockSystemAbility OnExitAnimation started.");
396     std::string type = EXIT_ANIMATION;
397     auto iter = registeredListeners_.find(type);
398     if (iter != registeredListeners_.end()) {
399         SCLOCK_HILOGI("ScreenLockSystemAbility iter exist.");
400         auto callback = [=]() {
401             SCLOCK_HILOGI("ScreenLockSystemAbility OnExitAnimation started2.");
402             iter->second->OnCallBack(type);
403         };
404         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
405     }
406 }
407 
RequestUnlock(const sptr<ScreenLockSystemAbilityInterface> & listener)408 void ScreenLockSystemAbility::RequestUnlock(const sptr<ScreenLockSystemAbilityInterface> &listener)
409 {
410     if (state_ != ServiceRunningState::STATE_RUNNING) {
411         SCLOCK_HILOGI("ScreenLockSystemAbility RequestUnlock restart.");
412         OnStart();
413     }
414     SCLOCK_HILOGI("ScreenLockSystemAbility RequestUnlock started.");
415     // check whether the page of app request unlock is the focus page
416     std::lock_guard<std::mutex> guard(lock_);
417     if (instance_->isFoucs_) {
418         SCLOCK_HILOGI("ScreenLockSystemAbility RequestUnlock  Unfocused.");
419         return;
420     }
421     unlockVecListeners_.push_back(listener);
422     SCLOCK_HILOGI("ScreenLockSystemAbility RequestUnlock listener= %{public}p", listener.GetRefPtr());
423     std::string type = UNLOCKSCREEN;
424     auto iter = registeredListeners_.find(type);
425     if (iter != registeredListeners_.end()) {
426         auto callback = [=]() { iter->second->OnCallBack(type); };
427         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
428     }
429 }
430 
IsScreenLocked()431 bool ScreenLockSystemAbility::IsScreenLocked()
432 {
433     if (state_ != ServiceRunningState::STATE_RUNNING) {
434         SCLOCK_HILOGI("ScreenLockSystemAbility IsScreenLocked restart.");
435         OnStart();
436     }
437     SCLOCK_HILOGI("ScreenLockSystemAbility IsScreenLocked started.");
438     std::lock_guard<std::mutex> guard(lock_);
439     bool screnLockState = stateValue_.GetScreenlockedState();
440     SCLOCK_HILOGI("IsScreenLocked screnLockState = %{public}d", screnLockState);
441     return screnLockState;
442 }
443 
GetSecure()444 bool ScreenLockSystemAbility::GetSecure()
445 {
446     if (state_ != ServiceRunningState::STATE_RUNNING) {
447         SCLOCK_HILOGI("ScreenLockSystemAbility GetSecure restart.");
448         OnStart();
449     }
450     SCLOCK_HILOGI("ScreenLockSystemAbility GetSecure started.");
451     int32_t slotId = DelayedRefSingleton<Telephony::CoreServiceClient>::GetInstance().GetPrimarySlotId();
452     int32_t simState =
453         DelayedRefSingleton<Telephony::CoreServiceClient>::GetInstance().GetSimState(static_cast<int>(slotId));
454     const int32_t simLockStatus = 2;
455     if (simState == simLockStatus) {
456         return true;
457     }
458     int callingUid = IPCSkeleton::GetCallingUid();
459     SCLOCK_HILOGD("ScreenLockSystemAbility::GetSecure callingUid=%{public}d", callingUid);
460     int userId = 0;
461     AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(callingUid, userId);
462     SCLOCK_HILOGD("userId=%{public}d", userId);
463     auto getInfoCallback = std::make_shared<ScreenLockGetInfoCallback>();
464     int32_t result = UserIDMClient::GetInstance().GetAuthInfo(userId, AuthType::PIN, getInfoCallback);
465     SCLOCK_HILOGI("GetAuthInfo AuthType::PIN result = %{public}d", result);
466     if (result == static_cast<int32_t>(IDMResultCode::SUCCESS)) {
467         std::vector<OHOS::UserIAM::UserIDM::CredentialInfo> pinInfo;
468         getInfoCallback->OnGetInfo(pinInfo);
469         if (pinInfo.size()) {
470             SCLOCK_HILOGI("pinInfo.size() = %{public}d", pinInfo.size());
471             return true;
472         }
473     }
474     result = UserIDMClient::GetInstance().GetAuthInfo(userId, AuthType::FACE, getInfoCallback);
475     SCLOCK_HILOGI("GetAuthInfo AuthType::FACE result = %{public}d", result);
476     if (result == static_cast<int32_t>(IDMResultCode::SUCCESS)) {
477         std::vector<OHOS::UserIAM::UserIDM::CredentialInfo> faceInfo;
478         getInfoCallback->OnGetInfo(faceInfo);
479         if (faceInfo.size()) {
480             SCLOCK_HILOGI("faceInfo.size() = %{public}d", faceInfo.size());
481             return true;
482         }
483     }
484     return false;
485 }
486 
On(const sptr<ScreenLockSystemAbilityInterface> & listener,const std::string & type)487 bool ScreenLockSystemAbility::On(const sptr<ScreenLockSystemAbilityInterface> &listener, const std::string &type)
488 {
489     SCLOCK_HILOGI("ScreenLockSystemAbility::On started. type=%{public}s", type.c_str());
490     int callingUid = IPCSkeleton::GetCallingUid();
491     SCLOCK_HILOGD("ScreenLockSystemAbility::On callingUid=%{public}d", callingUid);
492     std::string bundleName = "";
493     if (!ScreenLockBundleName::GetBundleNameByUid(callingUid, bundleName)) {
494         return false;
495     }
496     SCLOCK_HILOGD("ScreenLockSystemAbility::On bundleName=%{public}s", bundleName.c_str());
497     if (bundleName.empty()) {
498         SCLOCK_HILOGE("ScreenLockSystemAbility::On calling app is null");
499         return false;
500     }
501     if (bundleName != BUNDLE_NAME) {
502         SCLOCK_HILOGE("ScreenLockSystemAbility::On calling app is not Screenlock APP");
503         return false;
504     }
505     auto iter = registeredListeners_.find(type);
506     if (iter == registeredListeners_.end()) {
507         std::lock_guard<std::mutex> lck(listenerMapMutex_);
508         const auto temp = registeredListeners_.insert({ type, listener });
509         if (!temp.second) {
510             SCLOCK_HILOGE("ScreenLockSystemAbility::On insert type=%{public}s object fail.", type.c_str());
511             return false;
512         }
513     }
514     SCLOCK_HILOGI("ScreenLockSystemAbility::On end.");
515     return true;
516 }
517 
Off(const std::string & type)518 bool ScreenLockSystemAbility::Off(const std::string &type)
519 {
520     SCLOCK_HILOGI("ScreenLockSystemAbility::Off started. type=%{public}s", type.c_str());
521     int callingUid = IPCSkeleton::GetCallingUid();
522     SCLOCK_HILOGD("ScreenLockSystemAbility::Off callingUid=%{public}d", callingUid);
523     std::string bundleName = "";
524     if (!ScreenLockBundleName::GetBundleNameByUid(callingUid, bundleName)) {
525         return false;
526     }
527     SCLOCK_HILOGD("ScreenLockSystemAbility::Off bundleName=%{public}s", bundleName.c_str());
528     if (bundleName.empty()) {
529         SCLOCK_HILOGE("ScreenLockSystemAbility::Off calling app is null");
530         return false;
531     }
532     if (bundleName != BUNDLE_NAME) {
533         SCLOCK_HILOGE("ScreenLockSystemAbility::Off calling app is not Screenlock APP");
534         return false;
535     }
536     SCLOCK_HILOGI("ScreenLockSystemAbility::Off started.");
537     auto iter = registeredListeners_.find(type);
538     if (iter != registeredListeners_.end()) {
539         SCLOCK_HILOGE("ScreenLockSystemAbility::Off delete type=%{public}s object message.", type.c_str());
540         std::lock_guard<std::mutex> lck(listenerMapMutex_);
541         registeredListeners_.erase(iter);
542     }
543     return true;
544 }
545 
SendScreenLockEvent(const std::string & event,int param)546 bool ScreenLockSystemAbility::SendScreenLockEvent(const std::string &event, int param)
547 {
548     SCLOCK_HILOGI("ScreenLockSystemAbility SendScreenLockEvent started.");
549     int callingUid = IPCSkeleton::GetCallingUid();
550     std::string bundleName = "";
551     if (!ScreenLockBundleName::GetBundleNameByUid(callingUid, bundleName)) {
552         return false;
553     }
554     if (bundleName.empty()) {
555         SCLOCK_HILOGE("SendScreenLockEvent calling app is null");
556         return false;
557     }
558     if (bundleName != BUNDLE_NAME) {
559         SCLOCK_HILOGE("SendScreenLockEvent calling app is not Screenlock APP");
560         return false;
561     }
562     SCLOCK_HILOGD("event=%{public}s ,param=%{public}d", event.c_str(), param);
563     int stateResult = param;
564     if (event == UNLOCK_SCREEN_RESULT) {
565         if (stateResult == UNLOCKSCREEN_SUCC) {
566             SetScreenlocked(false);
567             DisplayManager::GetInstance().NotifyDisplayEvent(DisplayEvent::UNLOCK);
568         } else if (stateResult == UNLOCKSCREEN_FAIL || stateResult == UNLOCKSCREEN_CANCEL) {
569             SetScreenlocked(true);
570         }
571         lock_.lock();
572         if (unlockVecListeners_.size()) {
573             auto callback = [=]() {
574                 for (size_t i = 0; i < unlockVecListeners_.size(); i++) {
575                     std::string type = "";
576                     unlockVecListeners_[i]->OnCallBack(type, stateResult);
577                 }
578                 unlockVecListeners_.clear();
579             };
580             serviceHandler_->PostTask(callback, INTERVAL_ZERO);
581         }
582         lock_.unlock();
583     } else if (event == SCREEN_DRAWDONE) {
584         DisplayManager::GetInstance().NotifyDisplayEvent(DisplayEvent::KEYGUARD_DRAWN);
585     }
586     return true;
587 }
588 
SetScreenlocked(bool isScreenlocked)589 void ScreenLockSystemAbility::SetScreenlocked(bool isScreenlocked)
590 {
591     SCLOCK_HILOGI("ScreenLockSystemAbility SetScreenlocked started.");
592     std::lock_guard<std::mutex> guard(lock_);
593     stateValue_.SetScreenlocked(isScreenlocked);
594 }
595 
Reset()596 void StateValue::Reset()
597 {
598     isScreenlocked_ = true;
599     screenlockEnabled_ = true;
600     currentUser_ = USER_NULL;
601 }
602 
Test_SetScreenLocked(bool isScreenlocked)603 bool ScreenLockSystemAbility::Test_SetScreenLocked(bool isScreenlocked)
604 {
605     SCLOCK_HILOGI("ScreenLockSystemAbility Test_SetScreenLocked started.");
606     stateValue_.SetScreenlocked(isScreenlocked);
607     return true;
608 }
609 
Test_RuntimeNotify(const std::string & event,int param)610 bool ScreenLockSystemAbility::Test_RuntimeNotify(const std::string &event, int param)
611 {
612     SCLOCK_HILOGI("Test_RuntimeNotify event=%{public}s,param=%{public}d", event.c_str(), param);
613     if (event == BEGIN_WAKEUP) {
614         OnBeginWakeUp();
615     } else if (event == END_WAKEUP) {
616         OnEndWakeUp();
617     } else if (event == BEGIN_SCREEN_ON) {
618         OnBeginScreenOn();
619     } else if (event == END_SCREEN_ON) {
620         OnEndScreenOn();
621     } else if (event == BEGIN_SLEEP) {
622         OnBeginSleep(param);
623     } else if (event == END_SLEEP) {
624         OnEndSleep(param, false);
625     } else if (event == BEGIN_SCREEN_OFF) {
626         OnBeginScreenOff();
627     } else if (event == END_SCREEN_OFF) {
628         OnEndScreenOff();
629     } else if (event == CHANGE_USER) {
630         if (param < 0) {
631             return false;
632         }
633         OnChangeUser(param);
634     } else if (event == SCREENLOCK_ENABLED) {
635         OnScreenlockEnabled((param == 0) ? (false) : (true));
636     } else if (event == EXIT_ANIMATION) {
637         OnExitAnimation();
638     } else {
639         return false;
640     }
641     return true;
642 }
643 
Test_GetRuntimeState(const std::string & event)644 int ScreenLockSystemAbility::Test_GetRuntimeState(const std::string &event)
645 {
646     SCLOCK_HILOGI("ScreenLockSystemAbility Test_GetRuntimeState started.");
647     if (event == BEGIN_WAKEUP || event == END_WAKEUP || event == BEGIN_SLEEP || event == END_SLEEP) {
648         return stateValue_.GetInteractiveState();
649     } else if (event == BEGIN_SCREEN_ON || event == END_SCREEN_ON || event == BEGIN_SCREEN_OFF ||
650                event == END_SCREEN_OFF) {
651         return stateValue_.GetScreenState();
652     } else if (event == CHANGE_USER) {
653         return stateValue_.GetCurrentUser();
654     } else if (event == SCREENLOCK_ENABLED) {
655         return stateValue_.GetScreenlockEnabled() ? 1 : 0;
656     }
657     return ARGV_NORMAL;
658 }
659 
OnDump()660 void ScreenLockSystemAbility::OnDump()
661 {
662     std::lock_guard<std::mutex> guard(lock_);
663     struct tm *timeNow = nullptr;
664     time_t second = time(0);
665     if (second > 0) {
666         timeNow = localtime(&second);
667         if (timeNow != nullptr) {
668             SCLOCK_HILOGI(
669                 "ScreenLockSystemAbility dump time:%{public}d-%{public}d-%{public}d %{public}d:%{public}d:%{public}d",
670                 timeNow->tm_year + startTime_, timeNow->tm_mon + extraMonth_, timeNow->tm_mday, timeNow->tm_hour,
671                 timeNow->tm_min, timeNow->tm_sec);
672         }
673     } else {
674         SCLOCK_HILOGI("ScreenLockSystemAbility dump, time(0) is nullptr");
675     }
676 }
677 } // namespace ScreenLock
678 } // namespace OHOS
679