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