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