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