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