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