• 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 "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