1 /*
2 * Copyright (c) 2021 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 "ohos_application.h"
17 #include "application_impl.h"
18 #include "ability_record_mgr.h"
19 #include "app_loader.h"
20 #include "app_log_wrapper.h"
21 #include "iservice_registry.h"
22 #include "system_ability_definition.h"
23
24 namespace OHOS {
25 namespace AppExecFwk {
26
REGISTER_APPLICATION(OHOSApplication,OHOSApplication)27 REGISTER_APPLICATION(OHOSApplication, OHOSApplication)
28
29 OHOSApplication::OHOSApplication()
30 {
31 abilityLifecycleCallbacks_.clear();
32 elementsCallbacks_.clear();
33 }
34
35 /**
36 *
37 * @brief Called when Ability#onSaveAbilityState(PacMap) was called on an ability.
38 *
39 * @param outState Indicates the PacMap object passed to Ability#onSaveAbilityState(PacMap)
40 * for storing user data and states. This parameter cannot be null.
41 */
42
DispatchAbilitySavedState(const PacMap & outState)43 void OHOSApplication::DispatchAbilitySavedState(const PacMap &outState)
44 {
45 APP_LOGI("OHOSApplication::dispatchAbilitySavedState: called");
46 for (auto callback : abilityLifecycleCallbacks_) {
47 if (callback != nullptr) {
48 callback->OnAbilitySaveState(outState);
49 }
50 }
51 }
52
53 /**
54 *
55 * @brief Will be called the application foregrounds
56 *
57 */
OnForeground()58 void OHOSApplication::OnForeground()
59 {}
60
61 /**
62 *
63 * @brief Will be called the application backgrounds
64 *
65 */
OnBackground()66 void OHOSApplication::OnBackground()
67 {}
68
DumpApplication()69 void OHOSApplication::DumpApplication()
70 {
71 APP_LOGD("OHOSApplication::Dump called");
72 // create and initialize abilityInfos
73 std::shared_ptr<AbilityInfo> abilityInfo = nullptr;
74 std::shared_ptr<AbilityLocalRecord> record = nullptr;
75
76 if (abilityRecordMgr_) {
77 record = abilityRecordMgr_->GetAbilityItem(abilityRecordMgr_->GetToken());
78 }
79
80 if (record) {
81 abilityInfo = record->GetAbilityInfo();
82 }
83
84 if (abilityInfo) {
85 APP_LOGD("==============AbilityInfo==============");
86 APP_LOGD("abilityInfo: package: %{public}s", abilityInfo->package.c_str());
87 APP_LOGD("abilityInfo: name: %{public}s", abilityInfo->name.c_str());
88 APP_LOGD("abilityInfo: label: %{public}s", abilityInfo->label.c_str());
89 APP_LOGD("abilityInfo: description: %{public}s", abilityInfo->description.c_str());
90 APP_LOGD("abilityInfo: iconPath: %{public}s", abilityInfo->iconPath.c_str());
91 APP_LOGD("abilityInfo: visible: %{public}d", abilityInfo->visible);
92 APP_LOGD("abilityInfo: kind: %{public}s", abilityInfo->kind.c_str());
93 APP_LOGD("abilityInfo: type: %{public}d", abilityInfo->type);
94 APP_LOGD("abilityInfo: orientation: %{public}d", abilityInfo->orientation);
95 APP_LOGD("abilityInfo: launchMode: %{public}d", abilityInfo->launchMode);
96 for (auto permission : abilityInfo->permissions) {
97 APP_LOGD("abilityInfo: permission: %{public}s", permission.c_str());
98 }
99 APP_LOGD("abilityInfo: bundleName: %{public}s", abilityInfo->bundleName.c_str());
100 APP_LOGD("abilityInfo: applicationName: %{public}s", abilityInfo->applicationName.c_str());
101 }
102
103 // create and initialize applicationInfo
104 APP_LOGD("==============applicationInfo==============");
105 std::shared_ptr<ApplicationInfo> applicationInfoPtr = GetApplicationInfo();
106 if (applicationInfoPtr != nullptr) {
107 APP_LOGD("applicationInfo: name: %{public}s", applicationInfoPtr->name.c_str());
108 APP_LOGD("applicationInfo: bundleName: %{public}s", applicationInfoPtr->bundleName.c_str());
109 APP_LOGD("applicationInfo: signatureKey: %{public}s", applicationInfoPtr->signatureKey.c_str());
110 }
111 }
112
113 /**
114 *
115 * @brief Set the abilityRecordMgr to the OHOSApplication.
116 *
117 * @param abilityRecordMgr
118 */
SetAbilityRecordMgr(const std::shared_ptr<AbilityRecordMgr> & abilityRecordMgr)119 void OHOSApplication::SetAbilityRecordMgr(const std::shared_ptr<AbilityRecordMgr> &abilityRecordMgr)
120 {
121 APP_LOGI("OHOSApplication::SetAbilityRecordMgr. Start");
122 if (abilityRecordMgr == nullptr) {
123 APP_LOGE("ContextDeal::SetAbilityRecordMgr failed, abilityRecordMgr is nullptr");
124 return;
125 }
126 abilityRecordMgr_ = abilityRecordMgr;
127 APP_LOGI("OHOSApplication::SetAbilityRecordMgr. End");
128 }
129
130 /**
131 *
132 * Register AbilityLifecycleCallbacks with OHOSApplication
133 *
134 * @param callBack callBack When the life cycle of the ability in the application changes,
135 */
RegisterAbilityLifecycleCallbacks(const std::shared_ptr<AbilityLifecycleCallbacks> & callBack)136 void OHOSApplication::RegisterAbilityLifecycleCallbacks(const std::shared_ptr<AbilityLifecycleCallbacks> &callBack)
137 {
138 APP_LOGI("OHOSApplication::RegisterAbilityLifecycleCallbacks: called");
139
140 if (callBack == nullptr) {
141 APP_LOGI("OHOSApplication::RegisterAbilityLifecycleCallbacks: observer is null");
142 return;
143 }
144
145 abilityLifecycleCallbacks_.emplace_back(callBack);
146 }
147
148 /**
149 *
150 * Unregister AbilityLifecycleCallbacks with OHOSApplication
151 *
152 * @param callBack RegisterAbilityLifecycleCallbacks`s callBack
153 */
UnregisterAbilityLifecycleCallbacks(const std::shared_ptr<AbilityLifecycleCallbacks> & callBack)154 void OHOSApplication::UnregisterAbilityLifecycleCallbacks(const std::shared_ptr<AbilityLifecycleCallbacks> &callBack)
155 {
156 APP_LOGI("OHOSApplication::UnregisterAbilityLifecycleCallbacks: called");
157
158 if (callBack == nullptr) {
159 APP_LOGI("OHOSApplication::UnregisterAbilityLifecycleCallbacks: observer is null");
160 return;
161 }
162
163 abilityLifecycleCallbacks_.remove(callBack);
164 }
165
166 /**
167 *
168 * Will be called when the given ability calls Ability->onStart
169 *
170 * @param Ability Indicates the ability object that calls the onStart() method.
171 */
OnAbilityStart(const std::shared_ptr<Ability> & ability)172 void OHOSApplication::OnAbilityStart(const std::shared_ptr<Ability> &ability)
173 {
174 if (ability == nullptr) {
175 APP_LOGE("ContextDeal::OnAbilityStart failed, ability is nullptr");
176 return;
177 }
178
179 APP_LOGI("OHOSApplication::OnAbilityStart: called");
180 for (auto callback : abilityLifecycleCallbacks_) {
181 if (callback != nullptr) {
182 callback->OnAbilityStart(ability);
183 }
184 }
185 }
186
187 /**
188 *
189 * Will be called when the given ability calls Ability->onInactive
190 *
191 * @param Ability Indicates the Ability object that calls the onInactive() method.
192 */
OnAbilityInactive(const std::shared_ptr<Ability> & ability)193 void OHOSApplication::OnAbilityInactive(const std::shared_ptr<Ability> &ability)
194 {
195 if (ability == nullptr) {
196 APP_LOGE("ContextDeal::OnAbilityInactive failed, ability is nullptr");
197 return;
198 }
199
200 APP_LOGI("OHOSApplication::OnAbilityInactive: called");
201 for (auto callback : abilityLifecycleCallbacks_) {
202 if (callback != nullptr) {
203 callback->OnAbilityInactive(ability);
204 }
205 }
206 }
207
208 /**
209 *
210 * Will be called when the given ability calls Ability->onBackground
211 *
212 * @param Ability Indicates the Ability object that calls the onBackground() method.
213 */
OnAbilityBackground(const std::shared_ptr<Ability> & ability)214 void OHOSApplication::OnAbilityBackground(const std::shared_ptr<Ability> &ability)
215 {
216 if (ability == nullptr) {
217 APP_LOGE("ContextDeal::OnAbilityBackground failed, ability is nullptr");
218 return;
219 }
220
221 APP_LOGI("OHOSApplication::OnAbilityBackground: called");
222 for (auto callback : abilityLifecycleCallbacks_) {
223 if (callback != nullptr) {
224 callback->OnAbilityBackground(ability);
225 }
226 }
227 }
228
229 /**
230 *
231 * Will be called when the given ability calls Ability->onForeground
232 *
233 * @param Ability Indicates the Ability object that calls the onForeground() method.
234 */
OnAbilityForeground(const std::shared_ptr<Ability> & ability)235 void OHOSApplication::OnAbilityForeground(const std::shared_ptr<Ability> &ability)
236 {
237 if (ability == nullptr) {
238 APP_LOGE("ContextDeal::OnAbilityForeground failed, ability is nullptr");
239 return;
240 }
241
242 APP_LOGI("OHOSApplication::OnAbilityForeground: called");
243 for (auto callback : abilityLifecycleCallbacks_) {
244 if (callback != nullptr) {
245 callback->OnAbilityForeground(ability);
246 }
247 }
248 }
249
250 /**
251 *
252 * Will be called when the given ability calls Ability->onActive
253 *
254 * @param Ability Indicates the Ability object that calls the onActive() method.
255 */
OnAbilityActive(const std::shared_ptr<Ability> & ability)256 void OHOSApplication::OnAbilityActive(const std::shared_ptr<Ability> &ability)
257 {
258 if (ability == nullptr) {
259 APP_LOGE("ContextDeal::OnAbilityActive failed, ability is nullptr");
260 return;
261 }
262
263 APP_LOGI("OHOSApplication::OnAbilityActive: called");
264 for (auto callback : abilityLifecycleCallbacks_) {
265 if (callback != nullptr) {
266 callback->OnAbilityActive(ability);
267 }
268 }
269 }
270
271 /**
272 *
273 * Will be called when the given ability calls Ability->onStop
274 *
275 * @param Ability Indicates the Ability object that calls the onStop() method.
276 */
OnAbilityStop(const std::shared_ptr<Ability> & ability)277 void OHOSApplication::OnAbilityStop(const std::shared_ptr<Ability> &ability)
278 {
279 if (ability == nullptr) {
280 APP_LOGE("ContextDeal::OnAbilityStop failed, ability is nullptr");
281 return;
282 }
283
284 APP_LOGI("OHOSApplication::OnAbilityStop: called");
285 for (auto callback : abilityLifecycleCallbacks_) {
286 if (callback != nullptr) {
287 callback->OnAbilityStop(ability);
288 }
289 }
290 }
291
292 /**
293 *
294 * @brief Register ElementsCallback with OHOSApplication
295 *
296 * @param callBack callBack when the system configuration of the device changes.
297 */
RegisterElementsCallbacks(const std::shared_ptr<ElementsCallback> & callback)298 void OHOSApplication::RegisterElementsCallbacks(const std::shared_ptr<ElementsCallback> &callback)
299 {
300 APP_LOGI("OHOSApplication::RegisterElementsCallbacks: called");
301
302 if (callback == nullptr) {
303 APP_LOGI("OHOSApplication::RegisterElementsCallbacks: observer is null");
304 return;
305 }
306
307 elementsCallbacks_.emplace_back(callback);
308 }
309
310 /**
311 *
312 * @brief Unregister ElementsCallback with OHOSApplication
313 *
314 * @param callback RegisterElementsCallbacks`s callback
315 */
UnregisterElementsCallbacks(const std::shared_ptr<ElementsCallback> & callback)316 void OHOSApplication::UnregisterElementsCallbacks(const std::shared_ptr<ElementsCallback> &callback)
317 {
318 APP_LOGI("OHOSApplication::UnregisterElementsCallbacks: called");
319
320 if (callback == nullptr) {
321 APP_LOGI("OHOSApplication::UnregisterElementsCallbacks: observer is null");
322 return;
323 }
324
325 elementsCallbacks_.remove(callback);
326 }
327
328 /**
329 *
330 * @brief Will be Called when the system configuration of the device changes.
331 *
332 * @param config Indicates the new Configuration object.
333 */
OnConfigurationUpdated(const Configuration & config)334 void OHOSApplication::OnConfigurationUpdated(const Configuration &config)
335 {
336 APP_LOGI("OHOSApplication::OnConfigurationUpdated: called");
337 for (auto callback : elementsCallbacks_) {
338 if (callback != nullptr) {
339 callback->OnConfigurationUpdated(nullptr, config);
340 }
341 }
342 }
343
344 /**
345 *
346 * @brief Called when the system has determined to trim the memory, for example,
347 * when the ability is running in the background and there is no enough memory for
348 * running as many background processes as possible.
349 *
350 * @param level Indicates the memory trim level, which shows the current memory usage status.
351 */
OnMemoryLevel(int level)352 void OHOSApplication::OnMemoryLevel(int level)
353 {
354 APP_LOGI("OHOSApplication::OnMemoryLevel: called");
355 for (auto callback : elementsCallbacks_) {
356 if (callback != nullptr) {
357 callback->OnMemoryLevel(level);
358 }
359 }
360 }
361
362 /**
363 *
364 * @brief Will be called the application starts
365 *
366 */
OnStart()367 void OHOSApplication::OnStart()
368 {
369 APP_LOGI("OHOSApplication::OnStart: called");
370 }
371
372 /**
373 *
374 * @brief Will be called the application ends
375 *
376 */
OnTerminate()377 void OHOSApplication::OnTerminate()
378 {
379 APP_LOGI("OHOSApplication::OnTerminate: called");
380 }
381
382 /**
383 *
384 * @brief Called when an ability calls Ability#onSaveAbilityState(PacMap).
385 * You can implement your own logic in this method.
386 * @param outState IIndicates the {@link PacMap} object passed to the onSaveAbilityState() callback.
387 *
388 */
OnAbilitySaveState(const PacMap & outState)389 void OHOSApplication::OnAbilitySaveState(const PacMap &outState)
390 {
391 DispatchAbilitySavedState(outState);
392 }
393
394 } // namespace AppExecFwk
395 } // namespace OHOS
396