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