• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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