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