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