• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
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,bool isSelector)187 void DialogSessionManager::GenerateDialogCallerInfo(AbilityRequest &abilityRequest, int32_t userId,
188     std::shared_ptr<DialogCallerInfo> dialogCallerInfo, bool isSelector)
189 {
190     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
191     CHECK_POINTER(dialogCallerInfo);
192     dialogCallerInfo->isSelector = isSelector;
193     dialogCallerInfo->callerToken = abilityRequest.callerToken;
194     dialogCallerInfo->requestCode = abilityRequest.requestCode;
195     dialogCallerInfo->targetWant = abilityRequest.want;
196     dialogCallerInfo->userId = userId;
197 }
198 
SendDialogResult(const Want & want,const std::string & dialogSessionId,bool isAllowed)199 int DialogSessionManager::SendDialogResult(const Want &want, const std::string &dialogSessionId, bool isAllowed)
200 {
201     if (!isAllowed) {
202         TAG_LOGI(AAFwkTag::ABILITYMGR, "user refuse to jump");
203         ClearDialogContext(dialogSessionId);
204         return ERR_OK;
205     }
206     std::shared_ptr<StartupSessionInfo> startupSessionInfo = GetStartupSessionInfo(dialogSessionId);
207     if (startupSessionInfo != nullptr) {
208         return NotifySCBToRecoveryAfterInterception(dialogSessionId, startupSessionInfo->abilityRequest);
209     }
210     std::shared_ptr<DialogCallerInfo> dialogCallerInfo = GetDialogCallerInfo(dialogSessionId);
211     if (dialogCallerInfo == nullptr) {
212         TAG_LOGE(AAFwkTag::ABILITYMGR, "dialog caller info is nullptr");
213         ClearDialogContext(dialogSessionId);
214         return ERR_INVALID_VALUE;
215     }
216     auto targetWant = dialogCallerInfo->targetWant;
217     targetWant.SetElement(want.GetElement());
218     targetWant.SetParam("isSelector", dialogCallerInfo->isSelector);
219     targetWant.SetParam(DIALOG_SESSION_ID, dialogSessionId);
220     if (want.HasParameter(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY)) {
221         int32_t appIndex = want.GetIntParam(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, 0);
222         targetWant.SetParam(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, appIndex);
223     }
224     if (!targetWant.HasParameter(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY)) {
225         targetWant.SetParam(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, 0);
226     }
227     sptr<IRemoteObject> callerToken = dialogCallerInfo->callerToken;
228     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
229     if (!abilityMgr) {
230         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityMgr is nullptr.");
231         return INNER_ERR;
232     }
233     int ret = abilityMgr->StartAbilityAsCaller(targetWant, callerToken, callerToken, dialogCallerInfo->userId,
234         dialogCallerInfo->requestCode);
235     if (ret == ERR_OK) {
236         ClearDialogContext(dialogSessionId);
237         abilityMgr->RemoveSelectorIdentity(dialogCallerInfo->targetWant.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN, 0));
238     }
239     return ret;
240 }
241 
NotifySCBToRecoveryAfterInterception(const std::string & dialogSessionId,const AbilityRequest & abilityRequest)242 int32_t DialogSessionManager::NotifySCBToRecoveryAfterInterception(const std::string &dialogSessionId,
243     const AbilityRequest &abilityRequest)
244 {
245     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
246     if (!abilityMgr) {
247         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityMgr is nullptr.");
248         return INNER_ERR;
249     }
250     int ret = IN_PROCESS_CALL(abilityMgr->NotifySCBToRecoveryAfterInterception(abilityRequest));
251     if (ret == ERR_OK) {
252         ClearDialogContext(dialogSessionId);
253     }
254     return ret;
255 }
256 
GenerateDialogSessionRecordCommon(AbilityRequest & abilityRequest,int32_t userId,const AAFwk::WantParams & parameters,std::vector<DialogAppInfo> & dialogAppInfos,bool isSelector)257 std::string DialogSessionManager::GenerateDialogSessionRecordCommon(AbilityRequest &abilityRequest, int32_t userId,
258     const AAFwk::WantParams &parameters, std::vector<DialogAppInfo> &dialogAppInfos, bool isSelector)
259 {
260     auto dialogSessionInfo = sptr<DialogSessionInfo>::MakeSptr();
261     CHECK_POINTER_AND_RETURN(dialogSessionInfo, "");
262 
263     GenerateCallerAbilityInfo(abilityRequest, dialogSessionInfo->callerAbilityInfo);
264 
265     if (isSelector) {
266         GenerateSelectorTargetAbilityInfos(dialogAppInfos, dialogSessionInfo->targetAbilityInfos);
267     } else {
268         GenerateJumpTargetAbilityInfos(abilityRequest, dialogSessionInfo->targetAbilityInfos);
269     }
270 
271     dialogSessionInfo->parameters = parameters;
272 
273     std::shared_ptr<DialogCallerInfo> dialogCallerInfo = std::make_shared<DialogCallerInfo>();
274     GenerateDialogCallerInfo(abilityRequest, userId, dialogCallerInfo, isSelector);
275 
276     std::string dialogSessionId = GenerateDialogSessionId();
277     SetDialogSessionInfo(dialogSessionId, dialogSessionInfo, dialogCallerInfo);
278 
279     return dialogSessionId;
280 }
281 
CreateJumpModalDialog(AbilityRequest & abilityRequest,int32_t userId,const Want & replaceWant)282 int DialogSessionManager::CreateJumpModalDialog(AbilityRequest &abilityRequest, int32_t userId,
283     const Want &replaceWant)
284 {
285     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
286 
287     AAFwk::WantParams parameters;
288 
289     parameters.SetParam("deviceType", AAFwk::String::Box(OHOS::system::GetDeviceType()));
290     parameters.SetParam("userId", AAFwk::Integer::Box(userId));
291 
292     std::vector<DialogAppInfo> dialogAppInfos;
293     std::string dialogSessionId = GenerateDialogSessionRecordCommon(abilityRequest, userId, parameters,
294         dialogAppInfos, false);
295     if (dialogSessionId == "") {
296         TAG_LOGE(AAFwkTag::ABILITYMGR, "generate dialog session record failed");
297         return ERR_INVALID_VALUE;
298     }
299 
300     return CreateModalDialogCommon(replaceWant, abilityRequest.callerToken, dialogSessionId);
301 }
302 
CreateImplicitSelectorModalDialog(AbilityRequest & abilityRequest,const Want & want,int32_t userId,std::vector<DialogAppInfo> & dialogAppInfos)303 int DialogSessionManager::CreateImplicitSelectorModalDialog(AbilityRequest &abilityRequest, const Want &want,
304     int32_t userId, std::vector<DialogAppInfo> &dialogAppInfos)
305 {
306     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
307 
308     AAFwk::Want sessionWant;
309 
310     sessionWant.SetParam("deviceType", OHOS::system::GetDeviceType());
311     sessionWant.SetParam("userId", userId);
312     sessionWant.SetParam("action", abilityRequest.want.GetAction());
313     sessionWant.SetParam("wantType", abilityRequest.want.GetType());
314     sessionWant.SetParam("uri", abilityRequest.want.GetUriString());
315     sessionWant.SetParam("entities", abilityRequest.want.GetEntities());
316     sessionWant.SetParam("appselector.selectorType", static_cast<int>(SelectorType::IMPLICIT_START_SELECTOR));
317     bool showCaller = abilityRequest.want.GetBoolParam("showCaller", false);
318     sessionWant.SetParam("showCaller", showCaller);
319 
320     std::string dialogSessionId = GenerateDialogSessionRecordCommon(abilityRequest, userId, sessionWant.GetParams(),
321         dialogAppInfos, true);
322     if (dialogSessionId == "") {
323         TAG_LOGE(AAFwkTag::ABILITYMGR, "generate dialog session record failed");
324         return ERR_INVALID_VALUE;
325     }
326 
327     return CreateModalDialogCommon(want, abilityRequest.callerToken, dialogSessionId);
328 }
329 
CreateCloneSelectorModalDialog(AbilityRequest & abilityRequest,const Want & want,int32_t userId,std::vector<DialogAppInfo> & dialogAppInfos,const std::string & replaceWant)330 int DialogSessionManager::CreateCloneSelectorModalDialog(AbilityRequest &abilityRequest, const Want &want,
331     int32_t userId, std::vector<DialogAppInfo> &dialogAppInfos, const std::string &replaceWant)
332 {
333     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
334     AAFwk::WantParams parameters;
335 
336     parameters.SetParam("deviceType", AAFwk::String::Box(OHOS::system::GetDeviceType()));
337     parameters.SetParam("userId", AAFwk::Integer::Box(userId));
338     parameters.SetParam("appselector.selectorType",
339         AAFwk::Integer::Box(static_cast<int>(SelectorType::APP_CLONR_SELECTOR)));
340     if (replaceWant !=  "") {
341         parameters.SetParam("ecological.replaceWant", AAFwk::String::Box(replaceWant));
342     }
343 
344     std::string dialogSessionId = GenerateDialogSessionRecordCommon(abilityRequest, userId, parameters,
345         dialogAppInfos, true);
346     if (dialogSessionId == "") {
347         TAG_LOGE(AAFwkTag::ABILITYMGR, "generate dialog session record failed");
348         return ERR_INVALID_VALUE;
349     }
350 
351     return CreateModalDialogCommon(want, abilityRequest.callerToken, dialogSessionId);
352 }
353 
CreateModalDialogCommon(const Want & replaceWant,sptr<IRemoteObject> callerToken,const std::string & dialogSessionId)354 int DialogSessionManager::CreateModalDialogCommon(const Want &replaceWant, sptr<IRemoteObject> callerToken,
355     const std::string &dialogSessionId)
356 {
357     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
358     (const_cast<Want &>(replaceWant)).SetParam(DIALOG_SESSION_ID, dialogSessionId);
359     auto connection = std::make_shared<OHOS::Rosen::ModalSystemUiExtension>();
360     if (callerToken == nullptr) {
361         TAG_LOGD(AAFwkTag::ABILITYMGR, "create modal ui extension for system");
362         (const_cast<Want &>(replaceWant)).SetParam(UIEXTENSION_MODAL_TYPE, 1);
363         (const_cast<Want &>(replaceWant)).SetParam(SUPPORT_CLOSE_ON_BLUR, true);
364         return IN_PROCESS_CALL(connection->CreateModalUIExtension(replaceWant)) ? ERR_OK : INNER_ERR;
365     }
366     auto callerRecord = Token::GetAbilityRecordByToken(callerToken);
367     if (!callerRecord) {
368         TAG_LOGE(AAFwkTag::ABILITYMGR, "callerRecord is nullptr.");
369         return ERR_INVALID_VALUE;
370     }
371 
372     sptr<IRemoteObject> token;
373     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
374     if (!abilityMgr) {
375         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityMgr is nullptr.");
376         return INNER_ERR;
377     }
378     int ret = IN_PROCESS_CALL(abilityMgr->GetTopAbility(token));
379     if (ret != ERR_OK || token == nullptr) {
380         TAG_LOGD(AAFwkTag::ABILITYMGR, "create modal ui extension for system");
381         (const_cast<Want &>(replaceWant)).SetParam(UIEXTENSION_MODAL_TYPE, 1);
382         (const_cast<Want &>(replaceWant)).SetParam(SUPPORT_CLOSE_ON_BLUR, true);
383         return IN_PROCESS_CALL(connection->CreateModalUIExtension(replaceWant)) ? ERR_OK : INNER_ERR;
384     }
385 
386     if (callerRecord->GetAbilityInfo().type == AppExecFwk::AbilityType::PAGE && token == callerToken) {
387         TAG_LOGD(AAFwkTag::ABILITYMGR, "create modal ui extension for application");
388         return callerRecord->CreateModalUIExtension(replaceWant);
389     }
390     TAG_LOGD(AAFwkTag::ABILITYMGR, "create modal ui extension for system");
391     (const_cast<Want &>(replaceWant)).SetParam(UIEXTENSION_MODAL_TYPE, 1);
392     (const_cast<Want &>(replaceWant)).SetParam(SUPPORT_CLOSE_ON_BLUR, true);
393     return IN_PROCESS_CALL(connection->CreateModalUIExtension(replaceWant)) ? ERR_OK : INNER_ERR;
394 }
395 
HandleErmsResult(AbilityRequest & abilityRequest,int32_t userId,const Want & replaceWant)396 int DialogSessionManager::HandleErmsResult(AbilityRequest &abilityRequest, int32_t userId,
397     const Want &replaceWant)
398 {
399     std::string bundleName = abilityRequest.abilityInfo.bundleName;
400     if (StartAbilityUtils::ermsResultCode < ERMS_ISALLOW_RESULTCODE ||
401         !IsCreateCloneSelectorDialog(bundleName, userId)) {
402         TAG_LOGI(AAFwkTag::ABILITYMGR, "create jump modal dialog");
403         return CreateJumpModalDialog(abilityRequest, userId, replaceWant);
404     }
405     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
406     if (!abilityMgr) {
407         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityMgr is nullptr.");
408         return INNER_ERR;
409     }
410     (const_cast<Want &>(replaceWant)).RemoveParam("ecological_experience_original_target");
411     return abilityMgr->CreateCloneSelectorDialog(abilityRequest, userId, replaceWant.ToString());
412 }
413 
HandleErmsResultBySCB(AbilityRequest & abilityRequest,const Want & replaceWant)414 int32_t DialogSessionManager::HandleErmsResultBySCB(AbilityRequest &abilityRequest, const Want &replaceWant)
415 {
416     auto systemUIExtension = std::make_shared<OHOS::Rosen::ModalSystemUiExtension>();
417     (const_cast<Want &>(replaceWant)).SetParam(UIEXTENSION_MODAL_TYPE, 1);
418     (const_cast<Want &>(replaceWant)).SetParam(SUPPORT_CLOSE_ON_BLUR, true);
419     std::string dialogSessionId = GenerateDialogSessionId();
420     if (dialogSessionId == "") {
421         TAG_LOGE(AAFwkTag::ABILITYMGR, "generate dialog session record failed");
422         return ERR_INVALID_VALUE;
423     }
424     SetStartupSessionInfo(dialogSessionId, abilityRequest);
425     (const_cast<Want &>(replaceWant)).SetParam(DIALOG_SESSION_ID, dialogSessionId);
426     return IN_PROCESS_CALL(systemUIExtension->CreateModalUIExtension(replaceWant)) ?
427         ERR_ECOLOGICAL_CONTROL_STATUS : INNER_ERR;
428 }
429 
IsCreateCloneSelectorDialog(const std::string & bundleName,int32_t userId)430 bool DialogSessionManager::IsCreateCloneSelectorDialog(const std::string &bundleName, int32_t userId)
431 {
432     if (StartAbilityUtils::isWantWithAppCloneIndex) {
433         TAG_LOGI(AAFwkTag::ABILITYMGR, "want with app clone index.");
434         StartAbilityUtils::isWantWithAppCloneIndex = false;
435         return false;
436     }
437     auto appIndexes = StartAbilityUtils::GetCloneAppIndexes(bundleName, userId);
438     if (appIndexes.empty()) {
439         TAG_LOGI(AAFwkTag::ABILITYMGR, "The application do not create clone index.");
440         return false;
441     }
442     return true;
443 }
444 }  // namespace AAFwk
445 }  // namespace OHOS
446