1 /*
2 * Copyright (c) 2022-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 "application_context.h"
17
18 #include <algorithm>
19
20 #include "ability_manager_errors.h"
21 #include "ability_util.h"
22 #include "configuration_convertor.h"
23 #include "exit_reason.h"
24 #include "hilog_tag_wrapper.h"
25 #include "hitrace_meter.h"
26 #include "js_runtime.h"
27 #include "running_process_info.h"
28
29 namespace OHOS {
30 namespace AbilityRuntime {
31 const size_t ApplicationContext::CONTEXT_TYPE_ID(std::hash<const char*> {} ("ApplicationContext"));
32 std::vector<std::shared_ptr<AbilityLifecycleCallback>> ApplicationContext::callbacks_;
33 std::vector<std::shared_ptr<EnvironmentCallback>> ApplicationContext::envCallbacks_;
34 std::vector<std::weak_ptr<ApplicationStateChangeCallback>> ApplicationContext::applicationStateCallback_;
35
GetInstance()36 std::shared_ptr<ApplicationContext> ApplicationContext::GetInstance()
37 {
38 if (applicationContext_ == nullptr) {
39 std::lock_guard<std::mutex> lock_l(Context::contextMutex_);
40 if (applicationContext_ == nullptr) {
41 applicationContext_ = std::make_shared<ApplicationContext>();
42 }
43 }
44 return applicationContext_;
45 }
46
AttachContextImpl(const std::shared_ptr<ContextImpl> & contextImpl)47 void ApplicationContext::AttachContextImpl(const std::shared_ptr<ContextImpl> &contextImpl)
48 {
49 contextImpl_ = contextImpl;
50 }
51
RegisterAbilityLifecycleCallback(const std::shared_ptr<AbilityLifecycleCallback> & abilityLifecycleCallback)52 void ApplicationContext::RegisterAbilityLifecycleCallback(
53 const std::shared_ptr<AbilityLifecycleCallback> &abilityLifecycleCallback)
54 {
55 TAG_LOGD(AAFwkTag::APPKIT, "called");
56 if (abilityLifecycleCallback == nullptr) {
57 return;
58 }
59 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
60 callbacks_.push_back(abilityLifecycleCallback);
61 }
62
UnregisterAbilityLifecycleCallback(const std::shared_ptr<AbilityLifecycleCallback> & abilityLifecycleCallback)63 void ApplicationContext::UnregisterAbilityLifecycleCallback(
64 const std::shared_ptr<AbilityLifecycleCallback> &abilityLifecycleCallback)
65 {
66 TAG_LOGD(AAFwkTag::APPKIT, "called");
67 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
68 auto it = std::find(callbacks_.begin(), callbacks_.end(), abilityLifecycleCallback);
69 if (it != callbacks_.end()) {
70 callbacks_.erase(it);
71 }
72 }
73
IsAbilityLifecycleCallbackEmpty()74 bool ApplicationContext::IsAbilityLifecycleCallbackEmpty()
75 {
76 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
77 return callbacks_.empty();
78 }
79
RegisterEnvironmentCallback(const std::shared_ptr<EnvironmentCallback> & environmentCallback)80 void ApplicationContext::RegisterEnvironmentCallback(
81 const std::shared_ptr<EnvironmentCallback> &environmentCallback)
82 {
83 TAG_LOGD(AAFwkTag::APPKIT, "called");
84 if (environmentCallback == nullptr) {
85 return;
86 }
87 std::lock_guard<std::recursive_mutex> lock(envCallbacksLock_);
88 envCallbacks_.push_back(environmentCallback);
89 }
90
UnregisterEnvironmentCallback(const std::shared_ptr<EnvironmentCallback> & environmentCallback)91 void ApplicationContext::UnregisterEnvironmentCallback(
92 const std::shared_ptr<EnvironmentCallback> &environmentCallback)
93 {
94 TAG_LOGD(AAFwkTag::APPKIT, "called");
95 std::lock_guard<std::recursive_mutex> lock(envCallbacksLock_);
96 auto it = std::find(envCallbacks_.begin(), envCallbacks_.end(), environmentCallback);
97 if (it != envCallbacks_.end()) {
98 envCallbacks_.erase(it);
99 }
100 }
101
RegisterApplicationStateChangeCallback(const std::weak_ptr<ApplicationStateChangeCallback> & applicationStateChangeCallback)102 void ApplicationContext::RegisterApplicationStateChangeCallback(
103 const std::weak_ptr<ApplicationStateChangeCallback> &applicationStateChangeCallback)
104 {
105 std::lock_guard<std::recursive_mutex> lock(applicationStateCallbackLock_);
106 applicationStateCallback_.push_back(applicationStateChangeCallback);
107 }
108
DispatchOnAbilityCreate(const std::shared_ptr<NativeReference> & ability)109 void ApplicationContext::DispatchOnAbilityCreate(const std::shared_ptr<NativeReference> &ability)
110 {
111 if (!ability) {
112 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
113 return;
114 }
115 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
116 for (auto callback : callbacks_) {
117 if (callback != nullptr) {
118 callback->OnAbilityCreate(ability);
119 }
120 }
121 }
122
DispatchOnWindowStageCreate(const std::shared_ptr<NativeReference> & ability,const std::shared_ptr<NativeReference> & windowStage)123 void ApplicationContext::DispatchOnWindowStageCreate(const std::shared_ptr<NativeReference> &ability,
124 const std::shared_ptr<NativeReference> &windowStage)
125 {
126 if (!ability || !windowStage) {
127 TAG_LOGE(AAFwkTag::APPKIT, "null ability or windowStage");
128 return;
129 }
130 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
131 for (auto callback : callbacks_) {
132 if (callback != nullptr) {
133 callback->OnWindowStageCreate(ability, windowStage);
134 }
135 }
136 }
137
DispatchOnWindowStageDestroy(const std::shared_ptr<NativeReference> & ability,const std::shared_ptr<NativeReference> & windowStage)138 void ApplicationContext::DispatchOnWindowStageDestroy(const std::shared_ptr<NativeReference> &ability,
139 const std::shared_ptr<NativeReference> &windowStage)
140 {
141 if (!ability || !windowStage) {
142 TAG_LOGE(AAFwkTag::APPKIT, "null ability or windowStage");
143 return;
144 }
145 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
146 for (auto callback : callbacks_) {
147 if (callback != nullptr) {
148 callback->OnWindowStageDestroy(ability, windowStage);
149 }
150 }
151 }
152
DispatchWindowStageFocus(const std::shared_ptr<NativeReference> & ability,const std::shared_ptr<NativeReference> & windowStage)153 void ApplicationContext::DispatchWindowStageFocus(const std::shared_ptr<NativeReference> &ability,
154 const std::shared_ptr<NativeReference> &windowStage)
155 {
156 TAG_LOGD(AAFwkTag::APPKIT, "called");
157 if (!ability || !windowStage) {
158 TAG_LOGE(AAFwkTag::APPKIT, "null ability or windowStage");
159 return;
160 }
161 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
162 for (auto callback : callbacks_) {
163 if (callback != nullptr) {
164 callback->OnWindowStageActive(ability, windowStage);
165 }
166 }
167 }
168
DispatchWindowStageUnfocus(const std::shared_ptr<NativeReference> & ability,const std::shared_ptr<NativeReference> & windowStage)169 void ApplicationContext::DispatchWindowStageUnfocus(const std::shared_ptr<NativeReference> &ability,
170 const std::shared_ptr<NativeReference> &windowStage)
171 {
172 TAG_LOGD(AAFwkTag::APPKIT, "called");
173 if (!ability || !windowStage) {
174 TAG_LOGE(AAFwkTag::APPKIT, "null ability or windowStage");
175 return;
176 }
177 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
178 for (auto callback : callbacks_) {
179 if (callback != nullptr) {
180 callback->OnWindowStageInactive(ability, windowStage);
181 }
182 }
183 }
184
DispatchOnAbilityDestroy(const std::shared_ptr<NativeReference> & ability)185 void ApplicationContext::DispatchOnAbilityDestroy(const std::shared_ptr<NativeReference> &ability)
186 {
187 if (!ability) {
188 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
189 return;
190 }
191 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
192 for (auto callback : callbacks_) {
193 if (callback != nullptr) {
194 callback->OnAbilityDestroy(ability);
195 }
196 }
197 }
198
DispatchOnAbilityForeground(const std::shared_ptr<NativeReference> & ability)199 void ApplicationContext::DispatchOnAbilityForeground(const std::shared_ptr<NativeReference> &ability)
200 {
201 if (!ability) {
202 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
203 return;
204 }
205 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
206 for (auto callback : callbacks_) {
207 if (callback != nullptr) {
208 callback->OnAbilityForeground(ability);
209 }
210 }
211 }
212
DispatchOnAbilityBackground(const std::shared_ptr<NativeReference> & ability)213 void ApplicationContext::DispatchOnAbilityBackground(const std::shared_ptr<NativeReference> &ability)
214 {
215 if (!ability) {
216 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
217 return;
218 }
219 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
220 for (auto callback : callbacks_) {
221 if (callback != nullptr) {
222 callback->OnAbilityBackground(ability);
223 }
224 }
225 }
226
DispatchOnAbilityContinue(const std::shared_ptr<NativeReference> & ability)227 void ApplicationContext::DispatchOnAbilityContinue(const std::shared_ptr<NativeReference> &ability)
228 {
229 if (!ability) {
230 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
231 return;
232 }
233 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
234 for (auto callback : callbacks_) {
235 if (callback != nullptr) {
236 callback->OnAbilityContinue(ability);
237 }
238 }
239 }
240
DispatchOnAbilityWillContinue(const std::shared_ptr<NativeReference> & ability)241 void ApplicationContext::DispatchOnAbilityWillContinue(const std::shared_ptr<NativeReference> &ability)
242 {
243 TAG_LOGD(AAFwkTag::APPKIT, "Dispatch onAbilityWillContinue");
244 if (ability == nullptr) {
245 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
246 return;
247 }
248
249 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
250 for (auto callback : callbacks_) {
251 if (callback != nullptr) {
252 callback->OnAbilityWillContinue(ability);
253 }
254 }
255 }
256
DispatchOnWindowStageWillRestore(const std::shared_ptr<NativeReference> & ability,const std::shared_ptr<NativeReference> & windowStage)257 void ApplicationContext::DispatchOnWindowStageWillRestore(const std::shared_ptr<NativeReference> &ability,
258 const std::shared_ptr<NativeReference> &windowStage)
259 {
260 TAG_LOGD(AAFwkTag::APPKIT, "Dispatch onWindowStageWillRestore");
261 if (ability == nullptr || windowStage == nullptr) {
262 TAG_LOGE(AAFwkTag::APPKIT, "null ability or windowStage");
263 return;
264 }
265
266 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
267 for (auto callback : callbacks_) {
268 if (callback != nullptr) {
269 callback->OnWindowStageWillRestore(ability, windowStage);
270 }
271 }
272 }
273
DispatchOnWindowStageRestore(const std::shared_ptr<NativeReference> & ability,const std::shared_ptr<NativeReference> & windowStage)274 void ApplicationContext::DispatchOnWindowStageRestore(const std::shared_ptr<NativeReference> &ability,
275 const std::shared_ptr<NativeReference> &windowStage)
276 {
277 TAG_LOGD(AAFwkTag::APPKIT, "Dispatch onWindowStageRestore");
278 if (ability == nullptr || windowStage == nullptr) {
279 TAG_LOGE(AAFwkTag::APPKIT, "null ability or windowStage");
280 return;
281 }
282
283 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
284 for (auto callback : callbacks_) {
285 if (callback != nullptr) {
286 callback->OnWindowStageRestore(ability, windowStage);
287 }
288 }
289 }
290
DispatchOnAbilityWillSaveState(const std::shared_ptr<NativeReference> & ability)291 void ApplicationContext::DispatchOnAbilityWillSaveState(const std::shared_ptr<NativeReference> &ability)
292 {
293 TAG_LOGD(AAFwkTag::APPKIT, "Dispatch onAbilityWillSaveState");
294 if (ability == nullptr) {
295 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
296 return;
297 }
298
299 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
300 for (auto callback : callbacks_) {
301 if (callback != nullptr) {
302 callback->OnAbilityWillSaveState(ability);
303 }
304 }
305 }
306
DispatchOnAbilitySaveState(const std::shared_ptr<NativeReference> & ability)307 void ApplicationContext::DispatchOnAbilitySaveState(const std::shared_ptr<NativeReference> &ability)
308 {
309 TAG_LOGD(AAFwkTag::APPKIT, "called");
310 if (ability == nullptr) {
311 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
312 return;
313 }
314
315 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
316 for (auto callback : callbacks_) {
317 if (callback != nullptr) {
318 callback->OnAbilitySaveState(ability);
319 }
320 }
321 }
322
DispatchConfigurationUpdated(const AppExecFwk::Configuration & config)323 void ApplicationContext::DispatchConfigurationUpdated(const AppExecFwk::Configuration &config)
324 {
325 std::lock_guard<std::recursive_mutex> lock(envCallbacksLock_);
326 for (auto envCallback : envCallbacks_) {
327 if (envCallback != nullptr) {
328 envCallback->OnConfigurationUpdated(config);
329 }
330 }
331 }
332
DispatchMemoryLevel(const int level)333 void ApplicationContext::DispatchMemoryLevel(const int level)
334 {
335 std::lock_guard<std::recursive_mutex> lock(envCallbacksLock_);
336 for (auto envCallback : envCallbacks_) {
337 if (envCallback != nullptr) {
338 envCallback->OnMemoryLevel(level);
339 }
340 }
341 }
342
NotifyApplicationForeground()343 void ApplicationContext::NotifyApplicationForeground()
344 {
345 std::lock_guard<std::recursive_mutex> lock(applicationStateCallbackLock_);
346 for (auto callback : applicationStateCallback_) {
347 auto callbackSptr = callback.lock();
348 if (callbackSptr != nullptr) {
349 callbackSptr->NotifyApplicationForeground();
350 }
351 }
352 }
353
NotifyApplicationBackground()354 void ApplicationContext::NotifyApplicationBackground()
355 {
356 std::lock_guard<std::recursive_mutex> lock(applicationStateCallbackLock_);
357 for (auto callback : applicationStateCallback_) {
358 auto callbackSptr = callback.lock();
359 if (callbackSptr != nullptr) {
360 callbackSptr->NotifyApplicationBackground();
361 }
362 }
363 }
364
DispatchOnWillNewWant(const std::shared_ptr<NativeReference> & ability)365 void ApplicationContext::DispatchOnWillNewWant(const std::shared_ptr<NativeReference> &ability)
366 {
367 if (!ability) {
368 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
369 return;
370 }
371 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
372 for (auto callback : callbacks_) {
373 if (callback != nullptr) {
374 callback->OnWillNewWant(ability);
375 }
376 }
377 }
378
DispatchOnNewWant(const std::shared_ptr<NativeReference> & ability)379 void ApplicationContext::DispatchOnNewWant(const std::shared_ptr<NativeReference> &ability)
380 {
381 if (!ability) {
382 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
383 return;
384 }
385 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
386 for (auto callback : callbacks_) {
387 if (callback != nullptr) {
388 callback->OnNewWant(ability);
389 }
390 }
391 }
392
DispatchOnAbilityWillCreate(const std::shared_ptr<NativeReference> & ability)393 void ApplicationContext::DispatchOnAbilityWillCreate(const std::shared_ptr<NativeReference> &ability)
394 {
395 TAG_LOGD(AAFwkTag::APPKIT, "called");
396 if (!ability) {
397 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
398 return;
399 }
400 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
401 for (auto callback : callbacks_) {
402 if (callback != nullptr) {
403 callback->OnAbilityWillCreate(ability);
404 }
405 }
406 }
407
DispatchOnWindowStageWillCreate(const std::shared_ptr<NativeReference> & ability,const std::shared_ptr<NativeReference> & windowStage)408 void ApplicationContext::DispatchOnWindowStageWillCreate(const std::shared_ptr<NativeReference> &ability,
409 const std::shared_ptr<NativeReference> &windowStage)
410 {
411 TAG_LOGD(AAFwkTag::APPKIT, "called");
412 if (!ability || !windowStage) {
413 TAG_LOGE(AAFwkTag::APPKIT, "null ability or windowStage");
414 return;
415 }
416 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
417 for (auto callback : callbacks_) {
418 if (callback != nullptr) {
419 callback->OnWindowStageWillCreate(ability, windowStage);
420 }
421 }
422 }
423
DispatchOnWindowStageWillDestroy(const std::shared_ptr<NativeReference> & ability,const std::shared_ptr<NativeReference> & windowStage)424 void ApplicationContext::DispatchOnWindowStageWillDestroy(const std::shared_ptr<NativeReference> &ability,
425 const std::shared_ptr<NativeReference> &windowStage)
426 {
427 TAG_LOGD(AAFwkTag::APPKIT, "called");
428 if (!ability || !windowStage) {
429 TAG_LOGE(AAFwkTag::APPKIT, "null ability or windowStage");
430 return;
431 }
432 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
433 for (auto callback : callbacks_) {
434 if (callback != nullptr) {
435 callback->OnWindowStageWillDestroy(ability, windowStage);
436 }
437 }
438 }
439
DispatchOnAbilityWillDestroy(const std::shared_ptr<NativeReference> & ability)440 void ApplicationContext::DispatchOnAbilityWillDestroy(const std::shared_ptr<NativeReference> &ability)
441 {
442 TAG_LOGD(AAFwkTag::APPKIT, "called");
443 if (!ability) {
444 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
445 return;
446 }
447 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
448 for (auto callback : callbacks_) {
449 if (callback != nullptr) {
450 callback->OnAbilityWillDestroy(ability);
451 }
452 }
453 }
454
DispatchOnAbilityWillForeground(const std::shared_ptr<NativeReference> & ability)455 void ApplicationContext::DispatchOnAbilityWillForeground(const std::shared_ptr<NativeReference> &ability)
456 {
457 TAG_LOGD(AAFwkTag::APPKIT, "called");
458 if (!ability) {
459 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
460 return;
461 }
462 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
463 for (auto callback : callbacks_) {
464 if (callback != nullptr) {
465 callback->OnAbilityWillForeground(ability);
466 }
467 }
468 }
469
DispatchOnAbilityWillBackground(const std::shared_ptr<NativeReference> & ability)470 void ApplicationContext::DispatchOnAbilityWillBackground(const std::shared_ptr<NativeReference> &ability)
471 {
472 TAG_LOGD(AAFwkTag::APPKIT, "called");
473 if (!ability) {
474 TAG_LOGE(AAFwkTag::APPKIT, "null ability");
475 return;
476 }
477 std::lock_guard<std::recursive_mutex> lock(callbackLock_);
478 for (auto callback : callbacks_) {
479 if (callback != nullptr) {
480 callback->OnAbilityWillBackground(ability);
481 }
482 }
483 }
484
GetBundleName() const485 std::string ApplicationContext::GetBundleName() const
486 {
487 return (contextImpl_ != nullptr) ? contextImpl_->GetBundleName() : "";
488 }
489
CreateBundleContext(const std::string & bundleName)490 std::shared_ptr<Context> ApplicationContext::CreateBundleContext(const std::string &bundleName)
491 {
492 return (contextImpl_ != nullptr) ? contextImpl_->CreateBundleContext(bundleName) : nullptr;
493 }
494
CreateModuleContext(const std::string & moduleName)495 std::shared_ptr<Context> ApplicationContext::CreateModuleContext(const std::string &moduleName)
496 {
497 return contextImpl_ ? contextImpl_->CreateModuleContext(moduleName) : nullptr;
498 }
499
CreateModuleContext(const std::string & bundleName,const std::string & moduleName)500 std::shared_ptr<Context> ApplicationContext::CreateModuleContext(const std::string &bundleName,
501 const std::string &moduleName)
502 {
503 return contextImpl_ ? contextImpl_->CreateModuleContext(bundleName, moduleName) : nullptr;
504 }
505
CreateModuleResourceManager(const std::string & bundleName,const std::string & moduleName)506 std::shared_ptr<Global::Resource::ResourceManager> ApplicationContext::CreateModuleResourceManager(
507 const std::string &bundleName, const std::string &moduleName)
508 {
509 return contextImpl_ ? contextImpl_->CreateModuleResourceManager(bundleName, moduleName) : nullptr;
510 }
511
CreateSystemHspModuleResourceManager(const std::string & bundleName,const std::string & moduleName,std::shared_ptr<Global::Resource::ResourceManager> & resourceManager)512 int32_t ApplicationContext::CreateSystemHspModuleResourceManager(const std::string &bundleName,
513 const std::string &moduleName, std::shared_ptr<Global::Resource::ResourceManager> &resourceManager)
514 {
515 return contextImpl_ ?
516 contextImpl_->CreateSystemHspModuleResourceManager(bundleName, moduleName, resourceManager) : ERR_INVALID_VALUE;
517 }
518
GetApplicationInfo() const519 std::shared_ptr<AppExecFwk::ApplicationInfo> ApplicationContext::GetApplicationInfo() const
520 {
521 return (contextImpl_ != nullptr) ? contextImpl_->GetApplicationInfo() : nullptr;
522 }
523
SetApplicationInfo(const std::shared_ptr<AppExecFwk::ApplicationInfo> & info)524 void ApplicationContext::SetApplicationInfo(const std::shared_ptr<AppExecFwk::ApplicationInfo> &info)
525 {
526 if (contextImpl_ != nullptr) {
527 contextImpl_->SetApplicationInfo(info);
528 }
529 applicationInfoUpdateFlag_ = true;
530 }
531
GetApplicationInfoUpdateFlag() const532 bool ApplicationContext::GetApplicationInfoUpdateFlag() const
533 {
534 return applicationInfoUpdateFlag_;
535 }
536
SetApplicationInfoUpdateFlag(bool flag)537 void ApplicationContext::SetApplicationInfoUpdateFlag(bool flag)
538 {
539 applicationInfoUpdateFlag_ = flag;
540 }
541
GetResourceManager() const542 std::shared_ptr<Global::Resource::ResourceManager> ApplicationContext::GetResourceManager() const
543 {
544 return (contextImpl_ != nullptr) ? contextImpl_->GetResourceManager() : nullptr;
545 }
546
GetBundleCodePath() const547 std::string ApplicationContext::GetBundleCodePath() const
548 {
549 return (contextImpl_ != nullptr) ? contextImpl_->GetBundleCodePath() : "";
550 }
551
GetHapModuleInfo() const552 std::shared_ptr<AppExecFwk::HapModuleInfo> ApplicationContext::GetHapModuleInfo() const
553 {
554 return nullptr;
555 }
556
GetBundleCodeDir()557 std::string ApplicationContext::GetBundleCodeDir()
558 {
559 return (contextImpl_ != nullptr) ? contextImpl_->GetBundleCodeDir() : "";
560 }
561
GetCacheDir()562 std::string ApplicationContext::GetCacheDir()
563 {
564 return (contextImpl_ != nullptr) ? contextImpl_->GetCacheDir() : "";
565 }
566
GetTempDir()567 std::string ApplicationContext::GetTempDir()
568 {
569 return (contextImpl_ != nullptr) ? contextImpl_->GetTempDir() : "";
570 }
571
GetResourceDir(const std::string & moduleName)572 std::string ApplicationContext::GetResourceDir(const std::string &moduleName)
573 {
574 return (contextImpl_ != nullptr) ? contextImpl_->GetResourceDir(moduleName) : "";
575 }
576
IsModuleExist(const std::string & moduleName)577 bool ApplicationContext::IsModuleExist(const std::string &moduleName)
578 {
579 return (contextImpl_ != nullptr) ? contextImpl_->IsModuleExist(moduleName) : false;
580 }
581
GetAllTempDir(std::vector<std::string> & tempPaths)582 void ApplicationContext::GetAllTempDir(std::vector<std::string> &tempPaths)
583 {
584 if (contextImpl_ == nullptr) {
585 TAG_LOGE(AAFwkTag::APPKIT, "null contextImpl");
586 return;
587 }
588 contextImpl_->GetAllTempDir(tempPaths);
589 }
590
GetFilesDir()591 std::string ApplicationContext::GetFilesDir()
592 {
593 return (contextImpl_ != nullptr) ? contextImpl_->GetFilesDir() : "";
594 }
595
KillProcessBySelf(const bool clearPageStack)596 void ApplicationContext::KillProcessBySelf(const bool clearPageStack)
597 {
598 if (contextImpl_ != nullptr) {
599 contextImpl_->KillProcessBySelf(clearPageStack);
600 }
601 }
602
GetProcessRunningInformation(AppExecFwk::RunningProcessInfo & info)603 int32_t ApplicationContext::GetProcessRunningInformation(AppExecFwk::RunningProcessInfo &info)
604 {
605 return (contextImpl_ != nullptr) ? contextImpl_->GetProcessRunningInformation(info) : -1;
606 }
607
GetAllRunningInstanceKeys(std::vector<std::string> & instanceKeys)608 int32_t ApplicationContext::GetAllRunningInstanceKeys(std::vector<std::string> &instanceKeys)
609 {
610 return (contextImpl_ != nullptr) ? contextImpl_->GetAllRunningInstanceKeys(instanceKeys) : -1;
611 }
612
IsUpdatingConfigurations()613 bool ApplicationContext::IsUpdatingConfigurations()
614 {
615 return (contextImpl_ != nullptr) ? contextImpl_->IsUpdatingConfigurations() : false;
616 }
617
PrintDrawnCompleted()618 bool ApplicationContext::PrintDrawnCompleted()
619 {
620 return (contextImpl_ != nullptr) ? contextImpl_->PrintDrawnCompleted() : false;
621 }
622
GetDatabaseDir()623 std::string ApplicationContext::GetDatabaseDir()
624 {
625 return (contextImpl_ != nullptr) ? contextImpl_->GetDatabaseDir() : "";
626 }
627
GetPreferencesDir()628 std::string ApplicationContext::GetPreferencesDir()
629 {
630 return (contextImpl_ != nullptr) ? contextImpl_->GetPreferencesDir() : "";
631 }
632
GetSystemDatabaseDir(const std::string & groupId,bool checkExist,std::string & databaseDir)633 int32_t ApplicationContext::GetSystemDatabaseDir(const std::string &groupId, bool checkExist, std::string &databaseDir)
634 {
635 return contextImpl_ ?
636 contextImpl_->GetSystemDatabaseDir(groupId, checkExist, databaseDir) : ERR_INVALID_VALUE;
637 }
638
GetSystemPreferencesDir(const std::string & groupId,bool checkExist,std::string & preferencesDir)639 int32_t ApplicationContext::GetSystemPreferencesDir(const std::string &groupId, bool checkExist,
640 std::string &preferencesDir)
641 {
642 return contextImpl_ ?
643 contextImpl_->GetSystemPreferencesDir(groupId, checkExist, preferencesDir) : ERR_INVALID_VALUE;
644 }
645
GetGroupDir(std::string groupId)646 std::string ApplicationContext::GetGroupDir(std::string groupId)
647 {
648 return (contextImpl_ != nullptr) ? contextImpl_->GetGroupDir(groupId) : "";
649 }
650
RestartApp(const AAFwk::Want & want)651 int32_t ApplicationContext::RestartApp(const AAFwk::Want& want)
652 {
653 std::string abilityName = want.GetElement().GetAbilityName();
654 if (abilityName == "") {
655 TAG_LOGE(AAFwkTag::APPKIT, "abilityName empty");
656 return ERR_INVALID_VALUE;
657 }
658 std::string bundleName = GetBundleName();
659 const_cast<AAFwk::Want &>(want).SetBundle(bundleName);
660 return (contextImpl_ != nullptr) ? contextImpl_->RestartApp(want) : ERR_INVALID_VALUE;
661 }
662
GetDistributedFilesDir()663 std::string ApplicationContext::GetDistributedFilesDir()
664 {
665 return (contextImpl_ != nullptr) ? contextImpl_->GetDistributedFilesDir() : "";
666 }
667
GetCloudFileDir()668 std::string ApplicationContext::GetCloudFileDir()
669 {
670 return (contextImpl_ != nullptr) ? contextImpl_->GetCloudFileDir() : "";
671 }
672
GetToken()673 sptr<IRemoteObject> ApplicationContext::GetToken()
674 {
675 return (contextImpl_ != nullptr) ? contextImpl_->GetToken() : nullptr;
676 }
677
SetToken(const sptr<IRemoteObject> & token)678 void ApplicationContext::SetToken(const sptr<IRemoteObject> &token)
679 {
680 if (contextImpl_ != nullptr) {
681 contextImpl_->SetToken(token);
682 }
683 }
684
SwitchArea(int mode)685 void ApplicationContext::SwitchArea(int mode)
686 {
687 if (contextImpl_ != nullptr) {
688 contextImpl_->SwitchArea(mode);
689 }
690 }
691
SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration> & config)692 void ApplicationContext::SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration> &config)
693 {
694 if (contextImpl_ == nullptr) {
695 TAG_LOGE(AAFwkTag::APPKIT, "null context");
696 return;
697 }
698 contextImpl_->SetConfiguration(config);
699 }
700
AppHasDarkRes(bool & darkRes)701 void ApplicationContext::AppHasDarkRes(bool &darkRes)
702 {
703 if (contextImpl_ == nullptr) {
704 TAG_LOGE(AAFwkTag::APPKIT, "null context");
705 return;
706 }
707 contextImpl_->AppHasDarkRes(darkRes);
708 }
709
SetColorMode(int32_t colorMode)710 void ApplicationContext::SetColorMode(int32_t colorMode)
711 {
712 TAG_LOGD(AAFwkTag::APPKIT, "colorMode:%{public}d", colorMode);
713 if (colorMode < -1 || colorMode > 1) {
714 TAG_LOGE(AAFwkTag::APPKIT, "colorMode invalid");
715 return;
716 }
717 AppExecFwk::Configuration config;
718 config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE, AppExecFwk::GetColorModeStr(colorMode));
719 if (appConfigChangeCallback_ != nullptr) {
720 appConfigChangeCallback_(config);
721 }
722 }
723
SetLanguage(const std::string & language)724 void ApplicationContext::SetLanguage(const std::string &language)
725 {
726 TAG_LOGD(AAFwkTag::APPKIT, "language:%{public}s", language.c_str());
727 AppExecFwk::Configuration config;
728 config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE, language);
729 if (appConfigChangeCallback_ != nullptr) {
730 appConfigChangeCallback_(config);
731 }
732 }
733
SetFont(const std::string & font)734 void ApplicationContext::SetFont(const std::string &font)
735 {
736 TAG_LOGD(AAFwkTag::APPKIT, "font:%{public}s", font.c_str());
737 #ifdef SUPPORT_GRAPHICS
738 // Notify Window
739 AppExecFwk::Configuration config;
740 config.AddItem(AppExecFwk::ConfigurationInner::APPLICATION_FONT, font);
741 if (appFontCallback_ != nullptr) {
742 appFontCallback_(config);
743 }
744 #endif
745 }
746
SetFontSizeScale(double fontSizeScale)747 bool ApplicationContext::SetFontSizeScale(double fontSizeScale)
748 {
749 if (contextImpl_ == nullptr) {
750 TAG_LOGE(AAFwkTag::APPKIT, "null context");
751 return false;
752 }
753
754 AppExecFwk::Configuration config;
755 config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_SIZE_SCALE, std::to_string(fontSizeScale));
756 if (appConfigChangeCallback_ != nullptr) {
757 appConfigChangeCallback_(config);
758 }
759 TAG_LOGD(AAFwkTag::APPKIT, "SetFontSizeScale callback ok");
760 return true;
761 }
762
SetMcc(const std::string & mcc)763 void ApplicationContext::SetMcc(const std::string &mcc)
764 {
765 if (contextImpl_ != nullptr) {
766 contextImpl_->SetMcc(mcc);
767 }
768 }
769
SetMnc(const std::string & mnc)770 void ApplicationContext::SetMnc(const std::string &mnc)
771 {
772 if (contextImpl_ != nullptr) {
773 contextImpl_->SetMnc(mnc);
774 }
775 }
776
ClearUpApplicationData()777 void ApplicationContext::ClearUpApplicationData()
778 {
779 if (contextImpl_ != nullptr) {
780 contextImpl_->ClearUpApplicationData();
781 }
782 }
783
GetArea()784 int ApplicationContext::GetArea()
785 {
786 if (contextImpl_ == nullptr) {
787 TAG_LOGE(AAFwkTag::APPKIT, "null contextImpl");
788 return ContextImpl::EL_DEFAULT;
789 }
790 return contextImpl_->GetArea();
791 }
792
GetProcessName()793 std::string ApplicationContext::GetProcessName()
794 {
795 return (contextImpl_ != nullptr) ? contextImpl_->GetProcessName() : "";
796 }
797
GetConfiguration() const798 std::shared_ptr<AppExecFwk::Configuration> ApplicationContext::GetConfiguration() const
799 {
800 return (contextImpl_ != nullptr) ? contextImpl_->GetConfiguration() : nullptr;
801 }
802
GetBaseDir() const803 std::string ApplicationContext::GetBaseDir() const
804 {
805 return (contextImpl_ != nullptr) ? contextImpl_->GetBaseDir() : "";
806 }
807
GetDeviceType() const808 Global::Resource::DeviceType ApplicationContext::GetDeviceType() const
809 {
810 return (contextImpl_ != nullptr) ? contextImpl_->GetDeviceType() : Global::Resource::DeviceType::DEVICE_PHONE;
811 }
812
RegisterAppConfigUpdateObserver(AppConfigUpdateCallback appConfigChangeCallback)813 void ApplicationContext::RegisterAppConfigUpdateObserver(AppConfigUpdateCallback appConfigChangeCallback)
814 {
815 appConfigChangeCallback_ = appConfigChangeCallback;
816 }
817
RegisterAppFontObserver(AppConfigUpdateCallback appFontCallback)818 void ApplicationContext::RegisterAppFontObserver(AppConfigUpdateCallback appFontCallback)
819 {
820 appFontCallback_ = appFontCallback;
821 }
822
RegisterProcessSecurityExit(AppProcessExitCallback appProcessExitCallback)823 void ApplicationContext::RegisterProcessSecurityExit(AppProcessExitCallback appProcessExitCallback)
824 {
825 appProcessExitCallback_ = appProcessExitCallback;
826 }
827
RegisterAppGetSpecifiedRuntime(AppGetSpecifiedRuntimeCallback appGetSpecifiedRuntimeCallback)828 void ApplicationContext::RegisterAppGetSpecifiedRuntime(AppGetSpecifiedRuntimeCallback appGetSpecifiedRuntimeCallback)
829 {
830 appGetSpecifiedRuntimeCallback_ = appGetSpecifiedRuntimeCallback;
831 }
832
833 #ifdef SUPPORT_GRAPHICS
RegisterGetDisplayConfig(GetDisplayConfigCallback getDisplayConfigCallback)834 void ApplicationContext::RegisterGetDisplayConfig(GetDisplayConfigCallback getDisplayConfigCallback)
835 {
836 if (contextImpl_ == nullptr) {
837 TAG_LOGE(AAFwkTag::APPKIT, "null contextImpl_");
838 return;
839 }
840 contextImpl_->RegisterGetDisplayConfig(getDisplayConfigCallback);
841 }
842 #endif
843
GetAppRunningUniqueId() const844 std::string ApplicationContext::GetAppRunningUniqueId() const
845 {
846 TAG_LOGD(AAFwkTag::APPKIT, "GetAppRunningUniqueId is %{public}s", appRunningUniqueId_.c_str());
847 return appRunningUniqueId_;
848 }
849
GetCurrentAppCloneIndex()850 int32_t ApplicationContext::GetCurrentAppCloneIndex()
851 {
852 TAG_LOGD(AAFwkTag::APPKIT, "getCurrentAppCloneIndex is %{public}d", appIndex_);
853 return appIndex_;
854 }
855
GetCurrentAppMode()856 int32_t ApplicationContext::GetCurrentAppMode()
857 {
858 TAG_LOGD(AAFwkTag::APPKIT, "getCurrentMode is %{public}d", appMode_);
859 return appMode_;
860 }
861
GetCurrentInstanceKey()862 std::string ApplicationContext::GetCurrentInstanceKey()
863 {
864 TAG_LOGD(AAFwkTag::APPKIT, "getCurrentInstanceKey is %{public}s", instanceKey_.c_str());
865 return instanceKey_;
866 }
867
SetAppRunningUniqueId(const std::string & appRunningUniqueId)868 void ApplicationContext::SetAppRunningUniqueId(const std::string &appRunningUniqueId)
869 {
870 TAG_LOGD(AAFwkTag::APPKIT, "SetAppRunningUniqueId is %{public}s", appRunningUniqueId.c_str());
871 appRunningUniqueId_ = appRunningUniqueId;
872 }
873
SetSupportedProcessCacheSelf(bool isSupport)874 int32_t ApplicationContext::SetSupportedProcessCacheSelf(bool isSupport)
875 {
876 if (contextImpl_ != nullptr) {
877 return contextImpl_->SetSupportedProcessCacheSelf(isSupport);
878 }
879 TAG_LOGE(AAFwkTag::APPKIT, "null contextImpl_");
880 return ERR_INVALID_VALUE;
881 }
882
SetCurrentAppCloneIndex(int32_t appIndex)883 void ApplicationContext::SetCurrentAppCloneIndex(int32_t appIndex)
884 {
885 TAG_LOGD(AAFwkTag::APPKIT, "setCurrentAppCloneIndex is %{public}d", appIndex);
886 appIndex_ = appIndex;
887 }
888
SetCurrentAppMode(int32_t appMode)889 void ApplicationContext::SetCurrentAppMode(int32_t appMode)
890 {
891 TAG_LOGD(AAFwkTag::APPKIT, "setCurrentAppMode is %{public}d", appMode);
892 appMode_ = appMode;
893 }
894
SetCurrentInstanceKey(const std::string & instanceKey)895 void ApplicationContext::SetCurrentInstanceKey(const std::string& instanceKey)
896 {
897 TAG_LOGD(AAFwkTag::APPKIT, "setCurrentInstanceKey is %{public}s", instanceKey.c_str());
898 instanceKey_ = instanceKey;
899 }
900
ProcessSecurityExit(const AAFwk::ExitReason & exitReason)901 void ApplicationContext::ProcessSecurityExit(const AAFwk::ExitReason &exitReason)
902 {
903 if (appProcessExitCallback_ == nullptr) {
904 TAG_LOGE(AAFwkTag::APPKIT, "null callback");
905 return;
906 }
907
908 TAG_LOGI(AAFwkTag::APPKIT, "Proc exit, reason: %{public}s", exitReason.exitMsg.c_str());
909 appProcessExitCallback_(exitReason);
910 }
911
GetMainNapiEnv() const912 napi_env ApplicationContext::GetMainNapiEnv() const
913 {
914 if (appGetSpecifiedRuntimeCallback_ == nullptr) {
915 TAG_LOGE(AAFwkTag::APPKIT, "null callback");
916 return nullptr;
917 }
918 const std::unique_ptr<Runtime> &runtime = appGetSpecifiedRuntimeCallback_(
919 AppExecFwk::Constants::ARKTS_MODE_DYNAMIC);
920 if (runtime == nullptr) {
921 TAG_LOGE(AAFwkTag::APPKIT, "null runtime");
922 return nullptr;
923 }
924
925 if (runtime->GetLanguage() != Runtime::Language::JS) {
926 TAG_LOGD(AAFwkTag::APPKIT, "not js runtime");
927 return nullptr;
928 }
929 napi_env env = static_cast<JsRuntime&>(*runtime).GetNapiEnv();
930 return env;
931 }
932
GetDataDir()933 std::string ApplicationContext::GetDataDir()
934 {
935 std::lock_guard<std::mutex> lock(dataDirMutex_);
936 if (dataDir_.empty()) {
937 auto bundleManagerHelper = AAFwk::AbilityUtil::GetBundleManagerHelper();
938 dataDir_ = bundleManagerHelper->GetDataDir(GetBundleName(), appIndex_);
939 if (dataDir_.empty()) {
940 TAG_LOGE(AAFwkTag::APPKIT, "dataDir is empty");
941 return "";
942 }
943 }
944 TAG_LOGD(AAFwkTag::APPKIT, "GetDataDir is %{public}s", dataDir_.c_str());
945 return dataDir_;
946 }
947
CreateAreaModeContext(int areaMode)948 std::shared_ptr<Context> ApplicationContext::CreateAreaModeContext(int areaMode)
949 {
950 return contextImpl_ ? contextImpl_->CreateAreaModeContext(areaMode) : nullptr;
951 }
952
953 #ifdef SUPPORT_GRAPHICS
CreateDisplayContext(uint64_t displayId)954 std::shared_ptr<Context> ApplicationContext::CreateDisplayContext(uint64_t displayId)
955 {
956 return contextImpl_ ? contextImpl_->CreateDisplayContext(displayId) : nullptr;
957 }
958 #endif
959 } // namespace AbilityRuntime
960 } // namespace OHOS
961