1 /*
2 * Copyright (c) 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 "sub_managers_helper.h"
17
18 #include <dlfcn.h>
19
20 #include "ability_cache_manager.h"
21 #include "hilog_tag_wrapper.h"
22 #include "hitrace_meter.h"
23 #include "scene_board_judgement.h"
24 #include "os_account_manager_wrapper.h"
25
26 namespace OHOS {
27 namespace AAFwk {
28 constexpr int32_t U0_USER_ID = 0;
29 constexpr int32_t INVALID_USER_ID = -1;
30
SubManagersHelper(std::shared_ptr<TaskHandlerWrap> taskHandler,std::shared_ptr<AbilityEventHandler> eventHandler)31 SubManagersHelper::SubManagersHelper(
32 std::shared_ptr<TaskHandlerWrap> taskHandler, std::shared_ptr<AbilityEventHandler> eventHandler)
33 : taskHandler_(taskHandler), eventHandler_(eventHandler) {}
34
~SubManagersHelper()35 SubManagersHelper::~SubManagersHelper()
36 {
37 if (missionLibHandle_ != nullptr) {
38 missionListWrap_ = nullptr;
39 dlclose(missionLibHandle_);
40 missionLibHandle_ = nullptr;
41 }
42 }
43
InitSubManagers(int userId,bool switchUser)44 void SubManagersHelper::InitSubManagers(int userId, bool switchUser)
45 {
46 InitConnectManager(userId, switchUser);
47 InitDataAbilityManager(userId, switchUser);
48 InitPendWantManager(userId, switchUser);
49 if (userId != U0_USER_ID) {
50 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
51 InitUIAbilityManager(userId, switchUser);
52 } else {
53 InitMissionListManager(userId, switchUser);
54 }
55 }
56 }
57
InitConnectManager(int32_t userId,bool switchUser)58 void SubManagersHelper::InitConnectManager(int32_t userId, bool switchUser)
59 {
60 std::lock_guard<ffrt::mutex> lock(managersMutex_);
61 auto it = connectManagers_.find(userId);
62 if (it != connectManagers_.end()) {
63 if (switchUser) {
64 currentConnectManager_ = it->second;
65 }
66 return;
67 }
68 auto manager = std::make_shared<AbilityConnectManager>(userId);
69 manager->SetTaskHandler(taskHandler_);
70 manager->SetEventHandler(eventHandler_);
71 connectManagers_.emplace(userId, manager);
72 if (switchUser) {
73 currentConnectManager_ = manager;
74 }
75 }
76
InitDataAbilityManager(int32_t userId,bool switchUser)77 void SubManagersHelper::InitDataAbilityManager(int32_t userId, bool switchUser)
78 {
79 std::lock_guard<ffrt::mutex> lock(managersMutex_);
80 auto it = dataAbilityManagers_.find(userId);
81 if (it != dataAbilityManagers_.end()) {
82 if (switchUser) {
83 currentDataAbilityManager_ = it->second;
84 }
85 return;
86 }
87 auto manager = std::make_shared<DataAbilityManager>();
88 dataAbilityManagers_.emplace(userId, manager);
89 if (switchUser) {
90 currentDataAbilityManager_ = manager;
91 }
92 }
93
InitPendWantManager(int32_t userId,bool switchUser)94 void SubManagersHelper::InitPendWantManager(int32_t userId, bool switchUser)
95 {
96 std::lock_guard<ffrt::mutex> lock(managersMutex_);
97 auto it = pendingWantManagers_.find(userId);
98 if (it != pendingWantManagers_.end()) {
99 if (switchUser) {
100 currentPendingWantManager_ = it->second;
101 }
102 return;
103 }
104 auto manager = std::make_shared<PendingWantManager>();
105 pendingWantManagers_.emplace(userId, manager);
106 if (switchUser) {
107 currentPendingWantManager_ = manager;
108 }
109 }
110
InitMissionListManager(int userId,bool switchUser)111 void SubManagersHelper::InitMissionListManager(int userId, bool switchUser)
112 {
113 std::lock_guard<ffrt::mutex> lock(managersMutex_);
114 auto it = missionListManagers_.find(userId);
115 if (it != missionListManagers_.end()) {
116 if (switchUser) {
117 auto missionListWrap = GetMissionListWrap();
118 if (missionListWrap) {
119 missionListWrap->InitMissionInfoMgr(userId);
120 }
121 currentMissionListManager_ = it->second;
122 }
123 return;
124 }
125 auto manager = CreateMissionListMgr(userId);
126 if (manager == nullptr) {
127 TAG_LOGE(AAFwkTag::ABILITYMGR, "manager empty");
128 return;
129 }
130 manager->Init();
131 missionListManagers_.emplace(userId, manager);
132 if (switchUser) {
133 currentMissionListManager_ = manager;
134 }
135 }
136
InitUIAbilityManager(int userId,bool switchUser)137 void SubManagersHelper::InitUIAbilityManager(int userId, bool switchUser)
138 {
139 std::lock_guard<ffrt::mutex> lock(managersMutex_);
140 auto it = uiAbilityManagers_.find(userId);
141 if (it != uiAbilityManagers_.end()) {
142 if (switchUser) {
143 currentUIAbilityManager_ = it->second;
144 }
145 return;
146 }
147 auto manager = std::make_shared<UIAbilityLifecycleManager>(userId);
148 uiAbilityManagers_.emplace(userId, manager);
149 if (switchUser) {
150 currentUIAbilityManager_ = manager;
151 }
152 }
153
ClearSubManagers(int userId)154 void SubManagersHelper::ClearSubManagers(int userId)
155 {
156 std::lock_guard<ffrt::mutex> lock(managersMutex_);
157 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
158 uiAbilityManagers_.erase(userId);
159 } else {
160 missionListManagers_.erase(userId);
161 }
162 connectManagers_.erase(userId);
163 dataAbilityManagers_.erase(userId);
164 pendingWantManagers_.erase(userId);
165 }
166
GetCurrentDataAbilityManager()167 std::shared_ptr<DataAbilityManager> SubManagersHelper::GetCurrentDataAbilityManager()
168 {
169 std::lock_guard<ffrt::mutex> lock(managersMutex_);
170 return currentDataAbilityManager_;
171 }
172
GetDataAbilityManager(const sptr<IAbilityScheduler> & scheduler)173 std::shared_ptr<DataAbilityManager> SubManagersHelper::GetDataAbilityManager(const sptr<IAbilityScheduler> &scheduler)
174 {
175 if (scheduler == nullptr) {
176 TAG_LOGE(AAFwkTag::ABILITYMGR, "null scheduler");
177 return nullptr;
178 }
179
180 std::lock_guard<ffrt::mutex> lock(managersMutex_);
181 for (auto& item: dataAbilityManagers_) {
182 if (item.second && item.second->ContainsDataAbility(scheduler)) {
183 return item.second;
184 }
185 }
186
187 return nullptr;
188 }
189
GetDataAbilityManagers()190 std::unordered_map<int, std::shared_ptr<DataAbilityManager>> SubManagersHelper::GetDataAbilityManagers()
191 {
192 std::lock_guard<ffrt::mutex> lock(managersMutex_);
193 return dataAbilityManagers_;
194 }
195
GetDataAbilityManagerByUserId(int32_t userId)196 std::shared_ptr<DataAbilityManager> SubManagersHelper::GetDataAbilityManagerByUserId(int32_t userId)
197 {
198 std::lock_guard<ffrt::mutex> lock(managersMutex_);
199 auto it = dataAbilityManagers_.find(userId);
200 if (it != dataAbilityManagers_.end()) {
201 return it->second;
202 }
203 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed. UserId: %{public}d", userId);
204 return nullptr;
205 }
206
GetDataAbilityManagerByToken(const sptr<IRemoteObject> & token)207 std::shared_ptr<DataAbilityManager> SubManagersHelper::GetDataAbilityManagerByToken(const sptr<IRemoteObject> &token)
208 {
209 std::lock_guard<ffrt::mutex> lock(managersMutex_);
210 for (auto& item: dataAbilityManagers_) {
211 if (item.second && item.second->GetAbilityRecordByToken(token)) {
212 return item.second;
213 }
214 }
215
216 return nullptr;
217 }
218
GetConnectManagers()219 std::unordered_map<int, std::shared_ptr<AbilityConnectManager>> SubManagersHelper::GetConnectManagers()
220 {
221 std::lock_guard<ffrt::mutex> lock(managersMutex_);
222 return connectManagers_;
223 }
224
GetCurrentConnectManager()225 std::shared_ptr<AbilityConnectManager> SubManagersHelper::GetCurrentConnectManager()
226 {
227 std::lock_guard<ffrt::mutex> lock(managersMutex_);
228 return currentConnectManager_;
229 }
230
GetConnectManagerByUserId(int32_t userId)231 std::shared_ptr<AbilityConnectManager> SubManagersHelper::GetConnectManagerByUserId(int32_t userId)
232 {
233 std::lock_guard<ffrt::mutex> lock(managersMutex_);
234 auto it = connectManagers_.find(userId);
235 if (it != connectManagers_.end()) {
236 return it->second;
237 }
238 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed. UserId: %{public}d", userId);
239 return nullptr;
240 }
241
GetConnectManagerByToken(const sptr<IRemoteObject> & token)242 std::shared_ptr<AbilityConnectManager> SubManagersHelper::GetConnectManagerByToken(const sptr<IRemoteObject> &token)
243 {
244 std::lock_guard<ffrt::mutex> lock(managersMutex_);
245 for (auto& item: connectManagers_) {
246 if (item.second && item.second->GetExtensionByTokenFromServiceMap(token)) {
247 return item.second;
248 }
249 if (item.second && item.second->GetExtensionByTokenFromTerminatingMap(token)) {
250 return item.second;
251 }
252 }
253 auto abilityRecord = AbilityCacheManager::GetInstance().FindRecordByToken(token);
254 if (abilityRecord == nullptr) {
255 return nullptr;
256 }
257 auto iter = connectManagers_.find(abilityRecord->GetOwnerMissionUserId());
258 if (iter == connectManagers_.end()) {
259 return nullptr;
260 }
261 return iter->second;
262 }
263
GetConnectManagerByAbilityRecordId(const int64_t & abilityRecordId)264 std::shared_ptr<AbilityConnectManager> SubManagersHelper::GetConnectManagerByAbilityRecordId(
265 const int64_t &abilityRecordId)
266 {
267 std::lock_guard<ffrt::mutex> lock(managersMutex_);
268 for (auto& item: connectManagers_) {
269 if (item.second == nullptr) {
270 continue;
271 }
272 if (item.second->GetExtensionByIdFromServiceMap(abilityRecordId)) {
273 return item.second;
274 }
275 if (item.second->GetExtensionByIdFromTerminatingMap(abilityRecordId)) {
276 return item.second;
277 }
278 }
279
280 return nullptr;
281 }
282
GetCurrentPendingWantManager()283 std::shared_ptr<PendingWantManager> SubManagersHelper::GetCurrentPendingWantManager()
284 {
285 std::lock_guard<ffrt::mutex> lock(managersMutex_);
286 return currentPendingWantManager_;
287 }
288
GetPendingWantManagerByUserId(int32_t userId)289 std::shared_ptr<PendingWantManager> SubManagersHelper::GetPendingWantManagerByUserId(int32_t userId)
290 {
291 std::lock_guard<ffrt::mutex> lock(managersMutex_);
292 auto it = pendingWantManagers_.find(userId);
293 if (it != pendingWantManagers_.end()) {
294 return it->second;
295 }
296 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed.UserId: %{public}d", userId);
297 return nullptr;
298 }
299
GetMissionListManagers()300 std::unordered_map<int, std::shared_ptr<MissionListManagerInterface>> SubManagersHelper::GetMissionListManagers()
301 {
302 std::lock_guard<ffrt::mutex> lock(managersMutex_);
303 return missionListManagers_;
304 }
305
GetCurrentMissionListManager()306 std::shared_ptr<MissionListManagerInterface> SubManagersHelper::GetCurrentMissionListManager()
307 {
308 std::lock_guard<ffrt::mutex> lock(managersMutex_);
309 return currentMissionListManager_;
310 }
311
GetMissionListManagerByUserId(int32_t userId)312 std::shared_ptr<MissionListManagerInterface> SubManagersHelper::GetMissionListManagerByUserId(int32_t userId)
313 {
314 std::lock_guard<ffrt::mutex> lock(managersMutex_);
315 auto it = missionListManagers_.find(userId);
316 if (it != missionListManagers_.end()) {
317 return it->second;
318 }
319 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed UserId: %{public}d", userId);
320 return nullptr;
321 }
322
GetMissionListManagerByUid(int32_t uid)323 std::shared_ptr<MissionListManagerInterface> SubManagersHelper::GetMissionListManagerByUid(int32_t uid)
324 {
325 int32_t userId = INVALID_USER_ID;
326 int32_t getOsAccountRet =
327 DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->GetOsAccountLocalIdFromUid(uid, userId);
328 if (getOsAccountRet != 0) {
329 TAG_LOGE(AAFwkTag::ABILITYMGR, "GetOsAccountLocalIdFromUid() failed. ret: %{public}d", getOsAccountRet);
330 return nullptr;
331 }
332 TAG_LOGD(AAFwkTag::ABILITYMGR, "userId: %{public}d", userId);
333 if (userId == U0_USER_ID) {
334 std::lock_guard<ffrt::mutex> lock(managersMutex_);
335 return currentMissionListManager_;
336 }
337 return GetMissionListManagerByUserId(userId);
338 }
339
GetUIAbilityManagers()340 std::unordered_map<int, std::shared_ptr<UIAbilityLifecycleManager>> SubManagersHelper::GetUIAbilityManagers()
341 {
342 std::lock_guard<ffrt::mutex> lock(managersMutex_);
343 return uiAbilityManagers_;
344 }
345
GetCurrentUIAbilityManager()346 std::shared_ptr<UIAbilityLifecycleManager> SubManagersHelper::GetCurrentUIAbilityManager()
347 {
348 std::lock_guard<ffrt::mutex> lock(managersMutex_);
349 return currentUIAbilityManager_;
350 }
351
GetUIAbilityManagerByUserId(int32_t userId)352 std::shared_ptr<UIAbilityLifecycleManager> SubManagersHelper::GetUIAbilityManagerByUserId(int32_t userId)
353 {
354 std::lock_guard<ffrt::mutex> lock(managersMutex_);
355 auto it = uiAbilityManagers_.find(userId);
356 if (it != uiAbilityManagers_.end()) {
357 return it->second;
358 }
359 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail UserId: %{public}d", userId);
360 return nullptr;
361 }
362
GetUIAbilityManagerByUid(int32_t uid)363 std::shared_ptr<UIAbilityLifecycleManager> SubManagersHelper::GetUIAbilityManagerByUid(int32_t uid)
364 {
365 int32_t userId = INVALID_USER_ID;
366 int32_t getOsAccountRet =
367 DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->GetOsAccountLocalIdFromUid(uid, userId);
368 if (getOsAccountRet != 0) {
369 TAG_LOGE(AAFwkTag::ABILITYMGR, "GetOsAccountLocalIdFromUid() failed. ret: %{public}d", getOsAccountRet);
370 return nullptr;
371 }
372 TAG_LOGD(AAFwkTag::ABILITYMGR, "userId: %{public}d", userId);
373 if (userId == U0_USER_ID) {
374 std::lock_guard<ffrt::mutex> lock(managersMutex_);
375 return currentUIAbilityManager_;
376 }
377 return GetUIAbilityManagerByUserId(userId);
378 }
379
UninstallApp(const std::string & bundleName,int32_t uid)380 void SubManagersHelper::UninstallApp(const std::string &bundleName, int32_t uid)
381 {
382 int32_t userId = INVALID_USER_ID;
383 int32_t getOsAccountRet =
384 DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->GetOsAccountLocalIdFromUid(uid, userId);
385 if (getOsAccountRet != 0) {
386 TAG_LOGE(AAFwkTag::ABILITYMGR, "GetOsAccountLocalIdFromUid() failed. ret: %{public}d", getOsAccountRet);
387 return;
388 }
389 TAG_LOGD(AAFwkTag::ABILITYMGR, "userId: %{public}d", userId);
390 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
391 UninstallAppInUIAbilityManagers(userId, bundleName, uid);
392 } else {
393 UninstallAppInMissionListManagers(userId, bundleName, uid);
394 }
395
396 auto currentPendingWantManager = GetCurrentPendingWantManager();
397 if (currentPendingWantManager) {
398 currentPendingWantManager->ClearPendingWantRecord(bundleName, uid);
399 }
400 }
401
UninstallAppInUIAbilityManagers(int32_t userId,const std::string & bundleName,int32_t uid)402 void SubManagersHelper::UninstallAppInUIAbilityManagers(int32_t userId, const std::string &bundleName, int32_t uid)
403 {
404 if (userId == U0_USER_ID) {
405 auto uiAbilityManagers = GetUIAbilityManagers();
406 for (auto& item : uiAbilityManagers) {
407 if (item.second) {
408 item.second->UninstallApp(bundleName, uid);
409 }
410 }
411 } else {
412 auto manager = GetUIAbilityManagerByUserId(userId);
413 if (manager) {
414 manager->UninstallApp(bundleName, uid);
415 }
416 }
417 }
418
UninstallAppInMissionListManagers(int32_t userId,const std::string & bundleName,int32_t uid)419 void SubManagersHelper::UninstallAppInMissionListManagers(int32_t userId, const std::string &bundleName, int32_t uid)
420 {
421 if (userId == U0_USER_ID) {
422 auto missionListManagers = GetMissionListManagers();
423 for (auto& item : missionListManagers) {
424 if (item.second) {
425 item.second->UninstallApp(bundleName, uid);
426 }
427 }
428 } else {
429 auto listManager = GetMissionListManagerByUserId(userId);
430 if (listManager) {
431 listManager->UninstallApp(bundleName, uid);
432 }
433 }
434 }
435
VerificationAllTokenForConnectManagers(const sptr<IRemoteObject> & token)436 bool SubManagersHelper::VerificationAllTokenForConnectManagers(const sptr<IRemoteObject> &token)
437 {
438 auto connectManagers = GetConnectManagers();
439 for (auto& item: connectManagers) {
440 if (item.second && item.second->GetExtensionByTokenFromServiceMap(token)) {
441 return true;
442 }
443 if (item.second && item.second->GetExtensionByTokenFromTerminatingMap(token)) {
444 return true;
445 }
446 }
447 if (AbilityCacheManager::GetInstance().FindRecordByToken(token)) {
448 return true;
449 }
450 return false;
451 }
452
VerificationAllToken(const sptr<IRemoteObject> & token)453 bool SubManagersHelper::VerificationAllToken(const sptr<IRemoteObject> &token)
454 {
455 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
456 TAG_LOGD(AAFwkTag::ABILITYMGR, "VerificationAllToken.");
457 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
458 auto uiAbilityManagers = GetUIAbilityManagers();
459 for (auto& item: uiAbilityManagers) {
460 if (item.second && item.second->IsContainsAbility(token)) {
461 return true;
462 }
463 }
464 } else {
465 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchMissionListManagers");
466 auto missionListManagers = GetMissionListManagers();
467 for (auto& item: missionListManagers) {
468 if (item.second && item.second->GetAbilityRecordByToken(token)) {
469 return true;
470 }
471 if (item.second && item.second->GetAbilityFromTerminateList(token)) {
472 return true;
473 }
474 }
475 }
476 {
477 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchDataAbilityManagers_");
478 auto dataAbilityManagers = GetDataAbilityManagers();
479 for (auto& item: dataAbilityManagers) {
480 if (item.second && item.second->GetAbilityRecordByToken(token)) {
481 return true;
482 }
483 }
484 }
485 {
486 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchConnectManagers_");
487 if (VerificationAllTokenForConnectManagers(token)) {
488 return true;
489 }
490 }
491 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail");
492 return false;
493 }
494
GetMissionListWrap()495 std::shared_ptr<MissionListWrap> SubManagersHelper::GetMissionListWrap()
496 {
497 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
498 return nullptr;
499 }
500
501 std::lock_guard lock(missionListWrapMutex_);
502 if (missionListWrap_) {
503 return missionListWrap_;
504 }
505
506 if (missionLibHandle_ == nullptr) {
507 missionLibHandle_ = dlopen("libmission_list.z.so", RTLD_NOW | RTLD_GLOBAL);
508 if (missionLibHandle_ == nullptr) {
509 TAG_LOGE(AAFwkTag::ABILITYMGR, "open mission_list library failed");
510 return nullptr;
511 }
512 }
513
514 auto createMissionListWrapFunc = reinterpret_cast<CreateMissionListMgrFunc>(dlsym(missionLibHandle_,
515 "CreateMissionListWrap"));
516 if (createMissionListWrapFunc == nullptr) {
517 TAG_LOGE(AAFwkTag::ABILITYMGR, "createFunc empty");
518 dlclose(missionLibHandle_);
519 missionLibHandle_ = nullptr;
520 return nullptr;
521 }
522
523 missionListWrap_ = std::shared_ptr<MissionListWrap>(createMissionListWrapFunc());
524 return missionListWrap_;
525 }
526
CreateMissionListMgr(int32_t userId)527 std::shared_ptr<MissionListManagerInterface> SubManagersHelper::CreateMissionListMgr(int32_t userId)
528 {
529 auto missionListWrap = GetMissionListWrap();
530 if (missionListWrap != nullptr) {
531 return missionListWrap->CreateMissionListManager(userId);
532 }
533
534 return nullptr;
535 }
536 } // namespace AAFwk
537 } // namespace OHOS