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