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_impl.h"
17
18 #include <cstddef>
19 #include <memory>
20
21 #include "event_handler.h"
22 #include "fms_log_wrapper.h"
23 #include "form_constants.h"
24 #include "form_render_event_report.h"
25 #include "form_render_service_extension.h"
26 #include "js_runtime.h"
27 #include "service_extension.h"
28 #include "form_memmgr_client.h"
29 #ifdef SUPPORT_POWER
30 #include "power_mgr_client.h"
31 #endif
32
33 namespace OHOS {
34 namespace AppExecFwk {
35 namespace FormRender {
36 namespace {
37 constexpr int32_t RENDER_FORM_FAILED = -1;
38 constexpr int32_t RELOAD_FORM_FAILED = -1;
39 constexpr int32_t RECYCLE_FORM_FAILED = -1;
40 constexpr int32_t SET_VISIBLE_CHANGE_FAILED = -1;
41 constexpr int32_t FORM_RENDER_TASK_DELAY_TIME = 20; // ms
42 constexpr int32_t ENABLE_FORM_FAILED = -1;
43 constexpr int32_t UPDATE_FORM_SIZE_FAILED = -1;
44 }
45 using namespace AbilityRuntime;
46 using namespace OHOS::AAFwk::GlobalConfigurationKey;
47
FormRenderServiceCreator(const std::unique_ptr<Runtime> & runtime)48 static OHOS::AbilityRuntime::ServiceExtension *FormRenderServiceCreator(const std::unique_ptr<Runtime> &runtime)
49 {
50 HILOG_DEBUG("Create FormRenderServiceExtension");
51 return FormRenderServiceExtension::Create(runtime);
52 }
53
RegisterServiceExtensionCreator()54 __attribute__((constructor)) void RegisterServiceExtensionCreator()
55 {
56 HILOG_DEBUG("Set FormRenderServiceExtension creator");
57 OHOS::AbilityRuntime::ServiceExtension::SetCreator(FormRenderServiceCreator);
58 }
59
FormRenderImpl()60 FormRenderImpl::FormRenderImpl()
61 {
62 const std::string queueName = "FormRenderSerialQueue";
63 serialQueue_ = std::make_shared<FormRenderSerialQueue>(queueName);
64 if (serialQueue_ == nullptr) {
65 HILOG_ERROR("null serialQueue_");
66 }
67 }
68
69 FormRenderImpl::~FormRenderImpl() = default;
70
RenderForm(const FormJsInfo & formJsInfo,const Want & want,sptr<IRemoteObject> callerToken)71 int32_t FormRenderImpl::RenderForm(const FormJsInfo &formJsInfo, const Want &want,
72 sptr<IRemoteObject> callerToken)
73 {
74 HILOG_INFO("Render form,bundleName=%{public}s,abilityName=%{public}s,formName=%{public}s,"
75 "moduleName=%{public}s,jsFormCodePath=%{public}s,formSrc=%{public}s,formId=%{public}" PRId64,
76 formJsInfo.bundleName.c_str(), formJsInfo.abilityName.c_str(), formJsInfo.formName.c_str(),
77 formJsInfo.moduleName.c_str(), formJsInfo.jsFormCodePath.c_str(), formJsInfo.formSrc.c_str(),
78 formJsInfo.formId);
79
80 sptr<IFormSupply> formSupplyClient = iface_cast<IFormSupply>(callerToken);
81 {
82 std::lock_guard<std::mutex> lock(formSupplyMutex_);
83 if (formSupplyClient == nullptr) {
84 HILOG_ERROR("null IFormSupply");
85 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
86 }
87 formSupplyClient_ = formSupplyClient;
88 }
89 HILOG_DEBUG("connectId:%{public}d",
90 want.GetIntParam(Constants::FORM_CONNECT_ID, 0L));
91
92 std::string uid = want.GetStringParam(Constants::FORM_SUPPLY_UID);
93 if (uid.empty()) {
94 HILOG_ERROR("GetUid failed");
95 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
96 }
97 int32_t result = ERR_OK;
98 Want formRenderWant(want);
99 sptr<IRemoteObject> hostToken = formRenderWant.GetRemoteObject(Constants::PARAM_FORM_HOST_TOKEN);
100 {
101 std::lock_guard<std::mutex> lock(renderRecordMutex_);
102 ConfirmUnlockState(formRenderWant);
103 if (auto search = renderRecordMap_.find(uid); search != renderRecordMap_.end()) {
104 result = search->second->UpdateRenderRecord(formJsInfo, formRenderWant, hostToken);
105 } else {
106 auto record = FormRenderRecord::Create(formJsInfo.bundleName, uid, formJsInfo.isDynamic, formSupplyClient);
107 if (record == nullptr) {
108 HILOG_ERROR("null record");
109 return RENDER_FORM_FAILED;
110 }
111
112 record->SetConfiguration(configuration_);
113 result = record->UpdateRenderRecord(formJsInfo, formRenderWant, hostToken);
114 if (renderRecordMap_.empty()) {
115 FormMemmgrClient::GetInstance().SetCritical(true);
116 }
117 renderRecordMap_.emplace(uid, record);
118 FormRenderGCTask(uid);
119 }
120 }
121 formSupplyClient->OnRenderTaskDone(formJsInfo.formId, formRenderWant);
122 return result;
123 }
124
StopRenderingForm(const FormJsInfo & formJsInfo,const Want & want,const sptr<IRemoteObject> & callerToken)125 int32_t FormRenderImpl::StopRenderingForm(const FormJsInfo &formJsInfo, const Want &want,
126 const sptr<IRemoteObject> &callerToken)
127 {
128 HILOG_INFO("call");
129 sptr<IFormSupply> formSupplyClient = iface_cast<IFormSupply>(callerToken);
130 if (formSupplyClient == nullptr) {
131 HILOG_ERROR("null IFormSupply");
132 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
133 }
134
135 std::string uid = want.GetStringParam(Constants::FORM_SUPPLY_UID);
136 if (uid.empty()) {
137 HILOG_ERROR("GetUid failed");
138 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
139 }
140
141 bool isRenderGroupEmpty = false;
142 sptr<IRemoteObject> hostToken = want.GetRemoteObject(Constants::PARAM_FORM_HOST_TOKEN);
143 {
144 std::shared_ptr<FormRenderRecord> search = nullptr;
145 {
146 std::lock_guard<std::mutex> lock(renderRecordMutex_);
147 auto iterator = renderRecordMap_.find(uid);
148 if (iterator == renderRecordMap_.end() || !(iterator->second)) {
149 HILOG_ERROR("fail");
150 return RENDER_FORM_FAILED;
151 }
152 search = iterator->second;
153 }
154
155 std::string compId = want.GetStringParam(Constants::FORM_RENDER_COMP_ID);
156 search->DeleteRenderRecord(formJsInfo.formId, compId, hostToken, isRenderGroupEmpty);
157 {
158 std::lock_guard<std::mutex> lock(renderRecordMutex_);
159 if (search->IsEmpty() && !search->HasRenderFormTask()) {
160 auto iterator = renderRecordMap_.find(uid);
161 if (iterator == renderRecordMap_.end()) {
162 HILOG_ERROR("fail.");
163 return RENDER_FORM_FAILED;
164 }
165 renderRecordMap_.erase(iterator);
166 HILOG_INFO("DeleteRenderRecord success,uid:%{public}s", uid.c_str());
167 if (renderRecordMap_.empty()) {
168 FormMemmgrClient::GetInstance().SetCritical(false);
169 }
170 }
171 }
172 }
173
174 HILOG_INFO("connectId:%{public}d",
175 want.GetIntParam(Constants::FORM_CONNECT_ID, 0L));
176 if (isRenderGroupEmpty) {
177 formSupplyClient->OnStopRenderingTaskDone(formJsInfo.formId, want);
178 }
179
180 return ERR_OK;
181 }
182
ReleaseRenderer(int64_t formId,const std::string & compId,const std::string & uid)183 int32_t FormRenderImpl::ReleaseRenderer(int64_t formId, const std::string &compId, const std::string &uid)
184 {
185 HILOG_INFO("formId:%{public}" PRId64 ",compId:%{public}s,uid:%{public}s", formId, compId.c_str(), uid.c_str());
186 sptr<IFormSupply> formSupplyClient = nullptr;
187 {
188 std::lock_guard<std::mutex> lock(formSupplyMutex_);
189 formSupplyClient = formSupplyClient_;
190 }
191 if (formSupplyClient == nullptr) {
192 HILOG_ERROR("null formSupplyClient");
193 }
194
195 if (formId <= 0 || compId.empty() || uid.empty()) {
196 HILOG_ERROR("param invalid");
197 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
198 }
199
200 std::lock_guard<std::mutex> lock(renderRecordMutex_);
201 bool isRenderGroupEmpty = false;
202 auto search = renderRecordMap_.find(uid);
203 if (search == renderRecordMap_.end()) {
204 HILOG_ERROR("invalid record,formId:%{public}" PRId64, formId);
205 return RENDER_FORM_FAILED;
206 }
207
208 if (!search->second) {
209 HILOG_ERROR("record invalid,formId:%{public}" PRId64, formId);
210 return RENDER_FORM_FAILED;
211 }
212
213 search->second->ReleaseRenderer(formId, compId, isRenderGroupEmpty);
214 HILOG_INFO("end,isRenderGroupEmpty:%{public}d", isRenderGroupEmpty);
215 formSupplyClient->OnRecycleFormDone(formId);
216 if (isRenderGroupEmpty) {
217 search->second->Release();
218 }
219
220 return ERR_OK;
221 }
222
CleanFormHost(const sptr<IRemoteObject> & hostToken)223 int32_t FormRenderImpl::CleanFormHost(const sptr<IRemoteObject> &hostToken)
224 {
225 HILOG_INFO("Form host is died,clean renderRecord");
226 std::lock_guard<std::mutex> lock(renderRecordMutex_);
227 for (auto iter = renderRecordMap_.begin(); iter != renderRecordMap_.end();) {
228 auto renderRecord = iter->second;
229 if (renderRecord && renderRecord->HandleHostDied(hostToken)) {
230 HILOG_DEBUG("empty renderRecord,remove");
231 iter = renderRecordMap_.erase(iter);
232 } else {
233 ++iter;
234 }
235 }
236 if (renderRecordMap_.empty()) {
237 HILOG_INFO("empty renderRecordMap_,FormRenderService will exit later");
238 FormMemmgrClient::GetInstance().SetCritical(false);
239 }
240 return ERR_OK;
241 }
242
ReloadForm(const std::vector<FormJsInfo> && formJsInfos,const Want & want)243 int32_t FormRenderImpl::ReloadForm(const std::vector<FormJsInfo> &&formJsInfos, const Want &want)
244 {
245 HILOG_INFO("ReloadForm start");
246 std::string uid = want.GetStringParam(Constants::FORM_SUPPLY_UID);
247 if (uid.empty()) {
248 HILOG_ERROR("Get uid failed");
249 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
250 }
251 std::shared_ptr<FormRenderRecord> search = nullptr;
252 {
253 std::lock_guard<std::mutex> lock(renderRecordMutex_);
254 auto iterator = renderRecordMap_.find(uid);
255 if (iterator == renderRecordMap_.end()) {
256 HILOG_ERROR("RenderRecord not find");
257 return RELOAD_FORM_FAILED;
258 }
259 search = iterator->second;
260 }
261 if (search != nullptr) {
262 search->ReloadFormRecord(std::forward<decltype(formJsInfos)>(formJsInfos), want);
263 }
264 return ERR_OK;
265 }
266
OnUnlock()267 int32_t FormRenderImpl::OnUnlock()
268 {
269 HILOG_INFO("OnUnlock start");
270 std::lock_guard<std::mutex> lock(renderRecordMutex_);
271 if (isVerified_) {
272 HILOG_WARN("Has been unlocked in render form, maybe miss or delay unlock event");
273 return ERR_OK;
274 }
275
276 isVerified_ = true;
277 for (const auto& iter : renderRecordMap_) {
278 if (iter.second) {
279 iter.second->OnUnlock();
280 }
281 }
282 return ERR_OK;
283 }
284
SetVisibleChange(const int64_t & formId,bool isVisible,const Want & want)285 int32_t FormRenderImpl::SetVisibleChange(const int64_t &formId, bool isVisible, const Want &want)
286 {
287 HILOG_INFO("SetVisibleChange start");
288 if (formId <= 0) {
289 HILOG_ERROR("formId is negative");
290 return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
291 }
292
293 std::string uid = want.GetStringParam(Constants::FORM_SUPPLY_UID);
294 if (uid.empty()) {
295 HILOG_ERROR("empty uid,formId:%{public}" PRId64, formId);
296 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
297 }
298 HILOG_INFO("formId:%{public}" PRId64 ",uid:%{public}s", formId, uid.c_str());
299
300 std::lock_guard<std::mutex> lock(renderRecordMutex_);
301 if (auto search = renderRecordMap_.find(uid); search != renderRecordMap_.end()) {
302 if (search->second == nullptr) {
303 HILOG_ERROR("null renderRecord of %{public}s", std::to_string(formId).c_str());
304 return SET_VISIBLE_CHANGE_FAILED;
305 }
306 auto ret = search->second->SetVisibleChange(formId, isVisible);
307 if (ret != ERR_OK) {
308 return ret;
309 }
310 } else {
311 HILOG_ERROR("can't find render record of %{public}s", std::to_string(formId).c_str());
312 return SET_VISIBLE_CHANGE_FAILED;
313 }
314 return ERR_OK;
315 }
316
OnConfigurationUpdated(const std::shared_ptr<OHOS::AppExecFwk::Configuration> & configuration)317 void FormRenderImpl::OnConfigurationUpdated(
318 const std::shared_ptr<OHOS::AppExecFwk::Configuration>& configuration)
319 {
320 HILOG_DEBUG("OnConfigurationUpdated start");
321 std::lock_guard<std::mutex> lock(renderRecordMutex_);
322 if (!configuration) {
323 HILOG_ERROR("null configuration");
324 return;
325 }
326
327 SetConfiguration(configuration);
328
329 #ifdef SUPPORT_POWER
330 bool screenOnFlag = PowerMgr::PowerMgrClient::GetInstance().IsScreenOn();
331 bool collaborationScreenOnFlag = PowerMgr::PowerMgrClient::GetInstance().IsCollaborationScreenOn();
332 if (!screenOnFlag && !collaborationScreenOnFlag) {
333 HILOG_WARN("screen off");
334 hasCachedConfig_ = true;
335 return;
336 }
337 #endif
338
339 constexpr int64_t minDurationMs = 1500;
340 const std::string taskName = "FormRenderImpl::OnConfigurationUpdated";
341 serialQueue_->CancelDelayTask(taskName);
342 auto duration = std::chrono::steady_clock::now() - configUpdateTime_;
343 if (std::chrono::duration_cast<std::chrono::milliseconds>(duration).count() < minDurationMs) {
344 HILOG_INFO("OnConfigurationUpdated ignored");
345 auto configUpdateFunc = [this]() {
346 HILOG_INFO("OnConfigurationUpdated task run");
347 this->OnConfigurationUpdatedInner();
348 };
349 constexpr int64_t taskDelayMs = 1000;
350 serialQueue_->ScheduleDelayTask(taskName, taskDelayMs, configUpdateFunc);
351 return;
352 }
353 OnConfigurationUpdatedInner();
354 }
355
OnConfigurationUpdatedInner()356 void FormRenderImpl::OnConfigurationUpdatedInner()
357 {
358 sptr<IFormSupply> formSupplyClient = nullptr;
359 {
360 std::lock_guard<std::mutex> lock(formSupplyMutex_);
361 formSupplyClient = formSupplyClient_;
362 }
363 if (formSupplyClient == nullptr) {
364 HILOG_ERROR("null formSupplyClient");
365 }
366
367 configUpdateTime_ = std::chrono::steady_clock::now();
368 size_t allFormCount = 0;
369 for (auto iter = renderRecordMap_.begin(); iter != renderRecordMap_.end(); ++iter) {
370 if (iter->second) {
371 iter->second->UpdateConfiguration(configuration_, formSupplyClient);
372 allFormCount += iter->second->FormCount();
373 }
374 }
375 HILOG_INFO("OnConfigurationUpdated %{public}zu forms updated.", allFormCount);
376 hasCachedConfig_ = false;
377 PerformanceEventInfo eventInfo;
378 eventInfo.timeStamp = FormRenderEventReport::GetNowMillisecond();
379 eventInfo.bundleName = Constants::FRS_BUNDLE_NAME;
380 eventInfo.sceneId = Constants::CPU_SCENE_ID_CONFIG_UPDATE;
381 FormRenderEventReport::SendPerformanceEvent(SceneType::CPU_SCENE_ENTRY, eventInfo);
382 }
383
SetConfiguration(const std::shared_ptr<OHOS::AppExecFwk::Configuration> & config)384 void FormRenderImpl::SetConfiguration(const std::shared_ptr<OHOS::AppExecFwk::Configuration>& config)
385 {
386 if (config != nullptr && configuration_ != nullptr) {
387 auto checkConfigItem = { SYSTEM_COLORMODE, SYSTEM_LANGUAGE, SYSTEM_FONT_SIZE_SCALE, SYSTEM_FONT_WEIGHT_SCALE };
388 for (const auto& item: checkConfigItem) {
389 std::string newValue = config->GetItem(item);
390 std::string oldValue = configuration_->GetItem(item);
391 if (newValue.empty() && !oldValue.empty()) {
392 config->AddItem(item, oldValue);
393 }
394 }
395
396 configuration_ = config;
397 HILOG_INFO("current configuration_:%{public}s", configuration_->GetName().c_str());
398 return;
399 }
400
401 configuration_ = config;
402 }
403
RunCachedConfigurationUpdated()404 void FormRenderImpl::RunCachedConfigurationUpdated()
405 {
406 HILOG_INFO("RunCachedConfigUpdated");
407 std::lock_guard<std::mutex> lock(renderRecordMutex_);
408 if (hasCachedConfig_) {
409 OnConfigurationUpdatedInner();
410 }
411 }
412
FormRenderGCTask(const std::string & uid)413 void FormRenderImpl::FormRenderGCTask(const std::string &uid)
414 {
415 auto mainHandler = std::make_shared<AppExecFwk::EventHandler>(AppExecFwk::EventRunner::GetMainEventRunner());
416 if (mainHandler == nullptr) {
417 HILOG_ERROR("null mainHandler");
418 return;
419 }
420 auto formRenderGCFunc = [uid]() {
421 auto formRenderImpl = OHOS::DelayedSingleton<FormRenderImpl>::GetInstance();
422 if (formRenderImpl == nullptr) {
423 HILOG_ERROR("null formRenderImpl");
424 return;
425 }
426 formRenderImpl->FormRenderGC(uid);
427 };
428 mainHandler->PostTask(formRenderGCFunc, "FormRenderGC", FORM_RENDER_TASK_DELAY_TIME);
429 }
430
FormRenderGC(const std::string & uid)431 void FormRenderImpl::FormRenderGC(const std::string &uid)
432 {
433 HILOG_INFO("form gc, uid is %{s}public", uid.c_str());
434 std::lock_guard<std::mutex> lock(renderRecordMutex_);
435 if (auto search = renderRecordMap_.find(uid); search != renderRecordMap_.end()) {
436 search->second->FormRenderGC();
437 }
438 }
439
RecycleForm(const int64_t & formId,const Want & want)440 int32_t FormRenderImpl::RecycleForm(const int64_t &formId, const Want &want)
441 {
442 if (formId <= 0) {
443 HILOG_ERROR("formId is negative");
444 return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
445 }
446
447 std::string uid = want.GetStringParam(Constants::FORM_SUPPLY_UID);
448 if (uid.empty()) {
449 HILOG_ERROR("empty uid,formId:%{public}" PRId64, formId);
450 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
451 }
452 HILOG_INFO("formId:%{public}" PRId64 ",uid:%{public}s", formId, uid.c_str());
453
454 std::string statusData;
455 {
456 std::lock_guard<std::mutex> lock(renderRecordMutex_);
457 if (auto search = renderRecordMap_.find(uid); search != renderRecordMap_.end()) {
458 if (search->second == nullptr) {
459 HILOG_ERROR("null renderRecord of %{public}s", std::to_string(formId).c_str());
460 return RECYCLE_FORM_FAILED;
461 }
462 auto ret = search->second->RecycleForm(formId, statusData);
463 if (ret != ERR_OK) {
464 return ret;
465 }
466 } else {
467 HILOG_ERROR("can't find render record of %{public}s", std::to_string(formId).c_str());
468 return RECYCLE_FORM_FAILED;
469 }
470 if (statusData.empty()) {
471 HILOG_WARN("empty statusData of %{public}s", std::to_string(formId).c_str());
472 }
473 }
474
475 sptr<IFormSupply> formSupplyClient = nullptr;
476 {
477 std::lock_guard<std::mutex> lock(formSupplyMutex_);
478 formSupplyClient = formSupplyClient_;
479 }
480 if (formSupplyClient == nullptr) {
481 HILOG_ERROR("null formSupplyClient, formId:%{public}" PRId64, formId);
482 return RECYCLE_FORM_FAILED;
483 }
484
485 Want newWant = want;
486 newWant.SetParam(Constants::FORM_STATUS_DATA, statusData);
487 formSupplyClient->OnRecycleForm(formId, newWant);
488 return ERR_OK;
489 }
490
RecoverForm(const FormJsInfo & formJsInfo,const Want & want)491 int32_t FormRenderImpl::RecoverForm(const FormJsInfo &formJsInfo, const Want &want)
492 {
493 auto formId = formJsInfo.formId;
494 if (formId <= 0) {
495 HILOG_ERROR("formId is negative");
496 return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
497 }
498
499 std::string uid = want.GetStringParam(Constants::FORM_SUPPLY_UID);
500 if (uid.empty()) {
501 HILOG_ERROR("empty uid,formId:%{public}" PRId64, formId);
502 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
503 }
504 HILOG_INFO("formId:%{public}" PRId64 ", connectId:%{public}d, uid:%{public}s",
505 formId, want.GetIntParam(Constants::FORM_CONNECT_ID, 0L), uid.c_str());
506
507 std::string statusData = want.GetStringParam(Constants::FORM_STATUS_DATA);
508 if (statusData.empty()) {
509 HILOG_WARN("empty statusData of %{public}s", std::to_string(formId).c_str());
510 }
511
512 bool isRecoverFormToHandleClickEvent = want.GetBoolParam(
513 Constants::FORM_IS_RECOVER_FORM_TO_HANDLE_CLICK_EVENT, false);
514 std::lock_guard<std::mutex> lock(renderRecordMutex_);
515 if (auto search = renderRecordMap_.find(uid); search != renderRecordMap_.end()) {
516 if (search->second == nullptr) {
517 HILOG_ERROR("null renderRecord of %{public}s", std::to_string(formId).c_str());
518 return RECYCLE_FORM_FAILED;
519 }
520 return search->second->RecoverForm(formJsInfo, statusData, isRecoverFormToHandleClickEvent);
521 }
522 HILOG_ERROR("can't find render record of %{public}s", std::to_string(formId).c_str());
523 return RENDER_FORM_FAILED;
524 }
525
ConfirmUnlockState(Want & renderWant)526 void FormRenderImpl::ConfirmUnlockState(Want &renderWant)
527 {
528 // Ensure that there are no issues with adding form and unlocking drawing concurrency
529 if (isVerified_) {
530 renderWant.SetParam(Constants::FORM_RENDER_STATE, true);
531 } else if (renderWant.GetBoolParam(Constants::FORM_RENDER_STATE, false)) {
532 HILOG_WARN("Maybe unlock event is missed or delayed, all form record begin to render");
533 isVerified_ = true;
534 for (const auto& iter : renderRecordMap_) {
535 if (iter.second) {
536 iter.second->OnUnlock();
537 }
538 }
539 }
540 }
541
UpdateFormSize(const int64_t & formId,float width,float height,float borderWidth,const std::string & uid)542 int32_t FormRenderImpl::UpdateFormSize(
543 const int64_t &formId, float width, float height, float borderWidth, const std::string &uid)
544 {
545 std::lock_guard<std::mutex> lock(renderRecordMutex_);
546 if (auto search = renderRecordMap_.find(uid); search != renderRecordMap_.end()) {
547 if (search->second == nullptr) {
548 HILOG_ERROR("UpdateFormSize null renderRecord of %{public}" PRId64, formId);
549 return UPDATE_FORM_SIZE_FAILED;
550 }
551 search->second->UpdateFormSizeOfGroups(formId, width, height, borderWidth);
552 return ERR_OK;
553 }
554 HILOG_ERROR("can't find render record of %{public}" PRId64, formId);
555 return UPDATE_FORM_SIZE_FAILED;
556 }
557 } // namespace FormRender
558 } // namespace AppExecFwk
559 } // namespace OHOS
560