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