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 ¶m,
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