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