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