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> ¶ms, 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