• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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