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