• 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     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 
ExecAcquireProviderForbiddenTaskByFormId(const int64_t formId)235 void FormRenderMgr::ExecAcquireProviderForbiddenTaskByFormId(const int64_t formId)
236 {
237     HILOG_INFO("start, formId %{public}" PRId64, formId);
238     std::function<void()> task;
239     {
240         std::lock_guard<std::mutex> lock(forbiddenTaskMapMutex_);
241         for (auto iter = forbiddenTaskMap_.begin(); iter != forbiddenTaskMap_.end(); ++iter) {
242             auto search = iter->second.find(formId);
243             if (search != iter->second.end()) {
244                 task = search->second;
245                 iter->second.erase(search);
246                 if (iter->second.empty()) {
247                     forbiddenTaskMap_.erase(iter);
248                 }
249                 HILOG_INFO("add ftask success, formId:%{public}" PRId64, formId);
250                 break;
251             }
252         }
253     }
254     if (task) {
255         task();
256     }
257 }
258 
DeleteAcquireForbiddenTasksByBundleName(const std::string & bundleName)259 void FormRenderMgr::DeleteAcquireForbiddenTasksByBundleName(const std::string &bundleName)
260 {
261     std::lock_guard<std::mutex> lock(forbiddenTaskMapMutex_);
262     auto search = forbiddenTaskMap_.find(bundleName);
263     if (search != forbiddenTaskMap_.end()) {
264         forbiddenTaskMap_.erase(search);
265         HILOG_INFO("delete ftasks success, bundlename:%{public}s", bundleName.c_str());
266     }
267 }
268 
DeleteAcquireForbiddenTaskByFormId(int64_t formId)269 void FormRenderMgr::DeleteAcquireForbiddenTaskByFormId(int64_t formId)
270 {
271     std::lock_guard<std::mutex> lock(forbiddenTaskMapMutex_);
272 
273     for (auto iter = forbiddenTaskMap_.begin(); iter != forbiddenTaskMap_.end(); ++iter) {
274         auto search = iter->second.find(formId);
275         if (search != iter->second.end()) {
276             iter->second.erase(search);
277             if (iter->second.empty()) {
278                 forbiddenTaskMap_.erase(iter);
279             }
280             HILOG_INFO("delete ftask success, formId:%{public}" PRId64, formId);
281             break;
282         }
283     }
284 }
285 
AddPostRenderFormTask(int64_t formId,std::function<void ()> task)286 void FormRenderMgr::AddPostRenderFormTask(int64_t formId, std::function<void()> task)
287 {
288     std::lock_guard<std::mutex> lock(renderFormTaskMapMutex_);
289     auto search = renderFormTaskMap_.find(formId);
290     if (search == renderFormTaskMap_.end()) {
291         renderFormTaskMap_.emplace(formId, task);
292     } else {
293         search->second = task;
294     }
295     HILOG_INFO("add PostRenderFormTask success, formId:%{public}" PRId64, formId);
296 }
297 
ExecPostRenderFormTask(int64_t formId)298 void FormRenderMgr::ExecPostRenderFormTask(int64_t formId)
299 {
300     std::function<void()> task;
301     bool findTask = false;
302     {
303         std::lock_guard<std::mutex> lock(renderFormTaskMapMutex_);
304         auto search = renderFormTaskMap_.find(formId);
305         if (search != renderFormTaskMap_.end()) {
306             task = search->second;
307             findTask = true;
308             renderFormTaskMap_.erase(search);
309         }
310     }
311     if (findTask) {
312         task();
313         HILOG_INFO("exec task, formId:%{public}" PRId64, formId);
314     }
315 }
316 
DeletePostRenderFormTask(int64_t formId)317 void FormRenderMgr::DeletePostRenderFormTask(int64_t formId)
318 {
319     std::lock_guard<std::mutex> lock(renderFormTaskMapMutex_);
320     auto search = renderFormTaskMap_.find(formId);
321     if (search != renderFormTaskMap_.end()) {
322         renderFormTaskMap_.erase(search);
323         HILOG_INFO("del task, formId:%{public}" PRId64, formId);
324     }
325 }
326 
NotifyScreenOn()327 void FormRenderMgr::NotifyScreenOn()
328 {
329     int32_t userId = FormUtil::GetCurrentAccountId();
330     auto renderIter = renderInners_.find(userId);
331     if (renderIter != renderInners_.end()) {
332         renderIter->second->NotifyScreenOn();
333     }
334     auto sandboxIter = sandboxInners_.find(userId);
335     if (sandboxIter != sandboxInners_.end()) {
336         sandboxIter->second->NotifyScreenOn();
337     }
338 }
339 
OnScreenUnlock()340 void FormRenderMgr::OnScreenUnlock()
341 {
342     HILOG_INFO("call. %{public}d,%{public}d", isVerified_, isScreenUnlocked_);
343     if (isScreenUnlocked_) {
344         return;
345     }
346 
347     // el2 path maybe not unlocked, should not acquire data
348     std::lock_guard<std::mutex> lock(isVerifiedMutex_);
349     isScreenUnlocked_ = true;
350     if (!isVerified_) {
351         PostOnUnlockTask();
352     }
353 }
354 
OnUnlock()355 void FormRenderMgr::OnUnlock()
356 {
357     HILOG_INFO("call. %{public}d,%{public}d", isVerified_, isScreenUnlocked_);
358     if (isVerified_) {
359         return;
360     }
361 
362     {
363         std::lock_guard<std::mutex> lock(isVerifiedMutex_);
364         isVerified_ = true;
365         if (!isScreenUnlocked_) {
366             PostOnUnlockTask();
367         }
368     }
369     ExecAcquireProviderTask();
370 }
371 
SetVisibleChange(int64_t formId,bool isVisible)372 void FormRenderMgr::SetVisibleChange(int64_t formId, bool isVisible)
373 {
374     HILOG_INFO("call.");
375     int32_t userId = FormUtil::GetCurrentAccountId();
376     auto renderIter = renderInners_.find(userId);
377     if (renderIter != renderInners_.end()) {
378         renderIter->second->PostSetVisibleChangeTask(formId, isVisible);
379     }
380     auto sandboxIter = sandboxInners_.find(userId);
381     if (sandboxIter != sandboxInners_.end()) {
382         sandboxIter->second->PostSetVisibleChangeTask(formId, isVisible);
383     }
384 }
385 
StopRenderingForm(int64_t formId,const FormRecord & formRecord,const std::string & compId,const sptr<IRemoteObject> & hostToken)386 ErrCode FormRenderMgr::StopRenderingForm(
387     int64_t formId, const FormRecord &formRecord, const std::string &compId, const sptr<IRemoteObject> &hostToken)
388 {
389     HILOG_INFO("formUserId:%{public}d", formRecord.userId);
390     if (formRecord.privacyLevel > 0) {
391         auto iter = sandboxInners_.find(formRecord.userId);
392         if (iter == sandboxInners_.end()) {
393             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
394         }
395         return iter->second->StopRenderingForm(formId, formRecord, compId, hostToken);
396     } else {
397         auto iter = renderInners_.find(formRecord.userId);
398         if (iter == renderInners_.end()) {
399             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
400         }
401         return iter->second->StopRenderingForm(formId, formRecord, compId, hostToken);
402     }
403 }
404 
RenderFormCallback(int64_t formId,const Want & want)405 ErrCode FormRenderMgr::RenderFormCallback(int64_t formId, const Want &want)
406 {
407     HILOG_DEBUG("call");
408     return ERR_OK;
409 }
410 
StopRenderingFormCallback(int64_t formId,const Want & want)411 ErrCode FormRenderMgr::StopRenderingFormCallback(int64_t formId, const Want &want)
412 {
413     int32_t callingUserId = IPCSkeleton::GetCallingUid() / Constants::CALLING_UID_TRANSFORM_DIVISOR;
414     HILOG_INFO("formId:%{public}" PRId64 ", callingUserId:%{public}d", formId, callingUserId);
415     auto renderIter = renderInners_.find(callingUserId);
416     if (renderIter != renderInners_.end()) {
417         renderIter->second->StopRenderingFormCallback(formId, want);
418     }
419     auto sandboxIter = sandboxInners_.find(callingUserId);
420     if (sandboxIter != sandboxInners_.end()) {
421         sandboxIter->second->StopRenderingFormCallback(formId, want);
422     }
423     return ERR_OK;
424 }
425 
ReleaseRenderer(int64_t formId,const FormRecord & formRecord,const std::string & compId)426 ErrCode FormRenderMgr::ReleaseRenderer(int64_t formId, const FormRecord &formRecord, const std::string &compId)
427 {
428     HILOG_INFO("formId:%{public}" PRId64 ", formUserId:%{public}d", formId, formRecord.userId);
429     if (formRecord.privacyLevel > 0) {
430         auto iter = sandboxInners_.find(formRecord.userId);
431         if (iter == sandboxInners_.end()) {
432             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
433         }
434         return iter->second->ReleaseRenderer(formId, formRecord, compId);
435     } else {
436         auto iter = renderInners_.find(formRecord.userId);
437         if (iter == renderInners_.end()) {
438             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
439         }
440         return iter->second->ReleaseRenderer(formId, formRecord, compId);
441     }
442 }
443 
AddConnection(int64_t formId,sptr<FormRenderConnection> connection,const FormRecord & formRecord)444 ErrCode FormRenderMgr::AddConnection(
445     int64_t formId, sptr<FormRenderConnection> connection, const FormRecord &formRecord)
446 {
447     HILOG_INFO("formUserId: %{public}d", formRecord.userId);
448     if (formRecord.privacyLevel > 0) {
449         auto iter = sandboxInners_.find(formRecord.userId);
450         if (iter == sandboxInners_.end()) {
451             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
452         }
453         return iter->second->AddConnection(formId, connection);
454     } else {
455         auto iter = renderInners_.find(formRecord.userId);
456         if (iter == renderInners_.end()) {
457             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
458         }
459         return iter->second->AddConnection(formId, connection);
460     }
461 }
462 
RemoveConnection(int64_t formId,const FormRecord & formRecord)463 void FormRenderMgr::RemoveConnection(int64_t formId, const FormRecord &formRecord)
464 {
465     HILOG_INFO("formId:%{public}" PRId64 ", formUserId:%{public}d", formId, formRecord.userId);
466     if (formRecord.privacyLevel > 0) {
467         auto iter = sandboxInners_.find(formRecord.userId);
468         if (iter != sandboxInners_.end()) {
469             iter->second->RemoveConnection(formId);
470         }
471     } else {
472         auto iter = renderInners_.find(formRecord.userId);
473         if (iter != renderInners_.end()) {
474             iter->second->RemoveConnection(formId);
475         }
476     }
477 }
478 
checkConnectionsFormIds(std::vector<int64_t> formIds,int32_t userId,std::vector<int64_t> & needconFormIds)479 ErrCode FormRenderMgr::checkConnectionsFormIds(std::vector<int64_t> formIds, int32_t userId,
480     std::vector<int64_t> &needconFormIds)
481 {
482     auto iter = renderInners_.find(userId);
483     if (iter == renderInners_.end()) {
484         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
485     }
486     return iter->second->checkConnectionsFormIds(formIds, needconFormIds);
487 }
488 
reAddConnections(std::vector<int64_t> formIds,int32_t userId,const sptr<IRemoteObject> & remoteObject)489 void FormRenderMgr::reAddConnections(std::vector<int64_t> formIds,
490     int32_t userId, const sptr<IRemoteObject> &remoteObject)
491 {
492     HILOG_ERROR("reAddConnections - Connect formIds, ");
493 
494     sptr<IFormHost> hostClient = iface_cast<IFormHost>(remoteObject);
495     if (hostClient == nullptr) {
496         HILOG_ERROR("null hostClient");
497         return;
498     }
499     hostClient->OnError(ERR_APPEXECFWK_FORM_RENDER_SERVICE_DIED, "FormRenderService is dead.", formIds);
500 }
501 
CleanFormHost(const sptr<IRemoteObject> & host,const int hostCallingUid)502 void FormRenderMgr::CleanFormHost(const sptr<IRemoteObject> &host, const int hostCallingUid)
503 {
504     int32_t hostUserId = hostCallingUid / Constants::CALLING_UID_TRANSFORM_DIVISOR;
505     if (hostUserId == 0) {
506         HILOG_WARN("hostUserId is 0, get current active userId ");
507         hostUserId = FormUtil::GetCurrentAccountId();
508     }
509     HILOG_INFO("hostUserId:%{public}d", hostUserId);
510     auto renderIter = renderInners_.find(hostUserId);
511     if (renderIter != renderInners_.end()) {
512         renderIter->second->CleanFormHost(host);
513     }
514     auto sandboxIter = sandboxInners_.find(hostUserId);
515     if (sandboxIter != sandboxInners_.end()) {
516         sandboxIter->second->CleanFormHost(host);
517     }
518 }
519 
AddRenderDeathRecipient(const sptr<IRemoteObject> & remoteObject,const FormRecord & formRecord)520 void FormRenderMgr::AddRenderDeathRecipient(const sptr<IRemoteObject> &remoteObject, const FormRecord &formRecord)
521 {
522     HILOG_INFO("formUserId:%{public}d", formRecord.userId);
523     if (formRecord.privacyLevel > 0) {
524         auto iter = sandboxInners_.find(formRecord.userId);
525         if (iter != sandboxInners_.end()) {
526             iter->second->AddRenderDeathRecipient(remoteObject);
527         }
528     } else {
529         auto iter = renderInners_.find(formRecord.userId);
530         if (iter != renderInners_.end()) {
531             iter->second->AddRenderDeathRecipient(remoteObject);
532         }
533     }
534 }
535 
OnRenderingBlock(const std::string & bundleName)536 void FormRenderMgr::OnRenderingBlock(const std::string &bundleName)
537 {
538     HILOG_INFO("bundleName:%{public}s", bundleName.c_str());
539     FormEventInfo eventInfo;
540     eventInfo.bundleName = bundleName;
541     FormEventReport::SendSecondFormEvent(
542         FormEventName::FORM_RENDER_BLOCK, HiSysEventType::FAULT, eventInfo);
543 
544     FormTrustMgr::GetInstance().MarkTrustFlag(bundleName, false);
545 
546     Want want;
547     want.SetElementName(Constants::FRS_BUNDLE_NAME, "ServiceExtension");
548     want.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
549     FormAmsHelper::GetInstance().StopExtensionAbility(want);
550 }
551 
IsNeedRender(int64_t formId)552 bool FormRenderMgr::IsNeedRender(int64_t formId)
553 {
554     FormRecord formRecord;
555     bool isGetFormRecord = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
556     if (!isGetFormRecord) {
557         HILOG_ERROR("not exist such form, formId:%{public}" PRId64 "", formId);
558         return false;
559     }
560     if (formRecord.uiSyntax != FormType::ETS) {
561         HILOG_DEBUG("no need render, formId:%{public}" PRId64 "", formId);
562         return false;
563     }
564     return true;
565 }
566 
HandleConnectFailed(int64_t formId,int32_t errorCode) const567 void FormRenderMgr::HandleConnectFailed(int64_t formId, int32_t errorCode) const
568 {
569     HILOG_ERROR("Connect render service failed, formId:%{public}" PRId64 ", errorCode:%{public}d",
570         formId, errorCode);
571     std::vector<sptr<IRemoteObject>> formHostObjs;
572     FormDataMgr::GetInstance().GetFormHostRemoteObj(formId, formHostObjs);
573     for (const auto &host : formHostObjs) {
574         auto hostClient = iface_cast<IFormHost>(host);
575         if (hostClient == nullptr) {
576             HILOG_ERROR("null hostClient");
577             continue;
578         }
579         hostClient->OnError(errorCode, "Connect FormRenderService failed");
580     }
581 }
582 
IsRerenderForRenderServiceDied(int64_t formId)583 bool FormRenderMgr::IsRerenderForRenderServiceDied(int64_t formId)
584 {
585     int32_t rerenderCount = 0;
586     int32_t reSandboxRenderCount = 0;
587     FormRecord formRecord;
588     bool isGetFormRecord = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
589     if (!isGetFormRecord) {
590         HILOG_ERROR("get FormRecord fail, not exist such form, formId:%{public}" PRId64 "", formId);
591         return true;
592     }
593     HILOG_INFO("formId:%{public}" PRId64 ", formUserId:%{public}d", formId, formRecord.userId);
594     auto renderIter = renderInners_.find(formRecord.userId);
595     if (renderIter != renderInners_.end()) {
596         rerenderCount = renderIter->second->GetReRenderCount();
597     }
598     auto sandboxIter = sandboxInners_.find(formRecord.userId);
599     if (sandboxIter != sandboxInners_.end()) {
600         reSandboxRenderCount = sandboxIter->second->GetReRenderCount();
601     }
602     bool ret = IsNeedRender(formId) && (rerenderCount > 0 || reSandboxRenderCount > 0);
603     HILOG_DEBUG("Is need to rerender:%{public}d", ret);
604     return ret;
605 }
606 
InitRenderInner(bool isSandbox,int32_t userId)607 void FormRenderMgr::InitRenderInner(bool isSandbox, int32_t userId)
608 {
609     HILOG_INFO("isSandbox: %{public}d userId: %{public}d.", isSandbox, userId);
610     std::lock_guard<std::mutex> lock(renderInnerMutex_);
611     if (isSandbox) {
612         auto iter = sandboxInners_.find(userId);
613         if (iter == sandboxInners_.end()) {
614             auto formSandboxRenderMgr = std::make_shared<FormSandboxRenderMgrInner>();
615             formSandboxRenderMgr->SetUserId(userId);
616             sandboxInners_.emplace(userId, formSandboxRenderMgr);
617         }
618     } else {
619         auto iter = renderInners_.find(userId);
620         if (iter == renderInners_.end()) {
621             auto formRenderMgr = std::make_shared<FormRenderMgrInner>();
622             formRenderMgr->SetUserId(userId);
623             renderInners_.emplace(userId, formRenderMgr);
624         }
625     }
626 }
627 
RecycleForms(const std::vector<int64_t> & formIds,const Want & want,const sptr<IRemoteObject> & remoteObjectOfHost)628 ErrCode FormRenderMgr::RecycleForms(
629     const std::vector<int64_t> &formIds, const Want &want, const sptr<IRemoteObject> &remoteObjectOfHost)
630 {
631     int callingUserId = want.GetIntParam(Constants::RECYCLE_FORMS_USER_ID, 0);
632     if (callingUserId == 0) {
633         callingUserId = IPCSkeleton::GetCallingUid() / Constants::CALLING_UID_TRANSFORM_DIVISOR;
634         if (callingUserId == 0) {
635             callingUserId = FormUtil::GetCurrentAccountId();
636         }
637         HILOG_INFO("callingUserId is 0, update callingUserId:%{public}d", callingUserId);
638     }
639     auto renderIter = renderInners_.find(callingUserId);
640     if (renderIter != renderInners_.end()) {
641         return renderIter->second->RecycleForms(formIds, want, remoteObjectOfHost);
642     }
643     auto sandboxIter = sandboxInners_.find(callingUserId);
644     if (sandboxIter != sandboxInners_.end()) {
645         return sandboxIter->second->RecycleForms(formIds, want, remoteObjectOfHost);
646     }
647     return ERR_APPEXECFWK_FORM_RENDER_SERVICE_DIED;
648 }
649 
RecoverForms(const std::vector<int64_t> & formIds,const WantParams & wantParams)650 ErrCode FormRenderMgr::RecoverForms(const std::vector<int64_t> &formIds, const WantParams &wantParams)
651 {
652     int32_t callingUserId = IPCSkeleton::GetCallingUid() / Constants::CALLING_UID_TRANSFORM_DIVISOR;
653     auto renderIter = renderInners_.find(callingUserId);
654     if (renderIter != renderInners_.end()) {
655         return renderIter->second->RecoverForms(formIds, wantParams);
656     }
657     auto sandboxIter = sandboxInners_.find(callingUserId);
658     if (sandboxIter != sandboxInners_.end()) {
659         return sandboxIter->second->RecoverForms(formIds, wantParams);
660     }
661     return ERR_APPEXECFWK_FORM_RENDER_SERVICE_DIED;
662 }
663 
DisconnectAllRenderConnections(int userId)664 void FormRenderMgr::DisconnectAllRenderConnections(int userId)
665 {
666     HILOG_INFO("userId: %{public}d", userId);
667     auto renderIter = renderInners_.find(userId);
668     if (renderIter != renderInners_.end()) {
669         renderIter->second->DisconnectAllRenderConnections();
670     }
671     auto sandboxIter = sandboxInners_.find(userId);
672     if (sandboxIter != sandboxInners_.end()) {
673         sandboxIter->second->DisconnectAllRenderConnections();
674     }
675 }
676 
RerenderAllFormsImmediate(int userId)677 void FormRenderMgr::RerenderAllFormsImmediate(int userId)
678 {
679     HILOG_INFO("userId: %{public}d", userId);
680     auto renderIter = renderInners_.find(userId);
681     if (renderIter != renderInners_.end()) {
682         renderIter->second->RerenderAllFormsImmediate();
683     }
684     auto sandboxIter = sandboxInners_.find(userId);
685     if (sandboxIter != sandboxInners_.end()) {
686         sandboxIter->second->RerenderAllFormsImmediate();
687     }
688 }
689 
UpdateFormSize(const int64_t & formId,float width,float height,float borderWidth)690 void FormRenderMgr::UpdateFormSize(const int64_t &formId, float width, float height, float borderWidth)
691 {
692     int32_t callingUserId = IPCSkeleton::GetCallingUid() / Constants::CALLING_UID_TRANSFORM_DIVISOR;
693     auto renderIter = renderInners_.find(callingUserId);
694     if (renderIter != renderInners_.end()) {
695         renderIter->second->UpdateFormSize(formId, width, height, borderWidth);
696     }
697     auto sandboxIter = sandboxInners_.find(callingUserId);
698     if (sandboxIter != sandboxInners_.end()) {
699         sandboxIter->second->UpdateFormSize(formId, width, height, borderWidth);
700     }
701 }
702 } // namespace AppExecFwk
703 } // namespace OHOS
704