1 /*
2 * Copyright (c) 2024 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 "cj_ability_lifecycle_callback_impl.h"
17
18 #include "cj_lambda.h"
19 #include "hilog_tag_wrapper.h"
20
21 namespace OHOS {
22 namespace AbilityRuntime {
23 int32_t CjAbilityLifecycleCallbackImpl::serialNumber_ = 0;
24
EmplaceAbilityFunc(int32_t callbackId,int64_t cFuncId,std::map<int32_t,std::function<void (int64_t)>> & cFuncMap)25 void EmplaceAbilityFunc(int32_t callbackId, int64_t cFuncId, std::map<int32_t, std::function<void(int64_t)>> &cFuncMap)
26 {
27 auto callback = CJLambda::Create(reinterpret_cast<void (*)(int64_t)>(cFuncId));
28 cFuncMap.emplace(callbackId, callback);
29 }
30
EmplaceAbilityWindowStageFunc(int32_t callbackId,int64_t cFuncId,std::map<int32_t,std::function<void (int64_t,WindowStagePtr)>> & cFuncMap)31 void EmplaceAbilityWindowStageFunc(int32_t callbackId, int64_t cFuncId,
32 std::map<int32_t, std::function<void(int64_t, WindowStagePtr)>> &cFuncMap)
33 {
34 auto callback = CJLambda::Create(reinterpret_cast<void (*)(int64_t, WindowStagePtr)>(cFuncId));
35 cFuncMap.emplace(callbackId, callback);
36 }
37
Register(CArrI64 cFuncIds,bool isSync)38 int32_t CjAbilityLifecycleCallbackImpl::Register(CArrI64 cFuncIds, bool isSync)
39 {
40 int32_t callbackId = serialNumber_;
41 if (serialNumber_ < INT32_MAX) {
42 serialNumber_++;
43 } else {
44 serialNumber_ = 0;
45 }
46 if (isSync) {
47 return -1;
48 } else {
49 int64_t i = 0;
50 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onAbilityCreatecallbacks_);
51 EmplaceAbilityWindowStageFunc(callbackId, cFuncIds.head[i++], onWindowStageCreatecallbacks_);
52 EmplaceAbilityWindowStageFunc(callbackId, cFuncIds.head[i++], onWindowStageActivecallbacks_);
53 EmplaceAbilityWindowStageFunc(callbackId, cFuncIds.head[i++], onWindowStageInactivecallbacks_);
54 EmplaceAbilityWindowStageFunc(callbackId, cFuncIds.head[i++], onWindowStageDestroycallbacks_);
55 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onAbilityDestroycallbacks_);
56 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onAbilityForegroundcallbacks_);
57 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onAbilityBackgroundcallbacks_);
58 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onAbilityContinuecallbacks_);
59 // optional callbacks
60 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onAbilityWillCreatecallbacks_);
61 EmplaceAbilityWindowStageFunc(callbackId, cFuncIds.head[i++], onWindowStageWillCreatecallbacks_);
62 EmplaceAbilityWindowStageFunc(callbackId, cFuncIds.head[i++], onWindowStageWillDestroycallbacks_);
63 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onAbilityWillForegroundcallbacks_);
64 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onAbilityWillDestroycallbacks_);
65 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onAbilityWillBackgroundcallbacks_);
66 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onWillNewWantcallbacks_);
67 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onNewWantcallbacks_);
68 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onAbilityWillContinuecallbacks_);
69 EmplaceAbilityWindowStageFunc(callbackId, cFuncIds.head[i++], onWindowStageWillRestorecallbacks_);
70 EmplaceAbilityWindowStageFunc(callbackId, cFuncIds.head[i++], onWindowStageRestorecallbacks_);
71 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onAbilityWillSaveStatecallbacks_);
72 EmplaceAbilityFunc(callbackId, cFuncIds.head[i++], onAbilitySaveStatecallbacks_);
73 }
74 return callbackId;
75 }
76
UnRegister(int32_t callbackId,bool isSync)77 bool CjAbilityLifecycleCallbackImpl::UnRegister(int32_t callbackId, bool isSync)
78 {
79 TAG_LOGI(AAFwkTag::APPKIT, "callbackId : %{public}d", callbackId);
80 if (isSync) {
81 return false;
82 }
83 auto it = onAbilityCreatecallbacks_.find(callbackId);
84 if (it == onAbilityCreatecallbacks_.end()) {
85 TAG_LOGE(AAFwkTag::APPKIT, "callbackId: %{public}d is not in callbacks_", callbackId);
86 return false;
87 }
88 onAbilityCreatecallbacks_.erase(callbackId);
89 onWindowStageCreatecallbacks_.erase(callbackId);
90 onWindowStageActivecallbacks_.erase(callbackId);
91 onWindowStageInactivecallbacks_.erase(callbackId);
92 onWindowStageDestroycallbacks_.erase(callbackId);
93 onAbilityDestroycallbacks_.erase(callbackId);
94 onAbilityForegroundcallbacks_.erase(callbackId);
95 onAbilityBackgroundcallbacks_.erase(callbackId);
96 onAbilityContinuecallbacks_.erase(callbackId);
97 // optional callbacks
98 onAbilityWillCreatecallbacks_.erase(callbackId);
99 onWindowStageWillCreatecallbacks_.erase(callbackId);
100 onWindowStageWillDestroycallbacks_.erase(callbackId);
101 onAbilityWillForegroundcallbacks_.erase(callbackId);
102 onAbilityWillDestroycallbacks_.erase(callbackId);
103 onAbilityWillBackgroundcallbacks_.erase(callbackId);
104 onWillNewWantcallbacks_.erase(callbackId);
105 onNewWantcallbacks_.erase(callbackId);
106 onAbilityWillContinuecallbacks_.erase(callbackId);
107 onWindowStageWillRestorecallbacks_.erase(callbackId);
108 onWindowStageRestorecallbacks_.erase(callbackId);
109 onAbilityWillSaveStatecallbacks_.erase(callbackId);
110 return onAbilitySaveStatecallbacks_.erase(callbackId) == 1;
111 }
112
OnAbilityCreate(const int64_t & ability)113 void CjAbilityLifecycleCallbackImpl::OnAbilityCreate(const int64_t &ability)
114 {
115 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnAbilityCreate");
116 if (!ability) {
117 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
118 return;
119 }
120 for (auto &callback : onAbilityCreatecallbacks_) {
121 if (!callback.second) {
122 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
123 return;
124 }
125 callback.second(ability);
126 }
127 }
128
OnWindowStageCreate(const int64_t & ability,WindowStagePtr windowStage)129 void CjAbilityLifecycleCallbackImpl::OnWindowStageCreate(const int64_t &ability, WindowStagePtr windowStage)
130 {
131 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnWindowStageCreate");
132 if (!ability || !windowStage) {
133 TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is nullptr");
134 return;
135 }
136 for (auto &callback : onWindowStageCreatecallbacks_) {
137 if (!callback.second) {
138 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
139 return;
140 }
141 callback.second(ability, windowStage);
142 }
143 }
144
OnWindowStageActive(const int64_t & ability,WindowStagePtr windowStage)145 void CjAbilityLifecycleCallbackImpl::OnWindowStageActive(const int64_t &ability, WindowStagePtr windowStage)
146 {
147 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnWindowStageActive");
148 if (!ability || !windowStage) {
149 TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is nullptr");
150 return;
151 }
152 for (auto &callback : onWindowStageActivecallbacks_) {
153 if (!callback.second) {
154 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
155 return;
156 }
157 callback.second(ability, windowStage);
158 }
159 }
160
OnWindowStageInactive(const int64_t & ability,WindowStagePtr windowStage)161 void CjAbilityLifecycleCallbackImpl::OnWindowStageInactive(const int64_t &ability, WindowStagePtr windowStage)
162 {
163 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnWindowStageInactive");
164 if (!ability || !windowStage) {
165 TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is nullptr");
166 return;
167 }
168 for (auto &callback : onWindowStageInactivecallbacks_) {
169 if (!callback.second) {
170 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
171 return;
172 }
173 callback.second(ability, windowStage);
174 }
175 }
176
OnWindowStageDestroy(const int64_t & ability,WindowStagePtr windowStage)177 void CjAbilityLifecycleCallbackImpl::OnWindowStageDestroy(const int64_t &ability, WindowStagePtr windowStage)
178 {
179 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnWindowStageDestroy");
180 if (!ability || !windowStage) {
181 TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is nullptr");
182 return;
183 }
184 for (auto &callback : onWindowStageDestroycallbacks_) {
185 if (!callback.second) {
186 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
187 return;
188 }
189 callback.second(ability, windowStage);
190 }
191 }
192
OnAbilityDestroy(const int64_t & ability)193 void CjAbilityLifecycleCallbackImpl::OnAbilityDestroy(const int64_t &ability)
194 {
195 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnAbilityDestroy");
196 if (!ability) {
197 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
198 return;
199 }
200 for (auto &callback : onAbilityDestroycallbacks_) {
201 if (!callback.second) {
202 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
203 return;
204 }
205 callback.second(ability);
206 }
207 }
208
OnAbilityForeground(const int64_t & ability)209 void CjAbilityLifecycleCallbackImpl::OnAbilityForeground(const int64_t &ability)
210 {
211 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnAbilityForeground");
212 if (!ability) {
213 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
214 return;
215 }
216 for (auto &callback : onAbilityForegroundcallbacks_) {
217 if (!callback.second) {
218 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
219 return;
220 }
221 callback.second(ability);
222 }
223 }
224
OnAbilityBackground(const int64_t & ability)225 void CjAbilityLifecycleCallbackImpl::OnAbilityBackground(const int64_t &ability)
226 {
227 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnAbilityBackground");
228 if (!ability) {
229 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
230 return;
231 }
232 for (auto &callback : onAbilityBackgroundcallbacks_) {
233 if (!callback.second) {
234 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
235 return;
236 }
237 callback.second(ability);
238 }
239 }
240
OnAbilityContinue(const int64_t & ability)241 void CjAbilityLifecycleCallbackImpl::OnAbilityContinue(const int64_t &ability)
242 {
243 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnAbilityContinue");
244 if (!ability) {
245 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
246 return;
247 }
248 for (auto &callback : onAbilityContinuecallbacks_) {
249 if (!callback.second) {
250 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
251 return;
252 }
253 callback.second(ability);
254 }
255 }
256
257 // optional callbacks
OnAbilityWillCreate(const int64_t & ability)258 void CjAbilityLifecycleCallbackImpl::OnAbilityWillCreate(const int64_t &ability)
259 {
260 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnAbilityWillCreate");
261 if (!ability) {
262 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
263 return;
264 }
265 for (auto &callback : onAbilityWillCreatecallbacks_) {
266 if (!callback.second) {
267 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
268 return;
269 }
270 callback.second(ability);
271 }
272 }
273
OnWindowStageWillCreate(const int64_t & ability,WindowStagePtr windowStage)274 void CjAbilityLifecycleCallbackImpl::OnWindowStageWillCreate(const int64_t &ability, WindowStagePtr windowStage)
275 {
276 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnWindowStageWillCreate");
277 if (!ability || !windowStage) {
278 TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is nullptr");
279 return;
280 }
281 for (auto &callback : onWindowStageWillCreatecallbacks_) {
282 if (!callback.second) {
283 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
284 return;
285 }
286 callback.second(ability, windowStage);
287 }
288 }
289
OnWindowStageWillDestroy(const int64_t & ability,WindowStagePtr windowStage)290 void CjAbilityLifecycleCallbackImpl::OnWindowStageWillDestroy(const int64_t &ability, WindowStagePtr windowStage)
291 {
292 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnWindowStageWillDestroy");
293 if (!ability || !windowStage) {
294 TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is nullptr");
295 return;
296 }
297 for (auto &callback : onWindowStageWillDestroycallbacks_) {
298 if (!callback.second) {
299 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
300 return;
301 }
302 callback.second(ability, windowStage);
303 }
304 }
305
OnAbilityWillDestroy(const int64_t & ability)306 void CjAbilityLifecycleCallbackImpl::OnAbilityWillDestroy(const int64_t &ability)
307 {
308 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnAbilityWillDestroy");
309 if (!ability) {
310 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
311 return;
312 }
313 for (auto &callback : onAbilityWillDestroycallbacks_) {
314 if (!callback.second) {
315 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
316 return;
317 }
318 callback.second(ability);
319 }
320 }
OnAbilityWillForeground(const int64_t & ability)321 void CjAbilityLifecycleCallbackImpl::OnAbilityWillForeground(const int64_t &ability)
322 {
323 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnAbilityWillForeground");
324 if (!ability) {
325 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
326 return;
327 }
328 for (auto &callback : onAbilityWillForegroundcallbacks_) {
329 if (!callback.second) {
330 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
331 return;
332 }
333 callback.second(ability);
334 }
335 }
OnAbilityWillBackground(const int64_t & ability)336 void CjAbilityLifecycleCallbackImpl::OnAbilityWillBackground(const int64_t &ability)
337 {
338 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnAbilityWillBackground");
339 if (!ability) {
340 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
341 return;
342 }
343 for (auto &callback : onAbilityWillBackgroundcallbacks_) {
344 if (!callback.second) {
345 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
346 return;
347 }
348 callback.second(ability);
349 }
350 }
351
OnNewWant(const int64_t & ability)352 void CjAbilityLifecycleCallbackImpl::OnNewWant(const int64_t &ability)
353 {
354 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnNewWant");
355 if (!ability) {
356 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
357 return;
358 }
359 for (auto &callback : onNewWantcallbacks_) {
360 if (!callback.second) {
361 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
362 return;
363 }
364 callback.second(ability);
365 }
366 }
367
OnWillNewWant(const int64_t & ability)368 void CjAbilityLifecycleCallbackImpl::OnWillNewWant(const int64_t &ability)
369 {
370 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnWillNewWant");
371 if (!ability) {
372 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
373 return;
374 }
375 for (auto &callback : onWillNewWantcallbacks_) {
376 if (!callback.second) {
377 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
378 return;
379 }
380 callback.second(ability);
381 }
382 }
383
OnAbilityWillContinue(const int64_t & ability)384 void CjAbilityLifecycleCallbackImpl::OnAbilityWillContinue(const int64_t &ability)
385 {
386 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnAbilityWillContinue");
387 if (!ability) {
388 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
389 return;
390 }
391 for (auto &callback : onAbilityWillContinuecallbacks_) {
392 if (!callback.second) {
393 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
394 return;
395 }
396 callback.second(ability);
397 }
398 }
399
OnWindowStageWillRestore(const int64_t & ability,WindowStagePtr windowStage)400 void CjAbilityLifecycleCallbackImpl::OnWindowStageWillRestore(const int64_t &ability, WindowStagePtr windowStage)
401 {
402 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnWindowStageWillRestore");
403 if (!ability || !windowStage) {
404 TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is nullptr");
405 return;
406 }
407 for (auto &callback : onWindowStageWillRestorecallbacks_) {
408 if (!callback.second) {
409 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
410 return;
411 }
412 callback.second(ability, windowStage);
413 }
414 }
415
OnWindowStageRestore(const int64_t & ability,WindowStagePtr windowStage)416 void CjAbilityLifecycleCallbackImpl::OnWindowStageRestore(const int64_t &ability, WindowStagePtr windowStage)
417 {
418 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnWindowStageRestore");
419 if (!ability || !windowStage) {
420 TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is nullptr");
421 return;
422 }
423 for (auto &callback : onWindowStageRestorecallbacks_) {
424 if (!callback.second) {
425 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
426 return;
427 }
428 callback.second(ability, windowStage);
429 }
430 }
431
OnAbilityWillSaveState(const int64_t & ability)432 void CjAbilityLifecycleCallbackImpl::OnAbilityWillSaveState(const int64_t &ability)
433 {
434 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnAbilityWillSaveState");
435 if (!ability) {
436 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
437 return;
438 }
439 for (auto &callback : onAbilityWillSaveStatecallbacks_) {
440 if (!callback.second) {
441 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
442 return;
443 }
444 callback.second(ability);
445 }
446 }
447
OnAbilitySaveState(const int64_t & ability)448 void CjAbilityLifecycleCallbackImpl::OnAbilitySaveState(const int64_t &ability)
449 {
450 TAG_LOGD(AAFwkTag::APPKIT, "methodName = OnAbilitySaveState");
451 if (!ability) {
452 TAG_LOGE(AAFwkTag::APPKIT, "ability is nullptr");
453 return;
454 }
455 for (auto &callback : onAbilitySaveStatecallbacks_) {
456 if (!callback.second) {
457 TAG_LOGE(AAFwkTag::APPKIT, "Invalid cjCallback");
458 return;
459 }
460 callback.second(ability);
461 }
462 }
463
464 } // namespace AbilityRuntime
465 } // namespace OHOS
466