• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 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 "implicit_start_processor.h"
16 
17 #include "ability_manager_service.h"
18 #include "ability_util.h"
19 #include "app_utils.h"
20 #include "dialog_session_manager.h"
21 #include "ecological_rule/ability_ecological_rule_mgr_service.h"
22 #include "global_constant.h"
23 #include "hitrace_meter.h"
24 #include "start_ability_utils.h"
25 #include "startup_util.h"
26 #ifdef WITH_DLP
27 #include "dlp_file_kits.h"
28 #endif // WITH_DLP
29 #ifdef SUPPORT_SCREEN
30 #include "utils/ability_permission_util.h"
31 #endif // SUPPORT_SCREEN
32 
33 namespace OHOS {
34 namespace AAFwk {
35 const size_t IDENTITY_LIST_MAX_SIZE = 10;
36 
37 const std::string BLACK_ACTION_SELECT_DATA = "ohos.want.action.select";
38 const std::string ACTION_VIEW = "ohos.want.action.viewData";
39 const std::string STR_PHONE = "phone";
40 const std::string STR_DEFAULT = "default";
41 const std::string TYPE_ONLY_MATCH_WILDCARD = "reserved/wildcard";
42 const std::string SHOW_DEFAULT_PICKER_FLAG = "ohos.ability.params.showDefaultPicker";
43 const std::string PARAM_ABILITY_APPINFOS = "ohos.ability.params.appInfos";
44 const std::string ANCO_PENDING_REQUEST = "ancoPendingRequest";
45 const int NFC_CALLER_UID = 1027;
46 const int NFC_QUERY_LENGTH = 2;
47 const std::string OPEN_LINK_APP_LINKING_ONLY = "appLinkingOnly";
48 const std::string HTTP_SCHEME_NAME = "http";
49 const std::string HTTPS_SCHEME_NAME = "https";
50 const std::string APP_CLONE_INDEX = "ohos.extra.param.key.appCloneIndex";
51 
SendAbilityEvent(const EventName & eventName,HiSysEventType type,const EventInfo & eventInfo)52 void SendAbilityEvent(const EventName &eventName, HiSysEventType type, const EventInfo &eventInfo)
53 {
54     auto instance_ = DelayedSingleton<AbilityManagerService>::GetInstance();
55     if (instance_ == nullptr) {
56         TAG_LOGE(AAFwkTag::ABILITYMGR, "instance null.");
57         return;
58     }
59     auto taskHandler = instance_->GetTaskHandler();
60     if (taskHandler == nullptr) {
61         TAG_LOGI(AAFwkTag::ABILITYMGR, "task handler null.");
62         return;
63     }
64     taskHandler->SubmitTask([eventName, type, eventInfo]() {
65         EventReport::SendAbilityEvent(eventName, type, eventInfo);
66     });
67 }
68 
IsExtensionInWhiteList(AppExecFwk::ExtensionAbilityType type)69 bool ImplicitStartProcessor::IsExtensionInWhiteList(AppExecFwk::ExtensionAbilityType type)
70 {
71     switch (type) {
72         case AppExecFwk::ExtensionAbilityType::FORM: return true;
73         case AppExecFwk::ExtensionAbilityType::INPUTMETHOD: return true;
74         case AppExecFwk::ExtensionAbilityType::WALLPAPER: return true;
75         case AppExecFwk::ExtensionAbilityType::WINDOW: return true;
76         case AppExecFwk::ExtensionAbilityType::THUMBNAIL: return true;
77         case AppExecFwk::ExtensionAbilityType::PREVIEW: return true;
78         default: return false;
79     }
80 }
81 
IsImplicitStartAction(const Want & want)82 bool ImplicitStartProcessor::IsImplicitStartAction(const Want &want)
83 {
84     auto element = want.GetElement();
85     if (!element.GetAbilityName().empty()) {
86         return false;
87     }
88 
89     if (want.GetIntParam(AAFwk::SCREEN_MODE_KEY, ScreenMode::IDLE_SCREEN_MODE) != ScreenMode::IDLE_SCREEN_MODE) {
90         TAG_LOGI(AAFwkTag::ABILITYMGR, "The implicit startup process is not used for the startup of EmbeddaUIAbility");
91         return false;
92     }
93 
94     if (want.GetAction() != BLACK_ACTION_SELECT_DATA) {
95         TAG_LOGI(AAFwkTag::ABILITYMGR, "implicit start, the action is %{public}s", want.GetAction().data());
96         return true;
97     }
98 
99     return false;
100 }
101 
CheckImplicitCallPermission(const AbilityRequest & abilityRequest)102 int ImplicitStartProcessor::CheckImplicitCallPermission(const AbilityRequest& abilityRequest)
103 {
104     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
105     CHECK_POINTER_AND_RETURN(abilityMgr, ERR_INVALID_VALUE);
106     bool isBackgroundCall = true;
107     if (abilityMgr->IsCallFromBackground(abilityRequest, isBackgroundCall) != ERR_OK) {
108         return ERR_INVALID_VALUE;
109     }
110     if (!isBackgroundCall) {
111         TAG_LOGD(AAFwkTag::ABILITYMGR, "hap not background");
112         return ERR_OK;
113     }
114 #ifdef SUPPORT_SCREEN
115     int32_t HasFloatingWindowRet =
116         AbilityPermissionUtil::GetInstance().CheckStartCallHasFloatingWindow(abilityRequest.callerToken);
117     if (HasFloatingWindowRet == ERR_OK) {
118         TAG_LOGD(AAFwkTag::ABILITYMGR, "has floatingwindow");
119         return ERR_OK;
120     }
121 #endif // SUPPORT_SCREEN
122     auto ret = AAFwk::PermissionVerification::GetInstance()->VerifyBackgroundCallPermission(isBackgroundCall);
123     if (!ret) {
124         TAG_LOGE(AAFwkTag::ABILITYMGR, "CheckImplicitCallPermission failed");
125         return CHECK_PERMISSION_FAILED;
126     }
127     return ERR_OK;
128 }
129 
ImplicitStartAbility(AbilityRequest & request,int32_t userId,int32_t windowMode,const std::string & replaceWantString,bool isAppCloneSelector)130 int ImplicitStartProcessor::ImplicitStartAbility(AbilityRequest &request, int32_t userId, int32_t windowMode,
131     const std::string &replaceWantString, bool isAppCloneSelector)
132 {
133     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
134     TAG_LOGI(AAFwkTag::ABILITYMGR, "implicit start ability by type: %{public}d", request.callType);
135     auto sysDialogScheduler = DelayedSingleton<SystemDialogScheduler>::GetInstance();
136     CHECK_POINTER_AND_RETURN(sysDialogScheduler, ERR_INVALID_VALUE);
137 
138     auto result = CheckImplicitCallPermission(request);
139     if (ERR_OK != result) {
140         return result;
141     }
142     std::vector<DialogAppInfo> dialogAppInfos;
143     request.want.RemoveParam(APP_CLONE_INDEX);
144     int32_t ret = ERR_OK;
145     if (isAppCloneSelector) {
146         ret = GenerateAbilityRequestByAppIndexes(userId, request, dialogAppInfos);
147     } else {
148         ret = GenerateAbilityRequestByAction(userId, request, dialogAppInfos, false);
149     }
150     if (ret != ERR_OK) {
151         TAG_LOGE(AAFwkTag::ABILITYMGR, "generate ability request failed.");
152         return ret;
153     }
154     AbilityUtil::WantSetParameterWindowMode(request.want, windowMode);
155 
156     auto identity = IPCSkeleton::ResetCallingIdentity();
157     auto startAbilityTask = [imp = shared_from_this(), request, userId, identity]
158         (const std::string& bundle, const std::string& abilityName) mutable {
159         TAG_LOGI(AAFwkTag::ABILITYMGR, "implicit start ability call back.");
160 
161         // reset calling indentity
162         IPCSkeleton::SetCallingIdentity(identity);
163 
164         AAFwk::Want targetWant = request.want;
165         targetWant.SetElementName(bundle, abilityName);
166         auto callBack = [imp, targetWant, request, userId]() -> int32_t {
167             return imp->ImplicitStartAbilityInner(targetWant, request, userId);
168         };
169         return imp->CallStartAbilityInner(userId, targetWant, callBack, request.callType);
170     };
171 
172     AAFwk::Want want;
173     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
174     int32_t tokenId = request.want.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN,
175         static_cast<int32_t>(IPCSkeleton::GetCallingTokenID()));
176     AddIdentity(tokenId, identity);
177     if (dialogAppInfos.size() == 0 && AppUtils::GetInstance().IsSelectorDialogDefaultPossion()) {
178         if ((request.want.GetFlags() & Want::FLAG_START_WITHOUT_TIPS) == Want::FLAG_START_WITHOUT_TIPS) {
179             TAG_LOGI(AAFwkTag::ABILITYMGR, "hint dialog doesn't generate.");
180             return ERR_IMPLICIT_START_ABILITY_FAIL;
181         }
182         ret = sysDialogScheduler->GetSelectorDialogWant(dialogAppInfos, request.want, want, request.callerToken);
183         if (ret != ERR_OK) {
184             TAG_LOGE(AAFwkTag::ABILITYMGR, "GetSelectorDialogWant failed.");
185             return ret;
186         }
187         if (want.GetBoolParam("isCreateAppGallerySelector", false)) {
188             want.RemoveParam("isCreateAppGallerySelector");
189             bool needGrantUriPermission = true;
190             DialogSessionManager::GetInstance().CreateImplicitSelectorModalDialog(request, want, userId,
191                 dialogAppInfos, needGrantUriPermission);
192             return ERR_IMPLICIT_START_ABILITY_FAIL;
193         }
194         TAG_LOGE(AAFwkTag::ABILITYMGR, "implicit query ability infos failed, show tips dialog.");
195         Want dialogWant = sysDialogScheduler->GetTipsDialogWant(request.callerToken);
196         abilityMgr->StartAbility(dialogWant);
197         return ERR_IMPLICIT_START_ABILITY_FAIL;
198     } else if (dialogAppInfos.size() == 0 && !AppUtils::GetInstance().IsSelectorDialogDefaultPossion()) {
199         std::string type = MatchTypeAndUri(request.want);
200         ret = sysDialogScheduler->GetPcSelectorDialogWant(dialogAppInfos, request.want, want, type,
201             userId, request.callerToken);
202         if (ret != ERR_OK) {
203             TAG_LOGE(AAFwkTag::ABILITYMGR, "GetPcSelectorDialogWant failed.");
204             return ret;
205         }
206         if (want.GetBoolParam("isCreateAppGallerySelector", false)) {
207             want.RemoveParam("isCreateAppGallerySelector");
208             DialogSessionManager::GetInstance().CreateImplicitSelectorModalDialog(request, want, userId,
209                 dialogAppInfos);
210             return ERR_IMPLICIT_START_ABILITY_FAIL;
211         }
212         std::vector<DialogAppInfo> dialogAllAppInfos;
213         bool isMoreHapList = true;
214         ret = GenerateAbilityRequestByAction(userId, request, dialogAllAppInfos, isMoreHapList);
215         if (ret != ERR_OK) {
216             TAG_LOGE(AAFwkTag::ABILITYMGR, "generate ability request by action failed.");
217             return ret;
218         }
219         if (dialogAllAppInfos.size() == 0) {
220             if ((request.want.GetFlags() & Want::FLAG_START_WITHOUT_TIPS) == Want::FLAG_START_WITHOUT_TIPS) {
221                 TAG_LOGI(AAFwkTag::ABILITYMGR, "hint dialog doesn't generate.");
222                 return ERR_IMPLICIT_START_ABILITY_FAIL;
223             }
224             Want dialogWant = sysDialogScheduler->GetTipsDialogWant(request.callerToken);
225             abilityMgr->StartAbility(dialogWant);
226             return ERR_IMPLICIT_START_ABILITY_FAIL;
227         }
228         ret = sysDialogScheduler->GetPcSelectorDialogWant(dialogAllAppInfos, request.want, want,
229             TYPE_ONLY_MATCH_WILDCARD, userId, request.callerToken);
230         if (ret != ERR_OK) {
231             TAG_LOGE(AAFwkTag::ABILITYMGR, "GetPcSelectorDialogWant failed.");
232             return ret;
233         }
234         ret = abilityMgr->StartAbility(request.want, request.callerToken);
235         // reset calling indentity
236         IPCSkeleton::SetCallingIdentity(identity);
237         int32_t tokenId = request.want.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN,
238             static_cast<int32_t>(IPCSkeleton::GetCallingTokenID()));
239         AddIdentity(tokenId, identity);
240         return ret;
241     }
242 
243     //There is a default opening method add Only one application supports
244     bool defaultPicker = false;
245     defaultPicker = request.want.GetBoolParam(SHOW_DEFAULT_PICKER_FLAG, defaultPicker);
246     if (dialogAppInfos.size() == 1 && !defaultPicker) {
247         auto info = dialogAppInfos.front();
248         TAG_LOGI(
249             AAFwkTag::ABILITYMGR, "ImplicitQueryInfos success, target ability: %{public}s", info.abilityName.data());
250         return IN_PROCESS_CALL(startAbilityTask(info.bundleName, info.abilityName));
251     }
252 
253     if (AppUtils::GetInstance().IsSelectorDialogDefaultPossion()) {
254         TAG_LOGI(AAFwkTag::ABILITYMGR, "ImplicitQueryInfos success, Multiple apps to choose.");
255         ret = sysDialogScheduler->GetSelectorDialogWant(dialogAppInfos, request.want, want, request.callerToken);
256         if (ret != ERR_OK) {
257             TAG_LOGE(AAFwkTag::ABILITYMGR, "GetSelectorDialogWant failed.");
258             return ret;
259         }
260         if (want.GetBoolParam("isCreateAppGallerySelector", false)) {
261             want.RemoveParam("isCreateAppGallerySelector");
262             if (isAppCloneSelector) {
263                 return DialogSessionManager::GetInstance().CreateCloneSelectorModalDialog(request, want,
264                     userId, dialogAppInfos, replaceWantString);
265             }
266             bool needGrantUriPermission = true;
267             return DialogSessionManager::GetInstance().CreateImplicitSelectorModalDialog(request,
268                 want, userId, dialogAppInfos, needGrantUriPermission);
269         }
270         ret = abilityMgr->ImplicitStartAbilityAsCaller(request.want, request.callerToken, nullptr);
271         // reset calling indentity
272         IPCSkeleton::SetCallingIdentity(identity);
273         return ret;
274     }
275 
276     TAG_LOGI(AAFwkTag::ABILITYMGR, "ImplicitQueryInfos success, Multiple apps to choose in pc.");
277     std::string type = MatchTypeAndUri(request.want);
278 
279     ret = sysDialogScheduler->GetPcSelectorDialogWant(dialogAppInfos, request.want, want,
280         type, userId, request.callerToken);
281     if (ret != ERR_OK) {
282         TAG_LOGE(AAFwkTag::ABILITYMGR, "GetPcSelectorDialogWant failed.");
283         return ret;
284     }
285     if (want.GetBoolParam("isCreateAppGallerySelector", false)) {
286         want.RemoveParam("isCreateAppGallerySelector");
287         if (isAppCloneSelector) {
288             return DialogSessionManager::GetInstance().CreateCloneSelectorModalDialog(request, want, userId,
289                 dialogAppInfos, replaceWantString);
290         }
291         return DialogSessionManager::GetInstance().CreateImplicitSelectorModalDialog(request, want, userId,
292             dialogAppInfos);
293     }
294     ret = abilityMgr->ImplicitStartAbilityAsCaller(request.want, request.callerToken, nullptr);
295     // reset calling indentity
296     IPCSkeleton::SetCallingIdentity(identity);
297     return ret;
298 }
299 
MatchTypeAndUri(const AAFwk::Want & want)300 std::string ImplicitStartProcessor::MatchTypeAndUri(const AAFwk::Want &want)
301 {
302     std::string type = want.GetType();
303     if (type.empty()) {
304         auto uri = want.GetUriString();
305         auto suffixIndex = uri.rfind('.');
306         if (suffixIndex == std::string::npos) {
307             TAG_LOGE(AAFwkTag::ABILITYMGR, "Get suffix failed, uri is %{public}s", uri.c_str());
308             return "";
309         }
310         type = uri.substr(suffixIndex);
311 #ifdef WITH_DLP
312         if (type == ".dlp") {
313             auto suffixDlpIndex = uri.rfind('.', suffixIndex - 1);
314             if (suffixDlpIndex == std::string::npos) {
315                 TAG_LOGE(AAFwkTag::ABILITYMGR, "Get suffix failed, uri is %{public}s", uri.c_str());
316                 return "";
317             }
318             type = uri.substr(suffixDlpIndex, suffixIndex - suffixDlpIndex);
319         }
320 #endif // WITH_DLP
321     }
322     return type;
323 }
324 
ProcessLinkType(std::vector<AppExecFwk::AbilityInfo> & abilityInfos)325 static void ProcessLinkType(std::vector<AppExecFwk::AbilityInfo> &abilityInfos)
326 {
327     bool appLinkingExist = false;
328     bool defaultAppExist = false;
329     if (!abilityInfos.size()) {
330         return;
331     }
332     for (const auto &info : abilityInfos) {
333         if (info.linkType == AppExecFwk::LinkType::APP_LINK) {
334             appLinkingExist = true;
335         }
336         if (info.linkType == AppExecFwk::LinkType::DEFAULT_APP) {
337             defaultAppExist = true;
338         }
339     }
340     if (!appLinkingExist && !defaultAppExist) {
341         return;
342     }
343     TAG_LOGI(AAFwkTag::ABILITYMGR, "Open applink first!");
344     for (auto it = abilityInfos.begin(); it != abilityInfos.end();) {
345         if (it->linkType == AppExecFwk::LinkType::APP_LINK) {
346             it++;
347             continue;
348         }
349         if (it->linkType == AppExecFwk::LinkType::DEFAULT_APP && appLinkingExist) {
350             TAG_LOGD(AAFwkTag::ABILITYMGR, "%{public}s default deleted.", it->name.c_str());
351             it = abilityInfos.erase(it);
352             continue;
353         }
354         if (it->linkType == AppExecFwk::LinkType::DEEP_LINK) {
355             TAG_LOGD(AAFwkTag::ABILITYMGR, "%{public}s deleted.", it->name.c_str());
356             it = abilityInfos.erase(it);
357             continue;
358         }
359         it++;
360     }
361 }
362 
OnlyKeepReserveApp(std::vector<AppExecFwk::AbilityInfo> & abilityInfos,std::vector<AppExecFwk::ExtensionAbilityInfo> & extensionInfos,const AbilityRequest & request)363 void ImplicitStartProcessor::OnlyKeepReserveApp(std::vector<AppExecFwk::AbilityInfo> &abilityInfos,
364     std::vector<AppExecFwk::ExtensionAbilityInfo> &extensionInfos, const AbilityRequest &request)
365 {
366     if (!request.uriReservedFlag) {
367         return;
368     }
369     if (extensionInfos.size() > 0) {
370         extensionInfos.clear();
371     }
372 
373     for (auto it = abilityInfos.begin(); it != abilityInfos.end();) {
374         if (it->bundleName == request.reservedBundleName) {
375             it++;
376             continue;
377         } else {
378             TAG_LOGI(AAFwkTag::ABILITYMGR, "Reserve App %{public}s dismatch with bundleName %{public}s.",
379                 request.reservedBundleName.c_str(), it->bundleName.c_str());
380             it = abilityInfos.erase(it);
381         }
382     }
383 }
384 
GenerateAbilityRequestByAction(int32_t userId,AbilityRequest & request,std::vector<DialogAppInfo> & dialogAppInfos,bool isMoreHapList)385 int ImplicitStartProcessor::GenerateAbilityRequestByAction(int32_t userId,
386     AbilityRequest &request, std::vector<DialogAppInfo> &dialogAppInfos, bool isMoreHapList)
387 {
388     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
389     TAG_LOGD(AAFwkTag::ABILITYMGR, "%{public}s.", __func__);
390     // get abilityinfos from bms
391     auto bundleMgrHelper = GetBundleManagerHelper();
392     CHECK_POINTER_AND_RETURN(bundleMgrHelper, GET_ABILITY_SERVICE_FAILED);
393     auto abilityInfoFlag = AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT
394         | AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI
395         | AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION;
396     std::vector<AppExecFwk::AbilityInfo> abilityInfos;
397     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
398     bool withDefault = false;
399     withDefault = request.want.GetBoolParam(SHOW_DEFAULT_PICKER_FLAG, withDefault) ? false : true;
400     bool appLinkingOnly = false;
401     bool isOpenLink = false;
402     isOpenLink = request.want.HasParameter(OPEN_LINK_APP_LINKING_ONLY);
403     appLinkingOnly = request.want.GetBoolParam(OPEN_LINK_APP_LINKING_ONLY, false);
404 
405     if (IPCSkeleton::GetCallingUid() == NFC_CALLER_UID &&
406         !request.want.GetStringArrayParam(PARAM_ABILITY_APPINFOS).empty()) {
407         TAG_LOGI(AAFwkTag::ABILITYMGR, "The NFCNeed caller source is NFC.");
408         ImplicitStartProcessor::QueryBmsAppInfos(request, userId, dialogAppInfos);
409     }
410 
411     if (!StartAbilityUtils::IsCallFromAncoShellOrBroker(request.callerToken)) {
412         request.want.RemoveParam(ANCO_PENDING_REQUEST);
413     }
414 
415     if (appLinkingOnly) {
416         abilityInfoFlag = static_cast<uint32_t>(abilityInfoFlag) |
417             static_cast<uint32_t>(AppExecFwk::GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING);
418     }
419 
420     if (request.uriReservedFlag) {
421         abilityInfoFlag = static_cast<uint32_t>(abilityInfoFlag) |
422             static_cast<uint32_t>(AppExecFwk::GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP);
423     }
424 
425     if (isOpenLink) {
426         std::string linkUriScheme = request.want.GetUri().GetScheme();
427         if (linkUriScheme == HTTPS_SCHEME_NAME || linkUriScheme == HTTP_SCHEME_NAME) {
428             request.want.SetAction(ACTION_VIEW);
429         }
430     }
431 
432     IN_PROCESS_CALL_WITHOUT_RET(bundleMgrHelper->ImplicitQueryInfos(
433         request.want, abilityInfoFlag, userId, withDefault, abilityInfos, extensionInfos));
434 
435     OnlyKeepReserveApp(abilityInfos, extensionInfos, request);
436     if (isOpenLink && extensionInfos.size() > 0) {
437         TAG_LOGI(AAFwkTag::ABILITYMGR, "Clear extensionInfos when isOpenLink.");
438         extensionInfos.clear();
439     }
440 
441     TAG_LOGI(AAFwkTag::ABILITYMGR,
442         "ImplicitQueryInfos, abilityInfo size : %{public}zu, extensionInfos size: %{public}zu.", abilityInfos.size(),
443         extensionInfos.size());
444 
445     if (appLinkingOnly && abilityInfos.size() == 0) {
446         TAG_LOGE(AAFwkTag::ABILITYMGR, "There isn't match app.");
447         return ERR_IMPLICIT_START_ABILITY_FAIL;
448     }
449 
450     if (!appLinkingOnly) {
451         ProcessLinkType(abilityInfos);
452     }
453 
454 #ifdef WITH_DLP
455     if (request.want.GetBoolParam(AbilityUtil::DLP_PARAMS_SANDBOX, false)) {
456         Security::DlpPermission::DlpFileKits::ConvertAbilityInfoWithSupportDlp(request.want, abilityInfos);
457         extensionInfos.clear();
458     }
459 #endif // WITH_DLP
460 
461     if (abilityInfos.size() + extensionInfos.size() > 1) {
462         TAG_LOGI(AAFwkTag::ABILITYMGR, "More than one target application, filter by erms");
463         bool ret = FilterAbilityList(request.want, abilityInfos, extensionInfos, userId);
464         if (!ret) {
465             TAG_LOGE(AAFwkTag::ABILITYMGR, "FilterAbilityList failed");
466         }
467     }
468 
469     auto isExtension = request.callType == AbilityCallType::START_EXTENSION_TYPE;
470 
471     Want implicitwant;
472     std::string typeName = MatchTypeAndUri(request.want);
473 
474     implicitwant.SetAction(request.want.GetAction());
475     implicitwant.SetType(TYPE_ONLY_MATCH_WILDCARD);
476     std::vector<AppExecFwk::AbilityInfo> implicitAbilityInfos;
477     std::vector<AppExecFwk::ExtensionAbilityInfo> implicitExtensionInfos;
478     std::vector<std::string> infoNames;
479     if (!AppUtils::GetInstance().IsSelectorDialogDefaultPossion() && isMoreHapList) {
480         IN_PROCESS_CALL_WITHOUT_RET(bundleMgrHelper->ImplicitQueryInfos(implicitwant, abilityInfoFlag, userId,
481             withDefault, implicitAbilityInfos, implicitExtensionInfos));
482         if (implicitAbilityInfos.size() != 0 && typeName != TYPE_ONLY_MATCH_WILDCARD) {
483             for (auto implicitAbilityInfo : implicitAbilityInfos) {
484                 infoNames.emplace_back(implicitAbilityInfo.bundleName + "#" +
485                     implicitAbilityInfo.moduleName + "#" + implicitAbilityInfo.name);
486             }
487         }
488     }
489 
490     if (abilityInfos.size() == 1) {
491         auto skillUri =  abilityInfos.front().skillUri;
492         SetTargetLinkInfo(skillUri, request.want);
493         if (abilityInfos.front().linkType == AppExecFwk::LinkType::APP_LINK) {
494             EventInfo eventInfo;
495             eventInfo.bundleName = abilityInfos.front().bundleName;
496             eventInfo.callerBundleName = request.want.GetStringParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
497             eventInfo.uri = request.want.GetUriString();
498             SendAbilityEvent(EventName::START_ABILITY_BY_APP_LINKING, HiSysEventType::BEHAVIOR, eventInfo);
499         }
500     }
501 
502     {
503         HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "for (const auto &info : abilityInfos)");
504         bool isExistDefaultApp = IsExistDefaultApp(userId, typeName);
505         for (const auto &info : abilityInfos) {
506             AddInfoParam param = {
507                 .info = info,
508                 .userId = userId,
509                 .isExtension = isExtension,
510                 .isMoreHapList = isMoreHapList,
511                 .withDefault = withDefault,
512                 .typeName = typeName,
513                 .infoNames = infoNames,
514                 .isExistDefaultApp = isExistDefaultApp
515             };
516             AddAbilityInfoToDialogInfos(param, dialogAppInfos);
517         }
518     }
519 
520     for (const auto &info : extensionInfos) {
521         if (!isExtension || !CheckImplicitStartExtensionIsValid(request, info)) {
522             continue;
523         }
524         DialogAppInfo dialogAppInfo;
525         dialogAppInfo.abilityName = info.name;
526         dialogAppInfo.bundleName = info.bundleName;
527         dialogAppInfo.abilityIconId = info.iconId;
528         dialogAppInfo.abilityLabelId = info.labelId;
529         dialogAppInfo.bundleIconId = info.applicationInfo.iconId;
530         dialogAppInfo.bundleLabelId = info.applicationInfo.labelId;
531         dialogAppInfo.visible = info.visible;
532         dialogAppInfo.appIndex = info.applicationInfo.appIndex;
533         dialogAppInfo.multiAppMode = info.applicationInfo.multiAppMode;
534         dialogAppInfos.emplace_back(dialogAppInfo);
535     }
536 
537     return ERR_OK;
538 }
539 
GenerateAbilityRequestByAppIndexes(int32_t userId,AbilityRequest & request,std::vector<DialogAppInfo> & dialogAppInfos)540 int ImplicitStartProcessor::GenerateAbilityRequestByAppIndexes(int32_t userId, AbilityRequest &request,
541     std::vector<DialogAppInfo> &dialogAppInfos)
542 {
543     auto appIndexes = StartAbilityUtils::GetCloneAppIndexes(request.want.GetBundle(), userId);
544     if (appIndexes.size() > AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
545         TAG_LOGE(AAFwkTag::ABILITYMGR, "The size of appIndexes is too large.");
546         return ERR_INVALID_VALUE;
547     }
548     auto bms = GetBundleManagerHelper();
549     CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
550     auto abilityInfoFlag = static_cast<uint32_t>(AbilityRuntime::StartupUtil::BuildAbilityInfoFlag()) |
551         static_cast<uint32_t>(AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL);
552     std::vector<AppExecFwk::AbilityInfo> abilityInfos;
553     abilityInfos.emplace_back(request.abilityInfo);
554     for (auto &appIndex: appIndexes) {
555         AppExecFwk::AbilityInfo abilityInfo;
556         IN_PROCESS_CALL_WITHOUT_RET(bms->QueryCloneAbilityInfo(request.want.GetElement(), abilityInfoFlag, appIndex,
557             abilityInfo, userId));
558         if (abilityInfo.name.empty() || abilityInfo.bundleName.empty()) {
559             int32_t ret = FindExtensionInfo(request.want, abilityInfoFlag, userId, appIndex, abilityInfo);
560             if (ret != ERR_OK) {
561                 TAG_LOGE(AAFwkTag::ABILITYMGR, "query clone extension info failed.");
562                 return ret;
563             }
564         }
565         abilityInfos.emplace_back(abilityInfo);
566     }
567     for (const auto &info : abilityInfos) {
568         DialogAppInfo dialogAppInfo;
569         dialogAppInfo.abilityName = info.name;
570         dialogAppInfo.bundleName = info.bundleName;
571         dialogAppInfo.moduleName = info.moduleName;
572         dialogAppInfo.abilityIconId = info.iconId;
573         dialogAppInfo.abilityLabelId = info.labelId;
574         dialogAppInfo.bundleIconId = info.applicationInfo.iconId;
575         dialogAppInfo.bundleLabelId = info.applicationInfo.labelId;
576         dialogAppInfo.visible = info.visible;
577         dialogAppInfo.appIndex = info.applicationInfo.appIndex;
578         dialogAppInfo.multiAppMode = info.applicationInfo.multiAppMode;
579         dialogAppInfos.emplace_back(dialogAppInfo);
580     }
581     return ERR_OK;
582 }
583 
FindExtensionInfo(const Want & want,int32_t flags,int32_t userId,int32_t appIndex,AppExecFwk::AbilityInfo & abilityInfo)584 int ImplicitStartProcessor::FindExtensionInfo(const Want &want, int32_t flags, int32_t userId,
585     int32_t appIndex, AppExecFwk::AbilityInfo &abilityInfo)
586 {
587     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
588     auto bms = GetBundleManagerHelper();
589     CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
590     AppExecFwk::ExtensionAbilityInfo extensionInfo;
591     IN_PROCESS_CALL_WITHOUT_RET(bms->QueryCloneExtensionAbilityInfoWithAppIndex(want.GetElement(),
592         flags, appIndex, extensionInfo, userId));
593     if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
594         TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty.");
595         return RESOLVE_ABILITY_ERR;
596     }
597     if (AbilityRuntime::StartupUtil::IsSupportAppClone(extensionInfo.type)) {
598         AbilityRuntime::StartupUtil::InitAbilityInfoFromExtension(extensionInfo, abilityInfo);
599         return ERR_OK;
600     }
601     return ERR_APP_CLONE_INDEX_INVALID;
602 }
603 
QueryBmsAppInfos(AbilityRequest & request,int32_t userId,std::vector<DialogAppInfo> & dialogAppInfos)604 int ImplicitStartProcessor::QueryBmsAppInfos(AbilityRequest &request, int32_t userId,
605     std::vector<DialogAppInfo> &dialogAppInfos)
606 {
607     auto bundleMgrHelper = GetBundleManagerHelper();
608     std::vector<AppExecFwk::AbilityInfo> bmsApps;
609     auto abilityInfoFlag = AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT
610         | AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI
611         | AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION;
612     std::vector<std::string> apps = request.want.GetStringArrayParam(PARAM_ABILITY_APPINFOS);
613     for (std::string appInfoStr : apps) {
614         AppExecFwk::AbilityInfo abilityInfo;
615         std::vector<std::string> appInfos = ImplicitStartProcessor::SplitStr(appInfoStr, '/');
616         if (appInfos.empty() || appInfos.size() != NFC_QUERY_LENGTH) {
617             continue;
618         }
619         std::string bundleName = appInfos[0];
620         std::string abilityName = appInfos[1];
621         std::string queryAbilityName = bundleName.append(abilityName);
622         Want want;
623         want.SetElementName(appInfos[0], queryAbilityName);
624 
625         IN_PROCESS_CALL_WITHOUT_RET(bundleMgrHelper->QueryAbilityInfo(want, abilityInfoFlag,
626             userId, abilityInfo));
627         if (!abilityInfo.name.empty() && !abilityInfo.bundleName.empty() && !abilityInfo.moduleName.empty()) {
628             bmsApps.emplace_back(abilityInfo);
629         }
630     }
631     if (!bmsApps.empty()) {
632         for (const auto &abilityInfo : bmsApps) {
633             DialogAppInfo dialogAppInfo;
634             dialogAppInfo.abilityName = abilityInfo.name;
635             dialogAppInfo.bundleName = abilityInfo.bundleName;
636             dialogAppInfo.moduleName = abilityInfo.moduleName;
637             dialogAppInfo.abilityIconId = abilityInfo.iconId;
638             dialogAppInfo.abilityLabelId = abilityInfo.labelId;
639             dialogAppInfo.bundleIconId = abilityInfo.applicationInfo.iconId;
640             dialogAppInfo.bundleLabelId = abilityInfo.applicationInfo.labelId;
641             dialogAppInfo.visible = abilityInfo.visible;
642             dialogAppInfo.appIndex = abilityInfo.applicationInfo.appIndex;
643             dialogAppInfo.multiAppMode = abilityInfo.applicationInfo.multiAppMode;
644             dialogAppInfos.emplace_back(dialogAppInfo);
645         }
646     }
647     return ERR_OK;
648 }
649 
SplitStr(const std::string & str,char delimiter)650 std::vector<std::string> ImplicitStartProcessor::SplitStr(const std::string& str, char delimiter)
651 {
652     std::stringstream ss(str);
653     std::vector<std::string> result;
654     std::string s;
655     while (std::getline(ss, s, delimiter)) {
656         result.push_back(s);
657     }
658     return result;
659 }
660 
CheckImplicitStartExtensionIsValid(const AbilityRequest & request,const AppExecFwk::ExtensionAbilityInfo & extensionInfo)661 bool ImplicitStartProcessor::CheckImplicitStartExtensionIsValid(const AbilityRequest &request,
662     const AppExecFwk::ExtensionAbilityInfo &extensionInfo)
663 {
664     if (!request.want.GetElement().GetBundleName().empty()) {
665         return true;
666     }
667     TAG_LOGD(
668         AAFwkTag::ABILITYMGR, "ImplicitStartExtension type: %{public}d.", static_cast<int32_t>(extensionInfo.type));
669     if (!IsExtensionInWhiteList(extensionInfo.type)) {
670         TAG_LOGE(AAFwkTag::ABILITYMGR, "The extension without UI is not allowed ImplicitStart");
671         return false;
672     }
673     return true;
674 }
675 
ImplicitStartAbilityInner(const Want & targetWant,const AbilityRequest & request,int32_t userId)676 int32_t ImplicitStartProcessor::ImplicitStartAbilityInner(const Want &targetWant,
677     const AbilityRequest &request, int32_t userId)
678 {
679     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
680     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
681     CHECK_POINTER_AND_RETURN(abilityMgr, ERR_INVALID_VALUE);
682 
683     int32_t result = ERR_OK;
684     switch (request.callType) {
685         case AbilityCallType::START_OPTIONS_TYPE: {
686             StartOptions startOptions;
687             auto displayId = targetWant.GetIntParam(Want::PARAM_RESV_DISPLAY_ID, 0);
688             auto windowMode = targetWant.GetIntParam(Want::PARAM_RESV_WINDOW_MODE, 0);
689             startOptions.SetDisplayID(static_cast<int32_t>(displayId));
690             startOptions.SetWindowMode(static_cast<int32_t>(windowMode));
691             result = abilityMgr->ImplicitStartAbility(
692                 targetWant, startOptions, request.callerToken, userId, request.requestCode);
693             break;
694         }
695         case AbilityCallType::START_SETTINGS_TYPE: {
696             CHECK_POINTER_AND_RETURN(request.startSetting, ERR_INVALID_VALUE);
697             result = abilityMgr->ImplicitStartAbility(
698                 targetWant, *request.startSetting, request.callerToken, userId, request.requestCode);
699             break;
700         }
701         case AbilityCallType::START_EXTENSION_TYPE:
702             result = abilityMgr->ImplicitStartExtensionAbility(
703                 targetWant, request.callerToken, userId, request.extensionType);
704             break;
705         default:
706             result = abilityMgr->StartAbilityWrap(
707                 targetWant, request.callerToken, request.requestCode, false, userId, false, 0, false, true);
708             break;
709     }
710 
711     return result;
712 }
713 
CallStartAbilityInner(int32_t userId,const Want & want,const StartAbilityClosure & callBack,const AbilityCallType & callType)714 int ImplicitStartProcessor::CallStartAbilityInner(int32_t userId,
715     const Want &want, const StartAbilityClosure &callBack, const AbilityCallType &callType)
716 {
717     EventInfo eventInfo;
718     eventInfo.userId = userId;
719     eventInfo.bundleName = want.GetElement().GetBundleName();
720     eventInfo.moduleName = want.GetElement().GetModuleName();
721     eventInfo.abilityName = want.GetElement().GetAbilityName();
722 
723     if (callType == AbilityCallType::INVALID_TYPE) {
724         SendAbilityEvent(EventName::START_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
725     }
726 
727     TAG_LOGI(AAFwkTag::ABILITYMGR, "ability:%{public}s, bundle:%{public}s", eventInfo.abilityName.c_str(),
728         eventInfo.bundleName.c_str());
729 
730     auto ret = callBack();
731     if (ret != ERR_OK) {
732         eventInfo.errCode = ret;
733         if (callType == AbilityCallType::INVALID_TYPE) {
734             SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
735         }
736     }
737     return ret;
738 }
739 
GetBundleManagerHelper()740 std::shared_ptr<AppExecFwk::BundleMgrHelper> ImplicitStartProcessor::GetBundleManagerHelper()
741 {
742     if (iBundleManagerHelper_ == nullptr) {
743         iBundleManagerHelper_ = AbilityUtil::GetBundleManagerHelper();
744     }
745     return iBundleManagerHelper_;
746 }
747 
GetDefaultAppProxy()748 sptr<AppExecFwk::IDefaultApp> ImplicitStartProcessor::GetDefaultAppProxy()
749 {
750     auto bundleMgrHelper = GetBundleManagerHelper();
751     if (bundleMgrHelper == nullptr) {
752         TAG_LOGE(AAFwkTag::ABILITYMGR, "The bundleMgrHelper is nullptr.");
753         return nullptr;
754     }
755     auto defaultAppProxy = bundleMgrHelper->GetDefaultAppProxy();
756     if (defaultAppProxy == nullptr) {
757         TAG_LOGE(AAFwkTag::ABILITYMGR, "The defaultAppProxy is nullptr.");
758         return nullptr;
759     }
760     return defaultAppProxy;
761 }
762 
FilterAbilityList(const Want & want,std::vector<AppExecFwk::AbilityInfo> & abilityInfos,std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos,int32_t userId)763 bool ImplicitStartProcessor::FilterAbilityList(const Want &want, std::vector<AppExecFwk::AbilityInfo> &abilityInfos,
764     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos, int32_t userId)
765 {
766     ErmsCallerInfo callerInfo;
767     GetEcologicalCallerInfo(want, callerInfo, userId);
768     return true;
769 }
770 
GetEcologicalCallerInfo(const Want & want,ErmsCallerInfo & callerInfo,int32_t userId)771 void ImplicitStartProcessor::GetEcologicalCallerInfo(const Want &want, ErmsCallerInfo &callerInfo, int32_t userId)
772 {
773     callerInfo.packageName = want.GetStringParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
774     callerInfo.uid = want.GetIntParam(Want::PARAM_RESV_CALLER_UID, IPCSkeleton::GetCallingUid());
775     callerInfo.pid = want.GetIntParam(Want::PARAM_RESV_CALLER_PID, IPCSkeleton::GetCallingPid());
776     callerInfo.targetAppType = ErmsCallerInfo::TYPE_INVALID;
777     callerInfo.callerAppType = ErmsCallerInfo::TYPE_INVALID;
778 
779     auto bundleMgrHelper = GetBundleManagerHelper();
780     if (bundleMgrHelper == nullptr) {
781         TAG_LOGE(AAFwkTag::ABILITYMGR, "Get Bubndle manager helper failed.");
782         return;
783     }
784 
785     std::string targetBundleName = want.GetBundle();
786     AppExecFwk::ApplicationInfo targetAppInfo;
787     bool getTargetResult = IN_PROCESS_CALL(bundleMgrHelper->GetApplicationInfo(targetBundleName,
788         AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO, userId, targetAppInfo));
789     if (!getTargetResult) {
790         TAG_LOGE(AAFwkTag::ABILITYMGR, "Get targetAppInfo failed.");
791     } else if (targetAppInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE) {
792         TAG_LOGD(AAFwkTag::ABILITYMGR, "the target type  is atomic service");
793         callerInfo.targetAppType = ErmsCallerInfo::TYPE_ATOM_SERVICE;
794     } else if (targetAppInfo.bundleType == AppExecFwk::BundleType::APP) {
795         TAG_LOGD(AAFwkTag::ABILITYMGR, "the target type is app");
796         callerInfo.targetAppType = ErmsCallerInfo::TYPE_HARMONY_APP;
797     } else {
798         TAG_LOGD(AAFwkTag::ABILITYMGR, "the target type is invalid type");
799     }
800 
801     std::string callerBundleName;
802     ErrCode err = IN_PROCESS_CALL(bundleMgrHelper->GetNameForUid(callerInfo.uid, callerBundleName));
803     if (err != ERR_OK) {
804         TAG_LOGE(AAFwkTag::ABILITYMGR, "Get callerBundleName failed.");
805         return;
806     }
807     AppExecFwk::ApplicationInfo callerAppInfo;
808     bool getCallerResult = IN_PROCESS_CALL(bundleMgrHelper->GetApplicationInfo(callerBundleName,
809         AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO, userId, callerAppInfo));
810     if (!getCallerResult) {
811         TAG_LOGD(AAFwkTag::ABILITYMGR, "Get callerAppInfo failed.");
812     } else if (callerAppInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE) {
813         TAG_LOGD(AAFwkTag::ABILITYMGR, "the caller type  is atomic service");
814         callerInfo.callerAppType = ErmsCallerInfo::TYPE_ATOM_SERVICE;
815     } else if (callerAppInfo.bundleType == AppExecFwk::BundleType::APP) {
816         TAG_LOGD(AAFwkTag::ABILITYMGR, "the caller type is app");
817         callerInfo.callerAppType = ErmsCallerInfo::TYPE_HARMONY_APP;
818     } else {
819         TAG_LOGD(AAFwkTag::ABILITYMGR, "the caller type is invalid type");
820     }
821 }
822 
AddIdentity(int32_t tokenId,std::string identity)823 void ImplicitStartProcessor::AddIdentity(int32_t tokenId, std::string identity)
824 {
825     std::lock_guard guard(identityListLock_);
826     if (identityList_.size() == IDENTITY_LIST_MAX_SIZE) {
827         identityList_.pop_front();
828         identityList_.emplace_back(IdentityNode(tokenId, identity));
829         return;
830     }
831     identityList_.emplace_back(IdentityNode(tokenId, identity));
832 }
833 
ResetCallingIdentityAsCaller(int32_t tokenId,bool flag)834 void ImplicitStartProcessor::ResetCallingIdentityAsCaller(int32_t tokenId, bool flag)
835 {
836     std::lock_guard guard(identityListLock_);
837     for (auto it = identityList_.begin(); it != identityList_.end(); it++) {
838         if (it->tokenId == tokenId) {
839             IPCSkeleton::SetCallingIdentity(it->identity);
840             if (flag) {
841                 identityList_.erase(it);
842             }
843             return;
844         }
845     }
846 }
847 
RemoveIdentity(int32_t tokenId)848 void ImplicitStartProcessor::RemoveIdentity(int32_t tokenId)
849 {
850     std::lock_guard guard(identityListLock_);
851     for (auto it = identityList_.begin(); it != identityList_.end(); it++) {
852         if (it->tokenId == tokenId) {
853             identityList_.erase(it);
854             return;
855         }
856     }
857 }
858 
AddAbilityInfoToDialogInfos(const AddInfoParam & param,std::vector<DialogAppInfo> & dialogAppInfos)859 void ImplicitStartProcessor::AddAbilityInfoToDialogInfos(const AddInfoParam &param,
860     std::vector<DialogAppInfo> &dialogAppInfos)
861 {
862     if (param.isExtension && param.info.type != AbilityType::EXTENSION) {
863         return;
864     }
865     if (!AppUtils::GetInstance().IsSelectorDialogDefaultPossion()) {
866         bool isDefaultFlag = param.withDefault && param.isExistDefaultApp;
867         if (!param.isMoreHapList && !isDefaultFlag &&
868             std::find(param.infoNames.begin(), param.infoNames.end(),
869             (param.info.bundleName + "#" + param.info.moduleName + "#" + param.info.name)) != param.infoNames.end()) {
870             return;
871         }
872     }
873     DialogAppInfo dialogAppInfo;
874     dialogAppInfo.abilityName = param.info.name;
875     dialogAppInfo.bundleName = param.info.bundleName;
876     dialogAppInfo.moduleName = param.info.moduleName;
877     dialogAppInfo.abilityIconId = param.info.iconId;
878     dialogAppInfo.abilityLabelId = param.info.labelId;
879     dialogAppInfo.bundleIconId = param.info.applicationInfo.iconId;
880     dialogAppInfo.bundleLabelId = param.info.applicationInfo.labelId;
881     dialogAppInfo.visible = param.info.visible;
882     dialogAppInfo.appIndex = param.info.applicationInfo.appIndex;
883     dialogAppInfo.multiAppMode = param.info.applicationInfo.multiAppMode;
884     dialogAppInfos.emplace_back(dialogAppInfo);
885 }
886 
IsExistDefaultApp(int32_t userId,const std::string & typeName)887 bool ImplicitStartProcessor::IsExistDefaultApp(int32_t userId, const std::string &typeName)
888 {
889     auto defaultMgr = GetDefaultAppProxy();
890     AppExecFwk::BundleInfo bundleInfo;
891     ErrCode ret =
892         IN_PROCESS_CALL(defaultMgr->GetDefaultApplication(userId, typeName, bundleInfo));
893     if (ret != ERR_OK) {
894         return false;
895     }
896 
897     if (bundleInfo.abilityInfos.size() == 1) {
898         TAG_LOGI(AAFwkTag::ABILITYMGR, "find default ability.");
899         return true;
900     } else if (bundleInfo.extensionInfos.size() == 1) {
901         TAG_LOGI(AAFwkTag::ABILITYMGR, "find default extension.");
902         return true;
903     } else {
904         TAG_LOGI(AAFwkTag::ABILITYMGR, "GetDefaultApplication failed.");
905         return false;
906     }
907 }
908 
SetTargetLinkInfo(const std::vector<AppExecFwk::SkillUriForAbilityAndExtension> & skillUri,Want & want)909 void ImplicitStartProcessor::SetTargetLinkInfo(const std::vector<AppExecFwk::SkillUriForAbilityAndExtension> &skillUri,
910     Want &want)
911 {
912     for (const auto& iter : skillUri) {
913         if (iter.isMatch) {
914             want.RemoveParam("send_to_erms_targetLinkFeature");
915             want.SetParam("send_to_erms_targetLinkFeature", iter.linkFeature);
916             want.RemoveParam("send_to_erms_targetLinkType");
917             if (want.GetBoolParam(OPEN_LINK_APP_LINKING_ONLY, false)) {
918                 want.SetParam("send_to_erms_targetLinkType", AbilityCallerInfo::LINK_TYPE_UNIVERSAL_LINK);
919             } else if ((iter.scheme == "https" || iter.scheme == "http") &&
920                 want.GetAction().compare(ACTION_VIEW) == 0) {
921                 want.SetParam("send_to_erms_targetLinkType", AbilityCallerInfo::LINK_TYPE_WEB_LINK);
922             } else {
923                 want.SetParam("send_to_erms_targetLinkType", AbilityCallerInfo::LINK_TYPE_DEEP_LINK);
924             }
925         }
926     }
927 }
928 }  // namespace AAFwk
929 }  // namespace OHOS
930