1 /*
2 * Copyright (c) 2023-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
16 #include "dialog_session_manager.h"
17
18 #include <random>
19 #include "ability_manager_service.h"
20 #include "ability_util.h"
21 #include "hitrace_meter.h"
22 #include "int_wrapper.h"
23 #include "modal_system_ui_extension.h"
24 #include "start_ability_utils.h"
25 #include "string_wrapper.h"
26 #include "want.h"
27
28 namespace OHOS {
29 namespace AAFwk {
30 using OHOS::AppExecFwk::BundleInfo;
31 namespace {
32 constexpr const char* UIEXTENSION_MODAL_TYPE = "ability.want.params.modalType";
33 constexpr int32_t ERMS_ISALLOW_RESULTCODE = 10;
34 constexpr const char* SUPPORT_CLOSE_ON_BLUR = "supportCloseOnBlur";
35 constexpr const char* DIALOG_SESSION_ID = "dialogSessionId";
36 }
37
GetInstance()38 DialogSessionManager &DialogSessionManager::GetInstance()
39 {
40 static DialogSessionManager instance;
41 return instance;
42 }
43
GenerateDialogSessionId()44 std::string DialogSessionManager::GenerateDialogSessionId()
45 {
46 auto timestamp = std::chrono::system_clock::now().time_since_epoch();
47 auto time = std::chrono::duration_cast<std::chrono::seconds>(timestamp).count();
48 std::random_device seed;
49 std::mt19937 rng(seed());
50 std::uniform_int_distribution<int> uni(0, INT_MAX);
51 int randomDigit = uni(rng);
52 std::string dialogSessionId = std::to_string(time) + "_" + std::to_string(randomDigit);
53
54 std::lock_guard<ffrt::mutex> guard(dialogSessionRecordLock_);
55 auto iter = dialogSessionInfoMap_.find(dialogSessionId);
56 while (iter != dialogSessionInfoMap_.end()) {
57 dialogSessionId += "_1";
58 iter = dialogSessionInfoMap_.find(dialogSessionId);
59 }
60 return dialogSessionId;
61 }
62
SetStartupSessionInfo(const std::string & dialogSessionId,const AbilityRequest & abilityRequest)63 void DialogSessionManager::SetStartupSessionInfo(const std::string &dialogSessionId,
64 const AbilityRequest &abilityRequest)
65 {
66 std::lock_guard<ffrt::mutex> guard(dialogSessionRecordLock_);
67 std::shared_ptr<StartupSessionInfo> startupSessionInfo = std::make_shared<StartupSessionInfo>();
68 startupSessionInfo->abilityRequest = abilityRequest;
69 startupSessionInfoMap_[dialogSessionId] = startupSessionInfo;
70 }
71
SetDialogSessionInfo(const std::string & dialogSessionId,sptr<DialogSessionInfo> & dilogSessionInfo,std::shared_ptr<DialogCallerInfo> & dialogCallerInfo)72 void DialogSessionManager::SetDialogSessionInfo(const std::string &dialogSessionId,
73 sptr<DialogSessionInfo> &dilogSessionInfo, std::shared_ptr<DialogCallerInfo> &dialogCallerInfo)
74 {
75 std::lock_guard<ffrt::mutex> guard(dialogSessionRecordLock_);
76 dialogSessionInfoMap_[dialogSessionId] = dilogSessionInfo;
77 dialogCallerInfoMap_[dialogSessionId] = dialogCallerInfo;
78 }
79
GetDialogSessionInfo(const std::string & dialogSessionId) const80 sptr<DialogSessionInfo> DialogSessionManager::GetDialogSessionInfo(const std::string &dialogSessionId) const
81 {
82 std::lock_guard<ffrt::mutex> guard(dialogSessionRecordLock_);
83 auto it = dialogSessionInfoMap_.find(dialogSessionId);
84 if (it != dialogSessionInfoMap_.end()) {
85 return it->second;
86 }
87 TAG_LOGI(AAFwkTag::DIALOG, "not find");
88 return nullptr;
89 }
90
GetDialogCallerInfo(const std::string & dialogSessionId) const91 std::shared_ptr<DialogCallerInfo> DialogSessionManager::GetDialogCallerInfo(const std::string &dialogSessionId) const
92 {
93 std::lock_guard<ffrt::mutex> guard(dialogSessionRecordLock_);
94 auto it = dialogCallerInfoMap_.find(dialogSessionId);
95 if (it != dialogCallerInfoMap_.end()) {
96 return it->second;
97 }
98 TAG_LOGI(AAFwkTag::DIALOG, "not find");
99 return nullptr;
100 }
101
GetStartupSessionInfo(const std::string & dialogSessionId) const102 std::shared_ptr<StartupSessionInfo> DialogSessionManager::GetStartupSessionInfo(
103 const std::string &dialogSessionId) const
104 {
105 std::lock_guard<ffrt::mutex> guard(dialogSessionRecordLock_);
106 auto it = startupSessionInfoMap_.find(dialogSessionId);
107 if (it != startupSessionInfoMap_.end()) {
108 return it->second;
109 }
110 TAG_LOGI(AAFwkTag::DIALOG, "not find");
111 return nullptr;
112 }
113
ClearDialogContext(const std::string & dialogSessionId)114 void DialogSessionManager::ClearDialogContext(const std::string &dialogSessionId)
115 {
116 std::lock_guard<ffrt::mutex> guard(dialogSessionRecordLock_);
117 dialogSessionInfoMap_.erase(dialogSessionId);
118 dialogCallerInfoMap_.erase(dialogSessionId);
119 startupSessionInfoMap_.erase(dialogSessionId);
120 return;
121 }
122
ClearAllDialogContexts()123 void DialogSessionManager::ClearAllDialogContexts()
124 {
125 std::lock_guard<ffrt::mutex> guard(dialogSessionRecordLock_);
126 dialogSessionInfoMap_.clear();
127 dialogCallerInfoMap_.clear();
128 startupSessionInfoMap_.clear();
129 }
130
GenerateCallerAbilityInfo(AbilityRequest & abilityRequest,DialogAbilityInfo & callerAbilityInfo)131 void DialogSessionManager::GenerateCallerAbilityInfo(AbilityRequest &abilityRequest,
132 DialogAbilityInfo &callerAbilityInfo)
133 {
134 sptr<IRemoteObject> callerToken = abilityRequest.callerToken;
135 if (callerToken != nullptr) {
136 auto callerRecord = Token::GetAbilityRecordByToken(callerToken);
137 CHECK_POINTER(callerRecord);
138 callerAbilityInfo.bundleName = callerRecord->GetAbilityInfo().bundleName;
139 callerAbilityInfo.moduleName = callerRecord->GetAbilityInfo().moduleName;
140 callerAbilityInfo.abilityName = callerRecord->GetAbilityInfo().name;
141 callerAbilityInfo.abilityIconId = callerRecord->GetAbilityInfo().iconId;
142 callerAbilityInfo.abilityLabelId = callerRecord->GetAbilityInfo().labelId;
143 callerAbilityInfo.bundleIconId = callerRecord->GetApplicationInfo().iconId;
144 callerAbilityInfo.bundleLabelId = callerRecord->GetApplicationInfo().labelId;
145 callerAbilityInfo.visible = callerRecord->GetAbilityInfo().visible;
146 callerAbilityInfo.appIndex = callerRecord->GetApplicationInfo().appIndex;
147 callerAbilityInfo.multiAppMode = callerRecord->GetApplicationInfo().multiAppMode;
148 }
149 }
150
GenerateSelectorTargetAbilityInfos(std::vector<DialogAppInfo> & dialogAppInfos,std::vector<DialogAbilityInfo> & targetAbilityInfos)151 void DialogSessionManager::GenerateSelectorTargetAbilityInfos(std::vector<DialogAppInfo> &dialogAppInfos,
152 std::vector<DialogAbilityInfo> &targetAbilityInfos)
153 {
154 for (auto &dialogAppInfo : dialogAppInfos) {
155 DialogAbilityInfo targetDialogAbilityInfo;
156 targetDialogAbilityInfo.bundleName = dialogAppInfo.bundleName;
157 targetDialogAbilityInfo.moduleName = dialogAppInfo.moduleName;
158 targetDialogAbilityInfo.abilityName = dialogAppInfo.abilityName;
159 targetDialogAbilityInfo.abilityIconId = dialogAppInfo.abilityIconId;
160 targetDialogAbilityInfo.abilityLabelId = dialogAppInfo.abilityLabelId;
161 targetDialogAbilityInfo.bundleIconId = dialogAppInfo.bundleIconId;
162 targetDialogAbilityInfo.bundleLabelId = dialogAppInfo.bundleLabelId;
163 targetDialogAbilityInfo.visible = dialogAppInfo.visible;
164 targetDialogAbilityInfo.appIndex = dialogAppInfo.appIndex;
165 targetDialogAbilityInfo.multiAppMode = dialogAppInfo.multiAppMode;
166 targetAbilityInfos.emplace_back(targetDialogAbilityInfo);
167 }
168 }
169
GenerateJumpTargetAbilityInfos(AbilityRequest & abilityRequest,std::vector<DialogAbilityInfo> & targetAbilityInfos)170 void DialogSessionManager::GenerateJumpTargetAbilityInfos(AbilityRequest &abilityRequest,
171 std::vector<DialogAbilityInfo> &targetAbilityInfos)
172 {
173 DialogAbilityInfo targetDialogAbilityInfo;
174 targetDialogAbilityInfo.bundleName = abilityRequest.abilityInfo.bundleName;
175 targetDialogAbilityInfo.moduleName = abilityRequest.abilityInfo.moduleName;
176 targetDialogAbilityInfo.abilityName = abilityRequest.abilityInfo.name;
177 targetDialogAbilityInfo.abilityIconId = abilityRequest.abilityInfo.iconId;
178 targetDialogAbilityInfo.abilityLabelId = abilityRequest.abilityInfo.labelId;
179 targetDialogAbilityInfo.bundleIconId = abilityRequest.abilityInfo.applicationInfo.iconId;
180 targetDialogAbilityInfo.bundleLabelId = abilityRequest.abilityInfo.applicationInfo.labelId;
181 targetDialogAbilityInfo.visible = abilityRequest.abilityInfo.visible;
182 targetDialogAbilityInfo.appIndex = abilityRequest.abilityInfo.applicationInfo.appIndex;
183 targetDialogAbilityInfo.multiAppMode = abilityRequest.abilityInfo.applicationInfo.multiAppMode;
184 targetAbilityInfos.emplace_back(targetDialogAbilityInfo);
185 }
186
GenerateDialogCallerInfo(AbilityRequest & abilityRequest,int32_t userId,std::shared_ptr<DialogCallerInfo> dialogCallerInfo,SelectorType type,bool needGrantUriPermission)187 void DialogSessionManager::GenerateDialogCallerInfo(AbilityRequest &abilityRequest, int32_t userId,
188 std::shared_ptr<DialogCallerInfo> dialogCallerInfo, SelectorType type, bool needGrantUriPermission)
189 {
190 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
191 CHECK_POINTER(dialogCallerInfo);
192 dialogCallerInfo->type = type;
193 dialogCallerInfo->callerToken = abilityRequest.callerToken;
194 dialogCallerInfo->requestCode = abilityRequest.requestCode;
195 dialogCallerInfo->targetWant = abilityRequest.want;
196 dialogCallerInfo->userId = userId;
197 dialogCallerInfo->needGrantUriPermission = needGrantUriPermission;
198 }
199
SendDialogResult(const Want & want,const std::string & dialogSessionId,bool isAllowed)200 int DialogSessionManager::SendDialogResult(const Want &want, const std::string &dialogSessionId, bool isAllowed)
201 {
202 if (!isAllowed) {
203 TAG_LOGI(AAFwkTag::ABILITYMGR, "user refuse to jump");
204 ClearDialogContext(dialogSessionId);
205 return ERR_OK;
206 }
207 std::shared_ptr<StartupSessionInfo> startupSessionInfo = GetStartupSessionInfo(dialogSessionId);
208 if (startupSessionInfo != nullptr) {
209 return NotifySCBToRecoveryAfterInterception(dialogSessionId, startupSessionInfo->abilityRequest);
210 }
211 std::shared_ptr<DialogCallerInfo> dialogCallerInfo = GetDialogCallerInfo(dialogSessionId);
212 if (dialogCallerInfo == nullptr) {
213 TAG_LOGE(AAFwkTag::ABILITYMGR, "dialog caller info is nullptr");
214 ClearDialogContext(dialogSessionId);
215 return ERR_INVALID_VALUE;
216 }
217 auto targetWant = dialogCallerInfo->targetWant;
218 targetWant.SetElement(want.GetElement());
219 targetWant.SetParam("isSelector", dialogCallerInfo->type != SelectorType::WITHOUT_SELECTOR);
220 targetWant.SetParam(DIALOG_SESSION_ID, dialogSessionId);
221 if (want.HasParameter(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY)) {
222 int32_t appIndex = want.GetIntParam(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, 0);
223 targetWant.SetParam(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, appIndex);
224 }
225 if (!targetWant.HasParameter(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY)) {
226 targetWant.SetParam(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, 0);
227 }
228 sptr<IRemoteObject> callerToken = dialogCallerInfo->callerToken;
229 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
230 if (!abilityMgr) {
231 TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityMgr is nullptr.");
232 return INNER_ERR;
233 }
234 int ret = abilityMgr->StartAbilityAsCallerDetails(targetWant, callerToken, callerToken, dialogCallerInfo->userId,
235 dialogCallerInfo->requestCode, false, dialogCallerInfo->type == SelectorType::APP_CLONE_SELECTOR);
236 if (ret == ERR_OK) {
237 ClearDialogContext(dialogSessionId);
238 abilityMgr->RemoveSelectorIdentity(dialogCallerInfo->targetWant.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN, 0));
239 }
240 return ret;
241 }
242
NotifySCBToRecoveryAfterInterception(const std::string & dialogSessionId,const AbilityRequest & abilityRequest)243 int32_t DialogSessionManager::NotifySCBToRecoveryAfterInterception(const std::string &dialogSessionId,
244 const AbilityRequest &abilityRequest)
245 {
246 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
247 if (!abilityMgr) {
248 TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityMgr is nullptr.");
249 return INNER_ERR;
250 }
251 int ret = IN_PROCESS_CALL(abilityMgr->NotifySCBToRecoveryAfterInterception(abilityRequest));
252 if (ret == ERR_OK) {
253 ClearDialogContext(dialogSessionId);
254 }
255 return ret;
256 }
257
GenerateDialogSessionRecordCommon(AbilityRequest & abilityRequest,int32_t userId,const AAFwk::WantParams & parameters,std::vector<DialogAppInfo> & dialogAppInfos,SelectorType type,bool needGrantUriPermission)258 std::string DialogSessionManager::GenerateDialogSessionRecordCommon(AbilityRequest &abilityRequest, int32_t userId,
259 const AAFwk::WantParams ¶meters, std::vector<DialogAppInfo> &dialogAppInfos, SelectorType type,
260 bool needGrantUriPermission)
261 {
262 auto dialogSessionInfo = sptr<DialogSessionInfo>::MakeSptr();
263 CHECK_POINTER_AND_RETURN(dialogSessionInfo, "");
264
265 GenerateCallerAbilityInfo(abilityRequest, dialogSessionInfo->callerAbilityInfo);
266
267 if (type != SelectorType::WITHOUT_SELECTOR) {
268 GenerateSelectorTargetAbilityInfos(dialogAppInfos, dialogSessionInfo->targetAbilityInfos);
269 } else {
270 GenerateJumpTargetAbilityInfos(abilityRequest, dialogSessionInfo->targetAbilityInfos);
271 }
272
273 dialogSessionInfo->parameters = parameters;
274
275 std::shared_ptr<DialogCallerInfo> dialogCallerInfo = std::make_shared<DialogCallerInfo>();
276 GenerateDialogCallerInfo(abilityRequest, userId, dialogCallerInfo, type, needGrantUriPermission);
277
278 std::string dialogSessionId = GenerateDialogSessionId();
279 SetDialogSessionInfo(dialogSessionId, dialogSessionInfo, dialogCallerInfo);
280
281 return dialogSessionId;
282 }
283
CreateJumpModalDialog(AbilityRequest & abilityRequest,int32_t userId,const Want & replaceWant)284 int DialogSessionManager::CreateJumpModalDialog(AbilityRequest &abilityRequest, int32_t userId,
285 const Want &replaceWant)
286 {
287 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
288
289 AAFwk::WantParams parameters;
290
291 parameters.SetParam("deviceType", AAFwk::String::Box(OHOS::system::GetDeviceType()));
292 parameters.SetParam("userId", AAFwk::Integer::Box(userId));
293
294 std::vector<DialogAppInfo> dialogAppInfos;
295 std::string dialogSessionId = GenerateDialogSessionRecordCommon(abilityRequest, userId, parameters,
296 dialogAppInfos, SelectorType::WITHOUT_SELECTOR);
297 if (dialogSessionId == "") {
298 TAG_LOGE(AAFwkTag::ABILITYMGR, "generate dialog session record failed");
299 return ERR_INVALID_VALUE;
300 }
301
302 return CreateModalDialogCommon(replaceWant, abilityRequest.callerToken, dialogSessionId);
303 }
304
CreateImplicitSelectorModalDialog(AbilityRequest & abilityRequest,const Want & want,int32_t userId,std::vector<DialogAppInfo> & dialogAppInfos,bool needGrantUriPermission)305 int DialogSessionManager::CreateImplicitSelectorModalDialog(AbilityRequest &abilityRequest, const Want &want,
306 int32_t userId, std::vector<DialogAppInfo> &dialogAppInfos, bool needGrantUriPermission)
307 {
308 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
309
310 AAFwk::Want sessionWant;
311
312 sessionWant.SetParam("deviceType", OHOS::system::GetDeviceType());
313 sessionWant.SetParam("userId", userId);
314 sessionWant.SetParam("action", abilityRequest.want.GetAction());
315 sessionWant.SetParam("wantType", abilityRequest.want.GetType());
316 sessionWant.SetParam("uri", abilityRequest.want.GetUriString());
317 sessionWant.SetParam("entities", abilityRequest.want.GetEntities());
318 sessionWant.SetParam("appselector.selectorType", static_cast<int>(SelectorType::IMPLICIT_START_SELECTOR));
319 bool showCaller = abilityRequest.want.GetBoolParam("showCaller", false);
320 sessionWant.SetParam("showCaller", showCaller);
321 sessionWant.SetParam("ohos.ability.param.showDefaultPicker",
322 abilityRequest.want.GetBoolParam("ohos.ability.params.showDefaultPicker", false));
323
324 std::string dialogSessionId = GenerateDialogSessionRecordCommon(abilityRequest, userId, sessionWant.GetParams(),
325 dialogAppInfos, SelectorType::IMPLICIT_START_SELECTOR, needGrantUriPermission);
326 if (dialogSessionId == "") {
327 TAG_LOGE(AAFwkTag::ABILITYMGR, "generate dialog session record failed");
328 return ERR_INVALID_VALUE;
329 }
330
331 return CreateModalDialogCommon(want, abilityRequest.callerToken, dialogSessionId);
332 }
333
CreateCloneSelectorModalDialog(AbilityRequest & abilityRequest,const Want & want,int32_t userId,std::vector<DialogAppInfo> & dialogAppInfos,const std::string & replaceWant)334 int DialogSessionManager::CreateCloneSelectorModalDialog(AbilityRequest &abilityRequest, const Want &want,
335 int32_t userId, std::vector<DialogAppInfo> &dialogAppInfos, const std::string &replaceWant)
336 {
337 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
338 AAFwk::WantParams parameters;
339
340 parameters.SetParam("deviceType", AAFwk::String::Box(OHOS::system::GetDeviceType()));
341 parameters.SetParam("userId", AAFwk::Integer::Box(userId));
342 parameters.SetParam("appselector.selectorType",
343 AAFwk::Integer::Box(static_cast<int>(SelectorType::APP_CLONE_SELECTOR)));
344 if (replaceWant != "") {
345 parameters.SetParam("ecological.replaceWant", AAFwk::String::Box(replaceWant));
346 }
347
348 std::string dialogSessionId = GenerateDialogSessionRecordCommon(abilityRequest, userId, parameters,
349 dialogAppInfos, SelectorType::APP_CLONE_SELECTOR);
350 if (dialogSessionId == "") {
351 TAG_LOGE(AAFwkTag::ABILITYMGR, "generate dialog session record failed");
352 return ERR_INVALID_VALUE;
353 }
354
355 return CreateModalDialogCommon(want, abilityRequest.callerToken, dialogSessionId);
356 }
357
CreateModalDialogCommon(const Want & replaceWant,sptr<IRemoteObject> callerToken,const std::string & dialogSessionId)358 int DialogSessionManager::CreateModalDialogCommon(const Want &replaceWant, sptr<IRemoteObject> callerToken,
359 const std::string &dialogSessionId)
360 {
361 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
362 (const_cast<Want &>(replaceWant)).SetParam(DIALOG_SESSION_ID, dialogSessionId);
363 auto connection = std::make_shared<OHOS::Rosen::ModalSystemUiExtension>();
364 if (callerToken == nullptr) {
365 TAG_LOGD(AAFwkTag::ABILITYMGR, "create modal ui extension for system");
366 (const_cast<Want &>(replaceWant)).SetParam(UIEXTENSION_MODAL_TYPE, 1);
367 (const_cast<Want &>(replaceWant)).SetParam(SUPPORT_CLOSE_ON_BLUR, true);
368 return IN_PROCESS_CALL(connection->CreateModalUIExtension(replaceWant)) ? ERR_OK : INNER_ERR;
369 }
370 auto callerRecord = Token::GetAbilityRecordByToken(callerToken);
371 if (!callerRecord) {
372 TAG_LOGE(AAFwkTag::ABILITYMGR, "callerRecord is nullptr.");
373 return ERR_INVALID_VALUE;
374 }
375
376 sptr<IRemoteObject> token;
377 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
378 if (!abilityMgr) {
379 TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityMgr is nullptr.");
380 return INNER_ERR;
381 }
382 int ret = IN_PROCESS_CALL(abilityMgr->GetTopAbility(token));
383 if (ret != ERR_OK || token == nullptr) {
384 TAG_LOGD(AAFwkTag::ABILITYMGR, "create modal ui extension for system");
385 (const_cast<Want &>(replaceWant)).SetParam(UIEXTENSION_MODAL_TYPE, 1);
386 (const_cast<Want &>(replaceWant)).SetParam(SUPPORT_CLOSE_ON_BLUR, true);
387 return IN_PROCESS_CALL(connection->CreateModalUIExtension(replaceWant)) ? ERR_OK : INNER_ERR;
388 }
389
390 if (callerRecord->GetAbilityInfo().type == AppExecFwk::AbilityType::PAGE && token == callerToken) {
391 TAG_LOGD(AAFwkTag::ABILITYMGR, "create modal ui extension for application");
392 return callerRecord->CreateModalUIExtension(replaceWant);
393 }
394 TAG_LOGD(AAFwkTag::ABILITYMGR, "create modal ui extension for system");
395 (const_cast<Want &>(replaceWant)).SetParam(UIEXTENSION_MODAL_TYPE, 1);
396 (const_cast<Want &>(replaceWant)).SetParam(SUPPORT_CLOSE_ON_BLUR, true);
397 return IN_PROCESS_CALL(connection->CreateModalUIExtension(replaceWant)) ? ERR_OK : INNER_ERR;
398 }
399
HandleErmsResult(AbilityRequest & abilityRequest,int32_t userId,const Want & replaceWant)400 int DialogSessionManager::HandleErmsResult(AbilityRequest &abilityRequest, int32_t userId,
401 const Want &replaceWant)
402 {
403 std::string bundleName = abilityRequest.abilityInfo.bundleName;
404 if (StartAbilityUtils::ermsResultCode < ERMS_ISALLOW_RESULTCODE ||
405 !IsCreateCloneSelectorDialog(bundleName, userId)) {
406 TAG_LOGI(AAFwkTag::ABILITYMGR, "create jump modal dialog");
407 return CreateJumpModalDialog(abilityRequest, userId, replaceWant);
408 }
409 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
410 if (!abilityMgr) {
411 TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityMgr is nullptr.");
412 return INNER_ERR;
413 }
414 (const_cast<Want &>(replaceWant)).RemoveParam("ecological_experience_original_target");
415 return abilityMgr->CreateCloneSelectorDialog(abilityRequest, userId, replaceWant.ToString());
416 }
417
HandleErmsResultBySCB(AbilityRequest & abilityRequest,const Want & replaceWant)418 int32_t DialogSessionManager::HandleErmsResultBySCB(AbilityRequest &abilityRequest, const Want &replaceWant)
419 {
420 auto systemUIExtension = std::make_shared<OHOS::Rosen::ModalSystemUiExtension>();
421 (const_cast<Want &>(replaceWant)).SetParam(UIEXTENSION_MODAL_TYPE, 1);
422 (const_cast<Want &>(replaceWant)).SetParam(SUPPORT_CLOSE_ON_BLUR, true);
423 std::string dialogSessionId = GenerateDialogSessionId();
424 if (dialogSessionId == "") {
425 TAG_LOGE(AAFwkTag::ABILITYMGR, "generate dialog session record failed");
426 return ERR_INVALID_VALUE;
427 }
428 SetStartupSessionInfo(dialogSessionId, abilityRequest);
429 (const_cast<Want &>(replaceWant)).SetParam(DIALOG_SESSION_ID, dialogSessionId);
430 return IN_PROCESS_CALL(systemUIExtension->CreateModalUIExtension(replaceWant)) ?
431 ERR_ECOLOGICAL_CONTROL_STATUS : INNER_ERR;
432 }
433
IsCreateCloneSelectorDialog(const std::string & bundleName,int32_t userId)434 bool DialogSessionManager::IsCreateCloneSelectorDialog(const std::string &bundleName, int32_t userId)
435 {
436 if (StartAbilityUtils::isWantWithAppCloneIndex) {
437 TAG_LOGI(AAFwkTag::ABILITYMGR, "want with app clone index.");
438 StartAbilityUtils::isWantWithAppCloneIndex = false;
439 return false;
440 }
441 auto appIndexes = StartAbilityUtils::GetCloneAppIndexes(bundleName, userId);
442 if (appIndexes.empty()) {
443 TAG_LOGI(AAFwkTag::ABILITYMGR, "The application do not create clone index.");
444 return false;
445 }
446 return true;
447 }
448
UpdateExtensionWantWithDialogCallerInfo(AbilityRequest & abilityRequest,const sptr<IRemoteObject> & callerToken,bool isSCBCall)449 bool DialogSessionManager::UpdateExtensionWantWithDialogCallerInfo(AbilityRequest &abilityRequest,
450 const sptr<IRemoteObject> &callerToken, bool isSCBCall)
451 {
452 if (callerToken == nullptr) {
453 TAG_LOGW(AAFwkTag::ABILITYMGR, "callerToken null");
454 return false;
455 }
456 std::string dialogSessionId = abilityRequest.want.GetStringParam(DIALOG_SESSION_ID);
457 if (dialogSessionId.empty()) {
458 return false;
459 }
460 TAG_LOGI(AAFwkTag::ABILITYMGR, "dialogSessionId:%{public}s", dialogSessionId.c_str());
461 auto dialogCallerInfo = GetDialogCallerInfo(dialogSessionId);
462 if (dialogCallerInfo == nullptr) {
463 TAG_LOGW(AAFwkTag::ABILITYMGR, "dialogCallerInfo null");
464 return false;
465 }
466 if (!dialogCallerInfo->needGrantUriPermission) {
467 TAG_LOGI(AAFwkTag::ABILITYMGR, "no need grant uri permission");
468 return false;
469 }
470 TAG_LOGI(AAFwkTag::ABILITYMGR, "get dialog caller info");
471 auto dialogTargetWant = dialogCallerInfo->targetWant;
472 auto flag = dialogTargetWant.GetFlags();
473 if ((flag & (Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION)) == 0) {
474 TAG_LOGI(AAFwkTag::ABILITYMGR, "not grant flag");
475 return false;
476 }
477 if (!isSCBCall && (dialogCallerInfo->callerToken != callerToken)) {
478 TAG_LOGI(AAFwkTag::ABILITYMGR, "not scb call or callerToken invalid");
479 return false;
480 }
481 // only reserve grant uri flag
482 abilityRequest.want.SetFlags(dialogTargetWant.GetFlags());
483 abilityRequest.want.SetUri(dialogTargetWant.GetUri());
484 auto uriVec = dialogTargetWant.GetStringArrayParam(AbilityConfig::PARAMS_STREAM);
485 abilityRequest.want.SetParam(AbilityConfig::PARAMS_STREAM, uriVec);
486 if (!isSCBCall) {
487 TAG_LOGI(AAFwkTag::ABILITYMGR, "not scb call");
488 return true;
489 }
490 auto abilityRecord = Token::GetAbilityRecordByToken(dialogCallerInfo->callerToken);
491 if (abilityRecord) {
492 TAG_LOGI(AAFwkTag::ABILITYMGR, "set specifyTokenId");
493 abilityRequest.specifyTokenId = abilityRecord->GetApplicationInfo().accessTokenId;
494 return true;
495 }
496 return false;
497 }
498 } // namespace AAFwk
499 } // namespace OHOS
500