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