• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 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 "ui_ability.h"
17 
18 #include "ability_lifecycle.h"
19 #include "ability_recovery.h"
20 #include "configuration_convertor.h"
21 #include "event_report.h"
22 #include "hilog_tag_wrapper.h"
23 #include "hitrace_meter.h"
24 #include "js_ui_ability.h"
25 #ifdef CJ_FRONTEND
26 #include "cj_ui_ability.h"
27 #endif
28 #include "ohos_application.h"
29 #include "reverse_continuation_scheduler_primary_stage.h"
30 #include "runtime.h"
31 #include "resource_config_helper.h"
32 
33 namespace OHOS {
34 namespace AbilityRuntime {
35 namespace {
36 constexpr char DMS_SESSION_ID[] = "sessionId";
37 constexpr char DMS_ORIGIN_DEVICE_ID[] = "deviceId";
38 constexpr int32_t DEFAULT_DMS_SESSION_ID = 0;
39 constexpr char LAUNCHER_BUNDLE_NAME[] = "com.ohos.launcher";
40 constexpr char LAUNCHER_ABILITY_NAME[] = "com.ohos.launcher.MainAbility";
41 constexpr char SHOW_ON_LOCK_SCREEN[] = "ShowOnLockScreen";
42 #ifdef WITH_DLP
43 constexpr char DLP_PARAMS_SECURITY_FLAG[] = "ohos.dlp.params.securityFlag";
44 #endif // WITH_DLP
45 constexpr char COMPONENT_STARTUP_NEW_RULES[] = "component.startup.newRules";
46 constexpr int32_t ERR_INVALID_VALUE = -1;
47 }
Create(const std::unique_ptr<Runtime> & runtime)48 UIAbility *UIAbility::Create(const std::unique_ptr<Runtime> &runtime)
49 {
50     if (!runtime) {
51         return new (std::nothrow) UIAbility;
52     }
53 
54     switch (runtime->GetLanguage()) {
55         case Runtime::Language::JS:
56             return JsUIAbility::Create(runtime);
57 #ifdef CJ_FRONTEND
58         case Runtime::Language::CJ:
59             return CJUIAbility::Create(runtime);
60 #endif
61         default:
62             return new (std::nothrow) UIAbility();
63     }
64 }
65 
Init(std::shared_ptr<AppExecFwk::AbilityLocalRecord> record,const std::shared_ptr<AppExecFwk::OHOSApplication> application,std::shared_ptr<AppExecFwk::AbilityHandler> & handler,const sptr<IRemoteObject> & token)66 void UIAbility::Init(std::shared_ptr<AppExecFwk::AbilityLocalRecord> record,
67     const std::shared_ptr<AppExecFwk::OHOSApplication> application,
68     std::shared_ptr<AppExecFwk::AbilityHandler> &handler, const sptr<IRemoteObject> &token)
69 {
70     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
71     TAG_LOGD(AAFwkTag::UIABILITY, "called");
72     if (record == nullptr) {
73         TAG_LOGE(AAFwkTag::UIABILITY, "null localRecord");
74         return;
75     }
76     application_ = application;
77     abilityInfo_ = record->GetAbilityInfo();
78     handler_ = handler;
79     token_ = token;
80 #ifdef SUPPORT_GRAPHICS
81     continuationManager_ = std::make_shared<AppExecFwk::ContinuationManagerStage>();
82     std::weak_ptr<AppExecFwk::ContinuationManagerStage> continuationManager = continuationManager_;
83     continuationHandler_ =
84         std::make_shared<AppExecFwk::ContinuationHandlerStage>(continuationManager, weak_from_this());
85     if (!continuationManager_->Init(shared_from_this(), GetToken(), GetAbilityInfo(), continuationHandler_)) {
86         continuationManager_.reset();
87     } else {
88         std::weak_ptr<AppExecFwk::ContinuationHandlerStage> continuationHandler = continuationHandler_;
89         sptr<AppExecFwk::ReverseContinuationSchedulerPrimaryStage> primary =
90             new (std::nothrow) AppExecFwk::ReverseContinuationSchedulerPrimaryStage(continuationHandler, handler_);
91         if (primary == nullptr) {
92             TAG_LOGE(AAFwkTag::UIABILITY, "null primary");
93         } else {
94             continuationHandler_->SetPrimaryStub(primary);
95             continuationHandler_->SetAbilityInfo(abilityInfo_);
96         }
97     }
98     // register displayid change callback
99     TAG_LOGD(AAFwkTag::UIABILITY, "registerDisplayListener");
100     abilityDisplayListener_ = new (std::nothrow) UIAbilityDisplayListener(weak_from_this());
101     if (abilityDisplayListener_ == nullptr) {
102         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityDisplayListener_");
103         return;
104     }
105     TAG_LOGD(AAFwkTag::UIABILITY, "end register");
106     Rosen::WindowManager::GetInstance().RegisterDisplayInfoChangedListener(token_, abilityDisplayListener_);
107 #endif
108     lifecycle_ = std::make_shared<AppExecFwk::LifeCycle>();
109     abilityLifecycleExecutor_ = std::make_shared<AppExecFwk::AbilityLifecycleExecutor>();
110     abilityLifecycleExecutor_->DispatchLifecycleState(AppExecFwk::AbilityLifecycleExecutor::LifecycleState::INITIAL);
111     if (abilityContext_ != nullptr) {
112         abilityContext_->RegisterAbilityCallback(weak_from_this());
113     }
114     TAG_LOGD(AAFwkTag::UIABILITY, "end");
115 }
116 
GetLifecycle()117 std::shared_ptr<OHOS::AppExecFwk::LifeCycle> UIAbility::GetLifecycle()
118 {
119     TAG_LOGD(AAFwkTag::UIABILITY, "called");
120     return lifecycle_;
121 }
122 
RegisterAbilityLifecycleObserver(const std::shared_ptr<AppExecFwk::ILifecycleObserver> & observer)123 void UIAbility::RegisterAbilityLifecycleObserver(const std::shared_ptr<AppExecFwk::ILifecycleObserver> &observer)
124 {
125     TAG_LOGD(AAFwkTag::UIABILITY, "called");
126     if (observer == nullptr) {
127         TAG_LOGE(AAFwkTag::UIABILITY, "null observer");
128         return;
129     }
130     if (lifecycle_ == nullptr) {
131         TAG_LOGE(AAFwkTag::UIABILITY, "null lifecycle_");
132         return;
133     }
134     lifecycle_->AddObserver(observer);
135 }
136 
UnregisterAbilityLifecycleObserver(const std::shared_ptr<AppExecFwk::ILifecycleObserver> & observer)137 void UIAbility::UnregisterAbilityLifecycleObserver(const std::shared_ptr<AppExecFwk::ILifecycleObserver> &observer)
138 {
139     TAG_LOGD(AAFwkTag::UIABILITY, "called");
140     if (observer == nullptr) {
141         TAG_LOGE(AAFwkTag::UIABILITY, "null observer");
142         return;
143     }
144     if (lifecycle_ == nullptr) {
145         TAG_LOGE(AAFwkTag::UIABILITY, "null lifecycle_");
146         return;
147     }
148     lifecycle_->RemoveObserver(observer);
149 }
150 
AttachAbilityContext(const std::shared_ptr<AbilityRuntime::AbilityContext> & abilityContext)151 void UIAbility::AttachAbilityContext(const std::shared_ptr<AbilityRuntime::AbilityContext> &abilityContext)
152 {
153     abilityContext_ = abilityContext;
154 }
155 
OnStart(const AAFwk::Want & want,sptr<AAFwk::SessionInfo> sessionInfo)156 void UIAbility::OnStart(const AAFwk::Want &want, sptr<AAFwk::SessionInfo> sessionInfo)
157 {
158     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
159     if (abilityInfo_ == nullptr) {
160         TAG_LOGE(AAFwkTag::UIABILITY, "null AbilityInfo_");
161         return;
162     }
163 
164 #ifdef WITH_DLP
165     securityFlag_ = want.GetBoolParam(DLP_PARAMS_SECURITY_FLAG, false);
166     (const_cast<AAFwk::Want &>(want)).RemoveParam(DLP_PARAMS_SECURITY_FLAG);
167 #endif // WITH_DLP
168     SetWant(want);
169     TAG_LOGD(AAFwkTag::UIABILITY, "ability: %{public}s.", abilityInfo_->name.c_str());
170 #ifdef SUPPORT_GRAPHICS
171     if (sessionInfo != nullptr) {
172         SetSessionToken(sessionInfo->sessionToken);
173         SetIdentityToken(sessionInfo->identityToken);
174     }
175     OnStartForSupportGraphics(want);
176 #endif
177     if (abilityLifecycleExecutor_ == nullptr) {
178         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityLifecycleExecutor_");
179         return;
180     }
181     abilityLifecycleExecutor_->DispatchLifecycleState(
182         AppExecFwk::AbilityLifecycleExecutor::LifecycleState::STARTED_NEW);
183 
184     if (lifecycle_ == nullptr) {
185         TAG_LOGE(AAFwkTag::UIABILITY, "null lifecycle_");
186         return;
187     }
188     lifecycle_->DispatchLifecycle(AppExecFwk::LifeCycle::Event::ON_START, want);
189     TAG_LOGD(AAFwkTag::UIABILITY, "end");
190 }
191 
OnStop()192 void UIAbility::OnStop()
193 {
194     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
195     TAG_LOGD(AAFwkTag::UIABILITY, "called");
196 #ifdef SUPPORT_GRAPHICS
197     if (abilityRecovery_ != nullptr) {
198         abilityRecovery_->ScheduleSaveAbilityState(AppExecFwk::StateReason::LIFECYCLE);
199     }
200     TAG_LOGI(AAFwkTag::UIABILITY, "UnregisterDisplayInfoChangedListener");
201     (void)Rosen::WindowManager::GetInstance().UnregisterDisplayInfoChangedListener(token_, abilityDisplayListener_);
202     auto &&window = GetWindow();
203     if (window != nullptr) {
204         TAG_LOGD(AAFwkTag::UIABILITY, "UnregisterDisplayMoveListener");
205         window->UnregisterDisplayMoveListener(abilityDisplayMoveListener_);
206     }
207     // Call JS Func(onWindowStageDestroy) and Release the scene.
208     if (scene_ != nullptr) {
209         OnSceneWillDestroy();
210         scene_->GoDestroy();
211         onSceneDestroyed();
212     }
213 #endif
214     if (abilityLifecycleExecutor_ == nullptr) {
215         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityLifecycleExecutor_");
216         return;
217     }
218     abilityLifecycleExecutor_->DispatchLifecycleState(AppExecFwk::AbilityLifecycleExecutor::LifecycleState::INITIAL);
219 
220     if (lifecycle_ == nullptr) {
221         TAG_LOGE(AAFwkTag::UIABILITY, "null lifecycle_");
222         return;
223     }
224     lifecycle_->DispatchLifecycle(AppExecFwk::LifeCycle::Event::ON_STOP);
225 #ifdef SUPPORT_SCREEN
226     Rosen::DisplayManager::GetInstance().RemoveDisplayIdFromAms(token_);
227 #endif
228     TAG_LOGD(AAFwkTag::UIABILITY, "end");
229 }
230 
OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> * callbackInfo,bool & isAsyncCallback)231 void UIAbility::OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo, bool &isAsyncCallback)
232 {
233     isAsyncCallback = false;
234     OnStop();
235 }
236 
OnStopCallback()237 void UIAbility::OnStopCallback()
238 {
239     TAG_LOGD(AAFwkTag::UIABILITY, "called");
240 }
241 
DestroyInstance()242 void UIAbility::DestroyInstance()
243 {
244     TAG_LOGD(AAFwkTag::UIABILITY, "called");
245 }
246 
IsRestoredInContinuation() const247 bool UIAbility::IsRestoredInContinuation() const
248 {
249     if (abilityContext_ == nullptr) {
250         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext_");
251         return false;
252     }
253 
254     if (launchParam_.launchReason != AAFwk::LaunchReason::LAUNCHREASON_CONTINUATION) {
255         TAG_LOGD(AAFwkTag::UIABILITY, "launchReason: %{public}d", launchParam_.launchReason);
256         return false;
257     }
258 
259     return true;
260 }
261 
ShouldRecoverState(const AAFwk::Want & want)262 bool UIAbility::ShouldRecoverState(const AAFwk::Want &want)
263 {
264     if (!want.GetBoolParam(Want::PARAM_ABILITY_RECOVERY_RESTART, false)) {
265         TAG_LOGE(AAFwkTag::UIABILITY, "appRecovery not recovery restart");
266         return false;
267     }
268 
269     if (abilityRecovery_ == nullptr) {
270         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityRecovery_");
271         return false;
272     }
273 
274     if (abilityContext_ == nullptr) {
275         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext_");
276         return false;
277     }
278 
279     if (abilityContext_->GetContentStorage() == nullptr) {
280         TAG_LOGE(AAFwkTag::UIABILITY, "get content failed");
281         return false;
282     }
283     return true;
284 }
285 
NotifyContinuationResult(const AAFwk::Want & want,bool success)286 void UIAbility::NotifyContinuationResult(const AAFwk::Want &want, bool success)
287 {
288     TAG_LOGD(AAFwkTag::UIABILITY, "called");
289     int sessionId = want.GetIntParam(DMS_SESSION_ID, DEFAULT_DMS_SESSION_ID);
290     std::string originDeviceId = want.GetStringParam(DMS_ORIGIN_DEVICE_ID);
291 
292     if (continuationManager_ == nullptr) {
293         TAG_LOGE(AAFwkTag::UIABILITY, "null continuationManager_");
294         return;
295     }
296     continuationManager_->NotifyCompleteContinuation(
297         originDeviceId, sessionId, success, reverseContinuationSchedulerReplica_);
298 }
299 
OnConfigurationUpdatedNotify(const AppExecFwk::Configuration & configuration)300 void UIAbility::OnConfigurationUpdatedNotify(const AppExecFwk::Configuration &configuration)
301 {
302     TAG_LOGD(AAFwkTag::UIABILITY, "begin");
303     ResourceConfigHelper resourceConfig;
304     InitConfigurationProperties(configuration, resourceConfig);
305     auto resourceManager = GetResourceManager();
306     resourceConfig.UpdateResConfig(configuration, resourceManager);
307 
308     if (abilityContext_ != nullptr && application_ != nullptr) {
309         abilityContext_->SetConfiguration(application_->GetConfiguration());
310     }
311     // Notify Ability Subclass
312     OnConfigurationUpdated(configuration);
313     TAG_LOGD(AAFwkTag::UIABILITY, "end");
314 }
315 
InitConfigurationProperties(const AppExecFwk::Configuration & changeConfiguration,ResourceConfigHelper & resourceConfig)316 void UIAbility::InitConfigurationProperties(const AppExecFwk::Configuration &changeConfiguration,
317     ResourceConfigHelper &resourceConfig)
318 {
319     resourceConfig.SetMcc(changeConfiguration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_MCC));
320     resourceConfig.SetMnc(changeConfiguration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_MNC));
321     if (setting_) {
322         auto displayId =
323             std::atoi(setting_->GetProperty(AppExecFwk::AbilityStartSetting::WINDOW_DISPLAY_ID_KEY).c_str());
324         resourceConfig.SetLanguage(changeConfiguration.GetItem(displayId,
325             AAFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE));
326         resourceConfig.SetColormode(changeConfiguration.GetItem(displayId,
327             AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE));
328         resourceConfig.SetHasPointerDevice(changeConfiguration.GetItem(displayId,
329             AAFwk::GlobalConfigurationKey::INPUT_POINTER_DEVICE));
330         TAG_LOGD(AAFwkTag::UIABILITY, "displayId: [%{public}d], language: [%{public}s], colormode: [%{public}s], "
331             "hasPointerDevice: [%{public}s] mcc: [%{public}s], mnc: [%{public}s]", displayId,
332             resourceConfig.GetLanguage().c_str(), resourceConfig.GetColormode().c_str(),
333             resourceConfig.GetHasPointerDevice().c_str(), resourceConfig.GetMcc().c_str(),
334             resourceConfig.GetMnc().c_str());
335     } else {
336         resourceConfig.SetLanguage(changeConfiguration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE));
337         resourceConfig.SetColormode(changeConfiguration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE));
338         resourceConfig.SetHasPointerDevice(changeConfiguration.GetItem(
339             AAFwk::GlobalConfigurationKey::INPUT_POINTER_DEVICE));
340         TAG_LOGD(AAFwkTag::UIABILITY,
341             "language: [%{public}s], colormode: [%{public}s], hasPointerDevice: [%{public}s] "
342             "mcc: [%{public}s], mnc: [%{public}s]",
343             resourceConfig.GetLanguage().c_str(), resourceConfig.GetColormode().c_str(),
344             resourceConfig.GetHasPointerDevice().c_str(), resourceConfig.GetMcc().c_str(),
345             resourceConfig.GetMnc().c_str());
346     }
347 }
348 
OnMemoryLevel(int level)349 void UIAbility::OnMemoryLevel(int level)
350 {
351     TAG_LOGD(AAFwkTag::UIABILITY, "called");
352     if (scene_ == nullptr) {
353         TAG_LOGE(AAFwkTag::UIABILITY, "null scene");
354         return;
355     }
356     scene_->NotifyMemoryLevel(level);
357 }
358 
GetAbilityName()359 std::string UIAbility::GetAbilityName()
360 {
361     if (abilityInfo_ == nullptr) {
362         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityInfo_");
363         return "";
364     }
365     return abilityInfo_->name;
366 }
367 
GetModuleName()368 std::string UIAbility::GetModuleName()
369 {
370     if (abilityInfo_ == nullptr) {
371         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityInfo_");
372         return "";
373     }
374 
375     return abilityInfo_->moduleName;
376 }
377 
OnAbilityResult(int requestCode,int resultCode,const AAFwk::Want & want)378 void UIAbility::OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want &want)
379 {
380     TAG_LOGD(AAFwkTag::UIABILITY, "called");
381 }
382 
OnNewWant(const AAFwk::Want & want)383 void UIAbility::OnNewWant(const AAFwk::Want &want)
384 {
385     TAG_LOGD(AAFwkTag::UIABILITY, "called");
386 }
387 
OnRestoreAbilityState(const AppExecFwk::PacMap & inState)388 void UIAbility::OnRestoreAbilityState(const AppExecFwk::PacMap &inState)
389 {
390     TAG_LOGD(AAFwkTag::UIABILITY, "called");
391 }
392 
SetWant(const AAFwk::Want & want)393 void UIAbility::SetWant(const AAFwk::Want &want)
394 {
395     std::lock_guard<std::mutex> lock(wantMutexlock_);
396     setWant_ = std::make_shared<AAFwk::Want>(want);
397 }
398 
GetWant()399 std::shared_ptr<AAFwk::Want> UIAbility::GetWant()
400 {
401     std::lock_guard<std::mutex> lock(wantMutexlock_);
402     return setWant_;
403 }
404 
OnConfigurationUpdated(const AppExecFwk::Configuration & configuration)405 void UIAbility::OnConfigurationUpdated(const AppExecFwk::Configuration &configuration)
406 {
407     TAG_LOGD(AAFwkTag::UIABILITY, "called");
408 }
409 
Dump(const std::vector<std::string> & params,std::vector<std::string> & info)410 void UIAbility::Dump(const std::vector<std::string> &params, std::vector<std::string> &info)
411 {
412     TAG_LOGD(AAFwkTag::UIABILITY, "called");
413 }
414 
GetState()415 AppExecFwk::AbilityLifecycleExecutor::LifecycleState UIAbility::GetState()
416 {
417     TAG_LOGD(AAFwkTag::UIABILITY, "called");
418     if (abilityLifecycleExecutor_ == nullptr) {
419         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityLifecycleExecutor_");
420         return AppExecFwk::AbilityLifecycleExecutor::LifecycleState::UNINITIALIZED;
421     }
422     return static_cast<AppExecFwk::AbilityLifecycleExecutor::LifecycleState>(abilityLifecycleExecutor_->GetState());
423 }
424 
OnContinue(AAFwk::WantParams & wantParams)425 int32_t UIAbility::OnContinue(AAFwk::WantParams &wantParams)
426 {
427     return AppExecFwk::ContinuationManagerStage::OnContinueResult::REJECT;
428 }
429 
ContinueAbilityWithStack(const std::string & deviceId,uint32_t versionCode)430 void UIAbility::ContinueAbilityWithStack(const std::string &deviceId, uint32_t versionCode)
431 {
432     if (deviceId.empty()) {
433         TAG_LOGE(AAFwkTag::UIABILITY, "empty deviceId");
434         return;
435     }
436 
437     if (continuationManager_ == nullptr) {
438         TAG_LOGE(AAFwkTag::UIABILITY, "null continuationManager_");
439         return;
440     }
441     continuationManager_->ContinueAbilityWithStack(deviceId, versionCode);
442 }
443 
OnStartContinuation()444 bool UIAbility::OnStartContinuation()
445 {
446     return false;
447 }
448 
OnSaveData(AAFwk::WantParams & saveData)449 bool UIAbility::OnSaveData(AAFwk::WantParams &saveData)
450 {
451     return false;
452 }
453 
OnRestoreData(AAFwk::WantParams & restoreData)454 bool UIAbility::OnRestoreData(AAFwk::WantParams &restoreData)
455 {
456     return false;
457 }
458 
OnSaveState(int32_t reason,AAFwk::WantParams & wantParams)459 int32_t UIAbility::OnSaveState(int32_t reason, AAFwk::WantParams &wantParams)
460 {
461     return ERR_OK;
462 }
463 
OnCompleteContinuation(int result)464 void UIAbility::OnCompleteContinuation(int result)
465 {
466     TAG_LOGD(AAFwkTag::UIABILITY, "called");
467     if (continuationManager_ == nullptr) {
468         TAG_LOGE(AAFwkTag::UIABILITY, "null continuationManager_");
469         return;
470     }
471 
472     continuationManager_->ChangeProcessStateToInit();
473 }
474 
OnRemoteTerminated()475 void UIAbility::OnRemoteTerminated()
476 {
477     TAG_LOGD(AAFwkTag::UIABILITY, "called");
478 }
479 
DispatchLifecycleOnForeground(const AAFwk::Want & want)480 void UIAbility::DispatchLifecycleOnForeground(const AAFwk::Want &want)
481 {
482     if (abilityLifecycleExecutor_ == nullptr) {
483         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityLifecycleExecutor_");
484         return;
485     }
486     abilityLifecycleExecutor_->DispatchLifecycleState(
487         AppExecFwk::AbilityLifecycleExecutor::LifecycleState::FOREGROUND_NEW);
488 
489     if (lifecycle_ == nullptr) {
490         TAG_LOGE(AAFwkTag::UIABILITY, "null lifecycle_");
491         return;
492     }
493     lifecycle_->DispatchLifecycle(AppExecFwk::LifeCycle::Event::ON_FOREGROUND, want);
494 }
495 
HandleCreateAsRecovery(const AAFwk::Want & want)496 void UIAbility::HandleCreateAsRecovery(const AAFwk::Want &want)
497 {
498     if (!want.GetBoolParam(Want::PARAM_ABILITY_RECOVERY_RESTART, false)) {
499         TAG_LOGE(AAFwkTag::UIABILITY, "appRecovery not recovery restart");
500         return;
501     }
502 
503     if (abilityRecovery_ != nullptr) {
504         abilityRecovery_->ScheduleRestoreAbilityState(AppExecFwk::StateReason::DEVELOPER_REQUEST, want);
505     }
506 }
507 
SetStartAbilitySetting(std::shared_ptr<AppExecFwk::AbilityStartSetting> setting)508 void UIAbility::SetStartAbilitySetting(std::shared_ptr<AppExecFwk::AbilityStartSetting> setting)
509 {
510     TAG_LOGD(AAFwkTag::UIABILITY, "called");
511     setting_ = setting;
512 }
513 
SetLaunchParam(const AAFwk::LaunchParam & launchParam)514 void UIAbility::SetLaunchParam(const AAFwk::LaunchParam &launchParam)
515 {
516     TAG_LOGD(AAFwkTag::UIABILITY, "called");
517     launchParam_ = launchParam;
518 }
519 
GetLaunchParam() const520 const AAFwk::LaunchParam &UIAbility::GetLaunchParam() const
521 {
522     return launchParam_;
523 }
524 
GetAbilityContext()525 std::shared_ptr<AbilityRuntime::AbilityContext> UIAbility::GetAbilityContext()
526 {
527     return abilityContext_;
528 }
529 
CallRequest()530 sptr<IRemoteObject> UIAbility::CallRequest()
531 {
532     return nullptr;
533 }
534 
IsUseNewStartUpRule()535 bool UIAbility::IsUseNewStartUpRule()
536 {
537     std::lock_guard<std::mutex> lock(wantMutexlock_);
538     if (!isNewRuleFlagSetted_ && setWant_) {
539         startUpNewRule_ = setWant_->GetBoolParam(COMPONENT_STARTUP_NEW_RULES, false);
540         isNewRuleFlagSetted_ = true;
541     }
542     return startUpNewRule_;
543 }
544 
EnableAbilityRecovery(const std::shared_ptr<AppExecFwk::AbilityRecovery> & abilityRecovery)545 void UIAbility::EnableAbilityRecovery(const std::shared_ptr<AppExecFwk::AbilityRecovery> &abilityRecovery)
546 {
547     abilityRecovery_ = abilityRecovery;
548 }
549 
OnShare(AAFwk::WantParams & wantParams)550 int32_t UIAbility::OnShare(AAFwk::WantParams &wantParams)
551 {
552     return ERR_OK;
553 }
554 
CheckIsSilentForeground() const555 bool UIAbility::CheckIsSilentForeground() const
556 {
557     return isSilentForeground_;
558 }
559 
SetIsSilentForeground(bool isSilentForeground)560 void UIAbility::SetIsSilentForeground(bool isSilentForeground)
561 {
562     isSilentForeground_ = isSilentForeground;
563 }
564 
565 #ifdef SUPPORT_GRAPHICS
OnSceneCreated()566 void UIAbility::OnSceneCreated()
567 {
568     TAG_LOGD(AAFwkTag::UIABILITY, "called");
569 }
570 
OnSceneRestored()571 void UIAbility::OnSceneRestored()
572 {
573     TAG_LOGD(AAFwkTag::UIABILITY, "called");
574 }
575 
OnSceneWillDestroy()576 void UIAbility::OnSceneWillDestroy()
577 {
578     TAG_LOGD(AAFwkTag::UIABILITY, "called");
579 }
580 
onSceneDestroyed()581 void UIAbility::onSceneDestroyed()
582 {
583     TAG_LOGD(AAFwkTag::UIABILITY, "called");
584 }
585 
OnForeground(const AAFwk::Want & want)586 void UIAbility::OnForeground(const AAFwk::Want &want)
587 {
588     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
589     TAG_LOGD(AAFwkTag::UIABILITY, "called");
590     DoOnForeground(want);
591     if (isSilentForeground_) {
592         TAG_LOGD(AAFwkTag::UIABILITY, "silent foreground, return");
593         return;
594     }
595     DispatchLifecycleOnForeground(want);
596     AAFwk::EventInfo eventInfo;
597     eventInfo.bundleName = want.GetElement().GetBundleName();
598     eventInfo.moduleName = want.GetElement().GetModuleName();
599     eventInfo.abilityName = want.GetElement().GetAbilityName();
600     eventInfo.callerBundleName = want.GetStringParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
601     if (abilityInfo_ != nullptr) {
602         eventInfo.bundleType = static_cast<int32_t>(abilityInfo_->applicationInfo.bundleType);
603     } else {
604         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityInfo_");
605     }
606     AAFwk::EventReport::SendAbilityEvent(AAFwk::EventName::ABILITY_ONFOREGROUND, HiSysEventType::BEHAVIOR, eventInfo);
607 }
608 
OnBackground()609 void UIAbility::OnBackground()
610 {
611     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
612     TAG_LOGD(AAFwkTag::UIABILITY, "called");
613     if (abilityInfo_ == nullptr) {
614         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityInfo_");
615         return;
616     }
617 
618     if (scene_ != nullptr) {
619         TAG_LOGD(AAFwkTag::UIABILITY, "goBackground sceneFlag: %{public}d", sceneFlag_);
620         scene_->GoBackground(sceneFlag_);
621     }
622     if (abilityRecovery_ != nullptr) {
623         abilityRecovery_->ScheduleSaveAbilityState(AppExecFwk::StateReason::LIFECYCLE);
624     }
625 
626     if (abilityLifecycleExecutor_ == nullptr) {
627         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityLifecycleExecutor_");
628         return;
629     }
630     abilityLifecycleExecutor_->DispatchLifecycleState(
631         AppExecFwk::AbilityLifecycleExecutor::LifecycleState::BACKGROUND_NEW);
632 
633     if (lifecycle_ == nullptr) {
634         TAG_LOGE(AAFwkTag::UIABILITY, "null lifecycle_");
635         return;
636     }
637     lifecycle_->DispatchLifecycle(AppExecFwk::LifeCycle::Event::ON_BACKGROUND);
638     AAFwk::EventInfo eventInfo;
639     eventInfo.bundleName = abilityInfo_->bundleName;
640     eventInfo.moduleName = abilityInfo_->moduleName;
641     eventInfo.abilityName = abilityInfo_->name;
642     eventInfo.bundleType = static_cast<int32_t>(abilityInfo_->applicationInfo.bundleType);
643     AAFwk::EventReport::SendAbilityEvent(AAFwk::EventName::ABILITY_ONBACKGROUND, HiSysEventType::BEHAVIOR, eventInfo);
644 }
645 
OnPrepareTerminate()646 bool UIAbility::OnPrepareTerminate()
647 {
648     TAG_LOGD(AAFwkTag::UIABILITY, "called");
649     return false;
650 }
651 
GetWindow()652 const sptr<Rosen::Window> UIAbility::GetWindow()
653 {
654     TAG_LOGD(AAFwkTag::UIABILITY, "called");
655     return nullptr;
656 }
657 
GetScene()658 std::shared_ptr<Rosen::WindowScene> UIAbility::GetScene()
659 {
660     return scene_;
661 }
662 
OnLeaveForeground()663 void UIAbility::OnLeaveForeground()
664 {
665     TAG_LOGD(AAFwkTag::UIABILITY, "called");
666 }
667 
GetContentInfo()668 std::string UIAbility::GetContentInfo()
669 {
670     if (scene_ == nullptr) {
671         TAG_LOGE(AAFwkTag::UIABILITY, "null scene");
672         return "";
673     }
674     return scene_->GetContentInfo();
675 }
676 
SetSceneListener(const sptr<Rosen::IWindowLifeCycle> & listener)677 void UIAbility::SetSceneListener(const sptr<Rosen::IWindowLifeCycle> &listener)
678 {
679     sceneListener_ = listener;
680 }
681 
DoOnForeground(const AAFwk::Want & want)682 void UIAbility::DoOnForeground(const AAFwk::Want &want)
683 {
684     TAG_LOGD(AAFwkTag::UIABILITY, "called");
685 }
686 
GetCurrentWindowMode()687 int32_t UIAbility::GetCurrentWindowMode()
688 {
689     TAG_LOGD(AAFwkTag::UIABILITY, "called");
690     auto windowMode = static_cast<int>(Rosen::WindowMode::WINDOW_MODE_UNDEFINED);
691     if (scene_ == nullptr) {
692         return windowMode;
693     }
694     auto window = scene_->GetMainWindow();
695     if (window != nullptr) {
696         windowMode = static_cast<int>(window->GetMode());
697     }
698     return windowMode;
699 }
700 
SetMissionLabel(const std::string & label)701 ErrCode UIAbility::SetMissionLabel(const std::string &label)
702 {
703     TAG_LOGD(AAFwkTag::UIABILITY, "called");
704     if (!abilityInfo_ || abilityInfo_->type != AppExecFwk::AbilityType::PAGE) {
705         TAG_LOGE(AAFwkTag::UIABILITY, "invalid ability info");
706         return ERR_INVALID_VALUE;
707     }
708 
709     if (scene_ == nullptr) {
710         TAG_LOGE(AAFwkTag::UIABILITY, "null scene");
711         return ERR_INVALID_VALUE;
712     }
713     auto window = scene_->GetMainWindow();
714     if (window == nullptr) {
715         TAG_LOGE(AAFwkTag::UIABILITY, "get window scene failed");
716         return ERR_INVALID_VALUE;
717     }
718 
719     if (window->SetAPPWindowLabel(label) != OHOS::Rosen::WMError::WM_OK) {
720         TAG_LOGE(AAFwkTag::UIABILITY, "setAPPWindowLabel failed");
721         return ERR_INVALID_VALUE;
722     }
723     return ERR_OK;
724 }
725 
SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap> & icon)726 ErrCode UIAbility::SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap> &icon)
727 {
728     TAG_LOGD(AAFwkTag::UIABILITY, "called");
729     if (!abilityInfo_ || abilityInfo_->type != AppExecFwk::AbilityType::PAGE) {
730         TAG_LOGE(AAFwkTag::UIABILITY, "abilityInfo_ is nullptr or not page type");
731         return ERR_INVALID_VALUE;
732     }
733 
734     if (scene_ == nullptr) {
735         TAG_LOGE(AAFwkTag::UIABILITY, "null scene_");
736         return ERR_INVALID_VALUE;
737     }
738     auto window = scene_->GetMainWindow();
739     if (window == nullptr) {
740         TAG_LOGE(AAFwkTag::UIABILITY, "null window");
741         return ERR_INVALID_VALUE;
742     }
743 
744     if (window->SetAPPWindowIcon(icon) != OHOS::Rosen::WMError::WM_OK) {
745         TAG_LOGE(AAFwkTag::UIABILITY, "setAPPWindowIcon failed");
746         return ERR_INVALID_VALUE;
747     }
748     return ERR_OK;
749 }
750 
GetWindowRect(int32_t & left,int32_t & top,int32_t & width,int32_t & height)751 void UIAbility::GetWindowRect(int32_t &left, int32_t &top, int32_t &width, int32_t &height)
752 {
753     TAG_LOGD(AAFwkTag::UIABILITY, "called");
754     if (scene_ == nullptr) {
755         TAG_LOGE(AAFwkTag::UIABILITY, "null scene");
756         return;
757     }
758     auto window = scene_->GetMainWindow();
759     if (window == nullptr) {
760         TAG_LOGE(AAFwkTag::UIABILITY, "null window");
761         return;
762     }
763     left = window->GetRect().posX_;
764     top = window->GetRect().posY_;
765     width = static_cast<int32_t>(window->GetRect().width_);
766     height = static_cast<int32_t>(window->GetRect().height_);
767     TAG_LOGD(AAFwkTag::UIABILITY, "left: %{public}d, top: %{public}d, width: %{public}d, height: %{public}d",
768         left, top, width, height);
769 }
770 
GetUIContent()771 Ace::UIContent *UIAbility::GetUIContent()
772 {
773     TAG_LOGD(AAFwkTag::UIABILITY, "called");
774     if (scene_ == nullptr) {
775         TAG_LOGE(AAFwkTag::UIABILITY, "null scene_");
776         return nullptr;
777     }
778     auto window = scene_->GetMainWindow();
779     if (window == nullptr) {
780         TAG_LOGE(AAFwkTag::UIABILITY, "null window");
781         return nullptr;
782     }
783     return window->GetUIContent();
784 }
785 
OnCreate(Rosen::DisplayId displayId)786 void UIAbility::OnCreate(Rosen::DisplayId displayId)
787 {
788     TAG_LOGD(AAFwkTag::UIABILITY, "called");
789 }
790 
OnDestroy(Rosen::DisplayId displayId)791 void UIAbility::OnDestroy(Rosen::DisplayId displayId)
792 {
793     TAG_LOGD(AAFwkTag::UIABILITY, "called");
794 }
795 
OnDisplayInfoChange(const sptr<IRemoteObject> & token,Rosen::DisplayId displayId,float density,Rosen::DisplayOrientation orientation)796 void UIAbility::OnDisplayInfoChange(const sptr<IRemoteObject>& token, Rosen::DisplayId displayId, float density,
797     Rosen::DisplayOrientation orientation)
798 {
799     TAG_LOGD(AAFwkTag::UIABILITY, "displayId: %{public}" PRIu64, displayId);
800     // Get display
801     auto display = Rosen::DisplayManager::GetInstance().GetDisplayById(displayId);
802     if (!display) {
803         TAG_LOGE(AAFwkTag::UIABILITY, "get display by displayId %{public}" PRIu64 " failed", displayId);
804         return;
805     }
806 
807     // Notify ResourceManager
808     int32_t width = display->GetWidth();
809     int32_t height = display->GetHeight();
810     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
811     if (resConfig != nullptr) {
812         auto resourceManager = GetResourceManager();
813         if (resourceManager != nullptr) {
814             resourceManager->GetResConfig(*resConfig);
815             resConfig->SetScreenDensity(density);
816             resConfig->SetDirection(AppExecFwk::ConvertDirection(height, width));
817             resourceManager->UpdateResConfig(*resConfig);
818             TAG_LOGD(AAFwkTag::UIABILITY, "notify resourceManager, density: %{public}f, direction: %{public}d",
819                 resConfig->GetScreenDensity(), resConfig->GetDirection());
820         }
821     }
822 
823     // Notify ability
824     Configuration newConfig;
825     newConfig.AddItem(
826         displayId, AppExecFwk::ConfigurationInner::APPLICATION_DIRECTION, AppExecFwk::GetDirectionStr(height, width));
827     newConfig.AddItem(
828         displayId, AppExecFwk::ConfigurationInner::APPLICATION_DENSITYDPI, AppExecFwk::GetDensityStr(density));
829 
830     if (application_ == nullptr) {
831         TAG_LOGE(AAFwkTag::UIABILITY, "null application_");
832         return;
833     }
834 
835     OnChangeForUpdateConfiguration(newConfig);
836     TAG_LOGD(AAFwkTag::UIABILITY, "end");
837 }
838 
OnChange(Rosen::DisplayId displayId)839 void UIAbility::OnChange(Rosen::DisplayId displayId)
840 {
841     TAG_LOGD(AAFwkTag::UIABILITY, "displayId: %{public}" PRIu64 "", displayId);
842     // Get display
843     auto display = Rosen::DisplayManager::GetInstance().GetDisplayById(displayId);
844     if (!display) {
845         TAG_LOGE(AAFwkTag::UIABILITY, "get display by displayId %{public}" PRIu64 " failed", displayId);
846         return;
847     }
848 
849     // Notify ResourceManager
850     float density = display->GetVirtualPixelRatio();
851     int32_t width = display->GetWidth();
852     int32_t height = display->GetHeight();
853     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
854     if (resConfig != nullptr) {
855         auto resourceManager = GetResourceManager();
856         if (resourceManager != nullptr) {
857             resourceManager->GetResConfig(*resConfig);
858             resConfig->SetScreenDensity(density);
859             resConfig->SetDirection(AppExecFwk::ConvertDirection(height, width));
860             resourceManager->UpdateResConfig(*resConfig);
861             TAG_LOGD(AAFwkTag::UIABILITY, "notify ResourceManager, density: %{public}f, direction: %{public}d",
862                 resConfig->GetScreenDensity(), resConfig->GetDirection());
863         }
864     }
865 
866     // Notify ability
867     Configuration newConfig;
868     newConfig.AddItem(
869         displayId, AppExecFwk::ConfigurationInner::APPLICATION_DIRECTION, AppExecFwk::GetDirectionStr(height, width));
870     newConfig.AddItem(
871         displayId, AppExecFwk::ConfigurationInner::APPLICATION_DENSITYDPI, AppExecFwk::GetDensityStr(density));
872 
873     if (application_ == nullptr) {
874         TAG_LOGE(AAFwkTag::UIABILITY, "null application_");
875         return;
876     }
877 
878     OnChangeForUpdateConfiguration(newConfig);
879     TAG_LOGD(AAFwkTag::UIABILITY, "end");
880 }
881 
OnDisplayMove(Rosen::DisplayId from,Rosen::DisplayId to)882 void UIAbility::OnDisplayMove(Rosen::DisplayId from, Rosen::DisplayId to)
883 {
884     TAG_LOGD(AAFwkTag::UIABILITY, "from displayId %{public}" PRIu64 " to %{public}" PRIu64 "", from, to);
885     auto display = Rosen::DisplayManager::GetInstance().GetDisplayById(to);
886     if (!display) {
887         TAG_LOGE(AAFwkTag::UIABILITY, "get display by displayId %{public}" PRIu64 " failed", to);
888         return;
889     }
890     // Get new display config
891     float density = display->GetVirtualPixelRatio();
892     int32_t width = display->GetWidth();
893     int32_t height = display->GetHeight();
894     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
895     if (resConfig != nullptr) {
896         auto resourceManager = GetResourceManager();
897         if (resourceManager != nullptr) {
898             resourceManager->GetResConfig(*resConfig);
899             resConfig->SetScreenDensity(density);
900             resConfig->SetDirection(AppExecFwk::ConvertDirection(height, width));
901             resourceManager->UpdateResConfig(*resConfig);
902             TAG_LOGD(AAFwkTag::UIABILITY,
903                 "Density: %{public}f, direction: %{public}d", resConfig->GetScreenDensity(), resConfig->GetDirection());
904         }
905     }
906         UpdateConfiguration(to, density, width, height);
907 }
908 
UpdateConfiguration(Rosen::DisplayId to,float density,int32_t width,int32_t height)909 void UIAbility::UpdateConfiguration(Rosen::DisplayId to, float density, int32_t width, int32_t height)
910 {
911     AppExecFwk::Configuration newConfig;
912     newConfig.AddItem(AppExecFwk::ConfigurationInner::APPLICATION_DISPLAYID, std::to_string(to));
913     newConfig.AddItem(
914         to, AppExecFwk::ConfigurationInner::APPLICATION_DIRECTION, AppExecFwk::GetDirectionStr(height, width));
915     newConfig.AddItem(to, AppExecFwk::ConfigurationInner::APPLICATION_DENSITYDPI, AppExecFwk::GetDensityStr(density));
916     if (application_ == nullptr || handler_ == nullptr) {
917         TAG_LOGE(AAFwkTag::UIABILITY, "null application_ or handler_");
918         return;
919     }
920     std::vector<std::string> changeKeyV;
921     auto configuration = application_->GetConfiguration();
922     if (!configuration) {
923         TAG_LOGE(AAFwkTag::UIABILITY, "null configuration");
924         return;
925     }
926 
927     configuration->CompareDifferent(changeKeyV, newConfig);
928     TAG_LOGD(AAFwkTag::UIABILITY, "changeKeyV size: %{public}zu", changeKeyV.size());
929     if (!changeKeyV.empty()) {
930         configuration->Merge(changeKeyV, newConfig);
931         auto task = [abilityWptr = weak_from_this(), configuration = *configuration]() {
932             auto ability = abilityWptr.lock();
933             if (ability == nullptr) {
934                 TAG_LOGE(AAFwkTag::UIABILITY, "null ability");
935                 return;
936             }
937             ability->OnConfigurationUpdated(configuration);
938         };
939         handler_->PostTask(task);
940     }
941 }
942 
RequestFocus(const AAFwk::Want & want)943 void UIAbility::RequestFocus(const AAFwk::Want &want)
944 {
945     TAG_LOGD(AAFwkTag::UIABILITY, "called");
946 }
947 
InitWindow(int32_t displayId,sptr<Rosen::WindowOption> option)948 void UIAbility::InitWindow(int32_t displayId, sptr<Rosen::WindowOption> option)
949 {
950     TAG_LOGD(AAFwkTag::UIABILITY, "called");
951 }
952 
GetWindowOption(const AAFwk::Want & want)953 sptr<Rosen::WindowOption> UIAbility::GetWindowOption(const AAFwk::Want &want)
954 {
955     auto option = sptr<Rosen::WindowOption>::MakeSptr();
956     if (option == nullptr) {
957         TAG_LOGE(AAFwkTag::UIABILITY, "null option");
958         return nullptr;
959     }
960     auto windowMode = want.GetIntParam(
961         AAFwk::Want::PARAM_RESV_WINDOW_MODE, AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED);
962     TAG_LOGD(AAFwkTag::UIABILITY, "window mode: %{public}d", windowMode);
963     option->SetWindowMode(static_cast<Rosen::WindowMode>(windowMode));
964     bool showOnLockScreen = false;
965     if (abilityInfo_) {
966         std::vector<AppExecFwk::CustomizeData> datas = abilityInfo_->metaData.customizeData;
967         for (AppExecFwk::CustomizeData data : datas) {
968             if (data.name == SHOW_ON_LOCK_SCREEN) {
969                 showOnLockScreen = true;
970             }
971         }
972     }
973     if (showOnLockScreen_ || showOnLockScreen) {
974         TAG_LOGD(AAFwkTag::UIABILITY, "add window flag WINDOW_FLAG_SHOW_WHEN_LOCKED");
975         option->AddWindowFlag(Rosen::WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED);
976     }
977 
978     if (want.GetElement().GetBundleName() == LAUNCHER_BUNDLE_NAME &&
979         want.GetElement().GetAbilityName() == LAUNCHER_ABILITY_NAME) {
980         TAG_LOGD(AAFwkTag::UIABILITY, "set window type for launcher");
981         option->SetWindowType(Rosen::WindowType::WINDOW_TYPE_DESKTOP);
982     }
983     return option;
984 }
985 
ContinuationRestore(const AAFwk::Want & want)986 void UIAbility::ContinuationRestore(const AAFwk::Want &want)
987 {
988     TAG_LOGD(AAFwkTag::UIABILITY, "called");
989 }
990 
OnStartForSupportGraphics(const AAFwk::Want & want)991 void UIAbility::OnStartForSupportGraphics(const AAFwk::Want &want)
992 {
993     if (abilityInfo_->type == AppExecFwk::AbilityType::PAGE) {
994         int32_t defualtDisplayId = static_cast<int32_t>(Rosen::DisplayManager::GetInstance().GetDefaultDisplayId());
995         int32_t displayId = want.GetIntParam(AAFwk::Want::PARAM_RESV_DISPLAY_ID, defualtDisplayId);
996         TAG_LOGD(AAFwkTag::UIABILITY, "abilityName: %{public}s, displayId: %{public}d",
997             abilityInfo_->name.c_str(), displayId);
998 #ifdef SUPPORT_SCREEN
999         Rosen::DisplayManager::GetInstance().AddDisplayIdFromAms(displayId, token_);
1000 #endif
1001         auto option = GetWindowOption(want);
1002         InitWindow(displayId, option);
1003 
1004         // Update resMgr, Configuration
1005         TAG_LOGD(AAFwkTag::UIABILITY, "displayId: %{public}d", displayId);
1006         auto display = Rosen::DisplayManager::GetInstance().GetDisplayById(displayId);
1007         if (display) {
1008             float density = display->GetVirtualPixelRatio();
1009             int32_t width = display->GetWidth();
1010             int32_t height = display->GetHeight();
1011             std::shared_ptr<AppExecFwk::Configuration> configuration = nullptr;
1012             if (application_) {
1013                 configuration = application_->GetConfiguration();
1014             }
1015             if (configuration) {
1016                 std::string direction = AppExecFwk::GetDirectionStr(height, width);
1017                 configuration->AddItem(displayId, AppExecFwk::ConfigurationInner::APPLICATION_DIRECTION, direction);
1018                 configuration->AddItem(displayId, AppExecFwk::ConfigurationInner::APPLICATION_DENSITYDPI,
1019                     AppExecFwk::GetDensityStr(density));
1020                 configuration->AddItem(
1021                     AppExecFwk::ConfigurationInner::APPLICATION_DISPLAYID, std::to_string(displayId));
1022                 UpdateContextConfiguration();
1023             }
1024 
1025             std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
1026             if (resConfig == nullptr) {
1027                 TAG_LOGE(AAFwkTag::UIABILITY, "null resConfig");
1028                 return;
1029             }
1030             auto resourceManager = GetResourceManager();
1031             if (resourceManager != nullptr) {
1032                 resourceManager->GetResConfig(*resConfig);
1033                 resConfig->SetScreenDensity(density);
1034                 resConfig->SetDirection(AppExecFwk::ConvertDirection(height, width));
1035                 resourceManager->UpdateResConfig(*resConfig);
1036                 TAG_LOGD(AAFwkTag::UIABILITY, "density: %{public}f, direction: %{public}d",
1037                     resConfig->GetScreenDensity(), resConfig->GetDirection());
1038             }
1039         }
1040     }
1041 }
1042 
OnChangeForUpdateConfiguration(const AppExecFwk::Configuration & newConfig)1043 void UIAbility::OnChangeForUpdateConfiguration(const AppExecFwk::Configuration &newConfig)
1044 {
1045     if (application_ == nullptr || handler_ == nullptr) {
1046         TAG_LOGE(AAFwkTag::UIABILITY, "null application_ or handler_");
1047         return;
1048     }
1049     auto configuration = application_->GetConfiguration();
1050     if (!configuration) {
1051         TAG_LOGE(AAFwkTag::UIABILITY, "null configuration");
1052         return;
1053     }
1054 
1055     std::vector<std::string> changeKeyV;
1056     configuration->CompareDifferent(changeKeyV, newConfig);
1057     TAG_LOGD(AAFwkTag::UIABILITY, "changeKeyV size: %{public}zu", changeKeyV.size());
1058     if (!changeKeyV.empty()) {
1059         configuration->Merge(changeKeyV, newConfig);
1060         auto task = [abilityWptr = weak_from_this(), configuration = *configuration]() {
1061             auto ability = abilityWptr.lock();
1062             if (ability == nullptr) {
1063                 TAG_LOGE(AAFwkTag::UIABILITY, "null ability");
1064                 return;
1065             }
1066             ability->OnConfigurationUpdated(configuration);
1067         };
1068         handler_->PostTask(task);
1069     }
1070 }
1071 
CallOnForegroundFunc(const AAFwk::Want & want)1072 void UIAbility::CallOnForegroundFunc(const AAFwk::Want &want)
1073 {
1074     TAG_LOGD(AAFwkTag::UIABILITY, "called");
1075 }
1076 
ExecuteInsightIntentRepeateForeground(const AAFwk::Want & want,const std::shared_ptr<InsightIntentExecuteParam> & executeParam,std::unique_ptr<InsightIntentExecutorAsyncCallback> callback)1077 void UIAbility::ExecuteInsightIntentRepeateForeground(const AAFwk::Want &want,
1078     const std::shared_ptr<InsightIntentExecuteParam> &executeParam,
1079     std::unique_ptr<InsightIntentExecutorAsyncCallback> callback)
1080 {
1081     TAG_LOGD(AAFwkTag::UIABILITY, "called");
1082 }
1083 
ExecuteInsightIntentMoveToForeground(const AAFwk::Want & want,const std::shared_ptr<InsightIntentExecuteParam> & executeParam,std::unique_ptr<InsightIntentExecutorAsyncCallback> callback)1084 void UIAbility::ExecuteInsightIntentMoveToForeground(const AAFwk::Want &want,
1085     const std::shared_ptr<InsightIntentExecuteParam> &executeParam,
1086     std::unique_ptr<InsightIntentExecutorAsyncCallback> callback)
1087 {
1088     TAG_LOGD(AAFwkTag::UIABILITY, "called");
1089 }
1090 
ExecuteInsightIntentBackground(const AAFwk::Want & want,const std::shared_ptr<InsightIntentExecuteParam> & executeParam,std::unique_ptr<InsightIntentExecutorAsyncCallback> callback)1091 void UIAbility::ExecuteInsightIntentBackground(const AAFwk::Want &want,
1092     const std::shared_ptr<InsightIntentExecuteParam> &executeParam,
1093     std::unique_ptr<InsightIntentExecutorAsyncCallback> callback)
1094 {
1095     TAG_LOGD(AAFwkTag::UIABILITY, "called");
1096 }
1097 
CreateModalUIExtension(const AAFwk::Want & want)1098 int UIAbility::CreateModalUIExtension(const AAFwk::Want &want)
1099 {
1100     TAG_LOGD(AAFwkTag::UIABILITY, "call");
1101     auto abilityContextImpl = GetAbilityContext();
1102     if (abilityContextImpl == nullptr) {
1103         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext");
1104         return ERR_INVALID_VALUE;
1105     }
1106     return abilityContextImpl->CreateModalUIExtensionWithApp(want);
1107 }
1108 
SetSessionToken(sptr<IRemoteObject> sessionToken)1109 void UIAbility::SetSessionToken(sptr<IRemoteObject> sessionToken)
1110 {
1111     std::lock_guard lock(sessionTokenMutex_);
1112     sessionToken_ = sessionToken;
1113     auto abilityContextImpl = GetAbilityContext();
1114     if (abilityContextImpl == nullptr) {
1115         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext");
1116         return;
1117     }
1118     abilityContextImpl->SetWeakSessionToken(sessionToken);
1119 }
1120 
UpdateSessionToken(sptr<IRemoteObject> sessionToken)1121 void UIAbility::UpdateSessionToken(sptr<IRemoteObject> sessionToken)
1122 {
1123     SetSessionToken(sessionToken);
1124 }
1125 
EraseUIExtension(int32_t sessionId)1126 void UIAbility::EraseUIExtension(int32_t sessionId)
1127 {
1128     TAG_LOGD(AAFwkTag::UIABILITY, "call");
1129     auto abilityContextImpl = GetAbilityContext();
1130     if (abilityContextImpl == nullptr) {
1131         TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext");
1132         return;
1133     }
1134     abilityContextImpl->EraseUIExtension(sessionId);
1135 }
1136 
SetIdentityToken(const std::string & identityToken)1137 void UIAbility::SetIdentityToken(const std::string &identityToken)
1138 {
1139     identityToken_ = identityToken;
1140 }
1141 
GetIdentityToken() const1142 std::string UIAbility::GetIdentityToken() const
1143 {
1144     return identityToken_;
1145 }
1146 #endif
1147 } // namespace AbilityRuntime
1148 } // namespace OHOS
1149