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 }