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