1 /*
2  * Copyright (c) 2023 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 "form_render_mgr.h"
17 
18 #include <mutex>
19 
20 #include "fms_log_wrapper.h"
21 #include "form_ams_helper.h"
22 #include "form_bms_helper.h"
23 #include "form_cache_mgr.h"
24 #include "form_constants.h"
25 #include "form_data_mgr.h"
26 #include "form_event_report.h"
27 #include "form_host_interface.h"
28 #include "form_mgr_errors.h"
29 #include "form_sandbox_render_mgr_inner.h"
30 #include "form_supply_callback.h"
31 #include "form_task_mgr.h"
32 #include "form_trust_mgr.h"
33 #include "form_util.h"
34 #include "ipc_skeleton.h"
35 #include "os_account_manager.h"
36 #include "want.h"
37 
38 namespace OHOS {
39 namespace AppExecFwk {
40 namespace {
41     constexpr size_t LAST_CONNECTION = 1;
42 }
43 using Want = OHOS::AAFwk::Want;
FormRenderMgr()44 FormRenderMgr::FormRenderMgr()
45 {
46 }
~FormRenderMgr()47 FormRenderMgr::~FormRenderMgr()
48 {
49 }
50 
GetFormRenderState()51 void FormRenderMgr::GetFormRenderState()
52 {
53     // Check whether the account is authenticated.
54     bool isVerified = false;
55     AccountSA::OsAccountManager::IsOsAccountVerified(FormUtil::GetCurrentAccountId(), isVerified);
56     HILOG_INFO("isVerified:%{public}d, isVerified_:%{public}d, screen:%{public}d",
57         isVerified, isVerified_, isScreenUnlocked_);
58 
59     std::lock_guard<std::mutex> lock(isVerifiedMutex_);
60     if (isVerified_ == isVerified) {
61         return;
62     }
63 
64     isVerified_ = isVerified;
65     if (!isVerified) {
66         return;
67     }
68     if (!isScreenUnlocked_) {
69         PostOnUnlockTask();
70     }
71     ExecAcquireProviderTask();
72 }
73 
GetIsVerified() const74 bool FormRenderMgr::GetIsVerified() const
75 {
76     HILOG_DEBUG("GetIsVerified");
77     std::lock_guard<std::mutex> lock(isVerifiedMutex_);
78     return isVerified_;
79 }
80 
RenderForm(const FormRecord & formRecord,const WantParams & wantParams,const sptr<IRemoteObject> & hostToken)81 ErrCode FormRenderMgr::RenderForm(
82     const FormRecord &formRecord, const WantParams &wantParams, const sptr<IRemoteObject> &hostToken)
83 {
84     HILOG_INFO("formId:%{public}" PRId64 ", formUserId:%{public}d", formRecord.formId, formRecord.userId);
85     GetFormRenderState();
86     HILOG_INFO("the current user authentication status:%{public}d,%{public}d", isVerified_, isScreenUnlocked_);
87     if (formRecord.uiSyntax != FormType::ETS) {
88         return ERR_OK;
89     }
90     if (formRecord.formId <= 0) {
91         HILOG_ERROR("formId not greater than 0");
92         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
93     }
94 
95     Want want;
96     want.SetParams(wantParams);
97     std::string recordUid = std::to_string(formRecord.providerUserId) + formRecord.bundleName;
98     want.SetParam(Constants::FORM_SUPPLY_UID, recordUid);
99     {
100         std::lock_guard<std::mutex> lock(isVerifiedMutex_);
101         want.SetParam(Constants::FORM_RENDER_STATE, isVerified_ || isScreenUnlocked_);
102     }
103     if (formRecord.privacyLevel > 0) {
104         InitRenderInner(true, formRecord.userId);
105         return sandboxInners_[formRecord.userId]->RenderForm(formRecord, want, hostToken);
106     } else {
107         InitRenderInner(false, formRecord.userId);
108         return renderInners_[formRecord.userId]->RenderForm(formRecord, want, hostToken);
109     }
110 }
111 
UpdateRenderingForm(int64_t formId,const FormProviderData & formProviderData,const WantParams & wantParams,bool mergeData)112 ErrCode FormRenderMgr::UpdateRenderingForm(int64_t formId, const FormProviderData &formProviderData,
113     const WantParams &wantParams, bool mergeData)
114 {
115     HILOG_INFO("update formId:%{public}" PRId64 ",%{public}zu", formId, formProviderData.GetDataString().length());
116 
117     FormRecord formRecord;
118     bool isGetFormRecord = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
119     if (!isGetFormRecord) {
120         HILOG_ERROR("get FormRecord fail, not exist such form, formId:%{public}" PRId64 "", formId);
121         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
122     }
123     int32_t formUserId = formRecord.userId;
124     HILOG_INFO("update formUserId:%{public}d", formUserId);
125     if (formRecord.privacyLevel > 0) {
126         auto iter = sandboxInners_.find(formUserId);
127         if (iter == sandboxInners_.end()) {
128             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
129         }
130         return iter->second->UpdateRenderingForm(formRecord, formProviderData, wantParams, mergeData);
131     } else {
132         auto iter = renderInners_.find(formUserId);
133         if (iter == renderInners_.end()) {
134             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
135         }
136         return iter->second->UpdateRenderingForm(formRecord, formProviderData, wantParams, mergeData);
137     }
138 }
139 
ReloadForm(const std::vector<FormRecord> && formRecords,const std::string & bundleName,int32_t userId)140 ErrCode FormRenderMgr::ReloadForm(
141     const std::vector<FormRecord> &&formRecords, const std::string &bundleName, int32_t userId)
142 {
143     HILOG_INFO("userId:%{public}d", userId);
144     std::vector<FormRecord> sandboxRecords;
145     std::vector<FormRecord> normalRecords;
146     for (const auto &record : formRecords) {
147         if (record.privacyLevel > 0) {
148             sandboxRecords.emplace_back(record);
149         } else {
150             normalRecords.emplace_back(record);
151         }
152     }
153     auto renderIter = renderInners_.find(userId);
154     if (!normalRecords.empty() && renderIter != renderInners_.end()) {
155         renderIter->second->ReloadForm(std::move(normalRecords), bundleName, userId);
156     }
157     auto sandboxIter = sandboxInners_.find(userId);
158     if (!sandboxRecords.empty() && sandboxIter != sandboxInners_.end()) {
159         sandboxIter->second->ReloadForm(std::move(sandboxRecords), bundleName, userId);
160     }
161     return ERR_OK;
162 }
163 
PostOnUnlockTask()164 void FormRenderMgr::PostOnUnlockTask()
165 {
166     int32_t userId = FormUtil::GetCurrentAccountId();
167     auto renderIter = renderInners_.find(userId);
168     if (renderIter != renderInners_.end()) {
169         renderIter->second->PostOnUnlockTask();
170     }
171     auto sandboxIter = sandboxInners_.find(userId);
172     if (sandboxIter != sandboxInners_.end()) {
173         sandboxIter->second->PostOnUnlockTask();
174     }
175 }
176 
AddAcquireProviderFormInfoTask(std::function<void ()> task)177 void FormRenderMgr::AddAcquireProviderFormInfoTask(std::function<void()> task)
178 {
179     HILOG_DEBUG("call");
180     std::lock_guard<std::mutex> lock(taskQueueMutex_);
181     taskQueue_.push(task);
182 }
183 
ExecAcquireProviderTask()184 void FormRenderMgr::ExecAcquireProviderTask()
185 {
186     HILOG_INFO("start");
187     // start to execute asynchronous tasks in the queue
188     std::lock_guard<std::mutex> lock(taskQueueMutex_);
189     while (!taskQueue_.empty()) {
190         auto task = taskQueue_.front();
191         task();
192         taskQueue_.pop();
193     }
194 }
195 
AddAcquireProviderForbiddenTask(const std::string & bundleName,int64_t formId,std::function<void ()> task)196 void FormRenderMgr::AddAcquireProviderForbiddenTask(const std::string &bundleName,
197     int64_t formId, std::function<void()> task)
198 {
199     std::lock_guard<std::mutex> lock(forbiddenTaskMapMutex_);
200 
201     auto search = forbiddenTaskMap_.find(bundleName);
202     if (search == forbiddenTaskMap_.end()) {
203         std::unordered_map<int64_t, std::function<void()>> taskQueue;
204         taskQueue.emplace(formId, task);
205         forbiddenTaskMap_.emplace(bundleName, taskQueue);
206     } else {
207         search->second[formId] = task;
208     }
209     HILOG_INFO("add ftask success, formId:%{public}" PRId64, formId);
210 }
211 
ExecAcquireProviderForbiddenTask(const std::string & bundleName)212 void FormRenderMgr::ExecAcquireProviderForbiddenTask(const std::string &bundleName)
213 {
214     HILOG_INFO("start");
215     // start to execute asynchronous tasks in the map
216     std::unordered_map<int64_t, std::function<void()>> taskQueue;
217     {
218         std::lock_guard<std::mutex> lock(forbiddenTaskMapMutex_);
219         auto search = forbiddenTaskMap_.find(bundleName);
220         if (search == forbiddenTaskMap_.end()) {
221             return;
222         }
223         taskQueue = search->second;
224         forbiddenTaskMap_.erase(search);
225     }
226     auto iter = taskQueue.begin();
227     while (iter != taskQueue.end()) {
228         auto task = iter->second;
229         task();
230         HILOG_INFO("exec ftask success, formId:%{public}" PRId64, iter->first);
231         iter = taskQueue.erase(iter);
232     }
233 }
234 
DeleteAcquireForbiddenTasksByBundleName(const std::string & bundleName)235 void FormRenderMgr::DeleteAcquireForbiddenTasksByBundleName(const std::string &bundleName)
236 {
237     std::lock_guard<std::mutex> lock(forbiddenTaskMapMutex_);
238     auto search = forbiddenTaskMap_.find(bundleName);
239     if (search != forbiddenTaskMap_.end()) {
240         forbiddenTaskMap_.erase(search);
241         HILOG_INFO("delete ftasks success, bundlename:%{public}s", bundleName.c_str());
242     }
243 }
244 
DeleteAcquireForbiddenTaskByFormId(int64_t formId)245 void FormRenderMgr::DeleteAcquireForbiddenTaskByFormId(int64_t formId)
246 {
247     std::lock_guard<std::mutex> lock(forbiddenTaskMapMutex_);
248 
249     for (auto iter = forbiddenTaskMap_.begin(); iter != forbiddenTaskMap_.end(); ++iter) {
250         auto search = iter->second.find(formId);
251         if (search != iter->second.end()) {
252             iter->second.erase(search);
253             if (iter->second.empty()) {
254                 forbiddenTaskMap_.erase(iter);
255             }
256             HILOG_INFO("delete ftask success, formId:%{public}" PRId64, formId);
257             break;
258         }
259     }
260 }
261 
NotifyScreenOn()262 void FormRenderMgr::NotifyScreenOn()
263 {
264     int32_t userId = FormUtil::GetCurrentAccountId();
265     auto renderIter = renderInners_.find(userId);
266     if (renderIter != renderInners_.end()) {
267         renderIter->second->NotifyScreenOn();
268     }
269     auto sandboxIter = sandboxInners_.find(userId);
270     if (sandboxIter != sandboxInners_.end()) {
271         sandboxIter->second->NotifyScreenOn();
272     }
273 }
274 
OnScreenUnlock()275 void FormRenderMgr::OnScreenUnlock()
276 {
277     HILOG_INFO("call. %{public}d,%{public}d", isVerified_, isScreenUnlocked_);
278     if (isScreenUnlocked_) {
279         return;
280     }
281 
282     // el2 path maybe not unlocked, should not acquire data
283     std::lock_guard<std::mutex> lock(isVerifiedMutex_);
284     isScreenUnlocked_ = true;
285     if (!isVerified_) {
286         PostOnUnlockTask();
287     }
288 }
289 
OnUnlock()290 void FormRenderMgr::OnUnlock()
291 {
292     HILOG_INFO("call. %{public}d,%{public}d", isVerified_, isScreenUnlocked_);
293     if (isVerified_) {
294         return;
295     }
296 
297     {
298         std::lock_guard<std::mutex> lock(isVerifiedMutex_);
299         isVerified_ = true;
300         if (!isScreenUnlocked_) {
301             PostOnUnlockTask();
302         }
303     }
304     ExecAcquireProviderTask();
305 }
306 
SetVisibleChange(int64_t formId,bool isVisible)307 void FormRenderMgr::SetVisibleChange(int64_t formId, bool isVisible)
308 {
309     HILOG_INFO("call.");
310     int32_t userId = FormUtil::GetCurrentAccountId();
311     auto renderIter = renderInners_.find(userId);
312     if (renderIter != renderInners_.end()) {
313         renderIter->second->PostSetVisibleChangeTask(formId, isVisible);
314     }
315     auto sandboxIter = sandboxInners_.find(userId);
316     if (sandboxIter != sandboxInners_.end()) {
317         sandboxIter->second->PostSetVisibleChangeTask(formId, isVisible);
318     }
319 }
320 
StopRenderingForm(int64_t formId,const FormRecord & formRecord,const std::string & compId,const sptr<IRemoteObject> & hostToken)321 ErrCode FormRenderMgr::StopRenderingForm(
322     int64_t formId, const FormRecord &formRecord, const std::string &compId, const sptr<IRemoteObject> &hostToken)
323 {
324     HILOG_INFO("formUserId:%{public}d", formRecord.userId);
325     if (formRecord.privacyLevel > 0) {
326         auto iter = sandboxInners_.find(formRecord.userId);
327         if (iter == sandboxInners_.end()) {
328             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
329         }
330         return iter->second->StopRenderingForm(formId, formRecord, compId, hostToken);
331     } else {
332         auto iter = renderInners_.find(formRecord.userId);
333         if (iter == renderInners_.end()) {
334             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
335         }
336         return iter->second->StopRenderingForm(formId, formRecord, compId, hostToken);
337     }
338 }
339 
RenderFormCallback(int64_t formId,const Want & want)340 ErrCode FormRenderMgr::RenderFormCallback(int64_t formId, const Want &want)
341 {
342     HILOG_DEBUG("call");
343     return ERR_OK;
344 }
345 
StopRenderingFormCallback(int64_t formId,const Want & want)346 ErrCode FormRenderMgr::StopRenderingFormCallback(int64_t formId, const Want &want)
347 {
348     int32_t callingUserId = IPCSkeleton::GetCallingUid() / Constants::CALLING_UID_TRANSFORM_DIVISOR;
349     HILOG_INFO("formId:%{public}" PRId64 ", callingUserId:%{public}d", formId, callingUserId);
350     auto renderIter = renderInners_.find(callingUserId);
351     if (renderIter != renderInners_.end()) {
352         renderIter->second->StopRenderingFormCallback(formId, want);
353     }
354     auto sandboxIter = sandboxInners_.find(callingUserId);
355     if (sandboxIter != sandboxInners_.end()) {
356         sandboxIter->second->StopRenderingFormCallback(formId, want);
357     }
358     return ERR_OK;
359 }
360 
ReleaseRenderer(int64_t formId,const FormRecord & formRecord,const std::string & compId)361 ErrCode FormRenderMgr::ReleaseRenderer(int64_t formId, const FormRecord &formRecord, const std::string &compId)
362 {
363     HILOG_INFO("formId:%{public}" PRId64 ", formUserId:%{public}d", formId, formRecord.userId);
364     if (formRecord.privacyLevel > 0) {
365         auto iter = sandboxInners_.find(formRecord.userId);
366         if (iter == sandboxInners_.end()) {
367             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
368         }
369         return iter->second->ReleaseRenderer(formId, formRecord, compId);
370     } else {
371         auto iter = renderInners_.find(formRecord.userId);
372         if (iter == renderInners_.end()) {
373             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
374         }
375         return iter->second->ReleaseRenderer(formId, formRecord, compId);
376     }
377 }
378 
AddConnection(int64_t formId,sptr<FormRenderConnection> connection,const FormRecord & formRecord)379 ErrCode FormRenderMgr::AddConnection(
380     int64_t formId, sptr<FormRenderConnection> connection, const FormRecord &formRecord)
381 {
382     HILOG_INFO("formUserId: %{public}d", formRecord.userId);
383     if (formRecord.privacyLevel > 0) {
384         auto iter = sandboxInners_.find(formRecord.userId);
385         if (iter == sandboxInners_.end()) {
386             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
387         }
388         return iter->second->AddConnection(formId, connection);
389     } else {
390         auto iter = renderInners_.find(formRecord.userId);
391         if (iter == renderInners_.end()) {
392             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
393         }
394         return iter->second->AddConnection(formId, connection);
395     }
396 }
397 
RemoveConnection(int64_t formId,const FormRecord & formRecord)398 void FormRenderMgr::RemoveConnection(int64_t formId, const FormRecord &formRecord)
399 {
400     HILOG_INFO("formId:%{public}" PRId64 ", formUserId:%{public}d", formId, formRecord.userId);
401     if (formRecord.privacyLevel > 0) {
402         auto iter = sandboxInners_.find(formRecord.userId);
403         if (iter != sandboxInners_.end()) {
404             iter->second->RemoveConnection(formId);
405         }
406     } else {
407         auto iter = renderInners_.find(formRecord.userId);
408         if (iter != renderInners_.end()) {
409             iter->second->RemoveConnection(formId);
410         }
411     }
412 }
413 
checkConnectionsFormIds(std::vector<int64_t> formIds,int32_t userId,std::vector<int64_t> & needconFormIds)414 ErrCode FormRenderMgr::checkConnectionsFormIds(std::vector<int64_t> formIds, int32_t userId,
415     std::vector<int64_t> &needconFormIds)
416 {
417     auto iter = renderInners_.find(userId);
418     if (iter == renderInners_.end()) {
419         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
420     }
421     return iter->second->checkConnectionsFormIds(formIds, needconFormIds);
422 }
423 
reAddConnections(std::vector<int64_t> formIds,int32_t userId,const sptr<IRemoteObject> & remoteObject)424 void FormRenderMgr::reAddConnections(std::vector<int64_t> formIds,
425     int32_t userId, const sptr<IRemoteObject> &remoteObject)
426 {
427     HILOG_ERROR("reAddConnections - Connect formIds, ");
428 
429     sptr<IFormHost> hostClient = iface_cast<IFormHost>(remoteObject);
430     if (hostClient == nullptr) {
431         HILOG_ERROR("null hostClient");
432         return;
433     }
434     hostClient->OnError(ERR_APPEXECFWK_FORM_RENDER_SERVICE_DIED, "FormRenderService is dead.", formIds);
435 }
436 
CleanFormHost(const sptr<IRemoteObject> & host,const int hostCallingUid)437 void FormRenderMgr::CleanFormHost(const sptr<IRemoteObject> &host, const int hostCallingUid)
438 {
439     int32_t hostUserId = hostCallingUid / Constants::CALLING_UID_TRANSFORM_DIVISOR;
440     if (hostUserId == 0) {
441         HILOG_WARN("hostUserId is 0, get current active userId ");
442         hostUserId = FormUtil::GetCurrentAccountId();
443     }
444     HILOG_INFO("hostUserId:%{public}d", hostUserId);
445     auto renderIter = renderInners_.find(hostUserId);
446     if (renderIter != renderInners_.end()) {
447         renderIter->second->CleanFormHost(host);
448     }
449     auto sandboxIter = sandboxInners_.find(hostUserId);
450     if (sandboxIter != sandboxInners_.end()) {
451         sandboxIter->second->CleanFormHost(host);
452     }
453 }
454 
AddRenderDeathRecipient(const sptr<IRemoteObject> & remoteObject,const FormRecord & formRecord)455 void FormRenderMgr::AddRenderDeathRecipient(const sptr<IRemoteObject> &remoteObject, const FormRecord &formRecord)
456 {
457     HILOG_INFO("formUserId:%{public}d", formRecord.userId);
458     if (formRecord.privacyLevel > 0) {
459         auto iter = sandboxInners_.find(formRecord.userId);
460         if (iter != sandboxInners_.end()) {
461             iter->second->AddRenderDeathRecipient(remoteObject);
462         }
463     } else {
464         auto iter = renderInners_.find(formRecord.userId);
465         if (iter != renderInners_.end()) {
466             iter->second->AddRenderDeathRecipient(remoteObject);
467         }
468     }
469 }
470 
OnRenderingBlock(const std::string & bundleName)471 void FormRenderMgr::OnRenderingBlock(const std::string &bundleName)
472 {
473     HILOG_INFO("bundleName:%{public}s", bundleName.c_str());
474     FormEventInfo eventInfo;
475     eventInfo.bundleName = bundleName;
476     FormEventReport::SendSecondFormEvent(
477         FormEventName::FORM_RENDER_BLOCK, HiSysEventType::FAULT, eventInfo);
478 
479     FormTrustMgr::GetInstance().MarkTrustFlag(bundleName, false);
480 
481     Want want;
482     want.SetElementName(Constants::FRS_BUNDLE_NAME, "ServiceExtension");
483     want.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
484     FormAmsHelper::GetInstance().StopExtensionAbility(want);
485 }
486 
IsNeedRender(int64_t formId)487 bool FormRenderMgr::IsNeedRender(int64_t formId)
488 {
489     FormRecord formRecord;
490     bool isGetFormRecord = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
491     if (!isGetFormRecord) {
492         HILOG_ERROR("not exist such form, formId:%{public}" PRId64 "", formId);
493         return false;
494     }
495     if (formRecord.uiSyntax != FormType::ETS) {
496         HILOG_DEBUG("no need render, formId:%{public}" PRId64 "", formId);
497         return false;
498     }
499     return true;
500 }
501 
HandleConnectFailed(int64_t formId,int32_t errorCode) const502 void FormRenderMgr::HandleConnectFailed(int64_t formId, int32_t errorCode) const
503 {
504     HILOG_ERROR("Connect render service failed, formId:%{public}" PRId64 ", errorCode:%{public}d",
505         formId, errorCode);
506     std::vector<sptr<IRemoteObject>> formHostObjs;
507     FormDataMgr::GetInstance().GetFormHostRemoteObj(formId, formHostObjs);
508     for (const auto &host : formHostObjs) {
509         auto hostClient = iface_cast<IFormHost>(host);
510         if (hostClient == nullptr) {
511             HILOG_ERROR("null hostClient");
512             continue;
513         }
514         hostClient->OnError(errorCode, "Connect FormRenderService failed");
515     }
516 }
517 
IsRerenderForRenderServiceDied(int64_t formId)518 bool FormRenderMgr::IsRerenderForRenderServiceDied(int64_t formId)
519 {
520     int32_t rerenderCount = 0;
521     int32_t reSandboxRenderCount = 0;
522     FormRecord formRecord;
523     bool isGetFormRecord = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
524     if (!isGetFormRecord) {
525         HILOG_ERROR("get FormRecord fail, not exist such form, formId:%{public}" PRId64 "", formId);
526         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
527     }
528     HILOG_INFO("formId:%{public}" PRId64 ", formUserId:%{public}d", formId, formRecord.userId);
529     auto renderIter = renderInners_.find(formRecord.userId);
530     if (renderIter != renderInners_.end()) {
531         rerenderCount = renderIter->second->GetReRenderCount();
532     }
533     auto sandboxIter = sandboxInners_.find(formRecord.userId);
534     if (sandboxIter != sandboxInners_.end()) {
535         reSandboxRenderCount = sandboxIter->second->GetReRenderCount();
536     }
537     bool ret = IsNeedRender(formId) && (rerenderCount > 0 || reSandboxRenderCount > 0);
538     HILOG_DEBUG("Is need to rerender:%{public}d", ret);
539     return ret;
540 }
541 
InitRenderInner(bool isSandbox,int32_t userId)542 void FormRenderMgr::InitRenderInner(bool isSandbox, int32_t userId)
543 {
544     HILOG_INFO("isSandbox: %{public}d userId: %{public}d.", isSandbox, userId);
545     std::lock_guard<std::mutex> lock(renderInnerMutex_);
546     if (isSandbox) {
547         auto iter = sandboxInners_.find(userId);
548         if (iter == sandboxInners_.end()) {
549             auto formSandboxRenderMgr = std::make_shared<FormSandboxRenderMgrInner>();
550             formSandboxRenderMgr->SetUserId(userId);
551             sandboxInners_.emplace(userId, formSandboxRenderMgr);
552         }
553     } else {
554         auto iter = renderInners_.find(userId);
555         if (iter == renderInners_.end()) {
556             auto formRenderMgr = std::make_shared<FormRenderMgrInner>();
557             formRenderMgr->SetUserId(userId);
558             renderInners_.emplace(userId, formRenderMgr);
559         }
560     }
561 }
562 
RecycleForms(const std::vector<int64_t> & formIds,const Want & want,const sptr<IRemoteObject> & remoteObjectOfHost)563 ErrCode FormRenderMgr::RecycleForms(
564     const std::vector<int64_t> &formIds, const Want &want, const sptr<IRemoteObject> &remoteObjectOfHost)
565 {
566     int callingUserId = want.GetIntParam(Constants::RECYCLE_FORMS_USER_ID, 0);
567     if (callingUserId == 0) {
568         callingUserId = IPCSkeleton::GetCallingUid() / Constants::CALLING_UID_TRANSFORM_DIVISOR;
569         HILOG_INFO("callingUserId is 0, update callingUserId:%{public}d", callingUserId);
570     }
571     auto renderIter = renderInners_.find(callingUserId);
572     if (renderIter != renderInners_.end()) {
573         return renderIter->second->RecycleForms(formIds, want, remoteObjectOfHost);
574     }
575     auto sandboxIter = sandboxInners_.find(callingUserId);
576     if (sandboxIter != sandboxInners_.end()) {
577         return sandboxIter->second->RecycleForms(formIds, want, remoteObjectOfHost);
578     }
579     return ERR_APPEXECFWK_FORM_RENDER_SERVICE_DIED;
580 }
581 
RecoverForms(const std::vector<int64_t> & formIds,const WantParams & wantParams)582 ErrCode FormRenderMgr::RecoverForms(const std::vector<int64_t> &formIds, const WantParams &wantParams)
583 {
584     int32_t callingUserId = IPCSkeleton::GetCallingUid() / Constants::CALLING_UID_TRANSFORM_DIVISOR;
585     auto renderIter = renderInners_.find(callingUserId);
586     if (renderIter != renderInners_.end()) {
587         return renderIter->second->RecoverForms(formIds, wantParams);
588     }
589     auto sandboxIter = sandboxInners_.find(callingUserId);
590     if (sandboxIter != sandboxInners_.end()) {
591         return sandboxIter->second->RecoverForms(formIds, wantParams);
592     }
593     return ERR_APPEXECFWK_FORM_RENDER_SERVICE_DIED;
594 }
595 
DisconnectAllRenderConnections(int userId)596 void FormRenderMgr::DisconnectAllRenderConnections(int userId)
597 {
598     HILOG_INFO("userId: %{public}d", userId);
599     auto renderIter = renderInners_.find(userId);
600     if (renderIter != renderInners_.end()) {
601         renderIter->second->DisconnectAllRenderConnections();
602     }
603     auto sandboxIter = sandboxInners_.find(userId);
604     if (sandboxIter != sandboxInners_.end()) {
605         sandboxIter->second->DisconnectAllRenderConnections();
606     }
607 }
608 
RerenderAllFormsImmediate(int userId)609 void FormRenderMgr::RerenderAllFormsImmediate(int userId)
610 {
611     HILOG_INFO("userId: %{public}d", userId);
612     auto renderIter = renderInners_.find(userId);
613     if (renderIter != renderInners_.end()) {
614         renderIter->second->RerenderAllFormsImmediate();
615     }
616     auto sandboxIter = sandboxInners_.find(userId);
617     if (sandboxIter != sandboxInners_.end()) {
618         sandboxIter->second->RerenderAllFormsImmediate();
619     }
620 }
621 
UpdateFormSize(const int64_t & formId,float width,float height,float borderWidth)622 void FormRenderMgr::UpdateFormSize(const int64_t &formId, float width, float height, float borderWidth)
623 {
624     int32_t callingUserId = IPCSkeleton::GetCallingUid() / Constants::CALLING_UID_TRANSFORM_DIVISOR;
625     auto renderIter = renderInners_.find(callingUserId);
626     if (renderIter != renderInners_.end()) {
627         renderIter->second->UpdateFormSize(formId, width, height, borderWidth);
628     }
629     auto sandboxIter = sandboxInners_.find(callingUserId);
630     if (sandboxIter != sandboxInners_.end()) {
631         sandboxIter->second->UpdateFormSize(formId, width, height, borderWidth);
632     }
633 }
634 } // namespace AppExecFwk
635 } // namespace OHOS
636