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