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