1 /*
2 * Copyright (c) 2021-2025 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 "extension_impl.h"
17
18 #include "ability_manager_client.h"
19 #include "ability_local_record.h"
20 #include "ability_transaction_callback_info.h"
21 #include "freeze_util.h"
22 #include "hitrace_meter.h"
23 #include "ipc_object_proxy.h"
24 #include "extension_context.h"
25 #include "hilog_tag_wrapper.h"
26 #include "ui_extension_utils.h"
27
28
29 namespace OHOS {
30 namespace AbilityRuntime {
31 const std::string JSON_KEY_ERR_MSG = "errMsg";
~ExtensionImpl()32 ExtensionImpl::~ExtensionImpl()
33 {
34 TAG_LOGD(AAFwkTag::EXT, "~ExtensionImpl");
35 }
36
Init(const std::shared_ptr<AppExecFwk::OHOSApplication> & application,const std::shared_ptr<AppExecFwk::AbilityLocalRecord> & record,std::shared_ptr<Extension> & extension,std::shared_ptr<AppExecFwk::AbilityHandler> & handler,const sptr<IRemoteObject> & token)37 void ExtensionImpl::Init(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
38 const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &record,
39 std::shared_ptr<Extension> &extension,
40 std::shared_ptr<AppExecFwk::AbilityHandler> &handler,
41 const sptr<IRemoteObject> &token)
42 {
43 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
44 TAG_LOGD(AAFwkTag::EXT, "call");
45 if ((token == nullptr) || (application == nullptr) || (handler == nullptr) || (record == nullptr) ||
46 extension == nullptr) {
47 TAG_LOGE(AAFwkTag::EXT, "init failed, some obj null");
48 return;
49 }
50
51 token_ = record->GetToken();
52 extension_ = extension;
53 if (record->GetAbilityInfo() != nullptr) {
54 extensionType_ = record->GetAbilityInfo()->extensionAbilityType;
55 if (AAFwk::UIExtensionUtils::IsUIExtension(extensionType_)) {
56 extension_->SetExtensionWindowLifeCycleListener(
57 sptr<ExtensionWindowLifeCycleImpl>(new ExtensionWindowLifeCycleImpl(token_, shared_from_this())));
58 }
59 }
60 extension_->Init(record, application, handler, token);
61 lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL;
62 skipCommandExtensionWithIntent_ = false;
63 }
64
65 /**
66 * @brief Handling the life cycle switching of Extension.
67 *
68 * @param want Indicates the structure containing information about the extension.
69 * @param targetState The life cycle state to switch to.
70 * @param sessionInfo Indicates the sessionInfo.
71 *
72 */
HandleExtensionTransaction(const Want & want,const AAFwk::LifeCycleStateInfo & targetState,sptr<AAFwk::SessionInfo> sessionInfo)73 void ExtensionImpl::HandleExtensionTransaction(const Want &want, const AAFwk::LifeCycleStateInfo &targetState,
74 sptr<AAFwk::SessionInfo> sessionInfo)
75 {
76 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
77 TAG_LOGI(AAFwkTag::EXT, "%{public}s;sourceState:%{public}d;targetState:%{public}d;isNewWant:%{public}d",
78 want.GetElement().GetAbilityName().c_str(), lifecycleState_, targetState.state, targetState.isNewWant);
79 if (lifecycleState_ == targetState.state) {
80 TAG_LOGE(AAFwkTag::EXT, "lifecycle state equal");
81 return;
82 }
83 SetLaunchParam(targetState.launchParam);
84 bool ret = true;
85 switch (targetState.state) {
86 case AAFwk::ABILITY_STATE_INITIAL: {
87 bool isAsyncCallback = false;
88 if (lifecycleState_ != AAFwk::ABILITY_STATE_INITIAL) {
89 Stop(isAsyncCallback, want, sessionInfo);
90 }
91 if (isAsyncCallback) {
92 ret = false;
93 }
94 break;
95 }
96 case AAFwk::ABILITY_STATE_INACTIVE: {
97 if (lifecycleState_ == AAFwk::ABILITY_STATE_INITIAL) {
98 Start(want, sessionInfo);
99 }
100 break;
101 }
102 case AAFwk::ABILITY_STATE_FOREGROUND_NEW: {
103 if (lifecycleState_ == AAFwk::ABILITY_STATE_INITIAL) {
104 Start(want, sessionInfo);
105 }
106 Foreground(want, sessionInfo);
107 break;
108 }
109 case AAFwk::ABILITY_STATE_BACKGROUND_NEW: {
110 Background(want, sessionInfo);
111 break;
112 }
113 default: {
114 ret = false;
115 TAG_LOGE(AAFwkTag::EXT, "error state");
116 break;
117 }
118 }
119 if (ret && !UIExtensionAbilityExecuteInsightIntent(want)) {
120 TAG_LOGD(AAFwkTag::EXT, "call abilityms");
121 AAFwk::PacMap restoreData;
122 AAFwk::AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_, targetState.state, restoreData);
123 }
124 }
125
UIExtensionAbilityExecuteInsightIntent(const Want & want)126 bool ExtensionImpl::UIExtensionAbilityExecuteInsightIntent(const Want &want)
127 {
128 return AAFwk::UIExtensionUtils::IsUIExtension(extensionType_) &&
129 AppExecFwk::InsightIntentExecuteParam::IsInsightIntentExecute(want);
130 }
131
ScheduleUpdateConfiguration(const AppExecFwk::Configuration & config)132 void ExtensionImpl::ScheduleUpdateConfiguration(const AppExecFwk::Configuration &config)
133 {
134 TAG_LOGD(AAFwkTag::EXT, "call");
135 if (extension_ == nullptr) {
136 TAG_LOGE(AAFwkTag::EXT, "null extension_");
137 return;
138 }
139
140 extension_->OnConfigurationUpdated(config);
141 }
142
NotifyMemoryLevel(int level)143 void ExtensionImpl::NotifyMemoryLevel(int level)
144 {
145 TAG_LOGD(AAFwkTag::EXT, "call");
146 if (extension_ == nullptr) {
147 TAG_LOGE(AAFwkTag::EXT, "null extension_");
148 return;
149 }
150
151 if (lifecycleState_ != AAFwk::ABILITY_STATE_INITIAL) {
152 extension_->OnMemoryLevel(level);
153 }
154 }
155
156 /**
157 * @brief Toggles the lifecycle status of Extension to AAFwk::ABILITY_STATE_INACTIVE. And notifies the application
158 * that it belongs to of the lifecycle status.
159 *
160 * @param want The Want object to switch the life cycle.
161 * @param sessionInfo Indicates the sessionInfo.
162 */
Start(const Want & want,sptr<AAFwk::SessionInfo> sessionInfo)163 void ExtensionImpl::Start(const Want &want, sptr<AAFwk::SessionInfo> sessionInfo)
164 {
165 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
166 TAG_LOGD(AAFwkTag::EXT, "call");
167 if (extension_ == nullptr) {
168 TAG_LOGE(AAFwkTag::EXT, "null extension_");
169 return;
170 }
171
172 TAG_LOGD(AAFwkTag::EXT, "called");
173 if (extension_->abilityInfo_->extensionAbilityType == AppExecFwk::ExtensionAbilityType::WINDOW ||
174 AAFwk::UIExtensionUtils::IsUIExtension(extension_->abilityInfo_->extensionAbilityType)) {
175 extension_->OnStart(want, sessionInfo);
176 } else {
177 extension_->OnStart(want);
178 }
179 lifecycleState_ = AAFwk::ABILITY_STATE_INACTIVE;
180 TAG_LOGD(AAFwkTag::EXT, "ok");
181 }
182
183 /**
184 * @brief Toggles the lifecycle status of Extension to AAFwk::ABILITY_STATE_INITIAL. And notifies the application
185 * that it belongs to of the lifecycle status.
186 *
187 */
Stop()188 void ExtensionImpl::Stop()
189 {
190 TAG_LOGD(AAFwkTag::EXT, "call");
191 if (extension_ == nullptr) {
192 TAG_LOGE(AAFwkTag::EXT, "null extension_");
193 return;
194 }
195
196 extension_->OnStop();
197 lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL;
198 TAG_LOGD(AAFwkTag::EXT, "ok");
199 }
200
Stop(bool & isAsyncCallback,const Want & want,sptr<AAFwk::SessionInfo> sessionInfo)201 void ExtensionImpl::Stop(bool &isAsyncCallback, const Want &want, sptr<AAFwk::SessionInfo> sessionInfo)
202 {
203 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
204 TAG_LOGD(AAFwkTag::EXT, "call");
205 if (extension_ == nullptr) {
206 TAG_LOGE(AAFwkTag::EXT, "null extension_");
207 isAsyncCallback = false;
208 return;
209 }
210
211 if (AAFwk::UIExtensionUtils::IsUIExtension(extensionType_) && sessionInfo != nullptr) {
212 CommandExtensionWindow(want, sessionInfo, AAFwk::WIN_CMD_DESTROY);
213 }
214
215 auto *callbackInfo = AppExecFwk::AbilityTransactionCallbackInfo<>::Create();
216 if (callbackInfo == nullptr) {
217 extension_->OnStop();
218 lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL;
219 isAsyncCallback = false;
220 return;
221 }
222 std::weak_ptr<ExtensionImpl> weakPtr = shared_from_this();
223 auto asyncCallback = [ExtensionImplWeakPtr = weakPtr, state = AAFwk::ABILITY_STATE_INITIAL]() {
224 auto extensionImpl = ExtensionImplWeakPtr.lock();
225 if (extensionImpl == nullptr) {
226 TAG_LOGE(AAFwkTag::EXT, "null extensionImpl");
227 return;
228 }
229 extensionImpl->lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL;
230 extensionImpl->AbilityTransactionCallback(state);
231 };
232 callbackInfo->Push(asyncCallback);
233
234 extension_->OnStop(callbackInfo, isAsyncCallback);
235 if (!isAsyncCallback) {
236 lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL;
237 AppExecFwk::AbilityTransactionCallbackInfo<>::Destroy(callbackInfo);
238 }
239 // else: callbackInfo will be destroyed after the async callback
240 TAG_LOGD(AAFwkTag::EXT, "end");
241 }
242
AbilityTransactionCallback(const AAFwk::AbilityLifeCycleState & state)243 void ExtensionImpl::AbilityTransactionCallback(const AAFwk::AbilityLifeCycleState &state)
244 {
245 TAG_LOGD(AAFwkTag::EXT, "called");
246 AAFwk::PacMap restoreData;
247 AAFwk::AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_, state, restoreData);
248 }
249
250 /**
251 * @brief Connect the extension. and Calling information back to Extension.
252 *
253 * @param want The Want object to connect to.
254 *
255 */
ConnectExtension(const Want & want)256 sptr<IRemoteObject> ExtensionImpl::ConnectExtension(const Want &want)
257 {
258 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
259 TAG_LOGD(AAFwkTag::EXT, "call");
260 if (extension_ == nullptr) {
261 TAG_LOGE(AAFwkTag::EXT, "null extension_");
262 return nullptr;
263 }
264
265 skipCommandExtensionWithIntent_ = true;
266 sptr<IRemoteObject> object = extension_->OnConnect(want);
267 lifecycleState_ = AAFwk::ABILITY_STATE_ACTIVE;
268 TAG_LOGD(AAFwkTag::EXT, "ok");
269
270 return object;
271 }
272
ConnectExtension(const Want & want,bool & isAsyncCallback)273 sptr<IRemoteObject> ExtensionImpl::ConnectExtension(const Want &want, bool &isAsyncCallback)
274 {
275 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
276 TAG_LOGD(AAFwkTag::EXT, "call");
277 FreezeUtil::GetInstance().AddLifecycleEvent(token_, "ExtensionImpl::ConnectExtension");
278 if (extension_ == nullptr) {
279 TAG_LOGE(AAFwkTag::EXT, "null extension_");
280 isAsyncCallback = false;
281 return nullptr;
282 }
283
284 skipCommandExtensionWithIntent_ = true;
285 auto *callbackInfo = AppExecFwk::AbilityTransactionCallbackInfo<sptr<IRemoteObject>>::Create();
286 if (callbackInfo == nullptr) {
287 sptr<IRemoteObject> object = extension_->OnConnect(want);
288 lifecycleState_ = AAFwk::ABILITY_STATE_ACTIVE;
289 isAsyncCallback = false;
290 TAG_LOGI(AAFwkTag::EXT, "end");
291 return object;
292 }
293
294 std::weak_ptr<ExtensionImpl> weakPtr = shared_from_this();
295 auto asyncCallback = [extensionImplWeakPtr = weakPtr](sptr<IRemoteObject> &service) {
296 auto extensionImpl = extensionImplWeakPtr.lock();
297 if (extensionImpl == nullptr) {
298 TAG_LOGE(AAFwkTag::EXT, "null extensionImpl");
299 return;
300 }
301 extensionImpl->lifecycleState_ = AAFwk::ABILITY_STATE_ACTIVE;
302 extensionImpl->ConnectExtensionCallback(service);
303 };
304 callbackInfo->Push(asyncCallback);
305
306 sptr<IRemoteObject> object = extension_->OnConnect(want, callbackInfo, isAsyncCallback);
307 if (!isAsyncCallback) {
308 lifecycleState_ = AAFwk::ABILITY_STATE_ACTIVE;
309 AppExecFwk::AbilityTransactionCallbackInfo<sptr<IRemoteObject>>::Destroy(callbackInfo);
310 }
311 // else: callbackInfo will be destroyed after the async callback
312 TAG_LOGD(AAFwkTag::EXT, "ok");
313 return object;
314 }
315
ConnectExtensionCallback(sptr<IRemoteObject> & service)316 void ExtensionImpl::ConnectExtensionCallback(sptr<IRemoteObject> &service)
317 {
318 FreezeUtil::GetInstance().AddLifecycleEvent(token_, "ExtensionImpl::ConnectExtensionCallback");
319 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->ScheduleConnectAbilityDone(token_, service);
320 if (err != ERR_OK) {
321 TAG_LOGE(AAFwkTag::EXT, "err: %{public}d", err);
322 FreezeUtil::GetInstance().AddLifecycleEvent(token_,
323 "ExtensionImpl::ConnectExtensionCallback fail, err is " + std::to_string(err));
324 return;
325 }
326 FreezeUtil::GetInstance().DeleteLifecycleEvent(token_);
327 FreezeUtil::GetInstance().DeleteAppLifecycleEvent(0);
328 }
329
330 /**
331 * @brief Disconnects the connected object.
332 *
333 * @param want The Want object to disconnect to.
334 */
DisconnectExtension(const Want & want)335 void ExtensionImpl::DisconnectExtension(const Want &want)
336 {
337 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
338 TAG_LOGD(AAFwkTag::EXT, "call");
339 if (extension_ == nullptr) {
340 TAG_LOGE(AAFwkTag::EXT, "null extension_");
341 return;
342 }
343
344 extension_->OnDisconnect(want);
345 TAG_LOGD(AAFwkTag::EXT, "ok");
346 }
347
DisconnectExtension(const Want & want,bool & isAsyncCallback)348 void ExtensionImpl::DisconnectExtension(const Want &want, bool &isAsyncCallback)
349 {
350 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
351 TAG_LOGD(AAFwkTag::EXT, "called");
352 if (extension_ == nullptr) {
353 TAG_LOGE(AAFwkTag::EXT, "null extension_");
354 isAsyncCallback = false;
355 return;
356 }
357
358 auto *callbackInfo = AppExecFwk::AbilityTransactionCallbackInfo<>::Create();
359 if (callbackInfo == nullptr) {
360 extension_->OnDisconnect(want);
361 isAsyncCallback = false;
362 return;
363 }
364 std::weak_ptr<ExtensionImpl> weakPtr = shared_from_this();
365 auto asyncCallback = [extensionImplWeakPtr = weakPtr]() {
366 auto extensionImpl = extensionImplWeakPtr.lock();
367 if (extensionImpl == nullptr) {
368 TAG_LOGE(AAFwkTag::EXT, "null extensionImpl");
369 return;
370 }
371 extensionImpl->DisconnectExtensionCallback();
372 };
373 callbackInfo->Push(asyncCallback);
374
375 extension_->OnDisconnect(want, callbackInfo, isAsyncCallback);
376 if (!isAsyncCallback) {
377 AppExecFwk::AbilityTransactionCallbackInfo<>::Destroy(callbackInfo);
378 }
379 // else: callbackInfo will be destroyed after the async callback
380 TAG_LOGD(AAFwkTag::EXT, "end");
381 }
382
DisconnectExtensionCallback()383 void ExtensionImpl::DisconnectExtensionCallback()
384 {
385 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->ScheduleDisconnectAbilityDone(token_);
386 if (err != ERR_OK) {
387 TAG_LOGE(AAFwkTag::EXT, "err: %{public}d", err);
388 }
389 }
390
391 /**
392 * @brief Command the Extension. and Calling information back to Extension.
393 *
394 * @param want The Want object to command to.
395 *
396 * * @param restart Indicates the startup mode. The value true indicates that Service is restarted after being
397 * destroyed, and the value false indicates a normal startup.
398 *
399 * @param startId Indicates the number of times the Service Extension has been started. The startId is incremented by 1
400 * every time the Extension is started. For example, if the Extension has been started for six times,
401 * the value of startId is 6.
402 */
CommandExtension(const Want & want,bool restart,int startId)403 void ExtensionImpl::CommandExtension(const Want &want, bool restart, int startId)
404 {
405 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
406 TAG_LOGD(AAFwkTag::EXT, "call");
407 if (extension_ == nullptr) {
408 TAG_LOGE(AAFwkTag::EXT, "null extension_");
409 return;
410 }
411 if (!AppExecFwk::InsightIntentExecuteParam::IsInsightIntentExecute(want) || !skipCommandExtensionWithIntent_) {
412 skipCommandExtensionWithIntent_ = true;
413 extension_->OnCommand(want, restart, startId);
414 }
415 lifecycleState_ = AAFwk::ABILITY_STATE_ACTIVE;
416 TAG_LOGD(AAFwkTag::EXT, "ok");
417 }
418
HandleInsightIntent(const Want & want)419 bool ExtensionImpl::HandleInsightIntent(const Want &want)
420 {
421 TAG_LOGD(AAFwkTag::EXT, "call");
422 if (extension_ == nullptr) {
423 TAG_LOGE(AAFwkTag::EXT, "null extension_");
424 return false;
425 }
426 auto ret = extension_->HandleInsightIntent(want);
427 if (!ret) {
428 TAG_LOGE(AAFwkTag::EXT, "handle failed");
429 return false;
430 }
431 TAG_LOGD(AAFwkTag::EXT, "ok");
432 return true;
433 }
434
CommandExtensionWindow(const Want & want,const sptr<AAFwk::SessionInfo> & sessionInfo,AAFwk::WindowCommand winCmd)435 void ExtensionImpl::CommandExtensionWindow(const Want &want, const sptr<AAFwk::SessionInfo> &sessionInfo,
436 AAFwk::WindowCommand winCmd)
437 {
438 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
439 if (extension_ == nullptr || sessionInfo == nullptr) {
440 TAG_LOGE(AAFwkTag::EXT, "null extension_ or sessionInfo");
441 return;
442 }
443
444 TAG_LOGD(AAFwkTag::EXT, "persistentId: %{private}d, componentId: %{public}" PRId64 ", winCmd: %{public}d",
445 sessionInfo->persistentId, sessionInfo->uiExtensionComponentId, winCmd);
446 extension_->OnCommandWindow(want, sessionInfo, winCmd);
447 TAG_LOGD(AAFwkTag::EXT, "ok");
448 }
449
SendResult(int requestCode,int resultCode,const Want & resultData)450 void ExtensionImpl::SendResult(int requestCode, int resultCode, const Want &resultData)
451 {
452 TAG_LOGD(AAFwkTag::EXT, "begin");
453 if (extension_ == nullptr) {
454 TAG_LOGE(AAFwkTag::EXT, "null extension_");
455 return;
456 }
457
458 extension_->OnAbilityResult(requestCode, resultCode, resultData);
459 TAG_LOGD(AAFwkTag::EXT, "end");
460 }
461
SetLaunchParam(const AAFwk::LaunchParam & launchParam)462 void ExtensionImpl::SetLaunchParam(const AAFwk::LaunchParam &launchParam)
463 {
464 TAG_LOGD(AAFwkTag::EXT, "called");
465 if (extension_ == nullptr) {
466 TAG_LOGE(AAFwkTag::EXT, "null extension_");
467 return;
468 }
469
470 extension_->SetLaunchParam(launchParam);
471 }
472
ScheduleAbilityRequestFailure(const std::string & requestId,const AppExecFwk::ElementName & element,const std::string & message,int32_t resultCode)473 void ExtensionImpl::ScheduleAbilityRequestFailure(const std::string &requestId, const AppExecFwk::ElementName &element,
474 const std::string &message, int32_t resultCode)
475 {
476 TAG_LOGD(AAFwkTag::EXT, "ScheduleAbilityRequestFailure called");
477 if (extension_ == nullptr) {
478 TAG_LOGE(AAFwkTag::EXT, "null extension_");
479 return;
480 }
481 extension_->OnExtensionAbilityRequestFailure(requestId, element, message, resultCode);
482 }
483
ScheduleAbilityRequestSuccess(const std::string & requestId,const AppExecFwk::ElementName & element)484 void ExtensionImpl::ScheduleAbilityRequestSuccess(const std::string &requestId, const AppExecFwk::ElementName &element)
485 {
486 TAG_LOGD(AAFwkTag::EXT, "ScheduleAbilityRequestSuccess called");
487 if (extension_ == nullptr) {
488 TAG_LOGE(AAFwkTag::EXT, "null extension_");
489 return;
490 }
491 nlohmann::json jsonObject = nlohmann::json {
492 { JSON_KEY_ERR_MSG, "Succeeded" },
493 };
494 extension_->OnExtensionAbilityRequestSuccess(requestId, element, jsonObject.dump());
495 }
496
Foreground(const Want & want,sptr<AAFwk::SessionInfo> sessionInfo)497 void ExtensionImpl::Foreground(const Want &want, sptr<AAFwk::SessionInfo> sessionInfo)
498 {
499 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
500 TAG_LOGD(AAFwkTag::EXT, "begin");
501 if (extension_ == nullptr) {
502 TAG_LOGE(AAFwkTag::EXT, "null extension");
503 return;
504 }
505
506 extension_->OnForeground(want, sessionInfo);
507 lifecycleState_ = AAFwk::ABILITY_STATE_FOREGROUND_NEW;
508 }
509
Background(const Want & want,sptr<AAFwk::SessionInfo> sessionInfo)510 void ExtensionImpl::Background(const Want &want, sptr<AAFwk::SessionInfo> sessionInfo)
511 {
512 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
513 TAG_LOGD(AAFwkTag::EXT, "begin");
514 if (extension_ == nullptr) {
515 TAG_LOGE(AAFwkTag::EXT, "null extension_");
516 return;
517 }
518
519 if (AAFwk::UIExtensionUtils::IsUIExtension(extensionType_) && sessionInfo != nullptr) {
520 CommandExtensionWindow(want, sessionInfo, AAFwk::WIN_CMD_BACKGROUND);
521 }
522
523 extension_->OnBackground();
524 lifecycleState_ = AAFwk::ABILITY_STATE_BACKGROUND_NEW;
525 }
526
AfterForeground()527 void ExtensionImpl::ExtensionWindowLifeCycleImpl::AfterForeground()
528 {
529 TAG_LOGD(AAFwkTag::EXT, "called");
530 }
531
AfterBackground()532 void ExtensionImpl::ExtensionWindowLifeCycleImpl::AfterBackground()
533 {
534 TAG_LOGD(AAFwkTag::EXT, "called");
535 }
536
AfterActive()537 void ExtensionImpl::ExtensionWindowLifeCycleImpl::AfterActive()
538 {
539 TAG_LOGD(AAFwkTag::EXT, "called");
540 }
541
AfterInactive()542 void ExtensionImpl::ExtensionWindowLifeCycleImpl::AfterInactive()
543 {
544 TAG_LOGD(AAFwkTag::EXT, "called");
545 }
546 }
547 }
548