1 /*
2 * Copyright (c) 2021-2024 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 "user_controller.h"
17
18 #include "ability_manager_service.h"
19 #include "hilog_tag_wrapper.h"
20 #include "mock_session_manager_service.h"
21 #include "os_account_manager_wrapper.h"
22 #include "scene_board_judgement.h"
23
24 namespace OHOS {
25 namespace AAFwk {
26 using namespace OHOS::AppExecFwk;
27 namespace {
28 const int64_t USER_SWITCH_TIMEOUT = 3 * 1000; // 3s
29 }
30
UserItem(int32_t id)31 UserItem::UserItem(int32_t id) : userId_(id)
32 {}
33
~UserItem()34 UserItem::~UserItem() {}
35
GetUserId()36 int32_t UserItem::GetUserId()
37 {
38 return userId_;
39 }
40
SetState(const UserState &state)41 void UserItem::SetState(const UserState &state)
42 {
43 if (curState_ == state) {
44 return;
45 }
46 lastState_ = curState_;
47 curState_ = state;
48 }
49
GetState()50 UserState UserItem::GetState()
51 {
52 return curState_;
53 }
54
UserController()55 UserController::UserController()
56 {
57 }
58
~UserController()59 UserController::~UserController()
60 {
61 }
62
Init()63 void UserController::Init()
64 {
65 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
66 if (!handler) {
67 return;
68 }
69
70 if (eventHandler_) {
71 return;
72 }
73 eventHandler_ = std::make_shared<UserEventHandler>(handler, shared_from_this());
74 }
75
ClearAbilityUserItems(int32_t userId)76 void UserController::ClearAbilityUserItems(int32_t userId)
77 {
78 std::lock_guard<ffrt::mutex> guard(userLock_);
79 if (userItems_.count(userId)) {
80 userItems_.erase(userId);
81 }
82 }
83
StartUser(int32_t userId, sptr<IUserCallback> callback, bool isAppRecovery)84 void UserController::StartUser(int32_t userId, sptr<IUserCallback> callback, bool isAppRecovery)
85 {
86 if (userId < 0 || userId == USER_ID_NO_HEAD) {
87 TAG_LOGE(AAFwkTag::ABILITYMGR, "StartUserId invalid:%{public}d", userId);
88 callback->OnStartUserDone(userId, INVALID_USERID_VALUE);
89 return;
90 }
91
92 if (IsCurrentUser(userId)) {
93 TAG_LOGW(AAFwkTag::ABILITYMGR, "StartUser current:%{public}d", userId);
94 callback->OnStartUserDone(userId, ERR_OK);
95 return;
96 }
97
98 auto appScheduler = DelayedSingleton<AppScheduler>::GetInstance();
99 if (!appScheduler) {
100 TAG_LOGE(AAFwkTag::ABILITYMGR, "null appScheduler");
101 return;
102 }
103 appScheduler->SetEnableStartProcessFlagByUserId(userId, true);
104
105 if (!IsExistOsAccount(userId)) {
106 TAG_LOGE(AAFwkTag::ABILITYMGR, "null StartUser account:%{public}d", userId);
107 callback->OnStartUserDone(userId, INVALID_USERID_VALUE);
108 return;
109 }
110
111 if (GetCurrentUserId() != USER_ID_NO_HEAD && !Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
112 // start freezing screen
113 SetFreezingNewUserId(userId);
114 DelayedSingleton<AbilityManagerService>::GetInstance()->StartFreezingScreen();
115 }
116
117 auto oldUserId = GetCurrentUserId();
118 auto userItem = GetOrCreateUserItem(userId);
119 auto state = userItem->GetState();
120 if (state == STATE_STOPPING || state == STATE_SHUTDOWN) {
121 TAG_LOGE(AAFwkTag::ABILITYMGR, "StartUser user stop, userId:%{public}d", userId);
122 callback->OnStartUserDone(userId, ERR_DEAD_OBJECT);
123 return;
124 }
125
126 SetCurrentUserId(userId);
127 // notify wms switching now
128
129 bool needStart = false;
130 if (state == STATE_BOOTING) {
131 needStart = true;
132 // send user start msg.
133 SendSystemUserStart(userId);
134 }
135
136 SendSystemUserCurrent(oldUserId, userId);
137 SendReportUserSwitch(oldUserId, userId, userItem);
138 SendUserSwitchTimeout(oldUserId, userId, userItem);
139
140 if (needStart) {
141 BroadcastUserStarted(userId);
142 }
143
144 UserBootDone(userItem);
145 MoveUserToForeground(oldUserId, userId, callback, isAppRecovery);
146 }
147
StopUser(int32_t userId)148 int32_t UserController::StopUser(int32_t userId)
149 {
150 if (userId < 0 || userId == USER_ID_NO_HEAD || userId == USER_ID_DEFAULT) {
151 TAG_LOGE(AAFwkTag::ABILITYMGR, "userId invalid:%{public}d", userId);
152 return -1;
153 }
154
155 if (IsCurrentUser(userId)) {
156 TAG_LOGW(AAFwkTag::ABILITYMGR, "user current:%{public}d", userId);
157 return 0;
158 }
159
160 if (!IsExistOsAccount(userId)) {
161 TAG_LOGE(AAFwkTag::ABILITYMGR, "null account:%{public}d", userId);
162 return -1;
163 }
164
165 BroadcastUserStopping(userId);
166
167 auto appScheduler = DelayedSingleton<AppScheduler>::GetInstance();
168 if (!appScheduler) {
169 TAG_LOGE(AAFwkTag::ABILITYMGR, "null appScheduler");
170 return -1;
171 }
172 appScheduler->KillProcessesByUserId(userId);
173
174 auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
175 if (!abilityManagerService) {
176 TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityManagerService null");
177 return -1;
178 }
179
180 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
181 auto missionListWrap = abilityManagerService->GetMissionListWrap();
182 if (!missionListWrap) {
183 TAG_LOGE(AAFwkTag::ABILITYMGR, "missionListWrap null");
184 return -1;
185 }
186 missionListWrap->RemoveUserDir(userId);
187 }
188
189 abilityManagerService->ClearUserData(userId);
190
191 BroadcastUserStopped(userId);
192 return 0;
193 }
194
LogoutUser(int32_t userId)195 int32_t UserController::LogoutUser(int32_t userId)
196 {
197 if (userId < 0 || userId == USER_ID_NO_HEAD) {
198 TAG_LOGE(AAFwkTag::ABILITYMGR, "userId invalid:%{public}d", userId);
199 return INVALID_USERID_VALUE;
200 }
201 if (!IsExistOsAccount(userId)) {
202 TAG_LOGE(AAFwkTag::ABILITYMGR, "null account:%{public}d", userId);
203 return INVALID_USERID_VALUE;
204 }
205 auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
206 if (!abilityManagerService) {
207 TAG_LOGE(AAFwkTag::ABILITYMGR, "null abilityManagerService");
208 return -1;
209 }
210 abilityManagerService->RemoveLauncherDeathRecipient(userId);
211 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
212 TAG_LOGI(AAFwkTag::ABILITYMGR, "SceneBoard exit normally.");
213 Rosen::MockSessionManagerService::GetInstance().NotifyNotKillService();
214 }
215 auto appScheduler = DelayedSingleton<AppScheduler>::GetInstance();
216 if (!appScheduler) {
217 TAG_LOGE(AAFwkTag::ABILITYMGR, "null appScheduler");
218 return INVALID_USERID_VALUE;
219 }
220 abilityManagerService->ClearUserData(userId);
221 appScheduler->SetEnableStartProcessFlagByUserId(userId, false);
222 if (IsCurrentUser(userId)) {
223 SetCurrentUserId(0);
224 }
225 appScheduler->KillProcessesByUserId(userId);
226 ClearAbilityUserItems(userId);
227 return 0;
228 }
229
GetCurrentUserId()230 int32_t UserController::GetCurrentUserId()
231 {
232 std::lock_guard<ffrt::mutex> guard(userLock_);
233 return currentUserId_;
234 }
235
GetUserItem(int32_t userId)236 std::shared_ptr<UserItem> UserController::GetUserItem(int32_t userId)
237 {
238 std::lock_guard<ffrt::mutex> guard(userLock_);
239 auto it = userItems_.find(userId);
240 if (it != userItems_.end()) {
241 return it->second;
242 }
243
244 return nullptr;
245 }
246
IsCurrentUser(int32_t userId)247 bool UserController::IsCurrentUser(int32_t userId)
248 {
249 int32_t oldUserId = GetCurrentUserId();
250 if (oldUserId == userId) {
251 auto userItem = GetUserItem(userId);
252 if (userItem) {
253 TAG_LOGW(AAFwkTag::ABILITYMGR, "IsCurrentUserId current:%{public}d", userId);
254 return true;
255 }
256 }
257 return false;
258 }
259
IsExistOsAccount(int32_t userId)260 bool UserController::IsExistOsAccount(int32_t userId)
261 {
262 bool isExist = false;
263 auto errCode = DelayedSingleton<OsAccountManagerWrapper>::GetInstance()->IsOsAccountExists(userId, isExist);
264 return (errCode == 0) && isExist;
265 }
266
GetOrCreateUserItem(int32_t userId)267 std::shared_ptr<UserItem> UserController::GetOrCreateUserItem(int32_t userId)
268 {
269 std::lock_guard<ffrt::mutex> guard(userLock_);
270 auto it = userItems_.find(userId);
271 if (it != userItems_.end()) {
272 return it->second;
273 }
274
275 auto userItem = std::make_shared<UserItem>(userId);
276 userItems_.emplace(userId, userItem);
277 return userItem;
278 }
279
SetCurrentUserId(int32_t userId)280 void UserController::SetCurrentUserId(int32_t userId)
281 {
282 std::lock_guard<ffrt::mutex> guard(userLock_);
283 currentUserId_ = userId;
284 TAG_LOGD(AAFwkTag::ABILITYMGR, "set current userId: %{public}d", userId);
285 DelayedSingleton<AppScheduler>::GetInstance()->SetCurrentUserId(userId);
286 }
287
MoveUserToForeground(int32_t oldUserId, int32_t newUserId, sptr<IUserCallback> callback, bool isAppRecovery)288 void UserController::MoveUserToForeground(int32_t oldUserId, int32_t newUserId, sptr<IUserCallback> callback,
289 bool isAppRecovery)
290 {
291 auto manager = DelayedSingleton<AbilityManagerService>::GetInstance();
292 if (!manager) {
293 return;
294 }
295 manager->SwitchToUser(oldUserId, newUserId, callback, isAppRecovery);
296 BroadcastUserBackground(oldUserId);
297 BroadcastUserForeground(newUserId);
298 }
299
UserBootDone(std::shared_ptr<UserItem> &item)300 void UserController::UserBootDone(std::shared_ptr<UserItem> &item)
301 {
302 if (!item) {
303 return;
304 }
305 int32_t userId = item->GetUserId();
306
307 std::lock_guard<ffrt::mutex> guard(userLock_);
308 auto it = userItems_.find(userId);
309 if (it != userItems_.end()) {
310 return;
311 }
312
313 if (item != it->second) {
314 return;
315 }
316 item->SetState(UserState::STATE_STARTED);
317 auto manager = DelayedSingleton<AbilityManagerService>::GetInstance();
318 if (!manager) {
319 return;
320 }
321 manager->UserStarted(userId);
322 }
323
BroadcastUserStarted(int32_t userId)324 void UserController::BroadcastUserStarted(int32_t userId)
325 {
326 // broadcast event user start.
327 }
328
BroadcastUserBackground(int32_t userId)329 void UserController::BroadcastUserBackground(int32_t userId)
330 {
331 // broadcast event user switch to bg.
332 }
333
BroadcastUserForeground(int32_t userId)334 void UserController::BroadcastUserForeground(int32_t userId)
335 {
336 // broadcast event user switch to fg.
337 }
338
BroadcastUserStopping(int32_t userId)339 void UserController::BroadcastUserStopping(int32_t userId)
340 {
341 }
342
BroadcastUserStopped(int32_t userId)343 void UserController::BroadcastUserStopped(int32_t userId)
344 {
345 }
346
SendSystemUserStart(int32_t userId)347 void UserController::SendSystemUserStart(int32_t userId)
348 {
349 auto handler = eventHandler_;
350 if (!handler) {
351 return;
352 }
353
354 auto eventData = std::make_shared<UserEvent>();
355 eventData->newUserId = userId;
356 handler->SendEvent(EventWrap(UserEventHandler::EVENT_SYSTEM_USER_START, eventData));
357 }
358
ProcessEvent(const EventWrap &event)359 void UserController::ProcessEvent(const EventWrap &event)
360 {
361 auto eventId = event.GetEventId();
362 auto eventData = static_cast<UserEvent*>(event.GetEventData().get());
363 if (!eventData) {
364 TAG_LOGD(AAFwkTag::ABILITYMGR, "no event data, event id: %{public}u.", eventId);
365 return;
366 }
367
368 TAG_LOGD(AAFwkTag::ABILITYMGR, "Event id obtained: %{public}u.", eventId);
369 switch (eventId) {
370 case UserEventHandler::EVENT_SYSTEM_USER_START: {
371 HandleSystemUserStart(eventData->newUserId);
372 break;
373 }
374 case UserEventHandler::EVENT_SYSTEM_USER_CURRENT: {
375 HandleSystemUserCurrent(eventData->oldUserId, eventData->newUserId);
376 break;
377 }
378 case UserEventHandler::EVENT_REPORT_USER_SWITCH: {
379 HandleReportUserSwitch(eventData->oldUserId, eventData->newUserId, eventData->userItem);
380 break;
381 }
382 case UserEventHandler::EVENT_CONTINUE_USER_SWITCH: {
383 HandleContinueUserSwitch(eventData->oldUserId, eventData->newUserId, eventData->userItem);
384 break;
385 }
386 case UserEventHandler::EVENT_USER_SWITCH_TIMEOUT: {
387 HandleUserSwitchTimeout(eventData->oldUserId, eventData->newUserId, eventData->userItem);
388 break;
389 }
390 case UserEventHandler::EVENT_REPORT_USER_SWITCH_DONE: {
391 HandleUserSwitchDone(eventData->newUserId);
392 break;
393 }
394 default: {
395 TAG_LOGW(AAFwkTag::ABILITYMGR, "Unsupported event.");
396 break;
397 }
398 }
399 }
400
SendSystemUserCurrent(int32_t oldUserId, int32_t newUserId)401 void UserController::SendSystemUserCurrent(int32_t oldUserId, int32_t newUserId)
402 {
403 auto handler = eventHandler_;
404 if (!handler) {
405 return;
406 }
407
408 auto eventData = std::make_shared<UserEvent>();
409 eventData->oldUserId = oldUserId;
410 eventData->newUserId = newUserId;
411 handler->SendEvent(EventWrap(UserEventHandler::EVENT_SYSTEM_USER_CURRENT, eventData));
412 }
413
SendReportUserSwitch(int32_t oldUserId, int32_t newUserId, std::shared_ptr<UserItem> &usrItem)414 void UserController::SendReportUserSwitch(int32_t oldUserId, int32_t newUserId,
415 std::shared_ptr<UserItem> &usrItem)
416 {
417 auto handler = eventHandler_;
418 if (!handler) {
419 return;
420 }
421
422 auto eventData = std::make_shared<UserEvent>();
423 eventData->oldUserId = oldUserId;
424 eventData->newUserId = newUserId;
425 eventData->userItem = usrItem;
426 handler->SendEvent(EventWrap(UserEventHandler::EVENT_REPORT_USER_SWITCH, eventData));
427 }
428
SendUserSwitchTimeout(int32_t oldUserId, int32_t newUserId, std::shared_ptr<UserItem> &usrItem)429 void UserController::SendUserSwitchTimeout(int32_t oldUserId, int32_t newUserId,
430 std::shared_ptr<UserItem> &usrItem)
431 {
432 auto handler = eventHandler_;
433 if (!handler) {
434 return;
435 }
436
437 auto eventData = std::make_shared<UserEvent>();
438 eventData->oldUserId = oldUserId;
439 eventData->newUserId = newUserId;
440 eventData->userItem = usrItem;
441 handler->SendEvent(EventWrap(UserEventHandler::EVENT_USER_SWITCH_TIMEOUT,
442 eventData), USER_SWITCH_TIMEOUT);
443 }
444
SendContinueUserSwitch(int32_t oldUserId, int32_t newUserId, std::shared_ptr<UserItem> &usrItem)445 void UserController::SendContinueUserSwitch(int32_t oldUserId, int32_t newUserId,
446 std::shared_ptr<UserItem> &usrItem)
447 {
448 auto handler = eventHandler_;
449 if (!handler) {
450 return;
451 }
452
453 auto eventData = std::make_shared<UserEvent>();
454 eventData->oldUserId = oldUserId;
455 eventData->newUserId = newUserId;
456 eventData->userItem = usrItem;
457 handler->SendEvent(EventWrap(UserEventHandler::EVENT_CONTINUE_USER_SWITCH, eventData));
458 }
459
SendUserSwitchDone(int32_t userId)460 void UserController::SendUserSwitchDone(int32_t userId)
461 {
462 auto handler = eventHandler_;
463 if (!handler) {
464 return;
465 }
466
467 auto eventData = std::make_shared<UserEvent>();
468 eventData->newUserId = userId;
469 handler->SendEvent(EventWrap(UserEventHandler::EVENT_REPORT_USER_SWITCH_DONE,
470 eventData));
471 }
472
HandleSystemUserStart(int32_t userId)473 void UserController::HandleSystemUserStart(int32_t userId)
474 {
475 // notify system mgr user start.
476 }
477
HandleSystemUserCurrent(int32_t oldUserId, int32_t newUserId)478 void UserController::HandleSystemUserCurrent(int32_t oldUserId, int32_t newUserId)
479 {
480 // notify system mgr user switch to new.
481 }
482
HandleReportUserSwitch(int32_t oldUserId, int32_t newUserId, std::shared_ptr<UserItem> &usrItem)483 void UserController::HandleReportUserSwitch(int32_t oldUserId, int32_t newUserId,
484 std::shared_ptr<UserItem> &usrItem)
485 {
486 // notify user switch observers, not support yet.
487 }
488
HandleUserSwitchTimeout(int32_t oldUserId, int32_t newUserId, std::shared_ptr<UserItem> &usrItem)489 void UserController::HandleUserSwitchTimeout(int32_t oldUserId, int32_t newUserId,
490 std::shared_ptr<UserItem> &usrItem)
491 {
492 // other observers
493 SendContinueUserSwitch(oldUserId, newUserId, usrItem);
494 }
495
HandleContinueUserSwitch(int32_t oldUserId, int32_t newUserId, std::shared_ptr<UserItem> &usrItem)496 void UserController::HandleContinueUserSwitch(int32_t oldUserId, int32_t newUserId,
497 std::shared_ptr<UserItem> &usrItem)
498 {
499 auto manager = DelayedSingleton<AbilityManagerService>::GetInstance();
500 if (manager && !Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
501 manager->StopFreezingScreen();
502 }
503 SendUserSwitchDone(newUserId);
504 }
505
HandleUserSwitchDone(int32_t userId)506 void UserController::HandleUserSwitchDone(int32_t userId)
507 {
508 // notify wms switching done.
509 // notify user switch observers.
510 }
511
GetFreezingNewUserId() const512 int32_t UserController::GetFreezingNewUserId() const
513 {
514 return freezingNewUserId_;
515 }
516
SetFreezingNewUserId(int32_t userId)517 void UserController::SetFreezingNewUserId(int32_t userId)
518 {
519 freezingNewUserId_ = userId;
520 }
521 }
522 }
523