• 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_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