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