1 /*
2  * Copyright (c) 2021-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 "core/components/form/resource/form_manager_delegate.h"
17 
18 #include <algorithm>
19 #include <iomanip>
20 #include <memory>
21 #include <sstream>
22 
23 #include "form_info_base.h"
24 #include "transaction/rs_sync_transaction_controller.h"
25 #include "transaction/rs_transaction.h"
26 
27 #include "base/log/log.h"
28 #include "core/common/container.h"
29 #include "core/components_ng/gestures/gesture_group.h"
30 #include "core/components_ng/gestures/pan_gesture.h"
31 #include "core/gestures/gesture_info.h"
32 #include "frameworks/base/json/json_util.h"
33 
34 #ifdef OHOS_STANDARD_SYSTEM
35 #include "form_callback_client.h"
36 #include "form_host_client.h"
37 #include "form_info.h"
38 #include "form_js_info.h"
39 #include "form_mgr.h"
40 #include "pointer_event.h"
41 
42 #include "core/common/form_manager.h"
43 #include "core/components/form/resource/form_utils.h"
44 #endif
45 
46 namespace OHOS::Ace {
47 namespace {
48 constexpr char FORM_EVENT_ON_ACQUIRE_FORM[] = "onAcquireForm";
49 constexpr char FORM_EVENT_ON_UPDATE_FORM[] = "onUpdateForm";
50 constexpr char FORM_EVENT_ON_ERROR[] = "onFormError";
51 constexpr char FORM_ADAPTOR_RESOURCE_NAME[] = "formAdaptor";
52 constexpr char NTC_PARAM_RICH_TEXT[] = "formAdaptor";
53 constexpr char FORM_RENDERER_PROCESS_ON_ADD_SURFACE[] = "ohos.extra.param.key.process_on_add_surface";
54 constexpr char FORM_RENDERER_DISPATCHER[] = "ohos.extra.param.key.process_on_form_renderer_dispatcher";
55 constexpr char PARAM_FORM_MIGRATE_FORM_KEY[] = "ohos.extra.param.key.migrate_form";
56 constexpr int32_t RENDER_DEAD_CODE = 16501006;
57 constexpr int32_t FORM_NOT_TRUST_CODE = 16501007;
58 constexpr char ALLOW_UPDATE[] = "allowUpdate";
59 constexpr char IS_DYNAMIC[] = "isDynamic";
60 constexpr uint32_t DELAY_TIME_FOR_FORM_SNAPSHOT_10S = 10000;
61 } // namespace
62 
~FormManagerDelegate()63 FormManagerDelegate::~FormManagerDelegate()
64 {
65     ReleasePlatformResource();
66 }
67 
ReleasePlatformResource()68 void FormManagerDelegate::ReleasePlatformResource()
69 {
70 #ifdef OHOS_STANDARD_SYSTEM
71     ReleaseForm();
72 #else
73     Stop();
74     Release();
75 #endif
76 }
77 
Stop()78 void FormManagerDelegate::Stop()
79 {
80     auto context = context_.Upgrade();
81     if (!context) {
82         return;
83     }
84     auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
85     if (platformTaskExecutor.IsRunOnCurrentThread()) {
86         UnregisterEvent();
87     } else {
88         platformTaskExecutor.PostTask([weak = WeakClaim(this)] {
89             auto delegate = weak.Upgrade();
90             if (delegate) {
91                 delegate->UnregisterEvent();
92             }
93         }, "ArkUIFormUnregisterEvent");
94     }
95 }
96 
UnregisterEvent()97 void FormManagerDelegate::UnregisterEvent()
98 {
99     auto context = context_.Upgrade();
100     if (!context) {
101         return;
102     }
103     auto resRegister = context->GetPlatformResRegister();
104     resRegister->UnregisterEvent(MakeEventHash(FORM_EVENT_ON_ACQUIRE_FORM));
105     resRegister->UnregisterEvent(MakeEventHash(FORM_EVENT_ON_UPDATE_FORM));
106     resRegister->UnregisterEvent(MakeEventHash(FORM_EVENT_ON_ERROR));
107 }
108 
109 #if OHOS_STANDARD_SYSTEM
AddForm(const WeakPtr<PipelineBase> & context,const RequestFormInfo & info,const AppExecFwk::FormInfo & formInfo)110 void FormManagerDelegate::AddForm(const WeakPtr<PipelineBase>& context, const RequestFormInfo& info,
111     const AppExecFwk::FormInfo& formInfo)
112 #else
113 void FormManagerDelegate::AddForm(const WeakPtr<PipelineBase>& context, const RequestFormInfo& info)
114 #endif
115 {
116 #ifdef OHOS_STANDARD_SYSTEM
117     // dynamic add new form should release the running form first.
118     if (runningCardId_ > 0) {
119         TAG_LOGI(AceLogTag::ACE_FORM, "Add new form, release platform resource about old form:%{public}s.",
120             std::to_string(runningCardId_).c_str());
121         ReleaseForm();
122         ResetForm();
123     }
124 
125     OHOS::AppExecFwk::FormJsInfo formJsInfo;
126     wantCache_.SetElementName(info.bundleName, info.abilityName);
127 
128     if (info.wantWrap) {
129         info.wantWrap->SetWantParamsFromWantWrap(reinterpret_cast<void*>(&wantCache_));
130     }
131 
132     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_IDENTITY_KEY, info.id);
133     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_MODULE_NAME_KEY, info.moduleName);
134     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_NAME_KEY, info.cardName);
135     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_TEMPORARY_KEY, info.temporary);
136     wantCache_.SetParam(
137         OHOS::AppExecFwk::Constants::ACQUIRE_TYPE, OHOS::AppExecFwk::Constants::ACQUIRE_TYPE_CREATE_FORM);
138     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_WIDTH_KEY, info.width.Value());
139     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_HEIGHT_KEY, info.height.Value());
140     wantCache_.SetParam(OHOS::AppExecFwk::Constants::FORM_COMP_ID, std::to_string(info.index));
141     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_BORDER_WIDTH_KEY, info.borderWidth);
142     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_OBSCURED_KEY, info.obscuredMode);
143     auto pipelineContext = context_.Upgrade();
144     if (pipelineContext) {
145         auto density = pipelineContext->GetDensity();
146         // 在OHOS::AppExecFwk::Constants中加类似常量
147         wantCache_.SetParam("ohos.extra.param.key.form_density", density);
148     }
149     if (info.dimension != -1) {
150         wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_DIMENSION_KEY, info.dimension);
151     }
152     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_RENDERINGMODE_KEY, info.renderingMode);
153 
154     if (formInfo.uiSyntax == AppExecFwk::FormType::ETS) {
155         CHECK_NULL_VOID(renderDelegate_);
156         wantCache_.SetParam(FORM_RENDERER_PROCESS_ON_ADD_SURFACE, renderDelegate_->AsObject());
157         wantCache_.SetParam(ALLOW_UPDATE, info.allowUpdate);
158         wantCache_.SetParam(IS_DYNAMIC, formInfo.isDynamic);
159     }
160     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FONT_FOLLOW_SYSTEM_KEY, formInfo.fontScaleFollowSystem);
161 
162     auto clientInstance = OHOS::AppExecFwk::FormHostClient::GetInstance();
163     TAG_LOGI(AceLogTag::ACE_FORM, "Before FormMgr adding form, info.id: %{public}" PRId64, info.id);
164     auto ret = OHOS::AppExecFwk::FormMgr::GetInstance().AddForm(info.id, wantCache_, clientInstance, formJsInfo);
165     if (ret != 0) {
166         auto errorMsg = OHOS::AppExecFwk::FormMgr::GetInstance().GetErrorMessage(ret);
167         OnFormError(std::to_string(ret), errorMsg);
168         return;
169     }
170 
171     TAG_LOGI(AceLogTag::ACE_FORM,
172         "Add form success, formId: %{public}s, type: %{public}d, uiSyntax: %{public}d, isDynamic: %{public}d",
173         std::to_string(formJsInfo.formId).c_str(), static_cast<int>(formJsInfo.type),
174         static_cast<int>(formJsInfo.uiSyntax), isDynamic_);
175     if (formCallbackClient_ == nullptr) {
176         formCallbackClient_ = std::make_shared<FormCallbackClient>();
177         formCallbackClient_->SetInstanceId(Container::CurrentId());
178     }
179     formCallbackClient_->SetFormManagerDelegate(AceType::WeakClaim(this));
180     clientInstance->AddForm(formCallbackClient_, formJsInfo);
181 
182     runningCardId_ = formJsInfo.formId;
183     runningCompId_ = std::to_string(info.index);
184     ProcessFormUpdate(formJsInfo);
185 #else
186     if (state_ == State::CREATED) {
187         hash_ = MakeResourceHash();
188         Method addFormMethod = MakeMethodHash("addForm");
189         std::string param = ConvertRequestInfo(info);
190         CallResRegisterMethod(addFormMethod, param, nullptr);
191     } else {
192         CreatePlatformResource(context, info);
193     }
194 #endif
195 }
196 
OnSurfaceCreate(const AppExecFwk::FormJsInfo & formInfo,const std::shared_ptr<Rosen::RSSurfaceNode> & rsSurfaceNode,const AAFwk::Want & want)197 void FormManagerDelegate::OnSurfaceCreate(const AppExecFwk::FormJsInfo& formInfo,
198     const std::shared_ptr<Rosen::RSSurfaceNode>& rsSurfaceNode, const AAFwk::Want& want)
199 {
200     TAG_LOGI(AceLogTag::ACE_FORM, "Form OnSurfaceCreate formId: %{public}s, isDynamic: %{public}d",
201         std::to_string(formInfo.formId).c_str(), formInfo.isDynamic);
202     if (!rsSurfaceNode) {
203         TAG_LOGE(AceLogTag::ACE_FORM, "rsSurfaceNode is null");
204         return;
205     }
206 
207     if (!onFormSurfaceNodeCallback_) {
208         TAG_LOGE(AceLogTag::ACE_FORM, "onFormSurfaceNodeCallback is null");
209         return;
210     }
211 
212     bool needHandleCachedClick =
213         want.GetBoolParam(OHOS::AppExecFwk::Constants::FORM_IS_RECOVER_FORM_TO_HANDLE_CLICK_EVENT, false);
214     bool isRecover = recycleStatus_ == RecycleStatus::RECYCLED || needHandleCachedClick;
215     AAFwk::Want newWant;
216     newWant.SetParam(OHOS::AppExecFwk::Constants::FORM_IS_DYNAMIC, formInfo.isDynamic);
217     newWant.SetParam(OHOS::AppExecFwk::Constants::FORM_IS_RECOVER_FORM, isRecover);
218     newWant.SetParam(OHOS::AppExecFwk::Constants::FORM_IS_RECOVER_FORM_TO_HANDLE_CLICK_EVENT, needHandleCachedClick);
219 
220     onFormSurfaceNodeCallback_(rsSurfaceNode, newWant);
221 
222     sptr<IRemoteObject> proxy = want.GetRemoteObject(FORM_RENDERER_DISPATCHER);
223     if (proxy != nullptr) {
224         formRendererDispatcher_ = iface_cast<IFormRendererDispatcher>(proxy);
225         CheckWhetherSurfaceChangeFailed();
226     } else {
227         TAG_LOGE(AceLogTag::ACE_FORM, "want renderer dispatcher null");
228     }
229 
230     isDynamic_ = formInfo.isDynamic;
231     if (!formInfo.isDynamic) {
232         HandleSnapshotCallback(DELAY_TIME_FOR_FORM_SNAPSHOT_10S);
233     }
234 }
235 
CheckWhetherSurfaceChangeFailed()236 void FormManagerDelegate::CheckWhetherSurfaceChangeFailed()
237 {
238     float width = 0.0f;
239     float height = 0.0f;
240     float borderWidth = 0.0f;
241     bool needRedispatch = false;
242     {
243         std::lock_guard<std::mutex> lock(surfaceChangeFailedRecordMutex_);
244         if (notifySurfaceChangeFailedRecord_.isfailed == true) {
245             TAG_LOGI(AceLogTag::ACE_FORM, "redispatch surface change event");
246             needRedispatch = true;
247             notifySurfaceChangeFailedRecord_.isfailed = false;
248             width = notifySurfaceChangeFailedRecord_.expectedWidth;
249             height = notifySurfaceChangeFailedRecord_.expectedHeight;
250             borderWidth = notifySurfaceChangeFailedRecord_.expectedBorderWidth;
251         }
252     }
253     if (needRedispatch) {
254         formRendererDispatcher_->DispatchSurfaceChangeEvent(width, height, borderWidth);
255     }
256 }
257 
HandleCachedClickEvents()258 void FormManagerDelegate::HandleCachedClickEvents()
259 {
260     if (formRendererDispatcher_ == nullptr) {
261         TAG_LOGE(AceLogTag::ACE_FORM, "dispatcher is null, formId:%{public}" PRId64, runningCardId_);
262         return;
263     }
264     if (!isDynamic_) {
265         TAG_LOGE(AceLogTag::ACE_FORM, "failed to handle cached click, not dynamic card");
266         return;
267     }
268     {
269         std::lock_guard<std::mutex> lock(recycleMutex_);
270         TAG_LOGI(AceLogTag::ACE_FORM, "process click event after recover form, pointerEventCache_.size: %{public}s",
271             std::to_string(pointerEventCache_.size()).c_str());
272         recycleStatus_ = RecycleStatus::RECOVERED;
273         for (const auto& pointerEvent : pointerEventCache_) {
274             SerializedGesture serializedGesture;
275             formRendererDispatcher_->DispatchPointerEvent(pointerEvent, serializedGesture);
276         }
277         pointerEventCache_.clear();
278     }
279 }
280 
ConvertRequestInfo(const RequestFormInfo & info) const281 std::string FormManagerDelegate::ConvertRequestInfo(const RequestFormInfo& info) const
282 {
283     std::stringstream paramStream;
284     paramStream << "bundle" << FORM_MANAGER_PARAM_EQUALS << info.bundleName << FORM_MANAGER_PARAM_AND << "ability"
285                 << FORM_MANAGER_PARAM_EQUALS << info.abilityName << FORM_MANAGER_PARAM_AND << "module"
286                 << FORM_MANAGER_PARAM_EQUALS << info.moduleName << FORM_MANAGER_PARAM_AND << "name"
287                 << FORM_MANAGER_PARAM_EQUALS << info.cardName << FORM_MANAGER_PARAM_AND << "dimension"
288                 << FORM_MANAGER_PARAM_EQUALS << info.dimension << FORM_MANAGER_PARAM_AND << "id"
289                 << FORM_MANAGER_PARAM_EQUALS << info.id << FORM_MANAGER_PARAM_AND << "temporary"
290                 << FORM_MANAGER_PARAM_EQUALS << info.temporary << FORM_MANAGER_PARAM_AND << "cardkey"
291                 << FORM_MANAGER_PARAM_EQUALS << info.ToString();
292     return paramStream.str();
293 }
294 
CreatePlatformResource(const WeakPtr<PipelineBase> & context,const RequestFormInfo & info)295 void FormManagerDelegate::CreatePlatformResource(const WeakPtr<PipelineBase>& context, const RequestFormInfo& info)
296 {
297     context_ = context;
298     state_ = State::CREATING;
299 
300     auto pipelineContext = context_.Upgrade();
301     if (!pipelineContext) {
302         state_ = State::CREATEFAILED;
303         TAG_LOGE(AceLogTag::ACE_FORM, "OnFormError CREATEFAILED");
304         OnFormError("internal error");
305         return;
306     }
307     auto platformTaskExecutor =
308         SingleTaskExecutor::Make(pipelineContext->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
309     auto resRegister = pipelineContext->GetPlatformResRegister();
310     auto weakRes = AceType::WeakClaim(AceType::RawPtr(resRegister));
311     platformTaskExecutor.PostTask([weak = WeakClaim(this), weakRes, info] {
312         auto delegate = weak.Upgrade();
313         if (!delegate) {
314             return;
315         }
316         auto resRegister = weakRes.Upgrade();
317         auto context = delegate->context_.Upgrade();
318         if (!resRegister || !context) {
319             TAG_LOGE(AceLogTag::ACE_FORM, "OnFormError resRegister or context error");
320             delegate->OnFormError("internal error");
321             return;
322         }
323 
324         delegate->id_ = CREATING_ID;
325 
326         std::stringstream paramStream;
327         paramStream << NTC_PARAM_RICH_TEXT << FORM_MANAGER_PARAM_EQUALS << delegate->id_ << FORM_MANAGER_PARAM_AND
328                     << "bundle" << FORM_MANAGER_PARAM_EQUALS << info.bundleName << FORM_MANAGER_PARAM_AND << "ability"
329                     << FORM_MANAGER_PARAM_EQUALS << info.abilityName << FORM_MANAGER_PARAM_AND << "module"
330                     << FORM_MANAGER_PARAM_EQUALS << info.moduleName << FORM_MANAGER_PARAM_AND << "name"
331                     << FORM_MANAGER_PARAM_EQUALS << info.cardName << FORM_MANAGER_PARAM_AND << "dimension"
332                     << FORM_MANAGER_PARAM_EQUALS << info.dimension << FORM_MANAGER_PARAM_AND << "id"
333                     << FORM_MANAGER_PARAM_EQUALS << info.id << FORM_MANAGER_PARAM_AND << "temporary"
334                     << FORM_MANAGER_PARAM_EQUALS << info.temporary << FORM_MANAGER_PARAM_AND << "cardkey"
335                     << FORM_MANAGER_PARAM_EQUALS << info.ToString();
336 
337         std::string param = paramStream.str();
338         delegate->id_ = resRegister->CreateResource(FORM_ADAPTOR_RESOURCE_NAME, param);
339         if (delegate->id_ == INVALID_ID) {
340             TAG_LOGE(AceLogTag::ACE_FORM, "OnFormError INVALID_ID");
341             delegate->OnFormError("internal error");
342             return;
343         }
344         delegate->state_ = State::CREATED;
345         delegate->hash_ = delegate->MakeResourceHash();
346         delegate->RegisterEvent();
347     }, "ArkUIFormCreatePlatformResource");
348 }
349 
RegisterEvent()350 void FormManagerDelegate::RegisterEvent()
351 {
352     auto context = context_.Upgrade();
353     if (!context) {
354         return;
355     }
356     auto resRegister = context->GetPlatformResRegister();
357     resRegister->RegisterEvent(
358         MakeEventHash(FORM_EVENT_ON_ACQUIRE_FORM), [weak = WeakClaim(this)](const std::string& param) {
359             auto delegate = weak.Upgrade();
360             if (delegate) {
361                 delegate->OnFormAcquired(param);
362             }
363         });
364     resRegister->RegisterEvent(
365         MakeEventHash(FORM_EVENT_ON_UPDATE_FORM), [weak = WeakClaim(this)](const std::string& param) {
366             auto delegate = weak.Upgrade();
367             if (delegate) {
368                 delegate->OnFormUpdate(param);
369             }
370         });
371     resRegister->RegisterEvent(MakeEventHash(FORM_EVENT_ON_ERROR), [weak = WeakClaim(this)](const std::string& param) {
372         auto delegate = weak.Upgrade();
373         if (delegate) {
374             delegate->OnFormError(param);
375         }
376     });
377 }
378 
AddFormAcquireCallback(const OnFormAcquiredCallback & callback)379 void FormManagerDelegate::AddFormAcquireCallback(const OnFormAcquiredCallback& callback)
380 {
381     if (!callback || state_ == State::RELEASED) {
382         return;
383     }
384     onFormAcquiredCallback_ = callback;
385 }
386 
AddFormUpdateCallback(const OnFormUpdateCallback & callback)387 void FormManagerDelegate::AddFormUpdateCallback(const OnFormUpdateCallback& callback)
388 {
389     if (!callback || state_ == State::RELEASED) {
390         return;
391     }
392     onFormUpdateCallback_ = callback;
393 }
394 
AddFormErrorCallback(const OnFormErrorCallback & callback)395 void FormManagerDelegate::AddFormErrorCallback(const OnFormErrorCallback& callback)
396 {
397     if (!callback || state_ == State::RELEASED) {
398         return;
399     }
400     onFormErrorCallback_ = callback;
401 }
402 
AddFormUninstallCallback(const OnFormUninstallCallback & callback)403 void FormManagerDelegate::AddFormUninstallCallback(const OnFormUninstallCallback& callback)
404 {
405     if (!callback || state_ == State::RELEASED) {
406         return;
407     }
408     onFormUninstallCallback_ = callback;
409 }
410 
AddFormSurfaceNodeCallback(const OnFormSurfaceNodeCallback & callback)411 void FormManagerDelegate::AddFormSurfaceNodeCallback(const OnFormSurfaceNodeCallback& callback)
412 {
413     if (!callback || state_ == State::RELEASED) {
414         return;
415     }
416     onFormSurfaceNodeCallback_ = callback;
417 }
418 
AddFormSurfaceChangeCallback(OnFormSurfaceChangeCallback && callback)419 void FormManagerDelegate::AddFormSurfaceChangeCallback(OnFormSurfaceChangeCallback&& callback)
420 {
421     if (!callback || state_ == State::RELEASED) {
422         return;
423     }
424     onFormSurfaceChangeCallback_ = std::move(callback);
425 }
426 
AddFormSurfaceDetachCallback(OnFormSurfaceDetachCallback && callback)427 void FormManagerDelegate::AddFormSurfaceDetachCallback(OnFormSurfaceDetachCallback&& callback)
428 {
429     if (!callback || state_ == State::RELEASED) {
430         return;
431     }
432     onFormSurfaceDetachCallback_ = std::move(callback);
433 }
434 
AddFormLinkInfoUpdateCallback(OnFormLinkInfoUpdateCallback && callback)435 void FormManagerDelegate::AddFormLinkInfoUpdateCallback(OnFormLinkInfoUpdateCallback&& callback)
436 {
437     if (!callback || state_ == State::RELEASED) {
438         return;
439     }
440     onFormLinkInfoUpdateCallback_ = std::move(callback);
441 }
442 
AddGetRectRelativeToWindowCallback(OnGetRectRelativeToWindowCallback && callback)443 void FormManagerDelegate::AddGetRectRelativeToWindowCallback(OnGetRectRelativeToWindowCallback&& callback)
444 {
445     if (!callback || state_ == State::RELEASED) {
446         return;
447     }
448     onGetRectRelativeToWindowCallback_ = std::move(callback);
449 }
450 
AddActionEventHandle(const ActionEventHandle & callback)451 void FormManagerDelegate::AddActionEventHandle(const ActionEventHandle& callback)
452 {
453     TAG_LOGI(AceLogTag::ACE_FORM, "EventHandle - AddActionEventHandle");
454     if (!callback || state_ == State::RELEASED) {
455         TAG_LOGE(AceLogTag::ACE_FORM, "EventHandle - ,state_ is RELEASED");
456         return;
457     }
458     actionEventHandle_ = callback;
459 }
460 
AddEnableFormCallback(EnableFormCallback && callback)461 void FormManagerDelegate::AddEnableFormCallback(EnableFormCallback&& callback)
462 {
463     if (!callback || state_ == State::RELEASED) {
464         TAG_LOGE(AceLogTag::ACE_FORM, "EnableFormCallback is null");
465         return;
466     }
467     enableFormCallback_ = std::move(callback);
468 }
469 
OnActionEventHandle(const std::string & action)470 void FormManagerDelegate::OnActionEventHandle(const std::string& action)
471 {
472     if (actionEventHandle_) {
473         TAG_LOGI(AceLogTag::ACE_FORM, "EventHandle - OnActionEventHandle ,formId: %{public}" PRId64,
474                     runningCardId_);
475         actionEventHandle_(action);
476     }
477 }
478 
AddUnTrustFormCallback(const UnTrustFormCallback & callback)479 void FormManagerDelegate::AddUnTrustFormCallback(const UnTrustFormCallback& callback)
480 {
481     if (!callback || state_ == State::RELEASED) {
482         return;
483     }
484     unTrustFormCallback_ = callback;
485 }
486 
AddSnapshotCallback(SnapshotCallback && callback)487 void FormManagerDelegate::AddSnapshotCallback(SnapshotCallback&& callback)
488 {
489     if (!callback || state_ == State::RELEASED) {
490         return;
491     }
492 
493     snapshotCallback_ = std::move(callback);
494 }
495 
ParseAction(const std::string & action,const std::string & type,AAFwk::Want & want)496 bool FormManagerDelegate::ParseAction(const std::string& action, const std::string& type, AAFwk::Want& want)
497 {
498     auto eventAction = JsonUtil::ParseJsonString(action);
499     auto bundleName = eventAction->GetValue("bundleName");
500     auto abilityName = eventAction->GetValue("abilityName");
501     auto params = eventAction->GetValue("params");
502     auto bundle = bundleName->GetString();
503     auto ability = abilityName->GetString();
504     if (type == "message") {
505         params->Put("params", params);
506         params->Put("action", type.c_str());
507         want.SetParam(OHOS::AppExecFwk::Constants::PARAM_MESSAGE_KEY, params->ToString());
508         return true;
509     }
510 
511     if (bundle.empty()) {
512         bundle = wantCache_.GetElement().GetBundleName();
513     }
514     if (ability.empty()) {
515         if (type != "router") {
516             return false;
517         }
518         auto uri = eventAction->GetValue("uri");
519         if (!uri->IsValid()) {
520             return false;
521         }
522     }
523 
524     want.SetElementName(bundle, ability);
525     if (params->IsValid()) {
526         auto child = params->GetChild();
527         while (child->IsValid()) {
528             auto key = child->GetKey();
529             if (child->IsNull()) {
530                 want.SetParam(key, std::string());
531             } else if (child->IsString()) {
532                 want.SetParam(key, child->GetString());
533             } else if (child->IsNumber()) {
534                 want.SetParam(key, child->GetInt());
535             } else {
536                 want.SetParam(key, std::string());
537             }
538             child = child->GetNext();
539         }
540     }
541     want.SetParam("params", params->ToString());
542     return true;
543 }
544 
AddRenderDelegate()545 void FormManagerDelegate::AddRenderDelegate()
546 {
547     if (renderDelegate_) {
548         return;
549     }
550     renderDelegate_ = new FormRendererDelegateImpl();
551 }
552 
RegisterRenderDelegateEvent()553 void FormManagerDelegate::RegisterRenderDelegateEvent()
554 {
555     CHECK_NULL_VOID(renderDelegate_);
556     auto&& surfaceCreateEventHandler = [weak = WeakClaim(this)](
557                                            const std::shared_ptr<Rosen::RSSurfaceNode>& surfaceNode,
558                                            const OHOS::AppExecFwk::FormJsInfo& formInfo, const AAFwk::Want& want) {
559         auto formManagerDelegate = weak.Upgrade();
560         CHECK_NULL_VOID(formManagerDelegate);
561         formManagerDelegate->OnSurfaceCreate(formInfo, surfaceNode, want);
562     };
563     renderDelegate_->SetSurfaceCreateEventHandler(std::move(surfaceCreateEventHandler));
564 
565     auto&& actionEventHandler = [weak = WeakClaim(this)](const std::string& action) {
566         auto formManagerDelegate = weak.Upgrade();
567         TAG_LOGI(AceLogTag::ACE_FORM, "EventHandle - actionEventHandler");
568         if (!formManagerDelegate) {
569             TAG_LOGE(AceLogTag::ACE_FORM, "EventHandle - ,formManagerDelegate is null");
570             return;
571         }
572         formManagerDelegate->OnActionEventHandle(action);
573     };
574     renderDelegate_->SetActionEventHandler(std::move(actionEventHandler));
575 
576     auto&& onErrorEventHandler = [weak = WeakClaim(this)](const std::string& code, const std::string& msg) {
577         auto formManagerDelegate = weak.Upgrade();
578         CHECK_NULL_VOID(formManagerDelegate);
579         formManagerDelegate->OnFormError(code, msg);
580     };
581     renderDelegate_->SetErrorEventHandler(std::move(onErrorEventHandler));
582 
583     auto&& onSurfaceChangeHandler = [weak = WeakClaim(this)](float width, float height, float borderWidth) {
584         auto formManagerDelegate = weak.Upgrade();
585         CHECK_NULL_VOID(formManagerDelegate);
586         formManagerDelegate->OnFormSurfaceChange(width, height, borderWidth);
587     };
588     renderDelegate_->SetSurfaceChangeEventHandler(std::move(onSurfaceChangeHandler));
589 
590     auto&& onSurfaceDetachHandler = [weak = WeakClaim(this)]() {
591         auto formManagerDelegate = weak.Upgrade();
592         CHECK_NULL_VOID(formManagerDelegate);
593         formManagerDelegate->OnFormSurfaceDetach();
594     };
595     renderDelegate_->SetSurfaceDetachEventHandler(std::move(onSurfaceDetachHandler));
596 
597     auto&& onFormLinkInfoUpdateHandler = [weak = WeakClaim(this)](const std::vector<std::string>& formLinkInfos) {
598         auto formManagerDelegate = weak.Upgrade();
599         CHECK_NULL_VOID(formManagerDelegate);
600         formManagerDelegate->OnFormLinkInfoUpdate(formLinkInfos);
601     };
602     renderDelegate_->SetFormLinkInfoUpdateHandler(std::move(onFormLinkInfoUpdateHandler));
603 
604     auto &&onGetRectRelativeToWindowHandler = [weak = WeakClaim(this)](int32_t &top, int32_t &left) {
605         auto formManagerDelegate = weak.Upgrade();
606         CHECK_NULL_VOID(formManagerDelegate);
607         formManagerDelegate->OnGetRectRelativeToWindow(top, left);
608     };
609     renderDelegate_->SetGetRectRelativeToWindowHandler(onGetRectRelativeToWindowHandler);
610 }
611 
OnActionEvent(const std::string & action)612 void FormManagerDelegate::OnActionEvent(const std::string& action)
613 {
614     auto eventAction = JsonUtil::ParseJsonString(action);
615     if (!eventAction->IsValid()) {
616         return;
617     }
618 
619     auto actionType = eventAction->GetValue("action");
620     if (!actionType->IsValid()) {
621         return;
622     }
623 
624     auto type = actionType->GetString();
625     if (type != "router" && type != "message" && type != "call") {
626         return;
627     }
628 
629 #ifdef OHOS_STANDARD_SYSTEM
630     if (type == "router") {
631         AAFwk::Want want;
632         if (!ParseAction(action, type, want)) {
633             TAG_LOGE(AceLogTag::ACE_FORM, "action parse failed, detail action:%{public}s", action.c_str());
634         } else {
635             CHECK_NULL_VOID(formUtils_);
636             auto context = context_.Upgrade();
637             CHECK_NULL_VOID(context);
638             auto instantId = context->GetInstanceId();
639             formUtils_->RouterEvent(runningCardId_, action, instantId, wantCache_.GetElement().GetBundleName());
640         }
641         return;
642     } else if (type == "call") {
643         AAFwk::Want want;
644         if (!ParseAction(action, type, want)) {
645             TAG_LOGE(AceLogTag::ACE_FORM, "action parse failed, detail action:%{public}s", action.c_str());
646         } else {
647             CHECK_NULL_VOID(formUtils_);
648             auto context = context_.Upgrade();
649             CHECK_NULL_VOID(context);
650             auto instantId = context->GetInstanceId();
651             formUtils_->BackgroundEvent(runningCardId_, action, instantId, wantCache_.GetElement().GetBundleName());
652         }
653         return;
654     }
655 
656     AAFwk::Want want;
657     if (!ParseAction(action, type, want)) {
658         TAG_LOGE(AceLogTag::ACE_FORM, "action parse failed, detail action:%{public}s", action.c_str());
659         return;
660     }
661     want.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_IDENTITY_KEY, (int64_t)runningCardId_);
662     if (AppExecFwk::FormMgr::GetRecoverStatus() == OHOS::AppExecFwk::Constants::IN_RECOVERING) {
663         return;
664     }
665 
666     // requestForm request to fms
667     AppExecFwk::FormMgr::GetInstance().MessageEvent(runningCardId_, want, AppExecFwk::FormHostClient::GetInstance());
668 #else
669     hash_ = MakeResourceHash();
670     Method actionMethod = MakeMethodHash("onAction");
671     std::stringstream paramStream;
672     paramStream << "type" << FORM_MANAGER_PARAM_EQUALS << type << FORM_MANAGER_PARAM_AND << "action"
673                 << FORM_MANAGER_PARAM_EQUALS << action;
674     std::string param = paramStream.str();
675     TAG_LOGI(AceLogTag::ACE_FORM, "send method:%{private}s, type:%{public}s params:%{private}s", actionMethod.c_str(),
676         type.c_str(), param.c_str());
677     CallResRegisterMethod(actionMethod, param, nullptr);
678 #endif
679 }
680 
DispatchPointerEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,SerializedGesture & serializedGesture)681 void FormManagerDelegate::DispatchPointerEvent(const
682     std::shared_ptr<MMI::PointerEvent>& pointerEvent,
683     SerializedGesture& serializedGesture)
684 {
685     if (!isDynamic_ || !pointerEvent) {
686         return;
687     }
688 
689     // if formRendererDispatcher_ is null, check if form is recycled.
690     if (formRendererDispatcher_ == nullptr) {
691         std::lock_guard<std::mutex> lock(recycleMutex_);
692         if (recycleStatus_ == RecycleStatus::RECYCLED) {
693             SetGestureInnerFlag();
694             TAG_LOGI(AceLogTag::ACE_FORM,
695                 "form is recycled, recover it first, action=%{public}d, formId=%{public}" PRId64 "",
696                 pointerEvent->GetPointerAction(), runningCardId_);
697             recycleStatus_ = RecycleStatus::RECOVERING;
698             pointerEventCache_.emplace_back(pointerEvent);
699 
700             std::vector<int64_t> formIds = {runningCardId_};
701             AAFwk::Want want;
702             want.SetParam(OHOS::AppExecFwk::Constants::FORM_IS_RECOVER_FORM_TO_HANDLE_CLICK_EVENT, true);
703             OHOS::AppExecFwk::FormMgr::GetInstance().RecoverForms(formIds, want);
704         } else if (recycleStatus_ == RecycleStatus::RECOVERING) {
705             TAG_LOGI(AceLogTag::ACE_FORM, "form is recovering, cache pointer event, action=%{public}d",
706                 pointerEvent->GetPointerAction());
707             pointerEventCache_.emplace_back(pointerEvent);
708         } else {
709             TAG_LOGE(AceLogTag::ACE_FORM, "formRendererDispatcher_ is null");
710         }
711         return;
712     }
713 
714     if (pointerEvent->GetPointerAction() == OHOS::MMI::PointerEvent::POINTER_ACTION_DOWN) {
715         TAG_LOGI(AceLogTag::ACE_FORM, "dispatch down event to renderer");
716     }
717     auto disablePanGesture = wantCache_.GetBoolParam(OHOS::AppExecFwk::Constants::FORM_DISABLE_GESTURE_KEY, false);
718     if (!disablePanGesture) {
719         formRendererDispatcher_->DispatchPointerEvent(pointerEvent, serializedGesture);
720         return;
721     }
722 
723     // pan gesture disabled, not dispatch move event, not concat serialized gesture
724     if (pointerEvent->GetPointerAction() == OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE) {
725         return;
726     }
727     TAG_LOGI(AceLogTag::ACE_FORM, "form pan gesture disabled, dispatch event action=%{public}d",
728         pointerEvent->GetPointerAction());
729     SerializedGesture ignoredGesture;
730     formRendererDispatcher_->DispatchPointerEvent(pointerEvent, ignoredGesture);
731     SetGestureInnerFlag();
732 }
733 
SetGestureInnerFlag()734 void FormManagerDelegate::SetGestureInnerFlag()
735 {
736     auto pipelineContext = context_.Upgrade();
737     if (pipelineContext && pipelineContext->GetEventManager()) {
738         // avoid context dispatch mocked cancel event
739         pipelineContext->GetEventManager()->SetInnerFlag(true);
740         TAG_LOGI(AceLogTag::ACE_FORM, "set event manager inner flag");
741     }
742 }
743 
SetAllowUpdate(bool allowUpdate)744 void FormManagerDelegate::SetAllowUpdate(bool allowUpdate)
745 {
746     if (formRendererDispatcher_ == nullptr) {
747         TAG_LOGE(AceLogTag::ACE_FORM, "formRendererDispatcher_ is null");
748         return;
749     }
750 
751     formRendererDispatcher_->SetAllowUpdate(allowUpdate);
752 }
753 
NotifySurfaceChange(float width,float height,float borderWidth)754 void FormManagerDelegate::NotifySurfaceChange(float width, float height, float borderWidth)
755 {
756     OHOS::AppExecFwk::FormMgr::GetInstance().UpdateFormSize(runningCardId_, width, height, borderWidth);
757     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_WIDTH_KEY, static_cast<double>(width));
758     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_HEIGHT_KEY, static_cast<double>(height));
759     wantCache_.SetParam(OHOS::AppExecFwk::Constants::PARAM_FORM_BORDER_WIDTH_KEY, borderWidth);
760     {
761         std::lock_guard<std::mutex> lock(surfaceChangeFailedRecordMutex_);
762         if (formRendererDispatcher_ == nullptr) {
763             TAG_LOGW(AceLogTag::ACE_FORM, "formRendererDispatcher_ is nullptr");
764             notifySurfaceChangeFailedRecord_.isfailed = true;
765             notifySurfaceChangeFailedRecord_.expectedWidth = width;
766             notifySurfaceChangeFailedRecord_.expectedHeight = height;
767             notifySurfaceChangeFailedRecord_.expectedBorderWidth = borderWidth;
768             return;
769         }
770     }
771     WindowSizeChangeReason sizeChangeReason = WindowSizeChangeReason::UNDEFINED;
772     if (FormManager::GetInstance().IsSizeChangeByRotate()) {
773         sizeChangeReason = WindowSizeChangeReason::ROTATION;
774     }
775     std::shared_ptr<Rosen::RSTransaction> transaction;
776     if (FormManager::GetInstance().GetRSTransaction().lock()) {
777         transaction = FormManager::GetInstance().GetRSTransaction().lock();
778     } else if (auto transactionController = Rosen::RSSyncTransactionController::GetInstance()) {
779         transaction = transactionController->GetRSTransaction();
780     }
781     formRendererDispatcher_->DispatchSurfaceChangeEvent(width, height,
782         static_cast<uint32_t>(sizeChangeReason), transaction, borderWidth);
783 }
784 
OnFormSurfaceChange(float width,float height,float borderWidth)785 void FormManagerDelegate::OnFormSurfaceChange(float width, float height, float borderWidth)
786 {
787     if (onFormSurfaceChangeCallback_) {
788         onFormSurfaceChangeCallback_(width, height, borderWidth);
789     }
790 }
791 
OnFormSurfaceDetach()792 void FormManagerDelegate::OnFormSurfaceDetach()
793 {
794     if (onFormSurfaceDetachCallback_) {
795         onFormSurfaceDetachCallback_();
796     }
797 }
798 
OnFormLinkInfoUpdate(const std::vector<std::string> & formLinkInfos)799 void FormManagerDelegate::OnFormLinkInfoUpdate(const std::vector<std::string>& formLinkInfos)
800 {
801     if (onFormLinkInfoUpdateCallback_) {
802         onFormLinkInfoUpdateCallback_(formLinkInfos);
803     }
804 }
805 
OnGetRectRelativeToWindow(int32_t & top,int32_t & left)806 void FormManagerDelegate::OnGetRectRelativeToWindow(int32_t &top, int32_t &left)
807 {
808     if (onGetRectRelativeToWindowCallback_) {
809         onGetRectRelativeToWindowCallback_(top, left);
810     }
811 }
812 
OnFormAcquired(const std::string & param)813 void FormManagerDelegate::OnFormAcquired(const std::string& param)
814 {
815     auto result = ParseMapFromString(param);
816     if (onFormAcquiredCallbackForJava_) {
817         onFormAcquiredCallbackForJava_(
818             StringUtils::StringToLongInt(result["formId"]), result["codePath"], result["moduleName"], result["data"]);
819     }
820 }
821 
OnFormUpdate(const std::string & param)822 void FormManagerDelegate::OnFormUpdate(const std::string& param)
823 {
824     auto result = ParseMapFromString(param);
825     if (onFormUpdateCallbackForJava_) {
826         onFormUpdateCallbackForJava_(StringUtils::StringToLongInt(result["formId"]), result["data"]);
827     }
828 }
829 
OnFormError(const std::string & param)830 void FormManagerDelegate::OnFormError(const std::string& param)
831 {
832     auto result = ParseMapFromString(param);
833     TAG_LOGI(AceLogTag::ACE_FORM,
834         "OnFormError, code:%{public}s, msg:%{public}s", result["code"].c_str(), result["msg"].c_str());
835     if (onFormErrorCallback_) {
836         onFormErrorCallback_(result["code"], result["msg"]);
837     }
838 }
839 
OnFormError(const std::string & code,const std::string & msg)840 void FormManagerDelegate::OnFormError(const std::string& code, const std::string& msg)
841 {
842     int32_t externalErrorCode = 0;
843     std::string errorMsg;
844     OHOS::AppExecFwk::FormMgr::GetInstance().GetExternalError(std::stoi(code), externalErrorCode, errorMsg);
845     TAG_LOGI(AceLogTag::ACE_FORM,
846         "OnFormError, code:%{public}s, msg:%{public}s, externalErrorCode:%{public}d, errorMsg: %{public}s",
847         code.c_str(), msg.c_str(), externalErrorCode, errorMsg.c_str());
848     switch (externalErrorCode) {
849         case RENDER_DEAD_CODE:
850             ReAddForm();
851             break;
852         case FORM_NOT_TRUST_CODE:
853             HandleUnTrustFormCallback();
854             break;
855         default:
856             if (onFormErrorCallback_) {
857                 onFormErrorCallback_(std::to_string(externalErrorCode), errorMsg);
858             }
859             break;
860     }
861 }
862 
HandleUnTrustFormCallback()863 void FormManagerDelegate::HandleUnTrustFormCallback()
864 {
865     TAG_LOGI(AceLogTag::ACE_FORM, "HandleUnTrustFormCallback.");
866     if (unTrustFormCallback_) {
867         unTrustFormCallback_();
868     }
869 }
870 
HandleSnapshotCallback(const uint32_t & delayTime)871 void FormManagerDelegate::HandleSnapshotCallback(const uint32_t& delayTime)
872 {
873     TAG_LOGI(AceLogTag::ACE_FORM, "HandleSnapshotCallback.");
874     if (snapshotCallback_) {
875         snapshotCallback_(delayTime);
876     }
877 }
878 
HandleEnableFormCallback(const bool enable)879 void FormManagerDelegate::HandleEnableFormCallback(const bool enable)
880 {
881     if (!enableFormCallback_) {
882         TAG_LOGE(AceLogTag::ACE_FORM, "enableFormCallback_. is null");
883         return;
884     }
885     enableFormCallback_(enable);
886 }
887 
ReAddForm()888 void FormManagerDelegate::ReAddForm()
889 {
890     {
891         std::lock_guard<std::mutex> lock(recycleMutex_);
892         recycleStatus_ = RecycleStatus::RECOVERED;
893     }
894     formRendererDispatcher_ = nullptr; // formRendererDispatcher_ need reset, otherwise PointerEvent will disable
895     if (wantCache_.HasParameter(PARAM_FORM_MIGRATE_FORM_KEY)) {
896         TAG_LOGW(AceLogTag::ACE_FORM, "Remove migrate form key.");
897         wantCache_.RemoveParam(PARAM_FORM_MIGRATE_FORM_KEY);
898     }
899     auto clientInstance = OHOS::AppExecFwk::FormHostClient::GetInstance();
900     auto ret =
901         OHOS::AppExecFwk::FormMgr::GetInstance().AddForm(formJsInfo_.formId, wantCache_, clientInstance, formJsInfo_);
902     if (ret != 0) {
903         auto errorMsg = OHOS::AppExecFwk::FormMgr::GetInstance().GetErrorMessage(ret);
904         TAG_LOGW(AceLogTag::ACE_FORM, "Add form failed, ret:%{public}d detail:%{public}s", ret, errorMsg.c_str());
905         OnFormError(std::to_string(ret), errorMsg);
906         return;
907     }
908 }
909 
SetObscured(bool isObscured)910 void FormManagerDelegate::SetObscured(bool isObscured)
911 {
912     CHECK_NULL_VOID(formRendererDispatcher_);
913     formRendererDispatcher_->SetObscured(isObscured);
914 }
915 
OnAccessibilityChildTreeRegister(uint32_t windowId,int32_t treeId,int64_t accessibilityId)916 void FormManagerDelegate::OnAccessibilityChildTreeRegister(uint32_t windowId, int32_t treeId, int64_t accessibilityId)
917 {
918     CHECK_NULL_VOID(formRendererDispatcher_);
919     formRendererDispatcher_->OnAccessibilityChildTreeRegister(windowId, treeId, accessibilityId);
920 }
921 
OnAccessibilityChildTreeDeregister()922 void FormManagerDelegate::OnAccessibilityChildTreeDeregister()
923 {
924     CHECK_NULL_VOID(formRendererDispatcher_);
925     formRendererDispatcher_->OnAccessibilityChildTreeDeregister();
926 }
927 
OnAccessibilityDumpChildInfo(const std::vector<std::string> & params,std::vector<std::string> & info)928 void FormManagerDelegate::OnAccessibilityDumpChildInfo(
929     const std::vector<std::string>& params, std::vector<std::string>& info)
930 {
931     CHECK_NULL_VOID(formRendererDispatcher_);
932     formRendererDispatcher_->OnAccessibilityDumpChildInfo(params, info);
933 }
934 
OnAccessibilityTransferHoverEvent(float pointX,float pointY,int32_t sourceType,int32_t eventType,int64_t timeMs)935 void FormManagerDelegate::OnAccessibilityTransferHoverEvent(float pointX, float pointY, int32_t sourceType,
936     int32_t eventType, int64_t timeMs)
937 {
938     CHECK_NULL_VOID(formRendererDispatcher_);
939     formRendererDispatcher_->OnAccessibilityTransferHoverEvent(pointX, pointY, sourceType, eventType, timeMs);
940 }
941 
CheckFormBundleForbidden(const std::string & bundleName)942 bool FormManagerDelegate::CheckFormBundleForbidden(const std::string& bundleName)
943 {
944     return OHOS::AppExecFwk::FormMgr::GetInstance().IsFormBundleForbidden(bundleName);
945 }
946 
947 #ifdef OHOS_STANDARD_SYSTEM
ResetForm()948 void FormManagerDelegate::ResetForm()
949 {
950     TAG_LOGI(AceLogTag::ACE_FORM, "Reset form id is %{public}" PRId64 "", runningCardId_);
951     runningCardId_ = -1;
952     runningCompId_.clear();
953     formRendererDispatcher_ = nullptr;
954 }
955 
ReleaseForm()956 void FormManagerDelegate::ReleaseForm()
957 {
958     TAG_LOGI(AceLogTag::ACE_FORM, "FormManagerDelegate releaseForm. formId: %{public}" PRId64 ", %{public}s",
959         runningCardId_, runningCompId_.c_str());
960     if (runningCardId_ <= 0) {
961         return;
962     }
963 
964     if (!runningCompId_.empty()) {
965         OHOS::AppExecFwk::FormMgr::GetInstance().StopRenderingForm(runningCardId_, runningCompId_);
966     }
967 
968     auto clientInstance = OHOS::AppExecFwk::FormHostClient::GetInstance();
969     clientInstance->RemoveForm(formCallbackClient_, runningCardId_);
970 }
971 
ProcessFormUpdate(const AppExecFwk::FormJsInfo & formJsInfo)972 void FormManagerDelegate::ProcessFormUpdate(const AppExecFwk::FormJsInfo& formJsInfo)
973 {
974     if (formJsInfo.formId != runningCardId_) {
975         return;
976     }
977     if (!hasCreated_) {
978         if (formJsInfo.jsFormCodePath.empty() || formJsInfo.formName.empty()) {
979             return;
980         }
981         if (!onFormAcquiredCallback_) {
982             return;
983         }
984         hasCreated_ = true;
985         OHOS::Ace::FrontendType type = OHOS::Ace::FrontendType::JS_CARD;
986         if (formJsInfo.type == AppExecFwk::FormType::ETS) {
987             type = OHOS::Ace::FrontendType::ETS_CARD;
988         }
989         OHOS::Ace::FrontendType uiSyntax = OHOS::Ace::FrontendType::JS_CARD;
990         if (formJsInfo.uiSyntax == AppExecFwk::FormType::ETS) {
991             uiSyntax = OHOS::Ace::FrontendType::ETS_CARD;
992         }
993         formJsInfo_ = formJsInfo;
994         onFormAcquiredCallback_(runningCardId_, formJsInfo.jsFormCodePath, formJsInfo.formName, formJsInfo.formData,
995             formJsInfo.imageDataMap, formJsInfo, type, uiSyntax);
996     } else {
997         if (formJsInfo.formData.empty()) {
998             return;
999         }
1000         if (!onFormUpdateCallback_) {
1001             return;
1002         }
1003         formJsInfo_ = formJsInfo;
1004         onFormUpdateCallback_(formJsInfo.formId, formJsInfo.formData, formJsInfo.imageDataMap);
1005     }
1006 }
1007 
ReleaseRenderer()1008 void FormManagerDelegate::ReleaseRenderer()
1009 {
1010     TAG_LOGI(AceLogTag::ACE_FORM, "FormManagerDelegate releaseRenderer. formId: %{public}" PRId64 ", %{public}s",
1011         runningCardId_, runningCompId_.c_str());
1012     if (runningCardId_ <= 0) {
1013         return;
1014     }
1015 
1016     OHOS::AppExecFwk::FormMgr::GetInstance().ReleaseRenderer(runningCardId_, runningCompId_);
1017     formRendererDispatcher_ = nullptr;
1018 }
1019 
ProcessFormUninstall(const int64_t formId)1020 void FormManagerDelegate::ProcessFormUninstall(const int64_t formId)
1021 {
1022     TAG_LOGI(AceLogTag::ACE_FORM, "ProcessFormUninstall formId:%{public}s", std::to_string(formId).c_str());
1023     if (onFormUninstallCallback_) {
1024         onFormUninstallCallback_(formId);
1025     }
1026 }
1027 
OnDeathReceived()1028 void FormManagerDelegate::OnDeathReceived()
1029 {
1030     AppExecFwk::FormJsInfo formJsInfo;
1031     OHOS::AppExecFwk::FormMgr::GetInstance().AddForm(
1032         runningCardId_, wantCache_, OHOS::AppExecFwk::FormHostClient::GetInstance(), formJsInfo);
1033 }
1034 
SetFormUtils(const std::shared_ptr<FormUtils> & formUtils)1035 void FormManagerDelegate::SetFormUtils(const std::shared_ptr<FormUtils>& formUtils)
1036 {
1037     if (formUtils) {
1038         formUtils_ = formUtils;
1039     }
1040 }
1041 
GetFormInfo(const std::string & bundleName,const std::string & moduleName,const std::string & cardName,AppExecFwk::FormInfo & formInfo)1042 bool FormManagerDelegate::GetFormInfo(const std::string& bundleName, const std::string& moduleName,
1043     const std::string& cardName, AppExecFwk::FormInfo& formInfo)
1044 {
1045     std::string bundle(bundleName);
1046     std::string module(moduleName);
1047     std::vector<OHOS::AppExecFwk::FormInfo> formInfos;
1048     auto result = OHOS::AppExecFwk::FormMgr::GetInstance().GetFormsInfoByModule(bundle, module, formInfos);
1049     if (result != 0) {
1050         LOGW("Query FormInfo failed.");
1051         return false;
1052     }
1053 
1054     auto iter = formInfos.begin();
1055     while (iter != formInfos.end()) {
1056         if (cardName == iter->name) {
1057             formInfo = *iter;
1058             return true;
1059         }
1060         iter++;
1061     }
1062     return false;
1063 }
1064 
ProcessRecycleForm()1065 void FormManagerDelegate::ProcessRecycleForm()
1066 {
1067     TAG_LOGI(AceLogTag::ACE_FORM, "ProcessRecycleForm, formId is %{public}s",
1068         std::to_string(runningCardId_).c_str());
1069     {
1070         std::lock_guard<std::mutex> lock(recycleMutex_);
1071         recycleStatus_ = RecycleStatus::RECYCLED;
1072     }
1073     HandleSnapshotCallback(0);
1074 }
1075 
ProcessEnableForm(bool enable)1076 void FormManagerDelegate::ProcessEnableForm(bool enable)
1077 {
1078     TAG_LOGI(AceLogTag::ACE_FORM, "ProcessEnableForm, formId is %{public}s",
1079         std::to_string(runningCardId_).c_str());
1080     HandleEnableFormCallback(enable);
1081 }
1082 #endif
1083 } // namespace OHOS::Ace
1084