• 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_application_context.h"
17 
18 #include "ability_delegator_registry.h"
19 #include "ability_manager_errors.h"
20 #include "application_context.h"
21 #include "running_process_info.h"
22 #include "cj_utils_ffi.h"
23 #include "cj_lambda.h"
24 #include "cj_macro.h"
25 #include "hilog_tag_wrapper.h"
26 #include "cj_ability_runtime_error.h"
27 
28 namespace OHOS {
29 namespace ApplicationContextCJ {
30 using namespace OHOS::FFI;
31 using namespace OHOS::AbilityRuntime;
32 
33 std::vector<std::shared_ptr<CjAbilityLifecycleCallback>> CJApplicationContext::callbacks_;
34 CJApplicationContext* CJApplicationContext::cjApplicationContext_ = nullptr;
35 std::mutex CJApplicationContext::contexMutex_;
36 
GetInstance()37 CJApplicationContext* CJApplicationContext::GetInstance()
38 {
39     return GetCJApplicationContext(AbilityRuntime::ApplicationContext::GetInstance());
40 }
41 
GetCJApplicationContext(std::weak_ptr<AbilityRuntime::ApplicationContext> && applicationContext)42 CJApplicationContext* CJApplicationContext::GetCJApplicationContext(
43     std::weak_ptr<AbilityRuntime::ApplicationContext> &&applicationContext)
44 {
45     if (cjApplicationContext_ == nullptr) {
46         std::lock_guard<std::mutex> lock(contexMutex_);
47         if (cjApplicationContext_ == nullptr) {
48             cjApplicationContext_ = FFIData::Create<CJApplicationContext>(applicationContext);
49         }
50     }
51     return cjApplicationContext_;
52 }
53 
GetArea()54 int CJApplicationContext::GetArea()
55 {
56     auto context = applicationContext_.lock();
57     if (context == nullptr) {
58         TAG_LOGE(AAFwkTag::CONTEXT, "null context");
59         return ContextImpl::EL_DEFAULT;
60     }
61     return context->GetArea();
62 }
63 
GetApplicationInfo()64 std::shared_ptr<AppExecFwk::ApplicationInfo> CJApplicationContext::GetApplicationInfo()
65 {
66     auto context = applicationContext_.lock();
67     if (context == nullptr) {
68         TAG_LOGE(AAFwkTag::CONTEXT, "null context");
69         return nullptr;
70     }
71     return context->GetApplicationInfo();
72 }
73 
IsAbilityLifecycleCallbackEmpty()74 bool CJApplicationContext::IsAbilityLifecycleCallbackEmpty()
75 {
76     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
77     return callbacks_.empty();
78 }
79 
RegisterAbilityLifecycleCallback(const std::shared_ptr<CjAbilityLifecycleCallback> & abilityLifecycleCallback)80 void CJApplicationContext::RegisterAbilityLifecycleCallback(
81     const std::shared_ptr<CjAbilityLifecycleCallback> &abilityLifecycleCallback)
82 {
83     TAG_LOGD(AAFwkTag::CONTEXT, "called");
84     if (abilityLifecycleCallback == nullptr) {
85         return;
86     }
87     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
88     callbacks_.push_back(abilityLifecycleCallback);
89 }
90 
UnregisterAbilityLifecycleCallback(const std::shared_ptr<CjAbilityLifecycleCallback> & abilityLifecycleCallback)91 void CJApplicationContext::UnregisterAbilityLifecycleCallback(
92     const std::shared_ptr<CjAbilityLifecycleCallback> &abilityLifecycleCallback)
93 {
94     TAG_LOGD(AAFwkTag::CONTEXT, "called");
95     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
96     auto it = std::find(callbacks_.begin(), callbacks_.end(), abilityLifecycleCallback);
97     if (it != callbacks_.end()) {
98         callbacks_.erase(it);
99     }
100 }
101 
DispatchOnAbilityCreate(const int64_t & ability)102 void CJApplicationContext::DispatchOnAbilityCreate(const int64_t &ability)
103 {
104     TAG_LOGD(AAFwkTag::APPKIT, "called");
105     if (!ability) {
106         TAG_LOGE(AAFwkTag::CONTEXT, "ability is null");
107         return;
108     }
109     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
110     for (auto callback : callbacks_) {
111         if (callback != nullptr) {
112             callback->OnAbilityCreate(ability);
113         }
114     }
115 }
116 
DispatchOnWindowStageCreate(const int64_t & ability,WindowStagePtr windowStage)117 void CJApplicationContext::DispatchOnWindowStageCreate(const int64_t &ability, WindowStagePtr windowStage)
118 {
119     TAG_LOGD(AAFwkTag::APPKIT, "called");
120     if (!ability || !windowStage) {
121         TAG_LOGE(AAFwkTag::CONTEXT, "ability or windowStage is nullptr");
122         return;
123     }
124     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
125     for (auto callback : callbacks_) {
126         if (callback != nullptr) {
127             callback->OnWindowStageCreate(ability, windowStage);
128         }
129     }
130 }
131 
DispatchWindowStageFocus(const int64_t & ability,WindowStagePtr windowStage)132 void CJApplicationContext::DispatchWindowStageFocus(const int64_t &ability, WindowStagePtr windowStage)
133 {
134     TAG_LOGD(AAFwkTag::APPKIT, "called");
135     if (!ability || !windowStage) {
136         TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is null");
137         return;
138     }
139     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
140     for (auto callback : callbacks_) {
141         if (callback != nullptr) {
142             callback->OnWindowStageActive(ability, windowStage);
143         }
144     }
145 }
146 
DispatchWindowStageUnfocus(const int64_t & ability,WindowStagePtr windowStage)147 void CJApplicationContext::DispatchWindowStageUnfocus(const int64_t &ability, WindowStagePtr windowStage)
148 {
149     TAG_LOGD(AAFwkTag::APPKIT, "called");
150     if (!ability || !windowStage) {
151         TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is nullptr");
152         return;
153     }
154     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
155     for (auto callback : callbacks_) {
156         if (callback != nullptr) {
157             callback->OnWindowStageInactive(ability, windowStage);
158         }
159     }
160 }
161 
DispatchOnWindowStageDestroy(const int64_t & ability,WindowStagePtr windowStage)162 void CJApplicationContext::DispatchOnWindowStageDestroy(const int64_t &ability, WindowStagePtr windowStage)
163 {
164     TAG_LOGD(AAFwkTag::APPKIT, "called");
165     if (!ability || !windowStage) {
166         TAG_LOGE(AAFwkTag::CONTEXT, "ability or windowStage is nullptr");
167         return;
168     }
169     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
170     for (auto callback : callbacks_) {
171         if (callback != nullptr) {
172             callback->OnWindowStageDestroy(ability, windowStage);
173         }
174     }
175 }
176 
DispatchOnAbilityDestroy(const int64_t & ability)177 void CJApplicationContext::DispatchOnAbilityDestroy(const int64_t &ability)
178 {
179     TAG_LOGD(AAFwkTag::APPKIT, "called");
180     if (!ability) {
181         TAG_LOGE(AAFwkTag::APPKIT, "ability is null");
182         return;
183     }
184     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
185     for (auto callback : callbacks_) {
186         if (callback != nullptr) {
187             callback->OnAbilityDestroy(ability);
188         }
189     }
190 }
191 
DispatchOnAbilityForeground(const int64_t & ability)192 void CJApplicationContext::DispatchOnAbilityForeground(const int64_t &ability)
193 {
194     TAG_LOGD(AAFwkTag::APPKIT, "called");
195     if (!ability) {
196         TAG_LOGE(AAFwkTag::CONTEXT, "ability is null");
197         return;
198     }
199     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
200     for (auto callback : callbacks_) {
201         if (callback != nullptr) {
202             callback->OnAbilityForeground(ability);
203         }
204     }
205 }
206 
DispatchOnAbilityBackground(const int64_t & ability)207 void CJApplicationContext::DispatchOnAbilityBackground(const int64_t &ability)
208 {
209     TAG_LOGD(AAFwkTag::APPKIT, "called");
210     if (!ability) {
211         TAG_LOGE(AAFwkTag::CONTEXT, "ability is null");
212         return;
213     }
214     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
215     for (auto callback : callbacks_) {
216         if (callback != nullptr) {
217             callback->OnAbilityBackground(ability);
218         }
219     }
220 }
221 
DispatchOnAbilityContinue(const int64_t & ability)222 void CJApplicationContext::DispatchOnAbilityContinue(const int64_t &ability)
223 {
224     TAG_LOGD(AAFwkTag::APPKIT, "called");
225     if (!ability) {
226         TAG_LOGE(AAFwkTag::APPKIT, "ability is null");
227         return;
228     }
229     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
230     for (auto callback : callbacks_) {
231         if (callback != nullptr) {
232             callback->OnAbilityContinue(ability);
233         }
234     }
235 }
236 
DispatchOnAbilityWillCreate(const int64_t & ability)237 void CJApplicationContext::DispatchOnAbilityWillCreate(const int64_t &ability)
238 {
239     TAG_LOGD(AAFwkTag::APPKIT, "called");
240     if (!ability) {
241         TAG_LOGE(AAFwkTag::APPKIT, "ability is null");
242         return;
243     }
244     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
245     for (auto callback : callbacks_) {
246         if (callback != nullptr) {
247             callback->OnAbilityWillCreate(ability);
248         }
249     }
250 }
251 
DispatchOnWindowStageWillCreate(const int64_t & ability,WindowStagePtr windowStage)252 void CJApplicationContext::DispatchOnWindowStageWillCreate(const int64_t &ability, WindowStagePtr windowStage)
253 {
254     TAG_LOGD(AAFwkTag::APPKIT, "called");
255     if (!ability || !windowStage) {
256         TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is null");
257         return;
258     }
259     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
260     for (auto callback : callbacks_) {
261         if (callback != nullptr) {
262             callback->OnWindowStageWillCreate(ability, windowStage);
263         }
264     }
265 }
266 
DispatchOnWindowStageWillDestroy(const int64_t & ability,WindowStagePtr windowStage)267 void CJApplicationContext::DispatchOnWindowStageWillDestroy(const int64_t &ability, WindowStagePtr windowStage)
268 {
269     TAG_LOGD(AAFwkTag::APPKIT, "called");
270     if (!ability || !windowStage) {
271         TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is null");
272         return;
273     }
274     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
275     for (auto callback : callbacks_) {
276         if (callback != nullptr) {
277             callback->OnWindowStageWillDestroy(ability, windowStage);
278         }
279     }
280 }
281 
DispatchOnAbilityWillDestroy(const int64_t & ability)282 void CJApplicationContext::DispatchOnAbilityWillDestroy(const int64_t &ability)
283 {
284     TAG_LOGD(AAFwkTag::APPKIT, "called");
285     if (!ability) {
286         TAG_LOGE(AAFwkTag::APPKIT, "ability is null");
287         return;
288     }
289     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
290     for (auto callback : callbacks_) {
291         if (callback != nullptr) {
292             callback->OnAbilityWillDestroy(ability);
293         }
294     }
295 }
296 
DispatchOnAbilityWillForeground(const int64_t & ability)297 void CJApplicationContext::DispatchOnAbilityWillForeground(const int64_t &ability)
298 {
299     TAG_LOGD(AAFwkTag::APPKIT, "called");
300     if (!ability) {
301         TAG_LOGE(AAFwkTag::APPKIT, "ability is null");
302         return;
303     }
304     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
305     for (auto callback : callbacks_) {
306         if (callback != nullptr) {
307             callback->OnAbilityWillForeground(ability);
308         }
309     }
310 }
311 
DispatchOnAbilityWillBackground(const int64_t & ability)312 void CJApplicationContext::DispatchOnAbilityWillBackground(const int64_t &ability)
313 {
314     TAG_LOGD(AAFwkTag::APPKIT, "called");
315     if (!ability) {
316         TAG_LOGE(AAFwkTag::APPKIT, "ability is null");
317         return;
318     }
319     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
320     for (auto callback : callbacks_) {
321         if (callback != nullptr) {
322             callback->OnAbilityWillBackground(ability);
323         }
324     }
325 }
326 
DispatchOnNewWant(const int64_t & ability)327 void CJApplicationContext::DispatchOnNewWant(const int64_t &ability)
328 {
329     TAG_LOGD(AAFwkTag::APPKIT, "called");
330     if (!ability) {
331         TAG_LOGE(AAFwkTag::APPKIT, "ability is null");
332         return;
333     }
334     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
335     for (auto callback : callbacks_) {
336         if (callback != nullptr) {
337             callback->OnNewWant(ability);
338         }
339     }
340 }
341 
DispatchOnWillNewWant(const int64_t & ability)342 void CJApplicationContext::DispatchOnWillNewWant(const int64_t &ability)
343 {
344     TAG_LOGD(AAFwkTag::APPKIT, "called");
345     if (!ability) {
346         TAG_LOGE(AAFwkTag::APPKIT, "ability is null");
347         return;
348     }
349     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
350     for (auto callback : callbacks_) {
351         if (callback != nullptr) {
352             callback->OnWillNewWant(ability);
353         }
354     }
355 }
356 
DispatchOnAbilityWillContinue(const int64_t & ability)357 void CJApplicationContext::DispatchOnAbilityWillContinue(const int64_t &ability)
358 {
359     TAG_LOGD(AAFwkTag::APPKIT, "Dispatch onAbilityWillContinue");
360     if (!ability) {
361         TAG_LOGE(AAFwkTag::APPKIT, "ability is null");
362         return;
363     }
364 
365     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
366     for (auto callback : callbacks_) {
367         if (callback != nullptr) {
368             callback->OnAbilityWillContinue(ability);
369         }
370     }
371 }
372 
DispatchOnWindowStageWillRestore(const int64_t & ability,WindowStagePtr windowStage)373 void CJApplicationContext::DispatchOnWindowStageWillRestore(const int64_t &ability, WindowStagePtr windowStage)
374 {
375     TAG_LOGD(AAFwkTag::APPKIT, "Dispatch onWindowStageWillRestore");
376     if (!ability || windowStage == nullptr) {
377         TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is null");
378         return;
379     }
380 
381     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
382     for (auto callback : callbacks_) {
383         if (callback != nullptr) {
384             callback->OnWindowStageWillRestore(ability, windowStage);
385         }
386     }
387 }
388 
DispatchOnWindowStageRestore(const int64_t & ability,WindowStagePtr windowStage)389 void CJApplicationContext::DispatchOnWindowStageRestore(const int64_t &ability, WindowStagePtr windowStage)
390 {
391     TAG_LOGD(AAFwkTag::APPKIT, "Dispatch onWindowStageRestore");
392     if (!ability || windowStage == nullptr) {
393         TAG_LOGE(AAFwkTag::APPKIT, "ability or windowStage is null");
394         return;
395     }
396 
397     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
398     for (auto callback : callbacks_) {
399         if (callback != nullptr) {
400             callback->OnWindowStageRestore(ability, windowStage);
401         }
402     }
403 }
404 
DispatchOnAbilityWillSaveState(const int64_t & ability)405 void CJApplicationContext::DispatchOnAbilityWillSaveState(const int64_t &ability)
406 {
407     TAG_LOGD(AAFwkTag::APPKIT, "Dispatch onAbilityWillSaveState");
408     if (!ability) {
409         TAG_LOGE(AAFwkTag::APPKIT, "ability is null");
410         return;
411     }
412 
413     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
414     for (auto callback : callbacks_) {
415         if (callback != nullptr) {
416             callback->OnAbilityWillSaveState(ability);
417         }
418     }
419 }
420 
DispatchOnAbilitySaveState(const int64_t & ability)421 void CJApplicationContext::DispatchOnAbilitySaveState(const int64_t &ability)
422 {
423     TAG_LOGD(AAFwkTag::APPKIT, "called");
424     if (!ability) {
425         TAG_LOGE(AAFwkTag::APPKIT, "ability is null");
426         return;
427     }
428 
429     std::lock_guard<std::recursive_mutex> lock(callbackLock_);
430     for (auto callback : callbacks_) {
431         if (callback != nullptr) {
432             callback->OnAbilitySaveState(ability);
433         }
434     }
435 }
436 
OnOnEnvironment(void (* cfgCallback)(CConfiguration),void (* memCallback)(int32_t),bool isSync,int32_t * errCode)437 int32_t CJApplicationContext::OnOnEnvironment(void (*cfgCallback)(CConfiguration),
438     void (*memCallback)(int32_t), bool isSync, int32_t *errCode)
439 {
440     auto context = applicationContext_.lock();
441     if (context == nullptr) {
442         TAG_LOGE(AAFwkTag::CONTEXT, "null context");
443         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
444         return -1;
445     }
446     if (envCallback_ != nullptr) {
447         TAG_LOGD(AAFwkTag::CONTEXT, "envCallback_ is not nullptr.");
448         return envCallback_->Register(CJLambda::Create(cfgCallback), CJLambda::Create(memCallback), isSync);
449     }
450     envCallback_ = std::make_shared<CjEnvironmentCallback>();
451     int32_t callbackId = envCallback_->Register(CJLambda::Create(cfgCallback), CJLambda::Create(memCallback), isSync);
452     context->RegisterEnvironmentCallback(envCallback_);
453     TAG_LOGD(AAFwkTag::CONTEXT, "OnOnEnvironment is end");
454     return callbackId;
455 }
456 
OnOnAbilityLifecycle(CArrI64 cFuncIds,bool isSync,int32_t * errCode)457 int32_t CJApplicationContext::OnOnAbilityLifecycle(CArrI64 cFuncIds, bool isSync, int32_t *errCode)
458 {
459     auto context = applicationContext_.lock();
460     if (context == nullptr) {
461         TAG_LOGE(AAFwkTag::CONTEXT, "null context");
462         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
463         return -1;
464     }
465     if (callback_ != nullptr) {
466         TAG_LOGD(AAFwkTag::CONTEXT, "callback_ is not nullptr.");
467         return callback_->Register(cFuncIds, isSync);
468     }
469     callback_ = std::make_shared<CjAbilityLifecycleCallbackImpl>();
470     int32_t callbackId = callback_->Register(cFuncIds, isSync);
471     RegisterAbilityLifecycleCallback(callback_);
472     return callbackId;
473 }
474 
OnOnApplicationStateChange(void (* foregroundCallback)(void),void (* backgroundCallback)(void),int32_t * errCode)475 int32_t CJApplicationContext::OnOnApplicationStateChange(void (*foregroundCallback)(void),
476     void (*backgroundCallback)(void), int32_t *errCode)
477 {
478     auto context = applicationContext_.lock();
479     if (context == nullptr) {
480         TAG_LOGE(AAFwkTag::CONTEXT, "null context");
481         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
482         return -1;
483     }
484     std::lock_guard<std::mutex> lock(applicationStateCallbackLock_);
485     if (applicationStateCallback_ != nullptr) {
486         return applicationStateCallback_->Register(CJLambda::Create(foregroundCallback),
487             CJLambda::Create(backgroundCallback));
488     }
489     applicationStateCallback_ = std::make_shared<CjApplicationStateChangeCallback>();
490     int32_t callbackId = applicationStateCallback_->Register(CJLambda::Create(foregroundCallback),
491         CJLambda::Create(backgroundCallback));
492     context->RegisterApplicationStateChangeCallback(applicationStateCallback_);
493     return callbackId;
494 }
495 
OnOffEnvironment(int32_t callbackId,int32_t * errCode)496 void CJApplicationContext::OnOffEnvironment(int32_t callbackId, int32_t *errCode)
497 {
498     auto context = applicationContext_.lock();
499     if (context == nullptr) {
500         TAG_LOGE(AAFwkTag::CONTEXT, "null context");
501         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
502         return;
503     }
504     std::weak_ptr<CjEnvironmentCallback> envCallbackWeak(envCallback_);
505     auto env_callback = envCallbackWeak.lock();
506     if (env_callback == nullptr) {
507         TAG_LOGD(AAFwkTag::CONTEXT, "env_callback is not nullptr.");
508         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
509         return;
510     }
511     TAG_LOGD(AAFwkTag::CONTEXT, "OnOffEnvironment begin");
512     if (!env_callback->UnRegister(callbackId, false)) {
513         TAG_LOGE(AAFwkTag::CONTEXT, "call UnRegister failed");
514         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
515         return;
516     }
517 }
518 
OnOffAbilityLifecycle(int32_t callbackId,int32_t * errCode)519 void CJApplicationContext::OnOffAbilityLifecycle(int32_t callbackId, int32_t *errCode)
520 {
521     auto context = applicationContext_.lock();
522     if (context == nullptr) {
523         TAG_LOGE(AAFwkTag::CONTEXT, "null context");
524         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
525         return;
526     }
527     std::weak_ptr<CjAbilityLifecycleCallbackImpl> callbackWeak(callback_);
528     auto lifecycle_callback = callbackWeak.lock();
529     if (lifecycle_callback == nullptr) {
530         TAG_LOGD(AAFwkTag::CONTEXT, "env_callback is not nullptr.");
531         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
532         return;
533     }
534     TAG_LOGD(AAFwkTag::CONTEXT, "OnOffAbilityLifecycle begin");
535     if (!lifecycle_callback->UnRegister(callbackId, false)) {
536         TAG_LOGE(AAFwkTag::CONTEXT, "call UnRegister failed");
537         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
538         return;
539     }
540 }
541 
OnOffApplicationStateChange(int32_t callbackId,int32_t * errCode)542 void CJApplicationContext::OnOffApplicationStateChange(int32_t callbackId, int32_t *errCode)
543 {
544     auto context = applicationContext_.lock();
545     if (context == nullptr) {
546         TAG_LOGE(AAFwkTag::CONTEXT, "null context");
547         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
548         return;
549     }
550     std::lock_guard<std::mutex> lock(applicationStateCallbackLock_);
551     if (applicationStateCallback_ == nullptr) {
552         TAG_LOGD(AAFwkTag::CONTEXT, "env_callback is not nullptr.");
553         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
554         return;
555     }
556     TAG_LOGD(AAFwkTag::CONTEXT, "OnOffApplicationStateChange begin");
557     if (!applicationStateCallback_->UnRegister(callbackId)) {
558         TAG_LOGE(AAFwkTag::CONTEXT, "call UnRegister failed");
559         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
560         return;
561     }
562     if (applicationStateCallback_->IsEmpty()) {
563         applicationStateCallback_.reset();
564     }
565 }
566 
OnSetFont(std::string font)567 void CJApplicationContext::OnSetFont(std::string font)
568 {
569     auto context = applicationContext_.lock();
570     if (context == nullptr) {
571         TAG_LOGE(AAFwkTag::CONTEXT, "applicationContext is already released");
572         return;
573     }
574     context->SetFont(font);
575 }
576 
OnSetLanguage(std::string language)577 void CJApplicationContext::OnSetLanguage(std::string language)
578 {
579     auto context = applicationContext_.lock();
580     if (context == nullptr) {
581         TAG_LOGE(AAFwkTag::CONTEXT, "applicationContext is already released");
582         return;
583     }
584     context->SetLanguage(language);
585 }
586 
OnSetColorMode(int32_t colorMode)587 void CJApplicationContext::OnSetColorMode(int32_t colorMode)
588 {
589     auto context = applicationContext_.lock();
590     if (context == nullptr) {
591         TAG_LOGE(AAFwkTag::CONTEXT, "applicationContext is already released");
592         return;
593     }
594     context->SetColorMode(colorMode);
595 }
596 
OnGetRunningProcessInformation(int32_t * errCode)597 std::shared_ptr<AppExecFwk::RunningProcessInfo> CJApplicationContext::OnGetRunningProcessInformation(
598     int32_t *errCode)
599 {
600     auto context = applicationContext_.lock();
601     if (context == nullptr) {
602         TAG_LOGE(AAFwkTag::CONTEXT, "applicationContext is already released");
603         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST;
604         return nullptr;
605     }
606     auto processInfo = std::make_shared<AppExecFwk::RunningProcessInfo>();
607     *errCode = context->GetProcessRunningInformation(*processInfo);
608     return processInfo;
609 }
610 
OnKillProcessBySelf(bool clearPageStack,int32_t * errCode)611 void CJApplicationContext::OnKillProcessBySelf(bool clearPageStack, int32_t *errCode)
612 {
613     auto context = applicationContext_.lock();
614     if (context == nullptr) {
615         TAG_LOGE(AAFwkTag::CONTEXT, "applicationContext is already released");
616         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST;
617         return;
618     }
619     context->KillProcessBySelf(clearPageStack);
620 }
621 
OnGetCurrentAppCloneIndex(int32_t * errCode)622 int32_t CJApplicationContext::OnGetCurrentAppCloneIndex(int32_t *errCode)
623 {
624     auto context = applicationContext_.lock();
625     if (context == nullptr) {
626         TAG_LOGE(AAFwkTag::CONTEXT, "applicationContext is already released");
627         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST;
628         return -1;
629     }
630     if (context->GetCurrentAppMode() != static_cast<int32_t>(AppExecFwk::MultiAppModeType::APP_CLONE)) {
631         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_NOT_APP_CLONE;
632         return -1;
633     }
634     return context->GetCurrentAppCloneIndex();
635 }
636 
OnRestartApp(AAFwk::Want want,int32_t * errCode)637 void CJApplicationContext::OnRestartApp(AAFwk::Want want, int32_t *errCode)
638 {
639     auto context = applicationContext_.lock();
640     if (context == nullptr) {
641         TAG_LOGE(AAFwkTag::CONTEXT, "applicationContext is already released");
642         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST;
643         return;
644     }
645     auto code = context->RestartApp(want);
646     if (code == ERR_OK) {
647         return;
648     }
649     if (code == ERR_INVALID_VALUE) {
650         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
651     } else if (code == AAFwk::ERR_RESTART_APP_INCORRECT_ABILITY) {
652         *errCode = ERR_ABILITY_RUNTIME_RESTART_APP_INCORRECT_ABILITY;
653     } else if (code == AAFwk::ERR_RESTART_APP_FREQUENT) {
654         *errCode = ERR_ABILITY_RUNTIME_RESTART_APP_FREQUENT;
655     } else if (code == AAFwk::NOT_TOP_ABILITY) {
656         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_NOT_TOP_ABILITY;
657     } else {
658         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR;
659     }
660 }
661 
OnClearUpApplicationData(int32_t * errCode)662 void CJApplicationContext::OnClearUpApplicationData(int32_t *errCode)
663 {
664     auto context = applicationContext_.lock();
665     if (!context) {
666         TAG_LOGE(AAFwkTag::APPKIT, "applicationContext is released");
667         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST;
668         return;
669     }
670     context->ClearUpApplicationData();
671 }
672 
OnSetSupportedProcessCacheSelf(bool isSupported,int32_t * errCode)673 void CJApplicationContext::OnSetSupportedProcessCacheSelf(bool isSupported, int32_t *errCode)
674 {
675     auto context = applicationContext_.lock();
676     if (!context) {
677         TAG_LOGE(AAFwkTag::APPKIT, "applicationContext is released");
678         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST;
679         return;
680     }
681     int32_t code = context->SetSupportedProcessCacheSelf(isSupported);
682     if (code == AAFwk::ERR_CAPABILITY_NOT_SUPPORT) {
683         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_NO_SUCH_SYSCAP;
684     } else if (code != ERR_OK) {
685         *errCode = ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR;
686     }
687 }
688 
689 extern "C" {
OHOS_CjAppCtxFunc(int32_t type,int64_t id)690 CJ_EXPORT void OHOS_CjAppCtxFunc(int32_t type, int64_t id)
691 {
692     auto applicationContext = AbilityRuntime::Context::GetApplicationContext();
693     if (applicationContext == nullptr) {
694         TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
695         return;
696     }
697     auto appContext = ApplicationContextCJ::CJApplicationContext::GetCJApplicationContext(applicationContext);
698     if (appContext == nullptr) {
699         TAG_LOGE(AAFwkTag::APPKIT, "null appContext");
700         return;
701     }
702     switch (CjAppCtxFuncType(type)) {
703         case CjAppCtxFuncType::ON_ABILITY_WILL_CREATE:
704             return appContext->DispatchOnAbilityWillCreate(id);
705         case CjAppCtxFuncType::ON_ABILITY_CREATE:
706             return appContext->DispatchOnAbilityCreate(id);
707         case CjAppCtxFuncType::ON_ABILITY_WILL_DESTROY:
708             return appContext->DispatchOnAbilityWillDestroy(id);
709         case CjAppCtxFuncType::ON_ABILITY_DESTROY:
710             return appContext->DispatchOnAbilityDestroy(id);
711         case CjAppCtxFuncType::ON_ABILITY_WILL_FOREGROUND:
712             return appContext->DispatchOnAbilityWillForeground(id);
713         case CjAppCtxFuncType::ON_ABILITY_FOREGROUND:
714             return appContext->DispatchOnAbilityForeground(id);
715         case CjAppCtxFuncType::ON_ABILITY_WILL_BACKGROUND:
716             return appContext->DispatchOnAbilityWillBackground(id);
717         case CjAppCtxFuncType::ON_ABILITY_BACKGROUND:
718             return appContext->DispatchOnAbilityBackground(id);
719         case CjAppCtxFuncType::ON_ABILITY_WILL_CONTINUE:
720             return appContext->DispatchOnAbilityWillContinue(id);
721         case CjAppCtxFuncType::ON_ABILITY_CONTINUE:
722             return appContext->DispatchOnAbilityContinue(id);
723         case CjAppCtxFuncType::ON_ABILITY_WILL_SAVE_STATE:
724             return appContext->DispatchOnAbilityWillSaveState(id);
725         case CjAppCtxFuncType::ON_ABILITY_SAVE_STATE:
726             return appContext->DispatchOnAbilitySaveState(id);
727         case CjAppCtxFuncType::ON_WILL_NEW_WANT:
728             return appContext->DispatchOnWillNewWant(id);
729         case CjAppCtxFuncType::ON_NEW_WANT:
730             return appContext->DispatchOnNewWant(id);
731         default:
732             TAG_LOGE(AAFwkTag::APPKIT, "invalid type: %{public}d", type);
733             return;
734     }
735 }
736 
OHOS_CjAppCtxWindowFunc(int32_t type,int64_t id,void * window)737 CJ_EXPORT void OHOS_CjAppCtxWindowFunc(int32_t type, int64_t id, void* window)
738 {
739     auto applicationContext = AbilityRuntime::Context::GetApplicationContext();
740     if (applicationContext == nullptr) {
741         TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
742         return;
743     }
744     auto appContext = ApplicationContextCJ::CJApplicationContext::GetCJApplicationContext(applicationContext);
745     if (appContext == nullptr) {
746         TAG_LOGE(AAFwkTag::APPKIT, "null appContext");
747         return;
748     }
749     switch (CjAppCtxFuncType(type)) {
750         case CjAppCtxFuncType::ON_WINDOWSTAGE_WILL_CREATE:
751             return appContext->DispatchOnWindowStageWillCreate(id, window);
752         case CjAppCtxFuncType::ON_WINDOWSTAGE_CREATE:
753             return appContext->DispatchOnWindowStageCreate(id, window);
754         case CjAppCtxFuncType::ON_WINDOWSTAGE_WILL_RESTORE:
755             return appContext->DispatchOnWindowStageWillRestore(id, window);
756         case CjAppCtxFuncType::ON_WINDOWSTAGE_RESTORE:
757             return appContext->DispatchOnWindowStageRestore(id, window);
758         case CjAppCtxFuncType::ON_WINDOWSTAGE_WILL_DESTROY:
759             return appContext->DispatchOnWindowStageWillDestroy(id, window);
760         case CjAppCtxFuncType::ON_WINDOWSTAGE_DESTROY:
761             return appContext->DispatchOnWindowStageDestroy(id, window);
762         case CjAppCtxFuncType::WINDOWSTAGE_FOCUS:
763             return appContext->DispatchWindowStageFocus(id, window);
764         case CjAppCtxFuncType::WINDOWSTAGE_UNFOCUS:
765             return appContext->DispatchWindowStageUnfocus(id, window);
766         default:
767             TAG_LOGE(AAFwkTag::APPKIT, "invalid type: %{public}d", type);
768             return;
769     }
770 }
771 }
772 }
773 }