1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "form_task_mgr.h"
17
18 #include <cinttypes>
19 #include <utility>
20 #include <cmath>
21
22 #include "fms_log_wrapper.h"
23 #include "form_constants.h"
24 #include "form_data_mgr.h"
25 #include "form_host_delegate_proxy.h"
26 #include "form_host_interface.h"
27 #include "form_mgr_adapter.h"
28 #include "form_mgr_errors.h"
29 #include "form_provider_interface.h"
30 #include "form_render_interface.h"
31 #include "form_serial_queue.h"
32 #include "form_share_mgr.h"
33 #include "form_supply_callback.h"
34 #include "js_form_state_observer_interface.h"
35 #include "form_info_rdb_storage_mgr.h"
36 #include "form_util.h"
37 #include "form_record_report.h"
38 #include "form_provider_mgr.h"
39 #include "form_status_queue.h"
40 #include "form_command_queue.h"
41 #include "form_status_mgr.h"
42 #include "form_cache_mgr.h"
43
44 namespace OHOS {
45 namespace AppExecFwk { // namespace
FormTaskMgr()46 FormTaskMgr::FormTaskMgr() {}
~FormTaskMgr()47 FormTaskMgr::~FormTaskMgr() {}
48 /**
49 * @brief Acquire form data from form provider(task).
50 * @param formId The Id of the form.
51 * @param want The want of the request.
52 * @param remoteObject Form provider proxy object.
53 */
PostAcquireTask(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)54 void FormTaskMgr::PostAcquireTask(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
55 {
56 if (serialQueue_ == nullptr) {
57 HILOG_ERROR("null serialQueue_");
58 return;
59 }
60 auto acquireProviderFormInfoFunc = [formId, want, remoteObject]() {
61 FormTaskMgr::GetInstance().AcquireProviderFormInfo(formId, want, remoteObject);
62 };
63 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, acquireProviderFormInfoFunc);
64 }
65
PostShareAcquireTask(int64_t formId,const std::string & remoteDeviceId,const Want & want,const sptr<IRemoteObject> & remoteObject)66 void FormTaskMgr::PostShareAcquireTask(int64_t formId, const std::string &remoteDeviceId, const Want &want,
67 const sptr<IRemoteObject> &remoteObject)
68 {
69 if (serialQueue_ == nullptr) {
70 HILOG_ERROR("null serialQueue_");
71 int64_t requestCode = static_cast<int64_t>(want.GetLongParam(Constants::FORM_SHARE_REQUEST_CODE, 0));
72 PostFormShareSendResponse(requestCode, ERR_APPEXECFWK_FORM_COMMON_CODE);
73 return;
74 }
75
76 auto acquireShareProviderFormInfoFunc = [formId, remoteDeviceId, want, remoteObject]() {
77 FormTaskMgr::GetInstance().AcquireShareFormData(formId, remoteDeviceId, want, remoteObject);
78 };
79 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, acquireShareProviderFormInfoFunc);
80 }
81 /**
82 * @brief Delete form data from form provider(task).
83 * @param formId The Id of the form.
84 * @param want The want of the request.
85 * @param remoteObject Form provider proxy object.
86 */
PostDeleteTask(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)87 void FormTaskMgr::PostDeleteTask(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
88 {
89 if (serialQueue_ == nullptr) {
90 HILOG_ERROR("null serialQueue_");
91 return;
92 }
93 auto notifyFormDeleteFunc = [formId, want, remoteObject]() {
94 FormTaskMgr::GetInstance().NotifyFormDelete(formId, want, remoteObject);
95 };
96 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, notifyFormDeleteFunc);
97 }
98
99 /**
100 * @brief Refresh form data from form provider(task).
101 *
102 * @param formId The Id of the form.
103 * @param want The want of the form.
104 * @param remoteObject Form provider proxy object.
105 * @return none.
106 */
PostRefreshTask(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)107 void FormTaskMgr::PostRefreshTask(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
108 {
109 if (serialQueue_ == nullptr) {
110 HILOG_ERROR("null serialQueue_");
111 return;
112 }
113 auto notifyFormUpdateFunc = [formId, want, remoteObject]() {
114 FormTaskMgr::GetInstance().NotifyFormUpdate(formId, want, remoteObject);
115 };
116 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, notifyFormUpdateFunc);
117 }
118
119 /**
120 * @brief Cast temp form data from form provider(task).
121 *
122 * @param formId The Id of the form.
123 * @param want The want of the form.
124 * @param remoteObject Form provider proxy object.
125 * @return none.
126 */
PostCastTempTask(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)127 void FormTaskMgr::PostCastTempTask(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
128 {
129 if (serialQueue_ == nullptr) {
130 HILOG_ERROR("null serialQueue_");
131 return;
132 }
133 auto notifyCastTempFunc = [formId, want, remoteObject]() {
134 FormTaskMgr::GetInstance().NotifyCastTemp(formId, want, remoteObject);
135 };
136 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, notifyCastTempFunc);
137 }
138
139 /**
140 * @brief Post form data to form host(task) when acquire form.
141 * @param formId The Id of the form.
142 * @param callingUid Calling uid.
143 * @param info Form configure info.
144 * @param wantParams WantParams of the request.
145 * @param remoteObject Form provider proxy object.
146 */
PostAcquireTaskToHost(const int64_t formId,const FormRecord & record,const sptr<IRemoteObject> & remoteObject)147 void FormTaskMgr::PostAcquireTaskToHost(const int64_t formId, const FormRecord &record,
148 const sptr<IRemoteObject> &remoteObject)
149 {
150 if (serialQueue_ == nullptr) {
151 HILOG_ERROR("null serialQueue_");
152 return;
153 }
154 auto acquireTaskToHostFunc = [formId, record, remoteObject]() {
155 FormTaskMgr::GetInstance().AcquireTaskToHost(formId, record, remoteObject);
156 };
157 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, acquireTaskToHostFunc);
158 }
159
PostAcquireDataTaskToHost(const AAFwk::WantParams & wantParams,int64_t requestCode,const sptr<IRemoteObject> & remoteObject)160 void FormTaskMgr::PostAcquireDataTaskToHost(const AAFwk::WantParams &wantParams,
161 int64_t requestCode, const sptr<IRemoteObject> &remoteObject)
162 {
163 if (serialQueue_ == nullptr) {
164 HILOG_ERROR("serialQueue_ invalidate");
165 return;
166 }
167 auto acquireTaskToHostFunc = [wantParams, requestCode, remoteObject]() {
168 FormTaskMgr::GetInstance().AcquireFormDataBack(wantParams, requestCode, remoteObject);
169 };
170 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, acquireTaskToHostFunc);
171 }
172
173 /**
174 * @brief Post form data to form host(task) when update form.
175 * @param formId The Id of the form.
176 * @param callingUid Calling uid.
177 * @param info Form configure info.
178 * @param wantParams WantParams of the request.
179 * @param remoteObject Form provider proxy object.
180 */
PostUpdateTaskToHost(const int64_t formId,const FormRecord & record,const sptr<IRemoteObject> & remoteObject)181 void FormTaskMgr::PostUpdateTaskToHost(const int64_t formId, const FormRecord &record,
182 const sptr<IRemoteObject> &remoteObject)
183 {
184 HILOG_INFO("call");
185
186 if (serialQueue_ == nullptr) {
187 HILOG_ERROR("serialQueue_ invalidate");
188 return;
189 }
190
191 HILOG_DEBUG("post the task of updateTaskToHostFunc");
192 auto updateTaskToHostFunc = [formId, record, remoteObject]() {
193 FormTaskMgr::GetInstance().UpdateTaskToHost(formId, record, remoteObject);
194 };
195 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, updateTaskToHostFunc);
196 }
197
198 /**
199 * @brief Acquire form data from form provider.
200 * @param formId The Id of the form.
201 * @param info Form configure info.
202 * @param wantParams WantParams of the request.
203 * @param remoteObject Form provider proxy object.
204 */
205 /**
206 * @brief Handle form host died(task).
207 * @param remoteHost Form host proxy object.
208 */
PostHostDiedTask(const sptr<IRemoteObject> & remoteHost)209 void FormTaskMgr::PostHostDiedTask(const sptr<IRemoteObject> &remoteHost)
210 {
211 if (serialQueue_ == nullptr) {
212 HILOG_ERROR("null serialQueue_");
213 return;
214 }
215 auto postTaskFunc = [remoteHost]() {
216 FormTaskMgr::GetInstance().HostDied(remoteHost);
217 };
218 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, postTaskFunc);
219 }
220
221 /**
222 * @brief Post event notify to form provider.
223 *
224 * @param formEvent The vector of form ids.
225 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
226 * @param want The want of the form.
227 * @param remoteObject The form provider proxy object.
228 * @return none.
229 */
PostEventNotifyTask(const std::vector<int64_t> & formEvent,const int32_t formVisibleType,const Want & want,const sptr<IRemoteObject> & remoteObject)230 void FormTaskMgr::PostEventNotifyTask(const std::vector<int64_t> &formEvent, const int32_t formVisibleType,
231 const Want &want, const sptr<IRemoteObject> &remoteObject)
232 {
233 if (serialQueue_ == nullptr) {
234 HILOG_ERROR("null serialQueue_");
235 return;
236 }
237 auto eventNotifyFunc = [formEvent, formVisibleType, want, remoteObject]() {
238 FormTaskMgr::GetInstance().EventNotify(formEvent, formVisibleType, want, remoteObject);
239 };
240 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, eventNotifyFunc);
241 }
242 /**
243 * @brief Post provider batch delete.
244 * @param formIds The Id list.
245 * @param want The want of the request.
246 * @param remoteObject Form provider proxy object.
247 */
PostProviderBatchDeleteTask(std::set<int64_t> & formIds,const Want & want,const sptr<IRemoteObject> & remoteObject)248 void FormTaskMgr::PostProviderBatchDeleteTask(std::set<int64_t> &formIds, const Want &want,
249 const sptr<IRemoteObject> &remoteObject)
250 {
251 if (serialQueue_ == nullptr) {
252 HILOG_ERROR("null serialQueue_");
253 return;
254 }
255 auto batchDeleteFunc = [&formIds, want, remoteObject]() {
256 FormTaskMgr::GetInstance().ProviderBatchDelete(formIds, want, remoteObject);
257 };
258 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, batchDeleteFunc);
259 }
260 /**
261 * @brief Post message event to form provider.
262 * @param formId The Id of the from.
263 * @param message Event message.
264 * @param want The want of the request.
265 * @param remoteObject Form provider proxy object.
266 */
PostFormEventTask(const int64_t formId,const std::string & message,const Want & want,const sptr<IRemoteObject> & remoteObject)267 void FormTaskMgr::PostFormEventTask(const int64_t formId, const std::string &message,
268 const Want &want, const sptr<IRemoteObject> &remoteObject)
269 {
270 if (serialQueue_ == nullptr) {
271 HILOG_ERROR("null serialQueue_");
272 return;
273 }
274 auto formEventFunc = [formId, message, want, remoteObject]() {
275 FormTaskMgr::GetInstance().FireFormEvent(formId, message, want, remoteObject);
276 };
277 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, formEventFunc);
278 }
279
280 /**
281 * @brief Post acquire state to form provider.
282 * @param wantArg The want of onAcquireFormState.
283 * @param provider The provider info.
284 * @param want The want of the request.
285 * @param remoteObject Form provider proxy object.
286 */
PostAcquireStateTask(const Want & wantArg,const std::string & provider,const Want & want,const sptr<IRemoteObject> & remoteObject)287 void FormTaskMgr::PostAcquireStateTask(const Want &wantArg, const std::string &provider, const Want &want,
288 const sptr<IRemoteObject> &remoteObject)
289 {
290 if (serialQueue_ == nullptr) {
291 HILOG_ERROR("null serialQueue_");
292 return;
293 }
294 auto acquireStateFunc = [wantArg, provider, want, remoteObject]() {
295 FormTaskMgr::GetInstance().AcquireState(wantArg, provider, want, remoteObject);
296 };
297 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, acquireStateFunc);
298 }
299
300 /**
301 * @brief Post acquire data to form provider.
302 * @param formId The Id of the from.
303 * @param want The want of the request.
304 * @param remoteObject Form provider proxy object.
305 */
PostAcquireDataTask(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)306 void FormTaskMgr::PostAcquireDataTask(const int64_t formId, const Want &want,
307 const sptr<IRemoteObject> &remoteObject)
308 {
309 if (serialQueue_ == nullptr) {
310 HILOG_ERROR("serialQueue_ invalidate");
311 return;
312 }
313 auto acquireDataFunc = [formId, want, remoteObject]() {
314 FormTaskMgr::GetInstance().AcquireFormData(formId, want, remoteObject);
315 };
316 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, acquireDataFunc);
317 }
318
319 /**
320 * @brief Post uninstall message to form host(task).
321 * @param formIds The Id list of the forms.
322 * @param remoteObject Form provider proxy object.
323 */
PostUninstallTaskToHost(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & remoteObject)324 void FormTaskMgr::PostUninstallTaskToHost(const std::vector<int64_t> &formIds, const sptr<IRemoteObject> &remoteObject)
325 {
326 HILOG_INFO("start");
327 if (serialQueue_ == nullptr) {
328 HILOG_ERROR("null serialQueue_");
329 return;
330 }
331 auto uninstallFunc = [formIds, remoteObject]() {
332 FormTaskMgr::GetInstance().FormUninstall(formIds, remoteObject);
333 };
334 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, uninstallFunc);
335 HILOG_INFO("end");
336 }
337
338 /**
339 * @brief Post acquire form state message to form host(task).
340 * @param state The form state.
341 * @param want The want of onAcquireFormState.
342 * @param remoteObject Form provider proxy object.
343 */
PostAcquireStateTaskToHost(AppExecFwk::FormState state,const AAFwk::Want & want,const sptr<IRemoteObject> & remoteObject)344 void FormTaskMgr::PostAcquireStateTaskToHost(AppExecFwk::FormState state, const AAFwk::Want &want,
345 const sptr<IRemoteObject> &remoteObject)
346 {
347 HILOG_INFO("start");
348 if (serialQueue_ == nullptr) {
349 HILOG_ERROR("null serialQueue_");
350 return;
351 }
352 auto acquireStateFunc = [state, want, remoteObject]() {
353 FormTaskMgr::GetInstance().AcquireStateBack(state, want, remoteObject);
354 };
355 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, acquireStateFunc);
356 HILOG_INFO("end");
357 }
358
PostFormShareSendResponse(int64_t formShareRequestCode,int32_t result)359 void FormTaskMgr::PostFormShareSendResponse(int64_t formShareRequestCode, int32_t result)
360 {
361 HILOG_INFO("start");
362 if (serialQueue_ == nullptr) {
363 HILOG_ERROR("null serialQueue_");
364 return;
365 }
366
367 auto formShareSendResponseFunc = [formShareRequestCode, result]() {
368 FormTaskMgr::GetInstance().FormShareSendResponse(formShareRequestCode, result);
369 };
370 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, formShareSendResponseFunc);
371 HILOG_INFO("end");
372 }
373
PostAddTaskToHost(const std::string bundleName,const sptr<IRemoteObject> & remoteObject,const RunningFormInfo & runningFormInfo)374 void FormTaskMgr::PostAddTaskToHost(const std::string bundleName,
375 const sptr<IRemoteObject> &remoteObject, const RunningFormInfo &runningFormInfo)
376 {
377 HILOG_DEBUG("start");
378 if (serialQueue_ == nullptr) {
379 HILOG_ERROR("serialQueue_ invalidate");
380 return;
381 }
382 auto addFunc = [bundleName, remoteObject, runningFormInfo]() {
383 FormTaskMgr::GetInstance().FormAdd(bundleName, remoteObject, runningFormInfo);
384 };
385 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, addFunc);
386 HILOG_DEBUG("end");
387 }
388
PostRemoveTaskToHost(const std::string bundleName,const sptr<IRemoteObject> & remoteObject,const RunningFormInfo & runningFormInfo)389 void FormTaskMgr::PostRemoveTaskToHost(const std::string bundleName,
390 const sptr<IRemoteObject> &remoteObject, const RunningFormInfo &runningFormInfo)
391 {
392 HILOG_DEBUG("start");
393 if (serialQueue_ == nullptr) {
394 HILOG_ERROR("serialQueue_ invalidate");
395 return;
396 }
397 auto removeFunc = [bundleName, remoteObject, runningFormInfo]() {
398 FormTaskMgr::GetInstance().FormRemove(bundleName, remoteObject, runningFormInfo);
399 };
400 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, removeFunc);
401 HILOG_DEBUG("end");
402 }
403
PostEnterpriseAppInstallFailedRetryTask(const int64_t formId,const Want & want,bool isVisibleToFresh)404 void FormTaskMgr::PostEnterpriseAppInstallFailedRetryTask(const int64_t formId, const Want &want, bool isVisibleToFresh)
405 {
406 HILOG_DEBUG("start");
407 if (serialQueue_ == nullptr) {
408 HILOG_ERROR("serialQueue_ invalidate");
409 return;
410 }
411 auto refreshForm = [formId, want, isVisibleToFresh]() {
412 FormProviderMgr::GetInstance().RefreshForm(formId, want, isVisibleToFresh);
413 };
414 serialQueue_->ScheduleTask(ENTERPRISE_APP_INSTALL_FAILED_DELAY_TIME, refreshForm);
415 HILOG_DEBUG("end");
416 }
417
FormAdd(const std::string bundleName,const sptr<IRemoteObject> & remoteObject,const RunningFormInfo & runningFormInfo)418 void FormTaskMgr::FormAdd(const std::string bundleName, const sptr<IRemoteObject> &remoteObject,
419 const RunningFormInfo &runningFormInfo)
420 {
421 HILOG_DEBUG("start");
422 sptr<AbilityRuntime::IJsFormStateObserver> remoteJsFormStateObserver =
423 iface_cast<AbilityRuntime::IJsFormStateObserver>(remoteObject);
424 if (remoteJsFormStateObserver == nullptr) {
425 HILOG_ERROR("get jsFormStateObserverProxy failed");
426 return;
427 }
428 remoteJsFormStateObserver->OnAddForm(bundleName, runningFormInfo);
429 HILOG_DEBUG("end");
430 }
431
FormRemove(const std::string bundleName,const sptr<IRemoteObject> & remoteObject,const RunningFormInfo & runningFormInfo)432 void FormTaskMgr::FormRemove(const std::string bundleName, const sptr<IRemoteObject> &remoteObject,
433 const RunningFormInfo &runningFormInfo)
434 {
435 HILOG_DEBUG("start");
436 sptr<AbilityRuntime::IJsFormStateObserver> remoteJsFormStateObserver =
437 iface_cast<AbilityRuntime::IJsFormStateObserver>(remoteObject);
438 if (remoteJsFormStateObserver == nullptr) {
439 HILOG_ERROR("get jsFormStateObserverProxy failed");
440 return;
441 }
442 remoteJsFormStateObserver->OnRemoveForm(bundleName, runningFormInfo);
443 HILOG_DEBUG("end");
444 }
445
AcquireProviderFormInfo(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)446 void FormTaskMgr::AcquireProviderFormInfo(const int64_t formId, const Want &want,
447 const sptr<IRemoteObject> &remoteObject)
448 {
449 FormMgrAdapter::GetInstance().AcquireProviderFormInfo(formId, want, remoteObject);
450 }
451
AcquireShareFormData(int64_t formId,const std::string & remoteDeviceId,const Want & want,const sptr<IRemoteObject> & remoteObject)452 void FormTaskMgr::AcquireShareFormData(int64_t formId, const std::string &remoteDeviceId,
453 const Want &want, const sptr<IRemoteObject> &remoteObject)
454 {
455 DelayedSingleton<FormShareMgr>::GetInstance()->AcquireShareFormData(formId, remoteDeviceId, want, remoteObject);
456 }
457 /**
458 * @brief Notify form provider for delete form.
459 *
460 * @param formId The Id of the from.
461 * @param want The want of the form.
462 * @param remoteObject Form provider proxy object.
463 * @return none.
464 */
NotifyFormDelete(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)465 void FormTaskMgr::NotifyFormDelete(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
466 {
467 FormMgrAdapter::GetInstance().NotifyFormDelete(formId, want, remoteObject);
468 }
469
470 /**
471 * @brief Notify form provider for updating form.
472 *
473 * @param formId The Id of the from.
474 * @param want The want of the form.
475 * @param remoteObject Form provider proxy object.
476 * @return none.
477 */
NotifyFormUpdate(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)478 void FormTaskMgr::NotifyFormUpdate(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
479 {
480 HILOG_INFO("call");
481
482 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
483 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
484 if (formProviderProxy == nullptr) {
485 RemoveConnection(connectId);
486 HILOG_ERROR("get formProviderProxy failed");
487 return;
488 }
489 int error = formProviderProxy->NotifyFormUpdate(formId, want, FormSupplyCallback::GetInstance());
490 if (error != ERR_OK) {
491 RemoveConnection(connectId);
492 HILOG_ERROR("fail notify form update");
493 }
494 }
495
496 /**
497 * @brief Event notify to form provider.
498 *
499 * @param formEvents The vector of form ids.
500 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
501 * @param want The want of the form.
502 * @param remoteObject The form provider proxy object.
503 * @return none.
504 */
EventNotify(const std::vector<int64_t> & formEvents,const int32_t formVisibleType,const Want & want,const sptr<IRemoteObject> & remoteObject)505 void FormTaskMgr::EventNotify(const std::vector<int64_t> &formEvents, const int32_t formVisibleType,
506 const Want &want, const sptr<IRemoteObject> &remoteObject)
507 {
508 HILOG_INFO("call");
509
510 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
511 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
512 if (formProviderProxy == nullptr) {
513 RemoveConnection(connectId);
514 HILOG_ERROR("get formProviderProxy failed");
515 return;
516 }
517
518 int error = formProviderProxy->EventNotify(formEvents, formVisibleType, want, FormSupplyCallback::GetInstance());
519 if (error != ERR_OK) {
520 RemoveConnection(connectId);
521 HILOG_ERROR("fail send event notify");
522 }
523 }
524
525 /**
526 * @brief Notify form provider for cast temp form.
527 *
528 * @param formId The Id of the from.
529 * @param want The want of the form.
530 * @param remoteObject Form provider proxy object.
531 * @return none.
532 */
NotifyCastTemp(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)533 void FormTaskMgr::NotifyCastTemp(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
534 {
535 HILOG_INFO("call");
536
537 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
538 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
539 if (formProviderProxy == nullptr) {
540 RemoveConnection(connectId);
541 HILOG_ERROR("get formProviderProxy failed");
542 return;
543 }
544
545 int error = formProviderProxy->NotifyFormCastTempForm(formId, want, FormSupplyCallback::GetInstance());
546 if (error != ERR_OK) {
547 RemoveConnection(connectId);
548 HILOG_ERROR("acquire providerFormInfo failed");
549 }
550 }
551
552 /**
553 * @brief Post form data to form host when acquire form.
554 * @param formId The Id of the form.
555 * @param callingUid Calling uid.
556 * @param info Form configure info.
557 * @param wantParams WantParams of the request.
558 * @param remoteObject Form provider proxy object.
559 */
AcquireTaskToHost(const int64_t formId,const FormRecord & record,const sptr<IRemoteObject> & remoteObject)560 void FormTaskMgr::AcquireTaskToHost(const int64_t formId, const FormRecord &record,
561 const sptr<IRemoteObject> &remoteObject)
562 {
563 HILOG_INFO("formId:%{public}" PRId64, formId);
564
565 sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(remoteObject);
566 if (remoteFormHost == nullptr) {
567 HILOG_ERROR("get formHostProxy failed");
568 return;
569 }
570
571 HILOG_DEBUG("FormTaskMgr remoteFormHost OnAcquired");
572 remoteFormHost->OnAcquired(CreateFormJsInfo(formId, record), nullptr);
573 }
574
575 /**
576 * @brief Post form data to form host when update form.
577 * @param formId The Id of the form.
578 * @param callingUid Calling uid.
579 * @param info Form configure info.
580 * @param wantParams WantParams of the request.
581 * @param remoteObject Form provider proxy object.
582 */
UpdateTaskToHost(const int64_t formId,const FormRecord & record,const sptr<IRemoteObject> & remoteObject)583 void FormTaskMgr::UpdateTaskToHost(const int64_t formId, const FormRecord &record,
584 const sptr<IRemoteObject> &remoteObject)
585 {
586 HILOG_INFO("start");
587
588 sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(remoteObject);
589 if (remoteFormHost == nullptr) {
590 HILOG_ERROR("get formHostProxy failed");
591 return;
592 }
593
594 HILOG_DEBUG("FormTaskMgr remoteFormHost OnUpdate");
595 remoteFormHost->OnUpdate(CreateFormJsInfo(formId, record));
596
597 HILOG_INFO("end");
598 }
599
600 /**
601 * @brief Handle form host died.
602 * @param remoteHost Form host proxy object.
603 */
HostDied(const sptr<IRemoteObject> & remoteHost)604 void FormTaskMgr::HostDied(const sptr<IRemoteObject> &remoteHost)
605 {
606 HILOG_INFO("remote client died event");
607 if (remoteHost == nullptr) {
608 HILOG_INFO("remote client died, invalid param");
609 return;
610 }
611 FormDataMgr::GetInstance().HandleHostDied(remoteHost);
612 FormSupplyCallback::GetInstance()->HandleHostDied(remoteHost);
613 }
614 /**
615 * @brief Post provider batch delete.
616 * @param formIds The Id list.
617 * @param want The want of the request.
618 * @param remoteObject Form provider proxy object.
619 */
ProviderBatchDelete(std::set<int64_t> & formIds,const Want & want,const sptr<IRemoteObject> & remoteObject)620 void FormTaskMgr::ProviderBatchDelete(std::set<int64_t> &formIds, const Want &want,
621 const sptr<IRemoteObject> &remoteObject)
622 {
623 HILOG_INFO("start");
624 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
625 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
626 if (formProviderProxy == nullptr) {
627 RemoveConnection(connectId);
628 HILOG_ERROR("Failed to get formProviderProxy");
629 return;
630 }
631 std::vector<int64_t> vFormIds;
632 vFormIds.assign(formIds.begin(), formIds.end());
633 int error = formProviderProxy->NotifyFormsDelete(vFormIds, want, FormSupplyCallback::GetInstance());
634 if (error != ERR_OK) {
635 RemoveConnection(connectId);
636 HILOG_ERROR("fail");
637 }
638 }
639 /**
640 * @brief Fire message event to form provider.
641 * @param formId The Id of the from.
642 * @param message Event message.
643 * @param want The want of the request.
644 * @param remoteObject Form provider proxy object.
645 */
FireFormEvent(const int64_t formId,const std::string & message,const Want & want,const sptr<IRemoteObject> & remoteObject)646 void FormTaskMgr::FireFormEvent(const int64_t formId, const std::string &message, const Want &want,
647 const sptr<IRemoteObject> &remoteObject)
648 {
649 HILOG_INFO("start");
650 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
651 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
652 if (formProviderProxy == nullptr) {
653 RemoveConnection(connectId);
654 HILOG_ERROR("get formProviderProxy failed");
655 return;
656 }
657
658 int error = formProviderProxy->FireFormEvent(formId, message, want, FormSupplyCallback::GetInstance());
659 if (error != ERR_OK) {
660 RemoveConnection(connectId);
661 HILOG_ERROR("fire messageEvent to formProvider failed");
662 }
663 }
664
665 /**
666 * @brief Acquire form state to form provider.
667 * @param wantArg The want of onAcquireFormState.
668 * @param provider The provider info.
669 * @param want The want of the request.
670 * @param remoteObject Form provider proxy object.
671 */
AcquireState(const Want & wantArg,const std::string & provider,const Want & want,const sptr<IRemoteObject> & remoteObject)672 void FormTaskMgr::AcquireState(const Want &wantArg, const std::string &provider, const Want &want,
673 const sptr<IRemoteObject> &remoteObject)
674 {
675 HILOG_INFO("start");
676 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
677 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
678 if (formProviderProxy == nullptr) {
679 RemoveConnection(connectId);
680 HILOG_ERROR("get formProviderProxy failed");
681 return;
682 }
683
684 int error = formProviderProxy->AcquireState(wantArg, provider, want, FormSupplyCallback::GetInstance());
685 if (error != ERR_OK) {
686 RemoveConnection(connectId);
687 HILOG_ERROR("acquire formState failed");
688 }
689 HILOG_INFO("end");
690 }
691
692 /**
693 * @brief Acquire form data to form provider.
694 * @param formId The Id of the form.
695 * @param want The want of the request.
696 * @param remoteObject Form provider proxy object.
697 */
AcquireFormData(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)698 void FormTaskMgr::AcquireFormData(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
699 {
700 HILOG_INFO("start");
701 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
702 int64_t requestCode = static_cast<int64_t>(want.GetLongParam(Constants::FORM_ACQUIRE_DATA_REQUEST_CODE, 0));
703 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
704 if (formProviderProxy == nullptr) {
705 RemoveConnection(connectId);
706 HILOG_ERROR("null formProviderProxy");
707 return;
708 }
709
710 int error = formProviderProxy->AcquireFormData(formId, FormSupplyCallback::GetInstance(), requestCode);
711 if (error != ERR_OK) {
712 RemoveConnection(connectId);
713 HILOG_ERROR("fail acquire formStateToFormProvider");
714 }
715 RemoveConnection(connectId);
716 HILOG_INFO("end");
717 }
718
719 /**
720 * @brief Handle uninstall message.
721 * @param formIds The Id list of the forms.
722 * @param remoteObject Form provider proxy object.
723 */
FormUninstall(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & remoteObject)724 void FormTaskMgr::FormUninstall(const std::vector<int64_t> &formIds,
725 const sptr<IRemoteObject> &remoteObject)
726 {
727 HILOG_INFO("start");
728 sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(remoteObject);
729 if (remoteFormHost == nullptr) {
730 HILOG_ERROR("get formHostProxy failed");
731 return;
732 }
733
734 remoteFormHost->OnUninstall(formIds);
735
736 HILOG_INFO("end");
737 }
738
739 /**
740 * @brief Handle acquire state.
741 * @param state the form state.
742 * @param want The want of onAcquireFormState.
743 * @param remoteObject Form provider proxy object.
744 */
AcquireStateBack(AppExecFwk::FormState state,const AAFwk::Want & want,const sptr<IRemoteObject> & remoteObject)745 void FormTaskMgr::AcquireStateBack(AppExecFwk::FormState state, const AAFwk::Want &want,
746 const sptr<IRemoteObject> &remoteObject)
747 {
748 HILOG_INFO("start");
749 sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(remoteObject);
750 if (remoteFormHost == nullptr) {
751 HILOG_ERROR("get formHostProxy failed");
752 return;
753 }
754
755 remoteFormHost->OnAcquireState(state, want);
756
757 HILOG_INFO("end");
758 }
759
760 /**
761 * @brief Handle acquire data.
762 * @param wantParams Indicates the data information acquired by the form.
763 * @param requestCode Indicates the requested id.
764 * @param remoteObject Form provider proxy object.
765 */
AcquireFormDataBack(const AAFwk::WantParams & wantParams,int64_t requestCode,const sptr<IRemoteObject> & remoteObject)766 void FormTaskMgr::AcquireFormDataBack(const AAFwk::WantParams &wantParams,
767 int64_t requestCode, const sptr<IRemoteObject> &remoteObject)
768 {
769 HILOG_INFO("start");
770 sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(remoteObject);
771 if (remoteFormHost == nullptr) {
772 HILOG_ERROR("get formHostProxy failed");
773 return;
774 }
775
776 remoteFormHost->OnAcquireDataResponse(wantParams, requestCode);
777
778 HILOG_INFO("end");
779 }
780
781 /**
782 * @brief Create form data for form host.
783 * @param formId The Id of the form.
784 * @param record Form record.
785 * @return Form data.
786 */
CreateFormJsInfo(const int64_t formId,const FormRecord & record)787 FormJsInfo FormTaskMgr::CreateFormJsInfo(const int64_t formId, const FormRecord &record)
788 {
789 HILOG_DEBUG("create formJsInfo");
790 FormJsInfo form;
791 form.formId = formId;
792 form.bundleName = record.bundleName;
793 form.abilityName = record.abilityName;
794 form.formName = record.formName;
795 form.moduleName = record.moduleName;
796 form.formTempFlag = record.formTempFlag;
797 form.jsFormCodePath = record.jsFormCodePath;
798 form.formData = record.formProviderInfo.GetFormDataString();
799 form.formProviderData = record.formProviderInfo.GetFormData();
800 form.formSrc = record.formSrc;
801 form.formWindow = record.formWindow;
802 form.type = record.type;
803 form.uiSyntax = record.uiSyntax;
804 form.isDynamic = record.isDynamic;
805 form.transparencyEnabled = record.transparencyEnabled;
806 form.modulePkgNameMap = record.modulePkgNameMap;
807 HILOG_DEBUG("jsPath: %{private}s, data: %{private}s", form.jsFormCodePath.c_str(), form.formData.c_str());
808 return form;
809 }
810
FormShareSendResponse(int64_t formShareRequestCode,int32_t result)811 void FormTaskMgr::FormShareSendResponse(int64_t formShareRequestCode, int32_t result)
812 {
813 auto formShareMgr = DelayedSingleton<FormShareMgr>::GetInstance();
814 if (formShareMgr == nullptr) {
815 HILOG_ERROR("null formShareMgr");
816 return;
817 }
818 formShareMgr->SendResponse(formShareRequestCode, result);
819 }
820
PostRenderForm(const FormRecord & formRecord,const Want & want,const sptr<IRemoteObject> & remoteObject)821 void FormTaskMgr::PostRenderForm(const FormRecord &formRecord, const Want &want,
822 const sptr<IRemoteObject> &remoteObject)
823 {
824 auto renderType = want.GetIntParam(Constants::FORM_UPDATE_TYPE_KEY, Constants::ADD_FORM_UPDATE_FORM);
825 if (renderType != Constants::ADAPTER_UPDATE_FORM
826 || FormDataMgr::GetInstance().GetFormCanUpdate(formRecord.formId)) {
827 FormTaskMgr::GetInstance().InnerPostRenderForm(formRecord, want, remoteObject);
828 return;
829 }
830 auto task = [formRecord, want, remoteObject]() {
831 FormRecord newRecord(formRecord);
832 std::string cacheData;
833 std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
834 bool hasCacheData = FormCacheMgr::GetInstance().GetData(formRecord.formId, cacheData, imageDataMap);
835 if (hasCacheData) {
836 newRecord.formProviderInfo.SetFormDataString(cacheData);
837 newRecord.formProviderInfo.SetImageDataMap(imageDataMap);
838 }
839 FormTaskMgr::GetInstance().InnerPostRenderForm(newRecord, want, remoteObject);
840 };
841 FormRenderMgr::GetInstance().AddPostRenderFormTask(formRecord.formId, task);
842 }
843
InnerPostRenderForm(const FormRecord & formRecord,const Want & want,const sptr<IRemoteObject> & remoteObject)844 void FormTaskMgr::InnerPostRenderForm(const FormRecord &formRecord, const Want &want,
845 const sptr<IRemoteObject> &remoteObject)
846 {
847 HILOG_DEBUG("PostRenderForm");
848 if (serialQueue_ == nullptr) {
849 HILOG_ERROR("null serialQueue_");
850 return;
851 }
852
853 auto renderForm = [formRecord, want, remoteObject]() {
854 FormTaskMgr::GetInstance().RenderForm(formRecord, want, remoteObject);
855 };
856
857 int64_t formId = formRecord.formId;
858 int64_t lastRecoverTime = 0;
859 {
860 std::lock_guard<std::mutex> lock(formRecoverTimesMutex_);
861 if (formLastRecoverTimes.find(formId) != formLastRecoverTimes.end()) {
862 lastRecoverTime = formLastRecoverTimes[formId];
863 formLastRecoverTimes.erase(formId);
864 }
865 }
866 auto hostToken = want.GetRemoteObject(Constants::PARAM_FORM_HOST_TOKEN);
867 int32_t recoverInterval = (int32_t) (FormUtil::GetCurrentMillisecond() - lastRecoverTime);
868 if (lastRecoverTime <= 0 || recoverInterval > FORM_BUILD_DELAY_TIME) {
869 FormCommand renderCommand{
870 formId,
871 std::make_pair(TaskCommandType::RENDER_FORM, formId),
872 FORM_TASK_DELAY_TIME,
873 renderForm};
874 FormStatusQueue::GetInstance().PostFormStatusTask(renderCommand, hostToken);
875 } else {
876 HILOG_INFO("delay render task: %{public}" PRId32 " ms, formId is %{public}" PRId64, recoverInterval, formId);
877 int32_t delayTime = FORM_BUILD_DELAY_TIME - recoverInterval;
878 delayTime = std::min(delayTime, FORM_BUILD_DELAY_TIME);
879 delayTime = std::max(delayTime, FORM_TASK_DELAY_TIME);
880 FormCommand renderCommand{
881 formId,
882 std::make_pair(TaskCommandType::RENDER_FORM, formId),
883 delayTime,
884 renderForm};
885 FormStatusQueue::GetInstance().PostFormStatusTask(renderCommand, hostToken);
886 }
887 HILOG_DEBUG("end");
888 }
889
RenderForm(const FormRecord & formRecord,const Want & want,const sptr<IRemoteObject> & remoteObject)890 void FormTaskMgr::RenderForm(const FormRecord &formRecord, const Want &want, const sptr<IRemoteObject> &remoteObject)
891 {
892 HILOG_INFO("render form");
893 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
894 sptr<IFormRender> remoteFormRender = iface_cast<IFormRender>(remoteObject);
895 if (remoteFormRender == nullptr) {
896 RemoveConnection(connectId);
897 HILOG_ERROR("get formRenderProxy failed");
898 return;
899 }
900
901 FormJsInfo formJsInfo = CreateFormJsInfo(formRecord.formId, formRecord);
902 int32_t error = remoteFormRender->RenderForm(formJsInfo, want, FormSupplyCallback::GetInstance());
903 FormRecordReport::GetInstance().IncreaseUpdateTimes(formRecord.formId, HiSysEventPointType::TYPE_DAILY_REFRESH);
904 if (!formRecord.isVisible) {
905 FormRecordReport::GetInstance().IncreaseUpdateTimes(formRecord.formId,
906 HiSysEventPointType::TYPE_INVISIBLE_UPDATE);
907 }
908 if (error != ERR_OK) {
909 RemoveConnection(connectId);
910 HILOG_ERROR("fail add form renderer");
911 FormStatusMgr::GetInstance().ResetFormStatus(formRecord.formId);
912 return;
913 }
914
915 HILOG_DEBUG("end");
916 }
917
PostStopRenderingForm(const FormRecord & formRecord,const Want & want,const sptr<IRemoteObject> & remoteObject)918 void FormTaskMgr::PostStopRenderingForm(
919 const FormRecord &formRecord, const Want &want, const sptr<IRemoteObject> &remoteObject)
920 {
921 HILOG_INFO("call");
922 if (serialQueue_ == nullptr) {
923 HILOG_ERROR("null serialQueue_");
924 return;
925 }
926 auto formId = formRecord.formId;
927 auto deleterenderForm = [formRecord, want, remoteObject]() {
928 FormTaskMgr::GetInstance().StopRenderingForm(formRecord, want, remoteObject);
929 };
930 {
931 std::lock_guard<std::mutex> lock(formRecoverTimesMutex_);
932 formLastRecoverTimes.erase(formId);
933 }
934 FormCommand deleteCommand{
935 formId,
936 std::make_pair(TaskCommandType::DELETE_FORM, formId),
937 FORM_TASK_DELAY_TIME,
938 deleterenderForm};
939 std::string compId = want.GetStringParam(Constants::FORM_RENDER_COMP_ID);
940 FormStatusQueue::GetInstance().PostFormDeleteTask(deleteCommand, compId);
941 }
942
StopRenderingForm(const FormRecord & formRecord,const Want & want,const sptr<IRemoteObject> & remoteObject)943 void FormTaskMgr::StopRenderingForm(
944 const FormRecord &formRecord, const Want &want, const sptr<IRemoteObject> &remoteObject)
945 {
946 HILOG_INFO("begin");
947 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
948 sptr<IFormRender> remoteFormDeleteRender = iface_cast<IFormRender>(remoteObject);
949 if (remoteFormDeleteRender == nullptr) {
950 RemoveConnection(connectId);
951 HILOG_ERROR("get formRenderProxy failed");
952 return;
953 }
954
955 FormJsInfo formJsInfo = CreateFormJsInfo(formRecord.formId, formRecord);
956 int32_t error = remoteFormDeleteRender->StopRenderingForm(formJsInfo, want, FormSupplyCallback::GetInstance());
957 if (error != ERR_OK) {
958 RemoveConnection(connectId);
959 HILOG_ERROR("fail add form renderer");
960 return;
961 }
962
963 HILOG_INFO("end");
964 }
965
PostReleaseRenderer(int64_t formId,const std::string & compId,const std::string & uid,const sptr<IRemoteObject> & remoteObject,bool isDynamic)966 void FormTaskMgr::PostReleaseRenderer(int64_t formId, const std::string &compId, const std::string &uid,
967 const sptr<IRemoteObject> &remoteObject, bool isDynamic)
968 {
969 HILOG_INFO("begin");
970 if (serialQueue_ == nullptr) {
971 HILOG_ERROR("null serialQueue_");
972 return;
973 }
974
975 auto deleterenderForm = [formId, compId, uid, remoteObject]() {
976 FormTaskMgr::GetInstance().ReleaseRenderer(formId, compId, uid, remoteObject);
977 };
978 {
979 std::lock_guard<std::mutex> lock(formRecoverTimesMutex_);
980 formLastRecoverTimes.erase(formId);
981 }
982 if (!isDynamic) {
983 FormCommand deleteCommand{
984 formId,
985 std::make_pair(TaskCommandType::DELETE_FORM, formId),
986 FORM_TASK_DELAY_TIME,
987 deleterenderForm};
988 FormStatusQueue::GetInstance().PostFormDeleteTask(deleteCommand, compId);
989 } else {
990 FormCommand releaseRenderCommand{
991 formId,
992 std::make_pair(TaskCommandType::RECYCLE_FORM, formId),
993 FORM_TASK_DELAY_TIME,
994 deleterenderForm};
995 FormStatusQueue::GetInstance().PostFormStatusTask(releaseRenderCommand);
996 }
997 HILOG_INFO("end");
998 }
999
ReleaseRenderer(int64_t formId,const std::string & compId,const std::string & uid,const sptr<IRemoteObject> & remoteObject)1000 void FormTaskMgr::ReleaseRenderer(
1001 int64_t formId, const std::string &compId, const std::string &uid, const sptr<IRemoteObject> &remoteObject)
1002 {
1003 HILOG_INFO("begin");
1004 sptr<IFormRender> remoteFormDeleteRender = iface_cast<IFormRender>(remoteObject);
1005 if (remoteFormDeleteRender == nullptr) {
1006 HILOG_ERROR("get formRenderProxy failed");
1007 return;
1008 }
1009
1010 int32_t error = remoteFormDeleteRender->ReleaseRenderer(formId, compId, uid);
1011 if (error != ERR_OK) {
1012 HILOG_ERROR("fail release form renderer");
1013 return;
1014 }
1015 HILOG_INFO("end");
1016 }
1017
ReloadForm(const std::vector<FormRecord> && formRecords,const Want & want,const sptr<IRemoteObject> & remoteObject)1018 void FormTaskMgr::ReloadForm(const std::vector<FormRecord> &&formRecords, const Want &want,
1019 const sptr<IRemoteObject> &remoteObject)
1020 {
1021 HILOG_INFO("begin");
1022 sptr<IFormRender> remoteFormRender = iface_cast<IFormRender>(remoteObject);
1023 if (remoteFormRender == nullptr) {
1024 HILOG_ERROR("get formRenderProxy failed");
1025 return;
1026 }
1027
1028 std::vector<FormJsInfo> formJsInfos;
1029 for (const auto &formRecord : formRecords) {
1030 FormJsInfo formJsInfo = CreateFormJsInfo(formRecord.formId, formRecord);
1031 formJsInfos.emplace_back(formJsInfo);
1032 }
1033
1034 int32_t error = remoteFormRender->ReloadForm(std::move(formJsInfos), want);
1035 if (error != ERR_OK) {
1036 HILOG_ERROR("fail reload form");
1037 return;
1038 }
1039 HILOG_INFO("end");
1040 }
1041
PostReloadForm(const std::vector<FormRecord> && formRecords,const Want & want,const sptr<IRemoteObject> & remoteObject)1042 void FormTaskMgr::PostReloadForm(const std::vector<FormRecord> &&formRecords, const Want &want,
1043 const sptr<IRemoteObject> &remoteObject)
1044 {
1045 HILOG_INFO("begin");
1046 if (serialQueue_ == nullptr) {
1047 HILOG_ERROR("null serialQueue_");
1048 return;
1049 }
1050 auto reloadForm = [forms = std::forward<decltype(formRecords)>(formRecords), want, remoteObject]() {
1051 FormTaskMgr::GetInstance().ReloadForm(std::move(forms), want, remoteObject);
1052 };
1053 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, reloadForm);
1054 HILOG_INFO("end");
1055 }
1056
OnUnlock(const sptr<IRemoteObject> & remoteObject)1057 void FormTaskMgr::OnUnlock(const sptr<IRemoteObject> &remoteObject)
1058 {
1059 HILOG_DEBUG("begin");
1060 sptr<IFormRender> remoteFormRender = iface_cast<IFormRender>(remoteObject);
1061 if (remoteFormRender == nullptr) {
1062 HILOG_ERROR("get formRenderProxy failed");
1063 return;
1064 }
1065 int32_t error = remoteFormRender->OnUnlock();
1066 if (error != ERR_OK) {
1067 HILOG_ERROR("fail");
1068 return;
1069 }
1070 HILOG_DEBUG("end");
1071 }
1072
PostOnUnlock(const sptr<IRemoteObject> & remoteObject)1073 void FormTaskMgr::PostOnUnlock(const sptr<IRemoteObject> &remoteObject)
1074 {
1075 HILOG_DEBUG("call");
1076 if (serialQueue_ == nullptr) {
1077 HILOG_ERROR("null serialQueue_");
1078 return;
1079 }
1080 auto task = [remoteObject]() {
1081 FormTaskMgr::GetInstance().OnUnlock(remoteObject);
1082 };
1083 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, task);
1084 HILOG_DEBUG("end");
1085 }
1086
SetVisibleChange(int64_t formId,bool isVisible,const sptr<IRemoteObject> & remoteObject)1087 void FormTaskMgr::SetVisibleChange(int64_t formId, bool isVisible, const sptr<IRemoteObject> &remoteObject)
1088 {
1089 HILOG_INFO("begin");
1090 sptr<IFormRender> remoteFormRender = iface_cast<IFormRender>(remoteObject);
1091 if (remoteFormRender == nullptr) {
1092 HILOG_ERROR("get formRenderProxy failed");
1093 return;
1094 }
1095
1096 FormRecord formRecord;
1097 if (!FormDataMgr::GetInstance().GetFormRecord(formId, formRecord)) {
1098 HILOG_ERROR("form %{public}" PRId64 " not exist", formId);
1099 return;
1100 }
1101
1102 Want want;
1103 want.SetParam(Constants::FORM_SUPPLY_UID, std::to_string(formRecord.providerUserId) + formRecord.bundleName);
1104
1105 int32_t error = remoteFormRender->SetVisibleChange(formId, isVisible, want);
1106 if (error != ERR_OK) {
1107 HILOG_ERROR("fail");
1108 return;
1109 }
1110 HILOG_INFO("end");
1111 }
1112
PostSetVisibleChange(int64_t formId,bool isVisible,const sptr<IRemoteObject> & remoteObject)1113 void FormTaskMgr::PostSetVisibleChange(int64_t formId, bool isVisible, const sptr<IRemoteObject> &remoteObject)
1114 {
1115 HILOG_INFO("call");
1116 if (serialQueue_ == nullptr) {
1117 HILOG_ERROR("null serialQueue_");
1118 return;
1119 }
1120 auto task = [formId, isVisible, remoteObject]() {
1121 FormTaskMgr::GetInstance().SetVisibleChange(formId, isVisible, remoteObject);
1122 };
1123 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, task);
1124 HILOG_INFO("end");
1125 }
1126
RemoveConnection(int32_t connectId)1127 void FormTaskMgr::RemoveConnection(int32_t connectId)
1128 {
1129 auto formSupplyCallback = FormSupplyCallback::GetInstance();
1130 if (formSupplyCallback == nullptr) {
1131 HILOG_ERROR("formSupplyCallback is nullptr.");
1132 return;
1133 }
1134 formSupplyCallback->RemoveConnection(connectId);
1135 }
1136
1137 /**
1138 * @brief want data from form router event(task).
1139 * @param formId The id of the form.
1140 * @param remoteObject Form router proxy manager object.
1141 * @param want The want of the form for router event.
1142 */
PostRouterProxyToHost(const int64_t formId,const sptr<IRemoteObject> & remoteObject,const Want & want)1143 void FormTaskMgr::PostRouterProxyToHost(const int64_t formId, const sptr<IRemoteObject> &remoteObject, const Want &want)
1144 {
1145 if (serialQueue_ == nullptr) {
1146 HILOG_ERROR("serialQueue_ invalidate");
1147 return;
1148 }
1149
1150 auto routerProxyFunc = [formId, want, remoteObject]() {
1151 FormTaskMgr::GetInstance().FormRouterEventProxy(formId, remoteObject, want);
1152 };
1153 serialQueue_->ScheduleTask(0, routerProxyFunc);
1154 }
1155
1156 /**
1157 * @brief Form router event proxy.
1158 * @param formId The id of the form.
1159 * @param remoteObject Form router proxy manager object.
1160 * @param want The want of the form for router event.
1161 */
FormRouterEventProxy(const int64_t formId,const sptr<IRemoteObject> & remoteObject,const Want & want)1162 void FormTaskMgr::FormRouterEventProxy(const int64_t formId, const sptr<IRemoteObject> &remoteObject, const Want &want)
1163 {
1164 if (remoteObject == nullptr) {
1165 HILOG_ERROR("Fail,null remoteObject");
1166 return;
1167 }
1168
1169 sptr<IFormHostDelegate> remoteFormHostDelegateProxy = iface_cast<IFormHostDelegate>(remoteObject);
1170 if (remoteFormHostDelegateProxy == nullptr) {
1171 HILOG_ERROR("Fail,null remoteFormHostDelegateProxy");
1172 return;
1173 }
1174 remoteFormHostDelegateProxy->RouterEvent(formId, want);
1175 }
1176
1177 /**
1178 * @brief Post Form visible/invisible notify.
1179 * @param formIds the Ids of forms need to notify.
1180 * @param formInstanceMaps formInstances for visibleNotify.
1181 * @param eventMaps eventMaps for event notify.
1182 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
1183 * @param visibleNotifyDelay delay time.
1184 */
PostVisibleNotify(const std::vector<int64_t> & formIds,std::map<std::string,std::vector<FormInstance>> & formInstanceMaps,std::map<std::string,std::vector<int64_t>> & eventMaps,const int32_t formVisibleType,int32_t visibleNotifyDelay,const sptr<IRemoteObject> & callerToken)1185 void FormTaskMgr::PostVisibleNotify(const std::vector<int64_t> &formIds,
1186 std::map<std::string, std::vector<FormInstance>> &formInstanceMaps,
1187 std::map<std::string, std::vector<int64_t>> &eventMaps,
1188 const int32_t formVisibleType, int32_t visibleNotifyDelay,
1189 const sptr<IRemoteObject> &callerToken)
1190 {
1191 HILOG_DEBUG("call");
1192 if (serialQueue_ == nullptr) {
1193 HILOG_ERROR("null serialQueue_");
1194 FormTaskMgr::GetInstance().NotifyVisible(formIds, formInstanceMaps, eventMaps, formVisibleType, callerToken);
1195 return;
1196 }
1197 auto task = [formIds, formInstanceMaps, eventMaps, formVisibleType, callerToken]() {
1198 FormTaskMgr::GetInstance().NotifyVisible(formIds, formInstanceMaps, eventMaps, formVisibleType, callerToken);
1199 };
1200 serialQueue_->ScheduleTask(visibleNotifyDelay, task);
1201 HILOG_DEBUG("end");
1202 }
1203
1204 /**
1205 * @brief Form visible/invisible notify.
1206 * @param formIds the Ids of forms need to notify.
1207 * @param formInstanceMaps formInstances for visibleNotify.
1208 * @param eventMaps eventMaps for event notify.
1209 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
1210 * @param callerToken Caller ability token.
1211 */
NotifyVisible(const std::vector<int64_t> & formIds,std::map<std::string,std::vector<FormInstance>> formInstanceMaps,std::map<std::string,std::vector<int64_t>> eventMaps,const int32_t formVisibleType,const sptr<IRemoteObject> & callerToken)1212 void FormTaskMgr::NotifyVisible(const std::vector<int64_t> &formIds,
1213 std::map<std::string, std::vector<FormInstance>> formInstanceMaps,
1214 std::map<std::string, std::vector<int64_t>> eventMaps, const int32_t formVisibleType,
1215 const sptr<IRemoteObject> &callerToken)
1216 {
1217 HILOG_INFO("call");
1218 FormMgrAdapter::GetInstance().HandlerNotifyWhetherVisibleForms(formIds,
1219 formInstanceMaps, eventMaps, formVisibleType, callerToken);
1220 }
1221
1222 /**
1223 * @brief Post recycle forms.
1224 * @param formIds the Ids of forms to be recycled.
1225 * @param want The want of the request.
1226 * @param remoteObjectOfHost Form host proxy object.
1227 * @param remoteObjectOfRender Form render proxy object.
1228 */
PostRecycleForms(const std::vector<int64_t> & formIds,const Want & want,const sptr<IRemoteObject> & remoteObjectOfHost,const sptr<IRemoteObject> & remoteObjectOfRender)1229 void FormTaskMgr::PostRecycleForms(const std::vector<int64_t> &formIds, const Want &want,
1230 const sptr<IRemoteObject> &remoteObjectOfHost, const sptr<IRemoteObject> &remoteObjectOfRender)
1231 {
1232 HILOG_DEBUG("start");
1233 if (serialQueue_ == nullptr) {
1234 HILOG_ERROR("null serialQueue_");
1235 return;
1236 }
1237
1238 auto delayTime = want.GetIntParam(Constants::FORM_DELAY_TIME_OF_RECYCLE, FORM_TASK_DELAY_TIME);
1239 for (const int64_t &formId : formIds) {
1240 auto recycleForm = [formId, remoteObjectOfHost, remoteObjectOfRender]() {
1241 FormTaskMgr::GetInstance().RecycleForm(formId, remoteObjectOfHost, remoteObjectOfRender);
1242 };
1243 {
1244 std::lock_guard<std::mutex> lock(formRecoverTimesMutex_);
1245 formLastRecoverTimes.erase(formId);
1246 }
1247 serialQueue_->ScheduleDelayTask(
1248 std::make_pair((int64_t)TaskType::RECYCLE_FORM, formId), delayTime, recycleForm);
1249 }
1250 HILOG_DEBUG("end");
1251 }
1252
1253 /**
1254 * @brief Handle recycle form message.
1255 * @param formId The Id of form to be recycled.
1256 * @param remoteObjectOfHost Form host proxy object.
1257 * @param remoteObjectOfRender Form render proxy object.
1258 */
RecycleForm(const int64_t & formId,const sptr<IRemoteObject> & remoteObjectOfHost,const sptr<IRemoteObject> & remoteObjectOfRender)1259 void FormTaskMgr::RecycleForm(const int64_t &formId, const sptr<IRemoteObject> &remoteObjectOfHost,
1260 const sptr<IRemoteObject> &remoteObjectOfRender)
1261 {
1262 HILOG_INFO("start");
1263
1264 sptr<IFormRender> remoteFormRender = iface_cast<IFormRender>(remoteObjectOfRender);
1265 if (remoteFormRender == nullptr) {
1266 HILOG_ERROR("fail get form render proxy, formId is %{public}" PRId64, formId);
1267 return;
1268 }
1269
1270 FormRecord formRecord;
1271 if (!FormDataMgr::GetInstance().GetFormRecord(formId, formRecord)) {
1272 HILOG_ERROR("form %{public}" PRId64 " not exist", formId);
1273 return;
1274 }
1275 if (formRecord.recycleStatus != RecycleStatus::RECYCLABLE) {
1276 HILOG_ERROR("form %{public}" PRId64 " not RECYCLABLE", formId);
1277 return;
1278 }
1279
1280 Want want;
1281 want.SetParam(Constants::FORM_SUPPLY_UID, std::to_string(formRecord.providerUserId) + formRecord.bundleName);
1282 want.SetParam(Constants::PARAM_FORM_HOST_TOKEN, remoteObjectOfHost);
1283 int32_t error = remoteFormRender->RecycleForm(formId, want);
1284 if (error != ERR_OK) {
1285 HILOG_ERROR("fail");
1286 return;
1287 }
1288 }
1289
1290 /**
1291 * @brief Post recover forms.
1292 * @param formIds the Ids of forms to be recycled.
1293 * @param want The want of the request.
1294 * @param remoteObject Form render proxy object.
1295 */
PostRecoverForm(const FormRecord & record,const Want & want,const sptr<IRemoteObject> & remoteObject)1296 void FormTaskMgr::PostRecoverForm(const FormRecord &record, const Want &want, const sptr<IRemoteObject> &remoteObject)
1297 {
1298 HILOG_DEBUG("start");
1299 if (serialQueue_ == nullptr) {
1300 HILOG_ERROR("null serialQueue_");
1301 return;
1302 }
1303
1304 auto formId = record.formId;
1305 auto recoverForm = [record, want, remoteObject]() {
1306 FormTaskMgr::GetInstance().RecoverForm(record, want, remoteObject);
1307 };
1308 {
1309 std::lock_guard<std::mutex> lock(formRecoverTimesMutex_);
1310 formLastRecoverTimes[formId] = FormUtil::GetCurrentMillisecond();
1311 }
1312 auto hostToken = want.GetRemoteObject(Constants::PARAM_FORM_HOST_TOKEN);
1313 FormCommand recoverCommand{
1314 formId,
1315 std::make_pair(TaskCommandType::RECOVER_FORM, formId),
1316 FORM_TASK_DELAY_TIME,
1317 recoverForm};
1318 FormStatusQueue::GetInstance().PostFormStatusTask(recoverCommand, hostToken);
1319 HILOG_DEBUG("end");
1320 }
1321
1322 /**
1323 * @brief Handle recover form message.
1324 * @param formId The Id of form to be recovered.
1325 * @param want The want of the request.
1326 * @param remoteObject Form render proxy object.
1327 */
RecoverForm(const FormRecord & record,const Want & want,const sptr<IRemoteObject> & remoteObject)1328 void FormTaskMgr::RecoverForm(const FormRecord &record, const Want &want, const sptr<IRemoteObject> &remoteObject)
1329 {
1330 HILOG_INFO("start");
1331 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
1332 sptr<IFormRender> remoteFormRender = iface_cast<IFormRender>(remoteObject);
1333 if (remoteFormRender == nullptr) {
1334 RemoveConnection(connectId);
1335 HILOG_ERROR("get formRenderProxy failed");
1336 return;
1337 }
1338
1339 FormJsInfo formJsInfo = CreateFormJsInfo(record.formId, record);
1340 int32_t error = remoteFormRender->RecoverForm(formJsInfo, want);
1341 if (error != ERR_OK) {
1342 RemoveConnection(connectId);
1343 HILOG_ERROR("fail recover form");
1344 FormStatusMgr::GetInstance().ResetFormStatus(record.formId);
1345 return;
1346 }
1347
1348 HILOG_DEBUG("end");
1349 }
1350 /**
1351 * @brief post delay RecheckWhetherNeedCleanFormHost task.
1352 * @param callerUid The calleruid of FormHostRecord of vector<FormHostRecord> clientRecords_.
1353 * @param remoteObjectOfHost The client stub of the form host record.
1354 */
PostDelayRecheckWhetherNeedCleanFormHostTask(const int callerUid,const sptr<IRemoteObject> & remoteObjectOfHost)1355 void FormTaskMgr::PostDelayRecheckWhetherNeedCleanFormHostTask(
1356 const int callerUid, const sptr<IRemoteObject> &remoteObjectOfHost)
1357 {
1358 HILOG_DEBUG("start");
1359 if (serialQueue_ == nullptr) {
1360 HILOG_ERROR("null serialQueue_");
1361 return;
1362 }
1363 auto recheckWhetherNeedCleanFormHost = [remoteObjectOfHost]() {
1364 FormDataMgr::GetInstance().RecheckWhetherNeedCleanFormHost(remoteObjectOfHost);
1365 };
1366 serialQueue_->ScheduleDelayTask(
1367 std::make_pair((int64_t)TaskType::DELETE_FORM_HOST_RECORD, static_cast<int64_t>(callerUid)),
1368 CLEAN_FORM_HOST_TASK_DELAY_TIME,
1369 recheckWhetherNeedCleanFormHost);
1370 HILOG_DEBUG("end");
1371 }
1372 /**
1373 * @brief Cancel delay task.
1374 * @param eventMsg Delay Task.
1375 */
CancelDelayTask(const std::pair<int64_t,int64_t> & eventMsg)1376 void FormTaskMgr::CancelDelayTask(const std::pair<int64_t, int64_t> &eventMsg)
1377 {
1378 HILOG_DEBUG("cancel delay task: <%{public}" PRId64",%{public}" PRId64">.",
1379 eventMsg.first, eventMsg.second);
1380 if (serialQueue_ == nullptr) {
1381 HILOG_ERROR("null serialQueue_");
1382 return;
1383 }
1384
1385 serialQueue_->CancelDelayTask(eventMsg);
1386 HILOG_DEBUG("end");
1387 }
1388
PostFormClickEventToHost(const std::string & bundleName,const std::string & formEventType,const sptr<IRemoteObject> & remoteObject,const RunningFormInfo & runningFormInfo)1389 void FormTaskMgr::PostFormClickEventToHost(
1390 const std::string &bundleName, const std::string &formEventType, const sptr<IRemoteObject> &remoteObject,
1391 const RunningFormInfo &runningFormInfo)
1392 {
1393 HILOG_DEBUG("call");
1394 if (serialQueue_ == nullptr) {
1395 HILOG_ERROR("serialQueue_ invalidate");
1396 return;
1397 }
1398 auto task = [bundleName, formEventType, remoteObject, runningFormInfo]() {
1399 if (remoteObject == nullptr) {
1400 HILOG_ERROR("null remoteObject");
1401 return;
1402 }
1403 FormTaskMgr::GetInstance().FormClickEvent(bundleName, formEventType, remoteObject, runningFormInfo);
1404 };
1405 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, task);
1406 }
1407
FormClickEvent(const std::string & bundleName,const std::string & formEventType,const sptr<IRemoteObject> & remoteObject,const RunningFormInfo & runningFormInfo)1408 void FormTaskMgr::FormClickEvent(const std::string &bundleName, const std::string &formEventType,
1409 const sptr<IRemoteObject> &remoteObject, const RunningFormInfo &runningFormInfo)
1410 {
1411 HILOG_DEBUG("call");
1412 sptr<AbilityRuntime::IJsFormStateObserver> remoteJsFormStateObserver =
1413 iface_cast<AbilityRuntime::IJsFormStateObserver>(remoteObject);
1414 if (remoteJsFormStateObserver == nullptr) {
1415 HILOG_ERROR("fail get js form state observer proxy");
1416 return;
1417 }
1418
1419 remoteJsFormStateObserver->OnFormClickEvent(bundleName, formEventType, runningFormInfo);
1420 }
1421
PostBatchRefreshForms(const int32_t formRefreshType)1422 void FormTaskMgr::PostBatchRefreshForms(const int32_t formRefreshType)
1423 {
1424 HILOG_DEBUG("start");
1425 if (serialQueue_ == nullptr) {
1426 HILOG_ERROR("null serialQueue_");
1427 return;
1428 }
1429
1430 auto batchRefreshForms = [formRefreshType]() {
1431 return FormMgrAdapter::GetInstance().BatchRefreshForms(formRefreshType);
1432 };
1433 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, batchRefreshForms);
1434 HILOG_DEBUG("end");
1435 }
1436
PostEnableFormsTaskToHost(const std::vector<int64_t> & formIds,const bool enable,const sptr<IRemoteObject> & remoteObject)1437 void FormTaskMgr::PostEnableFormsTaskToHost(const std::vector<int64_t> &formIds, const bool enable,
1438 const sptr<IRemoteObject> &remoteObject)
1439 {
1440 HILOG_DEBUG("call");
1441 if (serialQueue_ == nullptr) {
1442 HILOG_ERROR("serialQueue_ invalidate");
1443 return;
1444 }
1445
1446 auto enableFormsTaskToHostFunc = [formIds, enable, remoteObject]() {
1447 FormTaskMgr::GetInstance().EnableFormsTaskToHost(formIds, enable, remoteObject);
1448 };
1449 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, enableFormsTaskToHostFunc);
1450 }
1451
EnableFormsTaskToHost(const std::vector<int64_t> & formIds,const bool enable,const sptr<IRemoteObject> & remoteObject)1452 void FormTaskMgr::EnableFormsTaskToHost(const std::vector<int64_t> &formIds, const bool enable,
1453 const sptr<IRemoteObject> &remoteObject)
1454 {
1455 HILOG_DEBUG("start");
1456 sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(remoteObject);
1457 if (remoteFormHost == nullptr) {
1458 HILOG_ERROR("get formHostProxy failed");
1459 return;
1460 }
1461
1462 remoteFormHost->OnEnableForm(formIds, enable);
1463 HILOG_DEBUG("end");
1464 }
1465
PostLockFormsTaskToHost(const std::vector<int64_t> & formIds,const bool lock,const sptr<IRemoteObject> & remoteObject)1466 void FormTaskMgr::PostLockFormsTaskToHost(const std::vector<int64_t> &formIds, const bool lock,
1467 const sptr<IRemoteObject> &remoteObject)
1468 {
1469 HILOG_DEBUG("call");
1470 if (serialQueue_ == nullptr) {
1471 HILOG_ERROR("serialQueue_ invalidate");
1472 return;
1473 }
1474
1475 auto lockFormsTaskToHostFunc = [formIds, lock, remoteObject]() {
1476 FormTaskMgr::GetInstance().LockFormsTaskToHost(formIds, lock, remoteObject);
1477 };
1478 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, lockFormsTaskToHostFunc);
1479 }
1480
LockFormsTaskToHost(const std::vector<int64_t> & formIds,const bool lock,const sptr<IRemoteObject> & remoteObject)1481 void FormTaskMgr::LockFormsTaskToHost(const std::vector<int64_t> &formIds, const bool lock,
1482 const sptr<IRemoteObject> &remoteObject)
1483 {
1484 HILOG_DEBUG("start");
1485 HILOG_INFO("LockFormsTaskToHost start");
1486 sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(remoteObject);
1487 if (remoteFormHost == nullptr) {
1488 HILOG_ERROR("get formHostProxy failed");
1489 return;
1490 }
1491
1492 remoteFormHost->OnLockForm(formIds, lock);
1493 HILOG_DEBUG("end");
1494 }
1495
PostTask(const std::function<void ()> & func,uint64_t delayMs)1496 void FormTaskMgr::PostTask(const std::function<void()> &func, uint64_t delayMs)
1497 {
1498 if (!func) {
1499 HILOG_ERROR("Invalid input function");
1500 return;
1501 }
1502
1503 if (serialQueue_ == nullptr) {
1504 HILOG_ERROR("Invalid serialQueue_");
1505 return;
1506 }
1507
1508 serialQueue_->ScheduleTask(delayMs, func);
1509 }
1510
PostFrsDiedTaskToHost(const sptr<IRemoteObject> & remoteObject)1511 void FormTaskMgr::PostFrsDiedTaskToHost(const sptr<IRemoteObject> &remoteObject)
1512 {
1513 if (serialQueue_ == nullptr) {
1514 HILOG_ERROR("serialQueue_ invalidate");
1515 return;
1516 }
1517 auto task = [remoteObject]() {
1518 FormTaskMgr::GetInstance().FrsDiedTaskToHost(remoteObject);
1519 };
1520 serialQueue_->ScheduleTask(FORM_FRS_DIED_TASK_DELAY_TIME, task);
1521 }
1522
FrsDiedTaskToHost(const sptr<IRemoteObject> & remoteObject)1523 void FormTaskMgr::FrsDiedTaskToHost(const sptr<IRemoteObject> &remoteObject)
1524 {
1525 HILOG_INFO("call");
1526
1527 sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(remoteObject);
1528 if (remoteFormHost == nullptr) {
1529 HILOG_ERROR("get formHostProxy failed");
1530 return;
1531 }
1532
1533 remoteFormHost->OnError(ERR_APPEXECFWK_FORM_RENDER_SERVICE_DIED, "FormRenderService is dead.");
1534 }
1535
PostUpdateFormSize(const int64_t & formId,float width,float height,float borderWidth,const std::string & uid,const sptr<IRemoteObject> & remoteObject)1536 void FormTaskMgr::PostUpdateFormSize(const int64_t &formId, float width, float height, float borderWidth,
1537 const std::string &uid, const sptr<IRemoteObject> &remoteObject)
1538 {
1539 HILOG_DEBUG("start");
1540 if (serialQueue_ == nullptr) {
1541 HILOG_ERROR("null serialQueue_");
1542 return;
1543 }
1544
1545 auto updateFormSize = [formId, width, height, borderWidth, uid, remoteObject]() {
1546 FormTaskMgr::GetInstance().UpdateFormSize(formId, width, height, borderWidth, uid, remoteObject);
1547 };
1548 serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, updateFormSize);
1549 HILOG_DEBUG("end");
1550 }
1551
UpdateFormSize(const int64_t & formId,float width,float height,float borderWidth,const std::string & uid,const sptr<IRemoteObject> & remoteObject)1552 void FormTaskMgr::UpdateFormSize(const int64_t &formId, float width, float height, float borderWidth,
1553 const std::string &uid, const sptr<IRemoteObject> &remoteObject)
1554 {
1555 HILOG_DEBUG("start");
1556 sptr<IFormRender> remoteFormRender = iface_cast<IFormRender>(remoteObject);
1557 if (remoteFormRender == nullptr) {
1558 HILOG_ERROR("get formRenderProxy failed");
1559 return;
1560 }
1561
1562 int32_t error = remoteFormRender->UpdateFormSize(formId, width, height, borderWidth, uid);
1563 if (error != ERR_OK) {
1564 HILOG_ERROR("fail Update FormSize");
1565 return;
1566 }
1567
1568 HILOG_DEBUG("end");
1569 }
PostConnectNetWork()1570 void FormTaskMgr::PostConnectNetWork()
1571 {
1572 HILOG_DEBUG("start");
1573 if (serialQueue_ == nullptr) {
1574 HILOG_ERROR("null serialQueue_");
1575 return;
1576 }
1577
1578 auto connectNetWork = []() {
1579 FormTaskMgr::GetInstance().ConnectNetWork();
1580 };
1581 serialQueue_->ScheduleTask(FORM_CON_NETWORK_DELAY_TIME, connectNetWork);
1582 HILOG_DEBUG("end");
1583 }
1584
ConnectNetWork()1585 void FormTaskMgr::ConnectNetWork()
1586 {
1587 HILOG_INFO("call");
1588 DelayedSingleton<FormMgrService>::GetInstance()->SubscribeNetConn();
1589 }
1590
PostDelayRefreshForms(const std::vector<FormRecord> updatedForms,const Want & want)1591 void FormTaskMgr::PostDelayRefreshForms(const std::vector<FormRecord> updatedForms, const Want &want)
1592 {
1593 HILOG_INFO("start");
1594 if (serialQueue_ == nullptr) {
1595 HILOG_ERROR("serialQueue_ invalidate");
1596 return;
1597 }
1598 auto delayRefreshForms = [updatedForms, want]() {
1599 for (const auto &updatedForm : updatedForms) {
1600 ErrCode errCode = FormProviderMgr::GetInstance().RefreshForm(updatedForm.formId, want, true);
1601 if (errCode == ERR_APPEXECFWK_FORM_GET_AMSCONNECT_FAILED) {
1602 HILOG_INFO("RefreshForm failed one time, PostRefreshFormTask to retry. form %{public}" PRId64 "",
1603 updatedForm.formId);
1604 FormTaskMgr::GetInstance().PostEnterpriseAppInstallFailedRetryTask(updatedForm.formId, want, true);
1605 }
1606 }
1607 };
1608 serialQueue_->ScheduleTask(PROVIDER_UPDATE_REFRESH_FORMS_TASK_DELAY_TIME, delayRefreshForms);
1609 HILOG_INFO("end");
1610 }
1611
1612
1613 } // namespace AppExecFwk
1614 } // namespace OHOS
1615