1 /*
2 * Copyright (c) 2025 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 "status_mgr_center/form_render_status_task_mgr.h"
17
18 #include "status_mgr_center/form_render_status_mgr.h"
19 #include "form_constants.h"
20 #include "fms_log_wrapper.h"
21
22 namespace OHOS {
23 namespace AppExecFwk {
24 namespace FormRender {
25 namespace {
26 constexpr int64_t WAIT_RELEASE_RENDERER_TIMEOUT = 3000;
27 }
FormRenderStatusTaskMgr()28 FormRenderStatusTaskMgr::FormRenderStatusTaskMgr()
29 {
30 HILOG_DEBUG("create FormRenderStatusTaskMgr");
31 }
32
~FormRenderStatusTaskMgr()33 FormRenderStatusTaskMgr::~FormRenderStatusTaskMgr()
34 {
35 HILOG_DEBUG("destroy FormRenderStatusTaskMgr");
36 }
37
OnRenderFormDone(const int64_t formId,const FormFsmEvent event,const sptr<IFormSupply> formSupplyClient)38 void FormRenderStatusTaskMgr::OnRenderFormDone(
39 const int64_t formId, const FormFsmEvent event, const sptr<IFormSupply> formSupplyClient)
40 {
41 if (formSupplyClient == nullptr) {
42 HILOG_ERROR("null formSupplyClient");
43 return;
44 }
45
46 auto replyTask = [formId, event, formSupplyClient] {
47 Want replyWant;
48 std::string eventId = FormRenderStatusMgr::GetInstance().GetFormEventId(formId);
49 if (eventId.empty()) {
50 replyWant.SetParam(Constants::FORM_STATUS_EVENT, static_cast<int32_t>(FormFsmEvent::RENDER_FORM_FAIL));
51 } else {
52 replyWant.SetParam(Constants::FORM_STATUS_EVENT, static_cast<int32_t>(event));
53 replyWant.SetParam(Constants::FORM_STATUS_EVENT_ID, eventId);
54 }
55 return formSupplyClient->OnRenderFormDone(formId, replyWant);
56 };
57 FormRenderStatusMgr::GetInstance().PostFormEvent(formId, event, replyTask);
58 }
59
OnRecycleForm(const int64_t formId,const FormFsmEvent event,const std::string & statusData,const Want & want,const sptr<IFormSupply> formSupplyClient)60 void FormRenderStatusTaskMgr::OnRecycleForm(const int64_t formId, const FormFsmEvent event,
61 const std::string &statusData, const Want &want, const sptr<IFormSupply> formSupplyClient)
62 {
63 if (formSupplyClient == nullptr) {
64 HILOG_ERROR("null formSupplyClient");
65 return;
66 }
67
68 auto replyTask = [formId, event, statusData, want, formSupplyClient] {
69 Want newWant = want;
70 newWant.SetParam(Constants::FORM_STATUS_DATA, statusData);
71 std::string eventId = FormRenderStatusMgr::GetInstance().GetFormEventId(formId);
72 if (eventId.empty()) {
73 newWant.SetParam(Constants::FORM_STATUS_EVENT, static_cast<int32_t>(FormFsmEvent::RECYCLE_DATA_FAIL));
74 } else {
75 newWant.SetParam(Constants::FORM_STATUS_EVENT, static_cast<int32_t>(event));
76 newWant.SetParam(Constants::FORM_STATUS_EVENT_ID, eventId);
77 }
78 return formSupplyClient->OnRecycleForm(formId, newWant);
79 };
80
81 FormRenderStatusMgr::GetInstance().PostFormEvent(formId, event, replyTask);
82 }
83
OnRecoverFormDone(const int64_t formId,const FormFsmEvent event,const sptr<IFormSupply> formSupplyClient)84 void FormRenderStatusTaskMgr::OnRecoverFormDone(
85 const int64_t formId, const FormFsmEvent event, const sptr<IFormSupply> formSupplyClient)
86 {
87 if (formSupplyClient == nullptr) {
88 HILOG_ERROR("null formSupplyClient");
89 return;
90 }
91
92 auto replyTask = [formId, event, formSupplyClient] {
93 Want replyWant;
94 std::string eventId = FormRenderStatusMgr::GetInstance().GetFormEventId(formId);
95 if (eventId.empty()) {
96 replyWant.SetParam(Constants::FORM_STATUS_EVENT, static_cast<int32_t>(FormFsmEvent::RECOVER_FORM_FAIL));
97 } else {
98 replyWant.SetParam(Constants::FORM_STATUS_EVENT, static_cast<int32_t>(event));
99 replyWant.SetParam(Constants::FORM_STATUS_EVENT_ID, eventId);
100 }
101 return formSupplyClient->OnRecoverFormDone(formId, replyWant);
102 };
103 FormRenderStatusMgr::GetInstance().PostFormEvent(formId, event, replyTask);
104 }
105
OnDeleteFormDone(const int64_t formId,const FormFsmEvent event,const sptr<IFormSupply> formSupplyClient)106 void FormRenderStatusTaskMgr::OnDeleteFormDone(
107 const int64_t formId, const FormFsmEvent event, const sptr<IFormSupply> formSupplyClient)
108 {
109 if (formSupplyClient == nullptr) {
110 HILOG_ERROR("null formSupplyClient");
111 return;
112 }
113
114 auto replyTask = [formId, event, formSupplyClient] {
115 Want replyWant;
116 std::string eventId = FormRenderStatusMgr::GetInstance().GetFormEventId(formId);
117 if (eventId.empty()) {
118 replyWant.SetParam(Constants::FORM_STATUS_EVENT, static_cast<int32_t>(FormFsmEvent::DELETE_FORM_FAIL));
119 } else {
120 replyWant.SetParam(Constants::FORM_STATUS_EVENT, static_cast<int32_t>(event));
121 replyWant.SetParam(Constants::FORM_STATUS_EVENT_ID, eventId);
122 }
123 return formSupplyClient->OnDeleteFormDone(formId, replyWant);
124 };
125 FormRenderStatusMgr::GetInstance().PostFormEvent(formId, event, replyTask);
126 }
127
OnRecycleFormDone(const int64_t formId,const FormFsmEvent event,const sptr<IFormSupply> formSupplyClient)128 void FormRenderStatusTaskMgr::OnRecycleFormDone(
129 const int64_t formId, const FormFsmEvent event, const sptr<IFormSupply> formSupplyClient)
130 {
131 if (formSupplyClient == nullptr) {
132 HILOG_ERROR("null formSupplyClient");
133 return;
134 }
135
136 auto replyTask = [formId, event, formSupplyClient] {
137 Want replyWant;
138 std::string eventId = FormRenderStatusMgr::GetInstance().GetFormEventId(formId);
139 if (eventId.empty()) {
140 replyWant.SetParam(Constants::FORM_STATUS_EVENT, static_cast<int32_t>(FormFsmEvent::RECYCLE_FORM_FAIL));
141 } else {
142 replyWant.SetParam(Constants::FORM_STATUS_EVENT, static_cast<int32_t>(event));
143 replyWant.SetParam(Constants::FORM_STATUS_EVENT_ID, eventId);
144 }
145 return formSupplyClient->OnRecycleFormDone(formId, replyWant);
146 };
147 FormRenderStatusMgr::GetInstance().PostFormEvent(formId, event, replyTask);
148 }
149
ScheduleRecycleTimeout(const int64_t formId)150 bool FormRenderStatusTaskMgr::ScheduleRecycleTimeout(const int64_t formId)
151 {
152 FormRenderStatusTaskMgr::GetInstance().CancelRecycleTimeout(formId);
153
154 std::lock_guard<std::mutex> lock(serialQueueMutex_);
155 if (serialQueue_ == nullptr) {
156 HILOG_ERROR("null serialQueue_");
157 return false;
158 }
159
160 std::string str = std::to_string(formId);
161 auto timeoutTask = [formId]() {
162 HILOG_ERROR("RecycleForm failed, wait form release timeout, formId:%{public}" PRId64, formId);
163 FormRenderStatus::GetInstance().SetFormStatus(formId, FormFsmStatus::UNPROCESSABLE);
164 FormRenderStatusTaskMgr::GetInstance().CancelRecycleTimeout(formId);
165 };
166 return serialQueue_->ScheduleDelayTask(str, WAIT_RELEASE_RENDERER_TIMEOUT, timeoutTask);
167 }
168
CancelRecycleTimeout(const int64_t formId)169 bool FormRenderStatusTaskMgr::CancelRecycleTimeout(const int64_t formId)
170 {
171 std::lock_guard<std::mutex> lock(serialQueueMutex_);
172 if (serialQueue_ == nullptr) {
173 HILOG_ERROR("null serialQueue_");
174 return false;
175 }
176
177 std::string str = std::to_string(formId);
178 return serialQueue_->CancelDelayTask(str);
179 }
180 } // namespace FormRender
181 } // namespace AppExecFwk
182 } // namespace OHOS