• 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 "form_constants.h"
22 #include "form_data_mgr.h"
23 #include "form_host_interface.h"
24 #include "form_mgr_adapter.h"
25 #include "form_mgr_errors.h"
26 #include "form_provider_interface.h"
27 #include "form_render_interface.h"
28 #include "form_share_mgr.h"
29 #include "form_supply_callback.h"
30 #include "hilog_wrapper.h"
31 
32 namespace OHOS {
33 namespace AppExecFwk {
34 namespace {
35 constexpr int32_t FORM_TASK_DELAY_TIME = 20; // ms
36 } // namespace
FormTaskMgr()37 FormTaskMgr::FormTaskMgr() {}
~FormTaskMgr()38 FormTaskMgr::~FormTaskMgr() {}
39 /**
40  * @brief Acquire form data from form provider(task).
41  * @param formId The Id of the form.
42  * @param want The want of the request.
43  * @param remoteObject Form provider proxy object.
44  */
PostAcquireTask(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)45 void FormTaskMgr::PostAcquireTask(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
46 {
47     if (eventHandler_ == nullptr) {
48         HILOG_ERROR("%{public}s fail, event handler invalidate", __func__);
49         return;
50     }
51     auto acquireProviderFormInfoFunc = [formId, want, remoteObject]() {
52         FormTaskMgr::GetInstance().AcquireProviderFormInfo(formId, want, remoteObject);
53     };
54     eventHandler_->PostTask(acquireProviderFormInfoFunc, FORM_TASK_DELAY_TIME);
55 }
56 
PostShareAcquireTask(int64_t formId,const std::string & remoteDeviceId,const Want & want,const sptr<IRemoteObject> & remoteObject)57 void FormTaskMgr::PostShareAcquireTask(int64_t formId, const std::string &remoteDeviceId, const Want &want,
58     const sptr<IRemoteObject> &remoteObject)
59 {
60     if (eventHandler_ == nullptr) {
61         HILOG_ERROR("eventHandler_ is nullptr");
62         int64_t requestCode = static_cast<int64_t>(want.GetLongParam(Constants::FORM_SHARE_REQUEST_CODE, 0));
63         PostFormShareSendResponse(requestCode, ERR_APPEXECFWK_FORM_COMMON_CODE);
64         return;
65     }
66 
67     auto acquireShareProviderFormInfoFunc = [formId, remoteDeviceId, want, remoteObject]() {
68         FormTaskMgr::GetInstance().AcquireShareFormData(formId, remoteDeviceId, want, remoteObject);
69     };
70     eventHandler_->PostTask(acquireShareProviderFormInfoFunc, FORM_TASK_DELAY_TIME);
71 }
72 /**
73  * @brief Delete form data from form provider(task).
74  * @param formId The Id of the form.
75  * @param want The want of the request.
76  * @param remoteObject Form provider proxy object.
77  */
PostDeleteTask(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)78 void FormTaskMgr::PostDeleteTask(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
79 {
80     if (eventHandler_ == nullptr) {
81         HILOG_ERROR("%{public}s fail, event handler invalidate", __func__);
82         return;
83     }
84     auto notifyFormDeleteFunc = [formId, want, remoteObject]() {
85         FormTaskMgr::GetInstance().NotifyFormDelete(formId, want, remoteObject);
86     };
87     eventHandler_->PostTask(notifyFormDeleteFunc, FORM_TASK_DELAY_TIME);
88 }
89 
90 /**
91  * @brief Refresh form data from form provider(task).
92  *
93  * @param formId The Id of the form.
94  * @param want The want of the form.
95  * @param remoteObject Form provider proxy object.
96  * @return none.
97  */
PostRefreshTask(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)98 void FormTaskMgr::PostRefreshTask(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
99 {
100     if (eventHandler_ == nullptr) {
101         HILOG_ERROR("%{public}s fail, event handler invalidate.", __func__);
102         return;
103     }
104     auto notifyFormUpdateFunc = [formId, want, remoteObject]() {
105         FormTaskMgr::GetInstance().NotifyFormUpdate(formId, want, remoteObject);
106     };
107     eventHandler_->PostTask(notifyFormUpdateFunc, FORM_TASK_DELAY_TIME);
108 }
109 
110 /**
111  * @brief Cast temp form data from form provider(task).
112  *
113  * @param formId The Id of the form.
114  * @param want The want of the form.
115  * @param remoteObject Form provider proxy object.
116  * @return none.
117  */
PostCastTempTask(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)118 void FormTaskMgr::PostCastTempTask(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
119 {
120     if (eventHandler_ == nullptr) {
121         HILOG_ERROR("%{public}s fail, event handler invalidate", __func__);
122         return;
123     }
124     auto notifyCastTempFunc = [formId, want, remoteObject]() {
125         FormTaskMgr::GetInstance().NotifyCastTemp(formId, want, remoteObject);
126     };
127     eventHandler_->PostTask(notifyCastTempFunc, FORM_TASK_DELAY_TIME);
128 }
129 
130 /**
131  * @brief Post form data to form host(task) when acquire form.
132  * @param formId The Id of the form.
133  * @param callingUid Calling uid.
134  * @param info Form configure info.
135  * @param wantParams WantParams of the request.
136  * @param remoteObject Form provider proxy object.
137  */
PostAcquireTaskToHost(const int64_t formId,const FormRecord & record,const sptr<IRemoteObject> & remoteObject)138 void FormTaskMgr::PostAcquireTaskToHost(const int64_t formId, const FormRecord &record,
139     const sptr<IRemoteObject> &remoteObject)
140 {
141     if (eventHandler_ == nullptr) {
142         HILOG_ERROR("%{public}s fail, event handler invalidate", __func__);
143         return;
144     }
145     auto acquireTaskToHostFunc = [formId, record, remoteObject]() {
146         FormTaskMgr::GetInstance().AcquireTaskToHost(formId, record, remoteObject);
147     };
148     eventHandler_->PostTask(acquireTaskToHostFunc, FORM_TASK_DELAY_TIME);
149 }
150 
151 /**
152  * @brief Post form data to form host(task) when update form.
153  * @param formId The Id of the form.
154  * @param callingUid Calling uid.
155  * @param info Form configure info.
156  * @param wantParams WantParams of the request.
157  * @param remoteObject Form provider proxy object.
158  */
PostUpdateTaskToHost(const int64_t formId,const FormRecord & record,const sptr<IRemoteObject> & remoteObject)159 void FormTaskMgr::PostUpdateTaskToHost(const int64_t formId, const FormRecord &record,
160     const sptr<IRemoteObject> &remoteObject)
161 {
162     HILOG_INFO("%{public}s called.", __func__);
163 
164     if (eventHandler_ == nullptr) {
165         HILOG_ERROR("%{public}s fail, event handler invalidate.", __func__);
166         return;
167     }
168 
169     HILOG_DEBUG("%{public}s, post the task of updateTaskToHostFunc.", __func__);
170     auto updateTaskToHostFunc = [formId, record, remoteObject]() {
171         FormTaskMgr::GetInstance().UpdateTaskToHost(formId, record, remoteObject);
172     };
173     eventHandler_->PostTask(updateTaskToHostFunc, FORM_TASK_DELAY_TIME);
174 }
175 
176 /**
177  * @brief Acquire form data from form provider.
178  * @param formId The Id of the form.
179  * @param info Form configure info.
180  * @param wantParams WantParams of the request.
181  * @param remoteObject Form provider proxy object.
182  */
183 /**
184  * @brief Handle form host died(task).
185  * @param remoteHost Form host proxy object.
186  */
PostHostDiedTask(const sptr<IRemoteObject> & remoteHost)187 void FormTaskMgr::PostHostDiedTask(const sptr<IRemoteObject> &remoteHost)
188 {
189     if (eventHandler_ == nullptr) {
190         HILOG_ERROR("%{public}s fail, event handler invalidate", __func__);
191         return;
192     }
193     auto postTaskFunc = [remoteHost]() {
194         FormTaskMgr::GetInstance().HostDied(remoteHost);
195     };
196     eventHandler_->PostTask(postTaskFunc, FORM_TASK_DELAY_TIME);
197 }
198 
199 /**
200  * @brief Post event notify to form provider.
201  *
202  * @param formEvent The vector of form ids.
203  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
204  * @param want The want of the form.
205  * @param remoteObject The form provider proxy object.
206  * @return none.
207  */
PostEventNotifyTask(const std::vector<int64_t> & formEvent,const int32_t formVisibleType,const Want & want,const sptr<IRemoteObject> & remoteObject)208 void FormTaskMgr::PostEventNotifyTask(const std::vector<int64_t> &formEvent, const int32_t formVisibleType,
209     const Want &want, const sptr<IRemoteObject> &remoteObject)
210 {
211     if (eventHandler_ == nullptr) {
212         HILOG_ERROR("%{public}s fail, event handler invalidate.", __func__);
213         return;
214     }
215     auto eventNotifyFunc = [formEvent, formVisibleType, want, remoteObject]() {
216         FormTaskMgr::GetInstance().EventNotify(formEvent, formVisibleType, want, remoteObject);
217     };
218     eventHandler_->PostTask(eventNotifyFunc, FORM_TASK_DELAY_TIME);
219 }
220 /**
221  * @brief Post provider batch delete.
222  * @param formIds The Id list.
223  * @param want The want of the request.
224  * @param remoteObject Form provider proxy object.
225  */
PostProviderBatchDeleteTask(std::set<int64_t> & formIds,const Want & want,const sptr<IRemoteObject> & remoteObject)226 void FormTaskMgr::PostProviderBatchDeleteTask(std::set<int64_t> &formIds, const Want &want,
227     const sptr<IRemoteObject> &remoteObject)
228 {
229     if (eventHandler_ == nullptr) {
230         HILOG_ERROR("%{public}s fail, event handler invalidate.", __func__);
231         return;
232     }
233     auto batchDeleteFunc = [&formIds, want, remoteObject]() {
234         FormTaskMgr::GetInstance().ProviderBatchDelete(formIds, want, remoteObject);
235     };
236     eventHandler_->PostTask(batchDeleteFunc, FORM_TASK_DELAY_TIME);
237 }
238 /**
239  * @brief Post message event to form provider.
240  * @param formId The Id of the from.
241  * @param message Event message.
242  * @param want The want of the request.
243  * @param remoteObject Form provider proxy object.
244  */
PostFormEventTask(const int64_t formId,const std::string & message,const Want & want,const sptr<IRemoteObject> & remoteObject)245 void FormTaskMgr::PostFormEventTask(const int64_t formId, const std::string &message,
246     const Want &want, const sptr<IRemoteObject> &remoteObject)
247 {
248     if (eventHandler_ == nullptr) {
249         HILOG_ERROR("%{public}s fail, event handler invalidate.", __func__);
250         return;
251     }
252     auto formEventFunc = [formId, message, want, remoteObject]() {
253         FormTaskMgr::GetInstance().FireFormEvent(formId, message, want, remoteObject);
254     };
255     eventHandler_->PostTask(formEventFunc, FORM_TASK_DELAY_TIME);
256 }
257 
258 /**
259 * @brief Post acquire state to form provider.
260 * @param wantArg The want of onAcquireFormState.
261 * @param provider The provider info.
262 * @param want The want of the request.
263 * @param remoteObject Form provider proxy object.
264 */
PostAcquireStateTask(const Want & wantArg,const std::string & provider,const Want & want,const sptr<IRemoteObject> & remoteObject)265 void FormTaskMgr::PostAcquireStateTask(const Want &wantArg, const std::string &provider, const Want &want,
266                                        const sptr<IRemoteObject> &remoteObject)
267 {
268     if (eventHandler_ == nullptr) {
269         HILOG_ERROR("%{public}s fail, event handler invalidate.", __func__);
270         return;
271     }
272     auto acquireStateFunc = [wantArg, provider, want, remoteObject]() {
273         FormTaskMgr::GetInstance().AcquireState(wantArg, provider, want, remoteObject);
274     };
275     eventHandler_->PostTask(acquireStateFunc, FORM_TASK_DELAY_TIME);
276 }
277 
278 /**
279  * @brief Post uninstall message to form host(task).
280  * @param formIds The Id list of the forms.
281  * @param remoteObject Form provider proxy object.
282  */
PostUninstallTaskToHost(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & remoteObject)283 void FormTaskMgr::PostUninstallTaskToHost(const std::vector<int64_t> &formIds, const sptr<IRemoteObject> &remoteObject)
284 {
285     HILOG_INFO("%{public}s start", __func__);
286     if (eventHandler_ == nullptr) {
287         HILOG_ERROR("%{public}s fail, event handler invalidate.", __func__);
288         return;
289     }
290     auto uninstallFunc = [formIds, remoteObject]() {
291         FormTaskMgr::GetInstance().FormUninstall(formIds, remoteObject);
292     };
293     eventHandler_->PostTask(uninstallFunc, FORM_TASK_DELAY_TIME);
294     HILOG_INFO("%{public}s end", __func__);
295 }
296 
297 /**
298 * @brief Post acquire form state message to form host(task).
299 * @param state The form state.
300 * @param want The want of onAcquireFormState.
301 * @param remoteObject Form provider proxy object.
302 */
PostAcquireStateTaskToHost(AppExecFwk::FormState state,const AAFwk::Want & want,const sptr<IRemoteObject> & remoteObject)303 void FormTaskMgr::PostAcquireStateTaskToHost(AppExecFwk::FormState state, const AAFwk::Want &want,
304                                              const sptr<IRemoteObject> &remoteObject)
305 {
306     HILOG_INFO("%{public}s start", __func__);
307     if (eventHandler_ == nullptr) {
308         HILOG_ERROR("%{public}s fail, event handler invalidate.", __func__);
309         return;
310     }
311     auto acquireStateFunc = [state, want, remoteObject]() {
312         FormTaskMgr::GetInstance().AcquireStateBack(state, want, remoteObject);
313     };
314     eventHandler_->PostTask(acquireStateFunc, FORM_TASK_DELAY_TIME);
315     HILOG_INFO("%{public}s end", __func__);
316 }
317 
PostFormShareSendResponse(int64_t formShareRequestCode,int32_t result)318 void FormTaskMgr::PostFormShareSendResponse(int64_t formShareRequestCode, int32_t result)
319 {
320     HILOG_INFO("%{public}s start", __func__);
321     if (eventHandler_ == nullptr) {
322         HILOG_ERROR("eventHandler_ is nullptr.");
323         return;
324     }
325 
326     auto formShareSendResponseFunc = [formShareRequestCode, result]() {
327         FormTaskMgr::GetInstance().FormShareSendResponse(formShareRequestCode, result);
328     };
329     eventHandler_->PostTask(formShareSendResponseFunc, FORM_TASK_DELAY_TIME);
330     HILOG_INFO("%{public}s end", __func__);
331 }
332 
AcquireProviderFormInfo(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)333 void FormTaskMgr::AcquireProviderFormInfo(const int64_t formId, const Want &want,
334     const sptr<IRemoteObject> &remoteObject)
335 {
336     FormMgrAdapter::GetInstance().AcquireProviderFormInfo(formId, want, remoteObject);
337 }
338 
AcquireShareFormData(int64_t formId,const std::string & remoteDeviceId,const Want & want,const sptr<IRemoteObject> & remoteObject)339 void FormTaskMgr::AcquireShareFormData(int64_t formId, const std::string &remoteDeviceId,
340     const Want &want, const sptr<IRemoteObject> &remoteObject)
341 {
342     DelayedSingleton<FormShareMgr>::GetInstance()->AcquireShareFormData(formId, remoteDeviceId, want, remoteObject);
343 }
344 /**
345  * @brief Notify form provider for delete form.
346  *
347  * @param formId The Id of the from.
348  * @param want The want of the form.
349  * @param remoteObject Form provider proxy object.
350  * @return none.
351  */
NotifyFormDelete(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)352 void FormTaskMgr::NotifyFormDelete(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
353 {
354     FormMgrAdapter::GetInstance().NotifyFormDelete(formId, want, remoteObject);
355 }
356 
357 /**
358  * @brief Notify form provider for updating form.
359  *
360  * @param formId The Id of the from.
361  * @param want The want of the form.
362  * @param remoteObject Form provider proxy object.
363  * @return none.
364  */
NotifyFormUpdate(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)365 void FormTaskMgr::NotifyFormUpdate(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
366 {
367     HILOG_INFO("%{public}s called.", __func__);
368 
369     auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
370     sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
371     if (formProviderProxy == nullptr) {
372         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
373         HILOG_ERROR("%{public}s fail, failed to get formProviderProxy", __func__);
374         return;
375     }
376     int error = formProviderProxy->NotifyFormUpdate(formId, want, FormSupplyCallback::GetInstance());
377     if (error != ERR_OK) {
378         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
379         HILOG_ERROR("%{public}s fail, Failed to notify form update.", __func__);
380     }
381 }
382 
383 /**
384  * @brief Event notify to form provider.
385  *
386  * @param formEvents The vector of form ids.
387  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
388  * @param want The want of the form.
389  * @param remoteObject The form provider proxy object.
390  * @return none.
391  */
EventNotify(const std::vector<int64_t> & formEvents,const int32_t formVisibleType,const Want & want,const sptr<IRemoteObject> & remoteObject)392 void FormTaskMgr::EventNotify(const std::vector<int64_t> &formEvents, const int32_t formVisibleType,
393     const Want &want, const sptr<IRemoteObject> &remoteObject)
394 {
395     HILOG_INFO("%{public}s called.", __func__);
396 
397     auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
398     sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
399     if (formProviderProxy == nullptr) {
400         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
401         HILOG_ERROR("%{public}s fail, failed to get formProviderProxy", __func__);
402         return;
403     }
404 
405     int error = formProviderProxy->EventNotify(formEvents, formVisibleType, want, FormSupplyCallback::GetInstance());
406     if (error != ERR_OK) {
407         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
408         HILOG_ERROR("%{public}s fail, Failed to send event notify.", __func__);
409     }
410 }
411 
412 /**
413  * @brief Notify form provider for cast temp form.
414  *
415  * @param formId The Id of the from.
416  * @param want The want of the form.
417  * @param remoteObject Form provider proxy object.
418  * @return none.
419  */
NotifyCastTemp(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)420 void FormTaskMgr::NotifyCastTemp(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
421 {
422     HILOG_INFO("%{public}s called.", __func__);
423 
424     auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
425     sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
426     if (formProviderProxy == nullptr) {
427         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
428         HILOG_ERROR("%{public}s fail, failed to get formProviderProxy", __func__);
429         return;
430     }
431 
432     int error = formProviderProxy->NotifyFormCastTempForm(formId, want, FormSupplyCallback::GetInstance());
433     if (error != ERR_OK) {
434         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
435         HILOG_ERROR("%{public}s fail, Failed to get acquire provider form info", __func__);
436     }
437 }
438 
439 /**
440  * @brief Post form data to form host when acquire form.
441  * @param formId The Id of the form.
442  * @param callingUid Calling uid.
443  * @param info Form configure info.
444  * @param wantParams WantParams of the request.
445  * @param remoteObject Form provider proxy object.
446  */
AcquireTaskToHost(const int64_t formId,const FormRecord & record,const sptr<IRemoteObject> & remoteObject)447 void FormTaskMgr::AcquireTaskToHost(const int64_t formId, const FormRecord &record,
448     const sptr<IRemoteObject> &remoteObject)
449 {
450     HILOG_INFO("FormTaskMgr AcquireTaskToHost, formId:%{public}" PRId64 "", formId);
451 
452     sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(remoteObject);
453     if (remoteFormHost == nullptr) {
454         HILOG_ERROR("%{public}s fail, Failed to get form host proxy", __func__);
455         return;
456     }
457 
458     HILOG_DEBUG("FormTaskMgr remoteFormHost OnAcquired");
459     remoteFormHost->OnAcquired(CreateFormJsInfo(formId, record), nullptr);
460 }
461 
462 /**
463  * @brief Post form data to form host when update form.
464  * @param formId The Id of the form.
465  * @param callingUid Calling uid.
466  * @param info Form configure info.
467  * @param wantParams WantParams of the request.
468  * @param remoteObject Form provider proxy object.
469  */
UpdateTaskToHost(const int64_t formId,const FormRecord & record,const sptr<IRemoteObject> & remoteObject)470 void FormTaskMgr::UpdateTaskToHost(const int64_t formId, const FormRecord &record,
471     const sptr<IRemoteObject> &remoteObject)
472 {
473     HILOG_INFO("%{public}s start.", __func__);
474 
475     sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(remoteObject);
476     if (remoteFormHost == nullptr) {
477         HILOG_ERROR("%{public}s fail, Failed to get form host proxy.", __func__);
478         return;
479     }
480 
481     HILOG_DEBUG("%{public}s, FormTaskMgr remoteFormHost OnUpdate.", __func__);
482     remoteFormHost->OnUpdate(CreateFormJsInfo(formId, record));
483 
484     HILOG_INFO("%{public}s end.", __func__);
485 }
486 
487 /**
488  * @brief Handle form host died.
489  * @param remoteHost Form host proxy object.
490  */
HostDied(const sptr<IRemoteObject> & remoteHost)491 void FormTaskMgr::HostDied(const sptr<IRemoteObject> &remoteHost)
492 {
493     HILOG_INFO("%{public}s, remote client died event", __func__);
494     if (remoteHost == nullptr) {
495         HILOG_INFO("%{public}s, remote client died, invalid param", __func__);
496         return;
497     }
498     FormDataMgr::GetInstance().HandleHostDied(remoteHost);
499     FormSupplyCallback::GetInstance()->HandleHostDied(remoteHost);
500 }
501 /**
502  * @brief Post provider batch delete.
503  * @param formIds The Id list.
504  * @param want The want of the request.
505  * @param remoteObject Form provider proxy object.
506  */
ProviderBatchDelete(std::set<int64_t> & formIds,const Want & want,const sptr<IRemoteObject> & remoteObject)507 void FormTaskMgr::ProviderBatchDelete(std::set<int64_t> &formIds, const Want &want,
508     const sptr<IRemoteObject> &remoteObject)
509 {
510     HILOG_INFO("%{public}s called.", __func__);
511     auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
512     sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
513     if (formProviderProxy == nullptr) {
514         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
515         HILOG_ERROR("%{public}s fail, Failed to get formProviderProxy", __func__);
516         return;
517     }
518     std::vector<int64_t> vFormIds;
519     vFormIds.assign(formIds.begin(), formIds.end());
520     int error = formProviderProxy->NotifyFormsDelete(vFormIds, want, FormSupplyCallback::GetInstance());
521     if (error != ERR_OK) {
522         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
523         HILOG_ERROR("%{public}s failed", __func__);
524     }
525 }
526 /**
527  * @brief Fire message event to form provider.
528  * @param formId The Id of the from.
529  * @param message Event message.
530  * @param want The want of the request.
531  * @param remoteObject Form provider proxy object.
532  */
FireFormEvent(const int64_t formId,const std::string & message,const Want & want,const sptr<IRemoteObject> & remoteObject)533 void FormTaskMgr::FireFormEvent(const int64_t formId, const std::string &message, const Want &want,
534     const sptr<IRemoteObject> &remoteObject)
535 {
536     HILOG_INFO("%{public}s start", __func__);
537     auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
538     sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
539     if (formProviderProxy == nullptr) {
540         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
541         HILOG_ERROR("%{public}s, Failed to get formProviderProxy", __func__);
542         return;
543     }
544 
545     int error = formProviderProxy->FireFormEvent(formId, message, want, FormSupplyCallback::GetInstance());
546     if (error != ERR_OK) {
547         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
548         HILOG_ERROR("%{public}s, Failed to fire message event to form provider", __func__);
549     }
550     HILOG_INFO("%{public}s end", __func__);
551 }
552 
553 /**
554  * @brief Acquire form state to form provider.
555  * @param wantArg The want of onAcquireFormState.
556  * @param provider The provider info.
557  * @param want The want of the request.
558  * @param remoteObject Form provider proxy object.
559  */
AcquireState(const Want & wantArg,const std::string & provider,const Want & want,const sptr<IRemoteObject> & remoteObject)560 void FormTaskMgr::AcquireState(const Want &wantArg, const std::string &provider, const Want &want,
561                                const sptr<IRemoteObject> &remoteObject)
562 {
563     HILOG_INFO("%{public}s start", __func__);
564     auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
565     sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
566     if (formProviderProxy == nullptr) {
567     FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
568         HILOG_ERROR("%{public}s, Failed to get formProviderProxy", __func__);
569         return;
570     }
571 
572     int error = formProviderProxy->AcquireState(wantArg, provider, want, FormSupplyCallback::GetInstance());
573     if (error != ERR_OK) {
574         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
575         HILOG_ERROR("%{public}s, Failed to acquire form state to form provider", __func__);
576     }
577     HILOG_INFO("%{public}s end", __func__);
578 }
579 
580 /**
581  * @brief Handle uninstall message.
582  * @param formIds The Id list of the forms.
583  * @param remoteObject Form provider proxy object.
584  */
FormUninstall(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & remoteObject)585 void FormTaskMgr::FormUninstall(const std::vector<int64_t> &formIds,
586     const sptr<IRemoteObject> &remoteObject)
587 {
588     HILOG_INFO("%{public}s start", __func__);
589     sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(remoteObject);
590     if (remoteFormHost == nullptr) {
591         HILOG_ERROR("%{public}s fail, Failed to get form host proxy.", __func__);
592         return;
593     }
594 
595     remoteFormHost->OnUninstall(formIds);
596 
597     HILOG_INFO("%{public}s end", __func__);
598 }
599 
600 /**
601  * @brief Handle acquire state.
602  * @param state the form state.
603  * @param want The want of onAcquireFormState.
604  * @param remoteObject Form provider proxy object.
605  */
AcquireStateBack(AppExecFwk::FormState state,const AAFwk::Want & want,const sptr<IRemoteObject> & remoteObject)606 void FormTaskMgr::AcquireStateBack(AppExecFwk::FormState state, const AAFwk::Want &want,
607                                    const sptr<IRemoteObject> &remoteObject)
608 {
609     HILOG_INFO("%{public}s start", __func__);
610     sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(remoteObject);
611     if (remoteFormHost == nullptr) {
612         HILOG_ERROR("%{public}s fail, Failed to get form host proxy.", __func__);
613         return;
614     }
615 
616     remoteFormHost->OnAcquireState(state, want);
617 
618     HILOG_INFO("%{public}s end", __func__);
619 }
620 
621 /**
622  * @brief Create form data for form host.
623  * @param formId The Id of the form.
624  * @param record Form record.
625  * @return Form data.
626  */
CreateFormJsInfo(const int64_t formId,const FormRecord & record)627 FormJsInfo FormTaskMgr::CreateFormJsInfo(const int64_t formId, const FormRecord &record)
628 {
629     HILOG_INFO("%{public}s start", __func__);
630     FormJsInfo form;
631     form.formId = formId;
632     form.bundleName = record.bundleName;
633     form.abilityName = record.abilityName;
634     form.formName = record.formName;
635     form.moduleName = record.moduleName;
636     form.formTempFlag = record.formTempFlag;
637     form.jsFormCodePath = record.jsFormCodePath;
638     form.formData = record.formProviderInfo.GetFormDataString();
639     form.formProviderData = record.formProviderInfo.GetFormData();
640     form.formSrc = record.formSrc;
641     form.formWindow = record.formWindow;
642     form.type = record.type;
643     form.uiSyntax = record.uiSyntax;
644     HILOG_DEBUG("%{public}s end, jsPath: %{private}s, data: %{public}s", __func__,
645         form.jsFormCodePath.c_str(), form.formData.c_str());
646     return form;
647 }
648 
FormShareSendResponse(int64_t formShareRequestCode,int32_t result)649 void FormTaskMgr::FormShareSendResponse(int64_t formShareRequestCode, int32_t result)
650 {
651     DelayedSingleton<FormShareMgr>::GetInstance()->SendResponse(formShareRequestCode, result);
652 }
653 
PostRenderForm(const FormRecord & formRecord,const Want & want,const sptr<IRemoteObject> & remoteObject)654 void FormTaskMgr::PostRenderForm(const FormRecord &formRecord, const Want &want,
655     const sptr<IRemoteObject> &remoteObject)
656 {
657     HILOG_INFO("%{public}s start", __func__);
658     if (eventHandler_ == nullptr) {
659         HILOG_ERROR("eventHandler_ is nullptr.");
660         return;
661     }
662 
663     auto renderForm = [formRecord, want, remoteObject]() {
664         FormTaskMgr::GetInstance().RenderForm(formRecord, want, remoteObject);
665     };
666     eventHandler_->PostTask(renderForm, FORM_TASK_DELAY_TIME);
667     HILOG_INFO("%{public}s end", __func__);
668 }
669 
RenderForm(const FormRecord & formRecord,const Want & want,const sptr<IRemoteObject> & remoteObject)670 void FormTaskMgr::RenderForm(const FormRecord &formRecord, const Want &want, const sptr<IRemoteObject> &remoteObject)
671 {
672     HILOG_INFO("%{public}s begin", __func__);
673     auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
674     sptr<IFormRender> remoteFormRender = iface_cast<IFormRender>(remoteObject);
675     if (remoteFormRender == nullptr) {
676         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
677         HILOG_ERROR("%{public}s fail, Failed to get form render proxy.", __func__);
678         return;
679     }
680 
681     FormJsInfo formJsInfo = CreateFormJsInfo(formRecord.formId, formRecord);
682     int32_t error = remoteFormRender->RenderForm(formJsInfo, want, FormSupplyCallback::GetInstance());
683     if (error != ERR_OK) {
684         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
685         HILOG_ERROR("%{public}s fail, Failed to add form renderer", __func__);
686         return;
687     }
688 
689     HILOG_INFO("%{public}s end", __func__);
690 }
691 
PostStopRenderingForm(const FormRecord & formRecord,const Want & want,const sptr<IRemoteObject> & remoteObject)692 void FormTaskMgr::PostStopRenderingForm(
693     const FormRecord &formRecord, const Want &want, const sptr<IRemoteObject> &remoteObject)
694 {
695     HILOG_INFO("%{public}s start", __func__);
696     if (eventHandler_ == nullptr) {
697         HILOG_ERROR("eventHandler_ is nullptr.");
698         return;
699     }
700 
701     auto deleterenderForm = [formRecord, want, remoteObject]() {
702         FormTaskMgr::GetInstance().StopRenderingForm(formRecord, want, remoteObject);
703     };
704     eventHandler_->PostTask(deleterenderForm, FORM_TASK_DELAY_TIME);
705     HILOG_INFO("%{public}s end", __func__);
706 }
707 
StopRenderingForm(const FormRecord & formRecord,const Want & want,const sptr<IRemoteObject> & remoteObject)708 void FormTaskMgr::StopRenderingForm(
709     const FormRecord &formRecord, const Want &want, const sptr<IRemoteObject> &remoteObject)
710 {
711     HILOG_INFO("%{public}s begin", __func__);
712     auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
713     sptr<IFormRender> remoteFormDeleteRender = iface_cast<IFormRender>(remoteObject);
714     if (remoteFormDeleteRender == nullptr) {
715         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
716         HILOG_ERROR("%{public}s fail, Failed to get form render proxy.", __func__);
717         return;
718     }
719 
720     FormJsInfo formJsInfo = CreateFormJsInfo(formRecord.formId, formRecord);
721     int32_t error = remoteFormDeleteRender->StopRenderingForm(formJsInfo, want, FormSupplyCallback::GetInstance());
722     if (error != ERR_OK) {
723         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
724         HILOG_ERROR("%{public}s fail, Failed to add form renderer", __func__);
725         return;
726     }
727 
728     HILOG_INFO("%{public}s end", __func__);
729 }
730 
ReloadForm(const std::vector<int64_t> && formIds,const Want & want,const sptr<IRemoteObject> & remoteObject)731 void FormTaskMgr::ReloadForm(const std::vector<int64_t> &&formIds, const Want &want,
732     const sptr<IRemoteObject> &remoteObject)
733 {
734     HILOG_INFO("%{public}s begin", __func__);
735     sptr<IFormRender> remoteFormRender = iface_cast<IFormRender>(remoteObject);
736     if (remoteFormRender == nullptr) {
737         HILOG_ERROR("%{public}s fail, Failed to get form render proxy.", __func__);
738         return;
739     }
740     int32_t error = remoteFormRender->ReloadForm(std::forward<decltype(formIds)>(formIds), want);
741     if (error != ERR_OK) {
742         HILOG_ERROR("%{public}s fail, Failed to reload form.", __func__);
743         return;
744     }
745     HILOG_INFO("%{public}s end", __func__);
746 }
747 
PostReloadForm(const std::vector<int64_t> && formIds,const Want & want,const sptr<IRemoteObject> & remoteObject)748 void FormTaskMgr::PostReloadForm(const std::vector<int64_t> &&formIds, const Want &want,
749     const sptr<IRemoteObject> &remoteObject)
750 {
751     HILOG_INFO("%{public}s begin", __func__);
752     if (eventHandler_ == nullptr) {
753         HILOG_ERROR("eventHandler_ is nullptr.");
754         return;
755     }
756     auto reloadForm = [ids = std::forward<decltype(formIds)>(formIds), want, remoteObject]() {
757         FormTaskMgr::GetInstance().ReloadForm(std::move(ids), want, remoteObject);
758     };
759     eventHandler_->PostTask(reloadForm, FORM_TASK_DELAY_TIME);
760     HILOG_INFO("%{public}s end", __func__);
761 }
762 } // namespace AppExecFwk
763 } // namespace OHOS
764