• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &parameters, 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