• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 "hilog_wrapper.h"
21 #include "running_process_info.h"
22 
23 namespace OHOS {
24 namespace AbilityRuntime {
25 std::vector<std::shared_ptr<AbilityLifecycleCallback>> ApplicationContext::callbacks_;
26 std::vector<std::shared_ptr<EnvironmentCallback>> ApplicationContext::envCallbacks_;
27 std::weak_ptr<ApplicationStateChangeCallback> ApplicationContext::applicationStateCallback_;
28 
GetInstance()29 std::shared_ptr<ApplicationContext> ApplicationContext::GetInstance()
30 {
31     if (applicationContext_ == nullptr) {
32         std::lock_guard<std::mutex> lock_l(Context::contextMutex_);
33         if (applicationContext_ == nullptr) {
34             applicationContext_ = std::make_shared<ApplicationContext>();
35         }
36     }
37     return applicationContext_;
38 }
39 
AttachContextImpl(const std::shared_ptr<ContextImpl> & contextImpl)40 void ApplicationContext::AttachContextImpl(const std::shared_ptr<ContextImpl> &contextImpl)
41 {
42     contextImpl_ = contextImpl;
43 }
44 
RegisterAbilityLifecycleCallback(const std::shared_ptr<AbilityLifecycleCallback> & abilityLifecycleCallback)45 void ApplicationContext::RegisterAbilityLifecycleCallback(
46     const std::shared_ptr<AbilityLifecycleCallback> &abilityLifecycleCallback)
47 {
48     HILOG_DEBUG("ApplicationContext RegisterAbilityLifecycleCallback");
49     if (abilityLifecycleCallback == nullptr) {
50         return;
51     }
52     std::lock_guard<std::mutex> lock(callbackLock_);
53     callbacks_.push_back(abilityLifecycleCallback);
54 }
55 
UnregisterAbilityLifecycleCallback(const std::shared_ptr<AbilityLifecycleCallback> & abilityLifecycleCallback)56 void ApplicationContext::UnregisterAbilityLifecycleCallback(
57     const std::shared_ptr<AbilityLifecycleCallback> &abilityLifecycleCallback)
58 {
59     HILOG_DEBUG("ApplicationContext UnregisterAbilityLifecycleCallback");
60     std::lock_guard<std::mutex> lock(callbackLock_);
61     auto it = std::find(callbacks_.begin(), callbacks_.end(), abilityLifecycleCallback);
62     if (it != callbacks_.end()) {
63         callbacks_.erase(it);
64     }
65 }
66 
IsAbilityLifecycleCallbackEmpty()67 bool ApplicationContext::IsAbilityLifecycleCallbackEmpty()
68 {
69     std::lock_guard<std::mutex> lock(callbackLock_);
70     return callbacks_.empty();
71 }
72 
RegisterEnvironmentCallback(const std::shared_ptr<EnvironmentCallback> & environmentCallback)73 void ApplicationContext::RegisterEnvironmentCallback(
74     const std::shared_ptr<EnvironmentCallback> &environmentCallback)
75 {
76     HILOG_DEBUG("ApplicationContext RegisterEnvironmentCallback");
77     if (environmentCallback == nullptr) {
78         return;
79     }
80     envCallbacks_.push_back(environmentCallback);
81 }
82 
UnregisterEnvironmentCallback(const std::shared_ptr<EnvironmentCallback> & environmentCallback)83 void ApplicationContext::UnregisterEnvironmentCallback(
84     const std::shared_ptr<EnvironmentCallback> &environmentCallback)
85 {
86     HILOG_DEBUG("ApplicationContext UnregisterEnvironmentCallback");
87     auto it = std::find(envCallbacks_.begin(), envCallbacks_.end(), environmentCallback);
88     if (it != envCallbacks_.end()) {
89         envCallbacks_.erase(it);
90     }
91 }
92 
RegisterApplicationStateChangeCallback(const std::weak_ptr<ApplicationStateChangeCallback> & applicationStateChangeCallback)93 void ApplicationContext::RegisterApplicationStateChangeCallback(
94     const std::weak_ptr<ApplicationStateChangeCallback> &applicationStateChangeCallback)
95 {
96     applicationStateCallback_ = applicationStateChangeCallback;
97 }
98 
DispatchOnAbilityCreate(const std::shared_ptr<NativeReference> & ability)99 void ApplicationContext::DispatchOnAbilityCreate(const std::shared_ptr<NativeReference> &ability)
100 {
101     if (!ability) {
102         HILOG_ERROR("ability is nullptr");
103         return;
104     }
105     std::lock_guard<std::mutex> lock(callbackLock_);
106     for (auto callback : callbacks_) {
107         if (callback != nullptr) {
108             callback->OnAbilityCreate(ability);
109         }
110     }
111 }
112 
DispatchOnWindowStageCreate(const std::shared_ptr<NativeReference> & ability,const std::shared_ptr<NativeReference> & windowStage)113 void ApplicationContext::DispatchOnWindowStageCreate(const std::shared_ptr<NativeReference> &ability,
114     const std::shared_ptr<NativeReference> &windowStage)
115 {
116     if (!ability || !windowStage) {
117         HILOG_ERROR("ability or windowStage is nullptr");
118         return;
119     }
120     std::lock_guard<std::mutex> lock(callbackLock_);
121     for (auto callback : callbacks_) {
122         if (callback != nullptr) {
123             callback->OnWindowStageCreate(ability, windowStage);
124         }
125     }
126 }
127 
DispatchOnWindowStageDestroy(const std::shared_ptr<NativeReference> & ability,const std::shared_ptr<NativeReference> & windowStage)128 void ApplicationContext::DispatchOnWindowStageDestroy(const std::shared_ptr<NativeReference> &ability,
129     const std::shared_ptr<NativeReference> &windowStage)
130 {
131     if (!ability || !windowStage) {
132         HILOG_ERROR("ability or windowStage is nullptr");
133         return;
134     }
135     std::lock_guard<std::mutex> lock(callbackLock_);
136     for (auto callback : callbacks_) {
137         if (callback != nullptr) {
138             callback->OnWindowStageDestroy(ability, windowStage);
139         }
140     }
141 }
142 
DispatchWindowStageFocus(const std::shared_ptr<NativeReference> & ability,const std::shared_ptr<NativeReference> & windowStage)143 void ApplicationContext::DispatchWindowStageFocus(const std::shared_ptr<NativeReference> &ability,
144     const std::shared_ptr<NativeReference> &windowStage)
145 {
146     HILOG_DEBUG("%{public}s begin.", __func__);
147     if (!ability || !windowStage) {
148         HILOG_ERROR("ability or windowStage is nullptr");
149         return;
150     }
151     std::lock_guard<std::mutex> lock(callbackLock_);
152     for (auto callback : callbacks_) {
153         if (callback != nullptr) {
154             callback->OnWindowStageActive(ability, windowStage);
155         }
156     }
157 }
158 
DispatchWindowStageUnfocus(const std::shared_ptr<NativeReference> & ability,const std::shared_ptr<NativeReference> & windowStage)159 void ApplicationContext::DispatchWindowStageUnfocus(const std::shared_ptr<NativeReference> &ability,
160     const std::shared_ptr<NativeReference> &windowStage)
161 {
162     HILOG_DEBUG("%{public}s begin.", __func__);
163     if (!ability || !windowStage) {
164         HILOG_ERROR("ability or windowStage is nullptr");
165         return;
166     }
167     std::lock_guard<std::mutex> lock(callbackLock_);
168     for (auto callback : callbacks_) {
169         if (callback != nullptr) {
170             callback->OnWindowStageInactive(ability, windowStage);
171         }
172     }
173 }
174 
DispatchOnAbilityDestroy(const std::shared_ptr<NativeReference> & ability)175 void ApplicationContext::DispatchOnAbilityDestroy(const std::shared_ptr<NativeReference> &ability)
176 {
177     if (!ability) {
178         HILOG_ERROR("ability is nullptr");
179         return;
180     }
181     std::lock_guard<std::mutex> lock(callbackLock_);
182     for (auto callback : callbacks_) {
183         if (callback != nullptr) {
184             callback->OnAbilityDestroy(ability);
185         }
186     }
187 }
188 
DispatchOnAbilityForeground(const std::shared_ptr<NativeReference> & ability)189 void ApplicationContext::DispatchOnAbilityForeground(const std::shared_ptr<NativeReference> &ability)
190 {
191     if (!ability) {
192         HILOG_ERROR("ability is nullptr");
193         return;
194     }
195     std::lock_guard<std::mutex> lock(callbackLock_);
196     for (auto callback : callbacks_) {
197         if (callback != nullptr) {
198             callback->OnAbilityForeground(ability);
199         }
200     }
201 }
202 
DispatchOnAbilityBackground(const std::shared_ptr<NativeReference> & ability)203 void ApplicationContext::DispatchOnAbilityBackground(const std::shared_ptr<NativeReference> &ability)
204 {
205     if (!ability) {
206         HILOG_ERROR("ability is nullptr");
207         return;
208     }
209     std::lock_guard<std::mutex> lock(callbackLock_);
210     for (auto callback : callbacks_) {
211         if (callback != nullptr) {
212             callback->OnAbilityBackground(ability);
213         }
214     }
215 }
216 
DispatchOnAbilityContinue(const std::shared_ptr<NativeReference> & ability)217 void ApplicationContext::DispatchOnAbilityContinue(const std::shared_ptr<NativeReference> &ability)
218 {
219     if (!ability) {
220         HILOG_ERROR("ability is nullptr");
221         return;
222     }
223     std::lock_guard<std::mutex> lock(callbackLock_);
224     for (auto callback : callbacks_) {
225         if (callback != nullptr) {
226             callback->OnAbilityContinue(ability);
227         }
228     }
229 }
230 
DispatchConfigurationUpdated(const AppExecFwk::Configuration & config)231 void ApplicationContext::DispatchConfigurationUpdated(const AppExecFwk::Configuration &config)
232 {
233     for (auto envCallback : envCallbacks_) {
234         if (envCallback != nullptr) {
235             envCallback->OnConfigurationUpdated(config);
236         }
237     }
238 }
239 
DispatchMemoryLevel(const int level)240 void ApplicationContext::DispatchMemoryLevel(const int level)
241 {
242     for (auto envCallback : envCallbacks_) {
243         if (envCallback != nullptr) {
244             envCallback->OnMemoryLevel(level);
245         }
246     }
247 }
248 
NotifyApplicationForeground()249 void ApplicationContext::NotifyApplicationForeground()
250 {
251     auto callback = applicationStateCallback_.lock();
252     if (callback == nullptr) {
253         HILOG_ERROR("applicationStateCallback is nullptr");
254         return;
255     }
256 
257     callback->NotifyApplicationForeground();
258 }
259 
NotifyApplicationBackground()260 void ApplicationContext::NotifyApplicationBackground()
261 {
262     auto callback = applicationStateCallback_.lock();
263     if (callback == nullptr) {
264         HILOG_ERROR("applicationStateCallback is nullptr");
265         return;
266     }
267 
268     callback->NotifyApplicationBackground();
269 }
270 
GetBundleName() const271 std::string ApplicationContext::GetBundleName() const
272 {
273     return (contextImpl_ != nullptr) ? contextImpl_->GetBundleName() : "";
274 }
275 
CreateBundleContext(const std::string & bundleName)276 std::shared_ptr<Context> ApplicationContext::CreateBundleContext(const std::string &bundleName)
277 {
278     return (contextImpl_ != nullptr) ? contextImpl_->CreateBundleContext(bundleName) : nullptr;
279 }
280 
CreateModuleContext(const std::string & moduleName)281 std::shared_ptr<Context> ApplicationContext::CreateModuleContext(const std::string &moduleName)
282 {
283     return contextImpl_ ? contextImpl_->CreateModuleContext(moduleName) : nullptr;
284 }
285 
CreateModuleContext(const std::string & bundleName,const std::string & moduleName)286 std::shared_ptr<Context> ApplicationContext::CreateModuleContext(const std::string &bundleName,
287                                                                  const std::string &moduleName)
288 {
289     return contextImpl_ ? contextImpl_->CreateModuleContext(bundleName, moduleName) : nullptr;
290 }
291 
GetApplicationInfo() const292 std::shared_ptr<AppExecFwk::ApplicationInfo> ApplicationContext::GetApplicationInfo() const
293 {
294     return (contextImpl_ != nullptr) ? contextImpl_->GetApplicationInfo() : nullptr;
295 }
296 
SetApplicationInfo(const std::shared_ptr<AppExecFwk::ApplicationInfo> & info)297 void ApplicationContext::SetApplicationInfo(const std::shared_ptr<AppExecFwk::ApplicationInfo> &info)
298 {
299     if (contextImpl_ != nullptr) {
300         contextImpl_->SetApplicationInfo(info);
301     }
302 }
303 
GetResourceManager() const304 std::shared_ptr<Global::Resource::ResourceManager> ApplicationContext::GetResourceManager() const
305 {
306     return (contextImpl_ != nullptr) ? contextImpl_->GetResourceManager() : nullptr;
307 }
308 
GetBundleCodePath() const309 std::string ApplicationContext::GetBundleCodePath() const
310 {
311     return (contextImpl_ != nullptr) ? contextImpl_->GetBundleCodePath() : "";
312 }
313 
GetHapModuleInfo() const314 std::shared_ptr<AppExecFwk::HapModuleInfo> ApplicationContext::GetHapModuleInfo() const
315 {
316     return nullptr;
317 }
318 
GetBundleCodeDir()319 std::string ApplicationContext::GetBundleCodeDir()
320 {
321     return (contextImpl_ != nullptr) ? contextImpl_->GetBundleCodeDir() : "";
322 }
323 
GetCacheDir()324 std::string ApplicationContext::GetCacheDir()
325 {
326     return (contextImpl_ != nullptr) ? contextImpl_->GetCacheDir() : "";
327 }
328 
GetTempDir()329 std::string ApplicationContext::GetTempDir()
330 {
331     return (contextImpl_ != nullptr) ? contextImpl_->GetTempDir() : "";
332 }
333 
GetFilesDir()334 std::string ApplicationContext::GetFilesDir()
335 {
336     return (contextImpl_ != nullptr) ? contextImpl_->GetFilesDir() : "";
337 }
338 
KillProcessBySelf()339 void ApplicationContext::KillProcessBySelf()
340 {
341     if (contextImpl_ != nullptr) {
342         contextImpl_->KillProcessBySelf();
343     }
344 }
345 
GetProcessRunningInformation(AppExecFwk::RunningProcessInfo & info)346 int32_t ApplicationContext::GetProcessRunningInformation(AppExecFwk::RunningProcessInfo &info)
347 {
348     return (contextImpl_ != nullptr) ? contextImpl_->GetProcessRunningInformation(info) : -1;
349 }
350 
IsUpdatingConfigurations()351 bool ApplicationContext::IsUpdatingConfigurations()
352 {
353     return (contextImpl_ != nullptr) ? contextImpl_->IsUpdatingConfigurations() : false;
354 }
355 
PrintDrawnCompleted()356 bool ApplicationContext::PrintDrawnCompleted()
357 {
358     return (contextImpl_ != nullptr) ? contextImpl_->PrintDrawnCompleted() : false;
359 }
360 
GetDatabaseDir()361 std::string ApplicationContext::GetDatabaseDir()
362 {
363     return (contextImpl_ != nullptr) ? contextImpl_->GetDatabaseDir() : "";
364 }
365 
GetPreferencesDir()366 std::string ApplicationContext::GetPreferencesDir()
367 {
368     return (contextImpl_ != nullptr) ? contextImpl_->GetPreferencesDir() : "";
369 }
370 
GetSystemDatabaseDir(const std::string & groupId,bool checkExist,std::string & databaseDir)371 int32_t ApplicationContext::GetSystemDatabaseDir(const std::string &groupId, bool checkExist, std::string &databaseDir)
372 {
373     return contextImpl_ ?
374         contextImpl_->GetSystemDatabaseDir(groupId, checkExist, databaseDir) : ERR_INVALID_VALUE;
375 }
376 
GetSystemPreferencesDir(const std::string & groupId,bool checkExist,std::string & preferencesDir)377 int32_t ApplicationContext::GetSystemPreferencesDir(const std::string &groupId, bool checkExist,
378     std::string &preferencesDir)
379 {
380     return contextImpl_ ?
381         contextImpl_->GetSystemPreferencesDir(groupId, checkExist, preferencesDir) : ERR_INVALID_VALUE;
382 }
383 
GetGroupDir(std::string groupId)384 std::string ApplicationContext::GetGroupDir(std::string groupId)
385 {
386     return (contextImpl_ != nullptr) ? contextImpl_->GetGroupDir(groupId) : "";
387 }
388 
GetDistributedFilesDir()389 std::string ApplicationContext::GetDistributedFilesDir()
390 {
391     return (contextImpl_ != nullptr) ? contextImpl_->GetDistributedFilesDir() : "";
392 }
393 
GetToken()394 sptr<IRemoteObject> ApplicationContext::GetToken()
395 {
396     return (contextImpl_ != nullptr) ? contextImpl_->GetToken() : nullptr;
397 }
398 
SetToken(const sptr<IRemoteObject> & token)399 void ApplicationContext::SetToken(const sptr<IRemoteObject> &token)
400 {
401     if (contextImpl_ != nullptr) {
402         contextImpl_->SetToken(token);
403     }
404 }
405 
SwitchArea(int mode)406 void ApplicationContext::SwitchArea(int mode)
407 {
408     if (contextImpl_ != nullptr) {
409         contextImpl_->SwitchArea(mode);
410     }
411 }
412 
GetArea()413 int ApplicationContext::GetArea()
414 {
415     if (contextImpl_ == nullptr) {
416         HILOG_ERROR("AbilityContext::contextImpl is nullptr.");
417         return ContextImpl::EL_DEFAULT;
418     }
419     return contextImpl_->GetArea();
420 }
421 
GetConfiguration() const422 std::shared_ptr<AppExecFwk::Configuration> ApplicationContext::GetConfiguration() const
423 {
424     return (contextImpl_ != nullptr) ? contextImpl_->GetConfiguration() : nullptr;
425 }
426 
GetBaseDir() const427 std::string ApplicationContext::GetBaseDir() const
428 {
429     return (contextImpl_ != nullptr) ? contextImpl_->GetBaseDir() : nullptr;
430 }
431 
GetDeviceType() const432 Global::Resource::DeviceType ApplicationContext::GetDeviceType() const
433 {
434     return (contextImpl_ != nullptr) ? contextImpl_->GetDeviceType() : Global::Resource::DeviceType::DEVICE_PHONE;
435 }
436 }  // namespace AbilityRuntime
437 }  // namespace OHOS
438