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