• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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