• 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 <fcntl.h>
18 #include <sys/time.h>
19 #include <unistd.h>
20 
21 #include <cerrno>
22 #include <ctime>
23 #include <functional>
24 #include <iostream>
25 #include <string>
26 
27 #include "ability_manager_client.h"
28 #include "bundle_mgr_proxy.h"
29 #include "command.h"
30 #include "core_service_client.h"
31 #include "display_manager.h"
32 #include "dump_helper.h"
33 #include "hitrace_meter.h"
34 #include "ipc_skeleton.h"
35 #include "iservice_registry.h"
36 #include "os_account_manager.h"
37 #include "parameter.h"
38 #include "sclock_log.h"
39 #include "screenlock_appinfo.h"
40 #include "screenlock_common.h"
41 #include "screenlock_get_info_callback.h"
42 #include "system_ability.h"
43 #include "system_ability_definition.h"
44 #include "user_idm_client.h"
45 
46 namespace OHOS {
47 namespace ScreenLock {
48 using namespace std;
49 using namespace OHOS::HiviewDFX;
50 using namespace OHOS::Rosen;
51 using namespace OHOS::UserIam::UserAuth;
52 using namespace OHOS::Telephony;
53 REGISTER_SYSTEM_ABILITY_BY_ID(ScreenLockSystemAbility, SCREENLOCK_SERVICE_ID, true);
54 const std::int64_t INIT_INTERVAL = 5000L;
55 const std::int64_t DELAY_TIME = 1000L;
56 const std::int64_t INTERVAL_ZERO = 0L;
57 std::mutex ScreenLockSystemAbility::instanceLock_;
58 sptr<ScreenLockSystemAbility> ScreenLockSystemAbility::instance_;
59 std::shared_ptr<AppExecFwk::EventHandler> ScreenLockSystemAbility::serviceHandler_;
60 constexpr const char *THEME_SCREENLOCK_WHITEAPP = "const.theme.screenlockWhiteApp";
61 constexpr const char *THEME_SCREENLOCK_APP = "const.theme.screenlockApp";
62 constexpr const char *CANCEL_UNLOCK_OPENATION = "The user canceled the unlock openation.";
63 static constexpr const int CONFIG_LEN = 128;
64 constexpr int32_t HANDLE_OK = 0;
65 constexpr int32_t MAX_RETRY_TIMES = 20;
66 
ScreenLockSystemAbility(int32_t systemAbilityId,bool runOnCreate)67 ScreenLockSystemAbility::ScreenLockSystemAbility(int32_t systemAbilityId, bool runOnCreate)
68     : SystemAbility(systemAbilityId, runOnCreate), state_(ServiceRunningState::STATE_NOT_START)
69 {
70 }
71 
~ScreenLockSystemAbility()72 ScreenLockSystemAbility::~ScreenLockSystemAbility()
73 {
74     SCLOCK_HILOGI("~ScreenLockSystemAbility state_  is %{public}d.", static_cast<int>(state_));
75 }
76 
GetInstance()77 sptr<ScreenLockSystemAbility> ScreenLockSystemAbility::GetInstance()
78 {
79     if (instance_ == nullptr) {
80         std::lock_guard<std::mutex> autoLock(instanceLock_);
81         if (instance_ == nullptr) {
82             instance_ = new ScreenLockSystemAbility(SCREENLOCK_SERVICE_ID, true);
83             SCLOCK_HILOGE("ScreenLockSystemAbility create instance.");
84         }
85     }
86     return instance_;
87 }
88 
Init()89 int32_t ScreenLockSystemAbility::Init()
90 {
91     bool ret = Publish(ScreenLockSystemAbility::GetInstance());
92     if (!ret) {
93         SCLOCK_HILOGE("Publish ScreenLockSystemAbility failed.");
94         return E_SCREENLOCK_PUBLISH_FAIL;
95     }
96     SCLOCK_HILOGD("state_ is %{public}d.", static_cast<int>(state_));
97     stateValue_.Reset();
98     SCLOCK_HILOGI("Init ScreenLockSystemAbility success.");
99     return ERR_OK;
100 }
101 
OnStart()102 void ScreenLockSystemAbility::OnStart()
103 {
104     SCLOCK_HILOGI("ScreenLockSystemAbility::Enter OnStart.");
105     if (instance_ == nullptr) {
106         instance_ = this;
107     }
108     if (state_ == ServiceRunningState::STATE_RUNNING) {
109         SCLOCK_HILOGI("ScreenLockSystemAbility is already running.");
110         return;
111     }
112     InitServiceHandler();
113     if (Init() != ERR_OK) {
114         auto callback = [=]() { Init(); };
115         serviceHandler_->PostTask(callback, INIT_INTERVAL);
116         SCLOCK_HILOGE("ScreenLockSystemAbility Init failed. Try again 5s later");
117         return;
118     }
119     AddSystemAbilityListener(DISPLAY_MANAGER_SERVICE_SA_ID);
120     RegisterDumpCommand();
121     return;
122 }
123 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)124 void ScreenLockSystemAbility::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
125 {
126     SCLOCK_HILOGI("OnAddSystemAbility systemAbilityId:%{public}d added!", systemAbilityId);
127     if (systemAbilityId == DISPLAY_MANAGER_SERVICE_SA_ID) {
128         int times = 0;
129         if (displayPowerEventListener_ == nullptr) {
130             displayPowerEventListener_ = new ScreenLockSystemAbility::ScreenLockDisplayPowerEventListener();
131         }
132         RegisterDisplayPowerEventListener(times);
133         if (flag_) {
134             state_ = ServiceRunningState::STATE_RUNNING;
135             auto callback = [=]() { OnSystemReady(); };
136             serviceHandler_->PostTask(callback, INTERVAL_ZERO);
137         }
138     }
139 }
140 
RegisterDisplayPowerEventListener(int32_t times)141 void ScreenLockSystemAbility::RegisterDisplayPowerEventListener(int32_t times)
142 {
143     times++;
144     flag_ = DisplayManager::GetInstance().RegisterDisplayPowerEventListener(displayPowerEventListener_);
145     if (flag_ == false && times <= MAX_RETRY_TIMES) {
146         SCLOCK_HILOGE("ScreenLockSystemAbility RegisterDisplayPowerEventListener failed");
147         auto callback = [this, times]() { RegisterDisplayPowerEventListener(times); };
148         serviceHandler_->PostTask(callback, DELAY_TIME);
149     }
150     SCLOCK_HILOGI("ScreenLockSystemAbility RegisterDisplayPowerEventListener end, flag_:%{public}d, times:%{public}d",
151         flag_, times);
152 }
153 
InitServiceHandler()154 void ScreenLockSystemAbility::InitServiceHandler()
155 {
156     SCLOCK_HILOGI("InitServiceHandler started.");
157     if (serviceHandler_ != nullptr) {
158         SCLOCK_HILOGI("InitServiceHandler already init.");
159         return;
160     }
161     std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create("ScreenLockSystemAbility");
162     serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
163     SCLOCK_HILOGI("InitServiceHandler succeeded.");
164 }
165 
OnStop()166 void ScreenLockSystemAbility::OnStop()
167 {
168     SCLOCK_HILOGI("OnStop started.");
169     if (state_ != ServiceRunningState::STATE_RUNNING) {
170         return;
171     }
172     serviceHandler_ = nullptr;
173     instance_ = nullptr;
174     state_ = ServiceRunningState::STATE_NOT_START;
175     DisplayManager::GetInstance().UnregisterDisplayPowerEventListener(displayPowerEventListener_);
176     SCLOCK_HILOGI("OnStop end.");
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     SystemEvent systemEvent(BEGIN_SCREEN_OFF);
214     SystemEventCallBack(systemEvent);
215 }
216 
OnEndScreenOff()217 void ScreenLockSystemAbility::OnEndScreenOff()
218 {
219     SCLOCK_HILOGI("ScreenLockSystemAbility OnEndScreenOff started.");
220     stateValue_.SetScreenState(static_cast<int>(ScreenState::SCREEN_STATE_END_OFF));
221     SystemEvent systemEvent(END_SCREEN_OFF);
222     SystemEventCallBack(systemEvent);
223 }
224 
OnBeginScreenOn()225 void ScreenLockSystemAbility::OnBeginScreenOn()
226 {
227     SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginScreenOn started.");
228     stateValue_.SetScreenState(static_cast<int>(ScreenState::SCREEN_STATE_BEGIN_ON));
229     SystemEvent systemEvent(BEGIN_SCREEN_ON);
230     SystemEventCallBack(systemEvent);
231 }
232 
OnSystemReady()233 void ScreenLockSystemAbility::OnSystemReady()
234 {
235     SCLOCK_HILOGI("ScreenLockSystemAbility OnSystemReady started.");
236     bool isExitFlag = false;
237     int tryTime = 20;
238     int minTryTime = 0;
239     while (!isExitFlag && (tryTime > minTryTime)) {
240         if (systemEventListener_ != nullptr) {
241             SCLOCK_HILOGI("ScreenLockSystemAbility OnSystemReady started1.");
242             std::lock_guard<std::mutex> lck(listenerMutex_);
243             SystemEvent systemEvent(SYSTEM_READY);
244             systemEventListener_->OnCallBack(systemEvent);
245             isExitFlag = true;
246         } else {
247             SCLOCK_HILOGE("ScreenLockSystemAbility OnSystemReady type not found., flag_ = %{public}d", flag_);
248             sleep(1);
249         }
250         --tryTime;
251     }
252 }
253 
OnEndScreenOn()254 void ScreenLockSystemAbility::OnEndScreenOn()
255 {
256     SCLOCK_HILOGI("ScreenLockSystemAbility OnEndScreenOn started.");
257     stateValue_.SetScreenState(static_cast<int>(ScreenState::SCREEN_STATE_END_ON));
258     SystemEvent systemEvent(END_SCREEN_ON);
259     SystemEventCallBack(systemEvent);
260 }
261 
OnBeginWakeUp()262 void ScreenLockSystemAbility::OnBeginWakeUp()
263 {
264     SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginWakeUp started.");
265     stateValue_.SetInteractiveState(static_cast<int>(InteractiveState::INTERACTIVE_STATE_BEGIN_WAKEUP));
266     SystemEvent systemEvent(BEGIN_WAKEUP);
267     SystemEventCallBack(systemEvent);
268 }
269 
OnEndWakeUp()270 void ScreenLockSystemAbility::OnEndWakeUp()
271 {
272     SCLOCK_HILOGI("ScreenLockSystemAbility OnEndWakeUp started.");
273     stateValue_.SetInteractiveState(static_cast<int>(InteractiveState::INTERACTIVE_STATE_END_WAKEUP));
274     SystemEvent systemEvent(END_WAKEUP);
275     SystemEventCallBack(systemEvent);
276 }
277 
OnBeginSleep(const int why)278 void ScreenLockSystemAbility::OnBeginSleep(const int why)
279 {
280     SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginSleep started.");
281     stateValue_.SetOffReason(why);
282     stateValue_.SetInteractiveState(static_cast<int>(InteractiveState::INTERACTIVE_STATE_BEGIN_SLEEP));
283     SystemEvent systemEvent(BEGIN_SLEEP, std::to_string(why));
284     SystemEventCallBack(systemEvent);
285 }
286 
OnEndSleep(const int why,const int isTriggered)287 void ScreenLockSystemAbility::OnEndSleep(const int why, const int isTriggered)
288 {
289     SCLOCK_HILOGI("ScreenLockSystemAbility OnEndSleep started.");
290     stateValue_.SetInteractiveState(static_cast<int>(InteractiveState::INTERACTIVE_STATE_END_SLEEP));
291     SystemEvent systemEvent(END_SLEEP, std::to_string(why));
292     SystemEventCallBack(systemEvent);
293 }
294 
OnChangeUser(const int newUserId)295 void ScreenLockSystemAbility::OnChangeUser(const int newUserId)
296 {
297     SCLOCK_HILOGI("ScreenLockSystemAbility OnChangeUser started. newUserId %{public}d", newUserId);
298     const int minUserId = 0;
299     const int maxUserID = 999999999;
300     if (newUserId < minUserId || newUserId >= maxUserID) {
301         SCLOCK_HILOGI("ScreenLockSystemAbility newUserId invalid.");
302         return;
303     }
304     stateValue_.SetCurrentUser(newUserId);
305     SystemEvent systemEvent(CHANGE_USER, std::to_string(newUserId));
306     SystemEventCallBack(systemEvent);
307 }
308 
OnScreenlockEnabled(bool enabled)309 void ScreenLockSystemAbility::OnScreenlockEnabled(bool enabled)
310 {
311     SCLOCK_HILOGI("ScreenLockSystemAbility OnScreenlockEnabled started.");
312     stateValue_.SetScreenlockEnabled(enabled);
313     SystemEvent systemEvent(SCREENLOCK_ENABLED, std::to_string(enabled));
314     SystemEventCallBack(systemEvent);
315 }
316 
OnExitAnimation()317 void ScreenLockSystemAbility::OnExitAnimation()
318 {
319     SCLOCK_HILOGI("ScreenLockSystemAbility OnExitAnimation started.");
320     SystemEvent systemEvent(EXIT_ANIMATION);
321     SystemEventCallBack(systemEvent);
322 }
323 
UnlockScreen(const sptr<ScreenLockSystemAbilityInterface> & listener)324 int32_t ScreenLockSystemAbility::UnlockScreen(const sptr<ScreenLockSystemAbilityInterface> &listener)
325 {
326     return UnlockInner(listener);
327 }
328 
Unlock(const sptr<ScreenLockSystemAbilityInterface> & listener)329 int32_t ScreenLockSystemAbility::Unlock(const sptr<ScreenLockSystemAbilityInterface> &listener)
330 {
331     StartAsyncTrace(HITRACE_TAG_MISC, "ScreenLockSystemAbility::RequestUnlock begin", HITRACE_UNLOCKSCREEN);
332     if (!IsSystemApp()) {
333         SCLOCK_HILOGE("Calling app is not system app");
334         return E_SCREENLOCK_NOT_SYSTEM_APP;
335     }
336     return UnlockInner(listener);
337 }
338 
UnlockInner(const sptr<ScreenLockSystemAbilityInterface> & listener)339 int32_t ScreenLockSystemAbility::UnlockInner(const sptr<ScreenLockSystemAbilityInterface> &listener)
340 {
341     if (state_ != ServiceRunningState::STATE_RUNNING) {
342         SCLOCK_HILOGI("ScreenLockSystemAbility RequestUnlock restart.");
343         OnStart();
344     }
345     SCLOCK_HILOGI("ScreenLockSystemAbility RequestUnlock started.");
346 
347     // check whether the page of app request unlock is the focus page
348     std::lock_guard<std::mutex> guard(lock_);
349     if (!IsAppInForeground(IPCSkeleton::GetCallingTokenID())) {
350         FinishAsyncTrace(
351             HITRACE_TAG_MISC, "ScreenLockSystemAbility::RequestUnlock finish by foucus", HITRACE_UNLOCKSCREEN);
352         SCLOCK_HILOGI("ScreenLockSystemAbility RequestUnlock  Unfocused.");
353         return E_SCREENLOCK_NO_PERMISSION;
354     }
355     unlockVecListeners_.push_back(listener);
356     SystemEvent systemEvent(UNLOCKSCREEN);
357     SystemEventCallBack(systemEvent, HITRACE_UNLOCKSCREEN);
358     return E_SCREENLOCK_OK;
359 }
360 
Lock(const sptr<ScreenLockSystemAbilityInterface> & listener)361 int32_t ScreenLockSystemAbility::Lock(const sptr<ScreenLockSystemAbilityInterface> &listener)
362 {
363     SCLOCK_HILOGI("ScreenLockSystemAbility RequestLock started.");
364     if (!IsAppInForeground(IPCSkeleton::GetCallingTokenID())) {
365         SCLOCK_HILOGE("Calling app is not Unfocused.");
366         return E_SCREENLOCK_NO_PERMISSION;
367     }
368     if (!IsWhiteListApp(IPCSkeleton::GetCallingTokenID(), THEME_SCREENLOCK_WHITEAPP)) {
369         SCLOCK_HILOGE("Calling app is not whitelist app");
370         return E_SCREENLOCK_NO_PERMISSION;
371     }
372     if (IsScreenLocked()) {
373         return E_SCREENLOCK_NO_PERMISSION;
374     }
375     lock_.lock();
376     lockVecListeners_.push_back(listener);
377     lock_.unlock();
378 
379     SystemEvent systemEvent(LOCKSCREEN);
380     SystemEventCallBack(systemEvent, HITRACE_LOCKSCREEN);
381     return E_SCREENLOCK_OK;
382 }
383 
IsLocked(bool & isLocked)384 int32_t ScreenLockSystemAbility::IsLocked(bool &isLocked)
385 {
386     if (!IsSystemApp()) {
387         SCLOCK_HILOGE("Calling app is not system app");
388         return E_SCREENLOCK_NOT_SYSTEM_APP;
389     }
390     isLocked = IsScreenLocked();
391     return E_SCREENLOCK_OK;
392 }
393 
IsScreenLocked()394 bool ScreenLockSystemAbility::IsScreenLocked()
395 {
396     if (state_ != ServiceRunningState::STATE_RUNNING) {
397         SCLOCK_HILOGI("IsScreenLocked restart.");
398         OnStart();
399     }
400     SCLOCK_HILOGI("ScreenLockSystemAbility IsScreenLocked started.");
401     std::lock_guard<std::mutex> guard(lock_);
402     bool screnLockState = stateValue_.GetScreenlockedState();
403     SCLOCK_HILOGI("IsScreenLocked screnLockState = %{public}d", screnLockState);
404     return screnLockState;
405 }
406 
GetSecure()407 bool ScreenLockSystemAbility::GetSecure()
408 {
409     if (state_ != ServiceRunningState::STATE_RUNNING) {
410         SCLOCK_HILOGI("ScreenLockSystemAbility GetSecure restart.");
411         OnStart();
412     }
413     SCLOCK_HILOGI("ScreenLockSystemAbility GetSecure started.");
414     int callingUid = IPCSkeleton::GetCallingUid();
415     SCLOCK_HILOGD("ScreenLockSystemAbility::GetSecure callingUid=%{public}d", callingUid);
416     int userId = 0;
417     AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(callingUid, userId);
418     SCLOCK_HILOGD("userId=%{public}d", userId);
419     auto getInfoCallback = std::make_shared<ScreenLockGetInfoCallback>();
420     int32_t result = UserIdmClient::GetInstance().GetCredentialInfo(userId, AuthType::PIN, getInfoCallback);
421     SCLOCK_HILOGI("GetCredentialInfo AuthType::PIN result = %{public}d", result);
422     if (result == static_cast<int32_t>(ResultCode::SUCCESS) && getInfoCallback->IsSecure()) {
423         return true;
424     }
425     result = UserIdmClient::GetInstance().GetCredentialInfo(userId, AuthType::FACE, getInfoCallback);
426     SCLOCK_HILOGI("GetCredentialInfo AuthType::FACE result = %{public}d", result);
427     if (result == static_cast<int32_t>(ResultCode::SUCCESS) && getInfoCallback->IsSecure()) {
428         return true;
429     }
430     return false;
431 }
432 
OnSystemEvent(const sptr<ScreenLockSystemAbilityInterface> & listener)433 int32_t ScreenLockSystemAbility::OnSystemEvent(const sptr<ScreenLockSystemAbilityInterface> &listener)
434 {
435     SCLOCK_HILOGI("ScreenLockSystemAbility::OnSystemEvent started.");
436     if (!IsWhiteListApp(IPCSkeleton::GetCallingTokenID(), THEME_SCREENLOCK_APP)) {
437         SCLOCK_HILOGE("Calling app is not whitelist app");
438         return E_SCREENLOCK_NO_PERMISSION;
439     }
440 
441     std::lock_guard<std::mutex> lck(listenerMutex_);
442     systemEventListener_ = listener;
443     SCLOCK_HILOGI("ScreenLockSystemAbility::OnSystemEvent end.");
444     return E_SCREENLOCK_OK;
445 }
446 
SendScreenLockEvent(const std::string & event,int param)447 int32_t ScreenLockSystemAbility::SendScreenLockEvent(const std::string &event, int param)
448 {
449     SCLOCK_HILOGI("ScreenLockSystemAbility SendScreenLockEvent started.");
450     if (!IsWhiteListApp(IPCSkeleton::GetCallingTokenID(), THEME_SCREENLOCK_APP)) {
451         SCLOCK_HILOGE("Calling app is not whitelist app");
452         return E_SCREENLOCK_NO_PERMISSION;
453     }
454     SCLOCK_HILOGD("event=%{public}s ,param=%{public}d", event.c_str(), param);
455     int stateResult = param;
456     if (event == UNLOCK_SCREEN_RESULT) {
457         UnlockScreenEvent(stateResult);
458     } else if (event == SCREEN_DRAWDONE) {
459         SetScreenlocked(true);
460         DisplayManager::GetInstance().NotifyDisplayEvent(DisplayEvent::KEYGUARD_DRAWN);
461     } else if (event == LOCK_SCREEN_RESULT) {
462         LockScreenEvent(stateResult);
463     }
464     return E_SCREENLOCK_OK;
465 }
466 
SetScreenlocked(bool isScreenlocked)467 void ScreenLockSystemAbility::SetScreenlocked(bool isScreenlocked)
468 {
469     SCLOCK_HILOGI("ScreenLockSystemAbility SetScreenlocked started.");
470     std::lock_guard<std::mutex> guard(lock_);
471     stateValue_.SetScreenlocked(isScreenlocked);
472 }
473 
Reset()474 void StateValue::Reset()
475 {
476     isScreenlocked_ = true;
477     screenlockEnabled_ = true;
478     currentUser_ = USER_NULL;
479 }
480 
OnDump()481 void ScreenLockSystemAbility::OnDump()
482 {
483     std::lock_guard<std::mutex> guard(lock_);
484     struct tm *timeNow = nullptr;
485     time_t second = time(0);
486     if (second > 0) {
487         timeNow = localtime(&second);
488         if (timeNow != nullptr) {
489             SCLOCK_HILOGI(
490                 "ScreenLockSystemAbility dump time:%{public}d-%{public}d-%{public}d %{public}d:%{public}d:%{public}d",
491                 timeNow->tm_year + startTime_, timeNow->tm_mon + extraMonth_, timeNow->tm_mday, timeNow->tm_hour,
492                 timeNow->tm_min, timeNow->tm_sec);
493         }
494     } else {
495         SCLOCK_HILOGI("ScreenLockSystemAbility dump, time(0) is nullptr");
496     }
497 }
498 
Dump(int fd,const std::vector<std::u16string> & args)499 int ScreenLockSystemAbility::Dump(int fd, const std::vector<std::u16string> &args)
500 {
501     int uid = static_cast<int>(IPCSkeleton::GetCallingUid());
502     const int maxUid = 10000;
503     if (uid > maxUid) {
504         return 0;
505     }
506 
507     std::vector<std::string> argsStr;
508     for (auto item : args) {
509         argsStr.emplace_back(Str16ToStr8(item));
510     }
511 
512     DumpHelper::GetInstance().Dispatch(fd, argsStr);
513     return ERR_OK;
514 }
515 
RegisterDumpCommand()516 void ScreenLockSystemAbility::RegisterDumpCommand()
517 {
518     auto cmd = std::make_shared<Command>(std::vector<std::string>{ "-all" }, "dump all screenlock information",
519         [this](const std::vector<std::string> &input, std::string &output) -> bool {
520             bool screenLocked = stateValue_.GetScreenlockedState();
521             bool screenState = stateValue_.GetScreenState();
522             int32_t offReason = stateValue_.GetOffReason();
523             int32_t interactiveState = stateValue_.GetInteractiveState();
524             string temp_screenLocked = "";
525             screenLocked ? temp_screenLocked = "true" : temp_screenLocked = "false";
526             string temp_screenState = "";
527             screenState ? temp_screenState = "true" : temp_screenState = "false";
528             output.append("\n Screenlock system state\\tValue\\t\\tDescription\n")
529                 .append(" * screenLocked  \t\t" + temp_screenLocked + "\t\twhether there is lock screen status\n")
530                 .append(" * screenState  \t\t" + temp_screenState + "\t\tscreen on / off status\n")
531                 .append(" * offReason  \t\t\t" + std::to_string(offReason) + "\t\tscreen failure reason\n")
532                 .append(" * interactiveState \t\t" + std::to_string(interactiveState) +
533                         "\t\tscreen interaction status\n");
534             return true;
535         });
536     DumpHelper::GetInstance().RegisterCommand(cmd);
537 }
538 
539 #ifdef OHOS_TEST_FLAG
IsAppInForeground(uint32_t tokenId)540 bool ScreenLockSystemAbility::IsAppInForeground(uint32_t tokenId)
541 {
542     return true;
543 }
544 #else
IsAppInForeground(uint32_t tokenId)545 bool ScreenLockSystemAbility::IsAppInForeground(uint32_t tokenId)
546 {
547     using namespace OHOS::AAFwk;
548     AppInfo appInfo;
549     auto ret = ScreenLockAppInfo::GetAppInfoByToken(tokenId, appInfo);
550     if (!ret || appInfo.bundleName.empty()) {
551         SCLOCK_HILOGI("get bundle name by token failed");
552         return false;
553     }
554     auto elementName = AbilityManagerClient::GetInstance()->GetTopAbility();
555     SCLOCK_HILOGD(" TopelementName:%{public}s, elementName.GetBundleName:%{public}s",
556         elementName.GetBundleName().c_str(),  appInfo.bundleName.c_str());
557     return elementName.GetBundleName() ==  appInfo.bundleName;
558 }
559 #endif
560 
LockScreenEvent(int stateResult)561 void ScreenLockSystemAbility::LockScreenEvent(int stateResult)
562 {
563     SCLOCK_HILOGD("ScreenLockSystemAbility LockScreenEvent stateResult:%{public}d", stateResult);
564     if (stateResult == ScreenChange::SCREEN_SUCC) {
565         SetScreenlocked(true);
566         DisplayManager::GetInstance().NotifyDisplayEvent(DisplayEvent::KEYGUARD_DRAWN);
567     } else if (stateResult == ScreenChange::SCREEN_FAIL || stateResult == ScreenChange::SCREEN_CANCEL) {
568         SetScreenlocked(false);
569     }
570     lock_.lock();
571     if (lockVecListeners_.size()) {
572         auto callback = [=]() {
573             for (size_t i = 0; i < lockVecListeners_.size(); i++) {
574                 SystemEvent systemEvent("", std::to_string(stateResult));
575                 lockVecListeners_[i]->OnCallBack(systemEvent);
576             }
577             lockVecListeners_.clear();
578         };
579         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
580     }
581     lock_.unlock();
582 }
583 
UnlockScreenEvent(int stateResult)584 void ScreenLockSystemAbility::UnlockScreenEvent(int stateResult)
585 {
586     SCLOCK_HILOGD("ScreenLockSystemAbility UnlockScreenEvent stateResult:%{public}d", stateResult);
587     if (stateResult == SCREEN_SUCC) {
588         SetScreenlocked(false);
589         DisplayManager::GetInstance().NotifyDisplayEvent(DisplayEvent::UNLOCK);
590     } else if (stateResult == SCREEN_FAIL || stateResult == SCREEN_CANCEL) {
591         SetScreenlocked(true);
592     }
593     std::lock_guard<std::mutex> autoLock(lock_);
594     if (unlockVecListeners_.size()) {
595         auto callback = [=]() {
596             for (size_t i = 0; i < unlockVecListeners_.size(); i++) {
597                 if (stateResult == SCREEN_CANCEL) {
598                     ErrorInfo errorInfo(JsErrorCode::ERR_CANCEL_UNLOCK, CANCEL_UNLOCK_OPENATION);
599                     unlockVecListeners_[i]->SetErrorInfo(errorInfo);
600                 }
601                 SystemEvent systemEvent("", std::to_string(stateResult));
602                 unlockVecListeners_[i]->OnCallBack(systemEvent);
603             }
604             unlockVecListeners_.clear();
605         };
606         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
607     }
608 }
609 
GetScreenlockParameter(const std::string & key) const610 std::string ScreenLockSystemAbility::GetScreenlockParameter(const std::string &key) const
611 {
612     char value[CONFIG_LEN] = { 0 };
613     auto errNo = GetParameter(key.c_str(), "", value, CONFIG_LEN);
614     if (errNo > HANDLE_OK) {
615         SCLOCK_HILOGD("GetParameter success, value = %{public}.5s.", value);
616         return value;
617     }
618     SCLOCK_HILOGE("GetParameter failed, errNo = %{public}d.", errNo);
619     return "";
620 }
621 
622 #ifdef OHOS_TEST_FLAG
IsWhiteListApp(uint32_t callingTokenId,const std::string & key)623 bool ScreenLockSystemAbility::IsWhiteListApp(uint32_t callingTokenId, const std::string &key)
624 {
625     return true;
626 }
627 
IsSystemApp()628 bool ScreenLockSystemAbility::IsSystemApp()
629 {
630     return true;
631 }
632 #else
IsWhiteListApp(uint32_t callingTokenId,const std::string & key)633 bool ScreenLockSystemAbility::IsWhiteListApp(uint32_t callingTokenId, const std::string &key)
634 {
635     std::string whiteListAppId = GetScreenlockParameter(key);
636     if (whiteListAppId.empty()) {
637         SCLOCK_HILOGE("ScreenLockSystemAbility::GetLockScreenWhiteApp  is null");
638         return false;
639     }
640     AppInfo appInfo;
641     if (!ScreenLockAppInfo::GetAppInfoByToken(callingTokenId, appInfo)) {
642         SCLOCK_HILOGE("ScreenLockSystemAbility::IsWhiteListApp GetAppInfoByToken is failed");
643         return false;
644     }
645     if (appInfo.appId.empty()) {
646         SCLOCK_HILOGE("ScreenLockSystemAbility::IsWhiteListApp appInfo.appId is null");
647         return false;
648     }
649     if (whiteListAppId != appInfo.appId) {
650         SCLOCK_HILOGE("ScreenLockSystemAbility::IsWhiteListApp calling app is not Screenlock APP");
651         return false;
652     }
653     SCLOCK_HILOGI("ScreenLockSystemAbility::IsWhiteListApp callingAppid=%{public}.5s, whiteListAppId=%{public}.5s",
654         appInfo.appId.c_str(), whiteListAppId.c_str());
655     return true;
656 }
657 
GetBundleMgr()658 static OHOS::sptr<OHOS::AppExecFwk::IBundleMgr> GetBundleMgr()
659 {
660     auto systemAbilityManager = OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
661     if (systemAbilityManager == nullptr) {
662         return nullptr;
663     }
664     auto bundleMgrSa = systemAbilityManager->GetSystemAbility(OHOS::BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
665     if (bundleMgrSa == nullptr) {
666         return nullptr;
667     }
668     auto bundleMgr = OHOS::iface_cast<AppExecFwk::IBundleMgr>(bundleMgrSa);
669     if (bundleMgr == nullptr) {
670         SCLOCK_HILOGE("GetBundleMgr iface_cast get null");
671     }
672     return bundleMgr;
673 }
674 
IsSystemApp()675 bool ScreenLockSystemAbility::IsSystemApp()
676 {
677     int32_t uid = IPCSkeleton::GetCallingUid();
678     auto bundleMgr = GetBundleMgr();
679     bool isSystemApplication = false;
680     if (bundleMgr != nullptr) {
681         isSystemApplication = bundleMgr->CheckIsSystemAppByUid(uid);
682     }
683     return isSystemApplication;
684 }
685 #endif
686 
SystemEventCallBack(const SystemEvent & systemEvent,TraceTaskId traceTaskId)687 void ScreenLockSystemAbility::SystemEventCallBack(const SystemEvent &systemEvent, TraceTaskId traceTaskId)
688 {
689     SCLOCK_HILOGI("OnCallBack eventType is %{public}s, params is %{public}s", systemEvent.eventType_.c_str(),
690         systemEvent.params_.c_str());
691     if (systemEventListener_ == nullptr) {
692         SCLOCK_HILOGE("systemEventListener_ is nullptr.");
693         return;
694     }
695     auto callback = [=]() {
696         if (traceTaskId != HITRACE_BUTT) {
697             StartAsyncTrace(
698                 HITRACE_TAG_MISC, "ScreenLockSystemAbility::" + systemEvent.eventType_ + "begin callback", traceTaskId);
699         }
700         std::lock_guard<std::mutex> lck(listenerMutex_);
701         systemEventListener_->OnCallBack(systemEvent);
702         if (traceTaskId != HITRACE_BUTT) {
703             FinishAsyncTrace(
704                 HITRACE_TAG_MISC, "ScreenLockSystemAbility::" + systemEvent.eventType_ + "end callback", traceTaskId);
705         }
706     };
707     if (serviceHandler_ != nullptr) {
708         serviceHandler_->PostTask(callback, INTERVAL_ZERO);
709     }
710 }
711 } // namespace ScreenLock
712 } // namespace OHOS
713