1 /*
2 * Copyright (c) 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 "cj_ui_ability.h"
17
18 #include <dlfcn.h>
19 #include <regex>
20 #include <cstdlib>
21
22 #include "ability_business_error.h"
23 #include "ability_delegator_registry.h"
24 #include "ability_recovery.h"
25 #include "ability_start_setting.h"
26 #include "app_recovery.h"
27 #include "context/application_context.h"
28 #include "connection_manager.h"
29 #include "context/context.h"
30 #include "hilog_tag_wrapper.h"
31 #include "hitrace_meter.h"
32 #include "if_system_ability_manager.h"
33 #include "insight_intent_executor_info.h"
34 #include "insight_intent_executor_mgr.h"
35 #include "insight_intent_execute_param.h"
36 #include "cj_runtime.h"
37 #include "cj_ability_object.h"
38 #include "cj_ability_context.h"
39 #include "time_util.h"
40 #include "scene_board_judgement.h"
41 #include "string_wrapper.h"
42 #include "system_ability_definition.h"
43
44 namespace OHOS {
45 namespace AbilityRuntime {
46 namespace {
47 #ifdef SUPPORT_GRAPHICS
48 const std::string PAGE_STACK_PROPERTY_NAME = "pageStack";
49 const std::string METHOD_NAME = "WindowScene::GoForeground";
50 const std::string SUPPORT_CONTINUE_PAGE_STACK_PROPERTY_NAME = "ohos.extra.param.key.supportContinuePageStack";
51 #endif
52 // Numerical base (radix) that determines the valid characters and their interpretation.
53 const int32_t BASE_DISPLAY_ID_NUM (10);
54
55 const char* CJWINDOW_FFI_LIBNAME = "libcj_window_ffi.z.so";
56 const char* FUNC_CREATE_CJWINDOWSTAGE = "OHOS_CreateCJWindowStage";
57 using CFFICreateCJWindowStage = int64_t (*)(std::shared_ptr<Rosen::WindowScene>&);
58
CreateCJWindowStage(std::shared_ptr<Rosen::WindowScene> windowScene)59 sptr<Rosen::CJWindowStageImpl> CreateCJWindowStage(std::shared_ptr<Rosen::WindowScene> windowScene)
60 {
61 static void* handle = nullptr;
62 if (handle == nullptr) {
63 handle = dlopen(CJWINDOW_FFI_LIBNAME, RTLD_LAZY);
64 if (handle == nullptr) {
65 TAG_LOGE(AAFwkTag::UIABILITY, "dlopen failed %{public}s, %{public}s", CJWINDOW_FFI_LIBNAME, dlerror());
66 return nullptr;
67 }
68 }
69 // get function
70 auto func = reinterpret_cast<CFFICreateCJWindowStage>(dlsym(handle, FUNC_CREATE_CJWINDOWSTAGE));
71 if (func == nullptr) {
72 TAG_LOGE(AAFwkTag::UIABILITY, "dlsym failed %{public}s, %{public}s", FUNC_CREATE_CJWINDOWSTAGE, dlerror());
73 dlclose(handle);
74 handle = nullptr;
75 return nullptr;
76 }
77 auto id = func(windowScene);
78 return OHOS::FFI::FFIData::GetData<Rosen::CJWindowStageImpl>(id);
79 }
80 }
81
Create(const std::unique_ptr<Runtime> & runtime)82 UIAbility *CJUIAbility::Create(const std::unique_ptr<Runtime> &runtime)
83 {
84 return new (std::nothrow) CJUIAbility(static_cast<CJRuntime &>(*runtime));
85 }
86
CJUIAbility(CJRuntime & cjRuntime)87 CJUIAbility::CJUIAbility(CJRuntime &cjRuntime) : cjRuntime_(cjRuntime)
88 {
89 TAG_LOGD(AAFwkTag::UIABILITY, "called");
90 }
91
~CJUIAbility()92 CJUIAbility::~CJUIAbility()
93 {
94 TAG_LOGD(AAFwkTag::UIABILITY, "called");
95 if (abilityContext_ != nullptr) {
96 abilityContext_->Unbind();
97 }
98 }
99
Init(std::shared_ptr<AppExecFwk::AbilityLocalRecord> record,const std::shared_ptr<OHOSApplication> application,std::shared_ptr<AbilityHandler> & handler,const sptr<IRemoteObject> & token)100 void CJUIAbility::Init(std::shared_ptr<AppExecFwk::AbilityLocalRecord> record,
101 const std::shared_ptr<OHOSApplication> application, std::shared_ptr<AbilityHandler> &handler,
102 const sptr<IRemoteObject> &token)
103 {
104 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
105 if (record == nullptr) {
106 TAG_LOGE(AAFwkTag::UIABILITY, "null local record");
107 return;
108 }
109 auto abilityInfo = record->GetAbilityInfo();
110 if (abilityInfo == nullptr) {
111 TAG_LOGE(AAFwkTag::UIABILITY, "null abilityInfo");
112 return;
113 }
114 UIAbility::Init(record, application, handler, token);
115
116 #ifdef SUPPORT_GRAPHICS
117 if (abilityContext_ != nullptr) {
118 AppExecFwk::AppRecovery::GetInstance().AddAbility(
119 shared_from_this(), abilityContext_->GetAbilityInfo(), abilityContext_->GetToken());
120 }
121 #endif
122 SetAbilityContext(abilityInfo);
123 }
124
SetAbilityContext(const std::shared_ptr<AbilityInfo> & abilityInfo)125 void CJUIAbility::SetAbilityContext(
126 const std::shared_ptr<AbilityInfo> &abilityInfo)
127 {
128 if (!abilityInfo) {
129 TAG_LOGE(AAFwkTag::UIABILITY, "null abilityInfo");
130 return;
131 }
132 cjAbilityObj_ = CJAbilityObject::LoadModule(abilityInfo->name);
133 if (!cjAbilityObj_) {
134 TAG_LOGE(AAFwkTag::UIABILITY, "get CJAbility object failed");
135 return;
136 }
137 cjAbilityObj_->Init(this);
138 }
139
OnStart(const Want & want,sptr<AAFwk::SessionInfo> sessionInfo)140 void CJUIAbility::OnStart(const Want &want, sptr<AAFwk::SessionInfo> sessionInfo)
141 {
142 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
143 TAG_LOGD(AAFwkTag::UIABILITY, "ability is %{public}s", GetAbilityName().c_str());
144 UIAbility::OnStart(want, sessionInfo);
145
146 if (!cjAbilityObj_) {
147 TAG_LOGE(AAFwkTag::UIABILITY, "null cJAbility");
148 return;
149 }
150 std::string methodName = "OnStart";
151 AddLifecycleEventBeforeCall(FreezeUtil::TimeoutState::FOREGROUND, methodName);
152 cjAbilityObj_->OnStart(want, GetLaunchParam());
153 AddLifecycleEventAfterCall(FreezeUtil::TimeoutState::FOREGROUND, methodName);
154
155 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
156 if (delegator) {
157 TAG_LOGD(AAFwkTag::UIABILITY, "call PostPerformStart");
158 delegator->PostPerformStart(CreateADelegatorAbilityProperty());
159 }
160 }
161
AddLifecycleEventBeforeCall(FreezeUtil::TimeoutState state,const std::string & methodName) const162 void CJUIAbility::AddLifecycleEventBeforeCall(FreezeUtil::TimeoutState state, const std::string &methodName) const
163 {
164 FreezeUtil::LifecycleFlow flow = { AbilityContext::token_, state };
165 auto entry = std::string("CJUIAbility::") + methodName + "; the " + methodName + " begin";
166 FreezeUtil::GetInstance().AddLifecycleEvent(flow, entry);
167 }
168
AddLifecycleEventAfterCall(FreezeUtil::TimeoutState state,const std::string & methodName) const169 void CJUIAbility::AddLifecycleEventAfterCall(FreezeUtil::TimeoutState state, const std::string &methodName) const
170 {
171 FreezeUtil::LifecycleFlow flow = { AbilityContext::token_, state };
172 auto entry = std::string("CJUIAbility::") + methodName + "; the " + methodName + " end.";
173 FreezeUtil::GetInstance().AddLifecycleEvent(flow, entry);
174 }
175
OnShare(WantParams & wantParams)176 int32_t CJUIAbility::OnShare(WantParams &wantParams)
177 {
178 TAG_LOGD(AAFwkTag::UIABILITY, "called");
179 return ERR_OK;
180 }
181
OnStop()182 void CJUIAbility::OnStop()
183 {
184 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
185 TAG_LOGD(AAFwkTag::UIABILITY, "called");
186 if (abilityContext_) {
187 TAG_LOGD(AAFwkTag::UIABILITY, "set terminating true");
188 abilityContext_->SetTerminating(true);
189 }
190 UIAbility::OnStop();
191 if (!cjAbilityObj_) {
192 TAG_LOGE(AAFwkTag::UIABILITY, "null cjAbilityObj");
193 return;
194 }
195 cjAbilityObj_->OnStop();
196 CJUIAbility::OnStopCallback();
197 TAG_LOGD(AAFwkTag::UIABILITY, "end");
198 }
199
OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> * callbackInfo,bool & isAsyncCallback)200 void CJUIAbility::OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo, bool &isAsyncCallback)
201 {
202 if (callbackInfo == nullptr) {
203 isAsyncCallback = false;
204 OnStop();
205 return;
206 }
207
208 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
209 TAG_LOGD(AAFwkTag::UIABILITY, "Begin");
210 if (abilityContext_) {
211 TAG_LOGD(AAFwkTag::UIABILITY, "set terminating true");
212 abilityContext_->SetTerminating(true);
213 }
214
215 UIAbility::OnStop();
216 cjAbilityObj_->OnStop();
217 OnStopCallback();
218 TAG_LOGD(AAFwkTag::UIABILITY, "end");
219 }
220
OnStopCallback()221 void CJUIAbility::OnStopCallback()
222 {
223 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
224 if (delegator) {
225 TAG_LOGD(AAFwkTag::UIABILITY, "call PostPerformStop");
226 delegator->PostPerformStop(CreateADelegatorAbilityProperty());
227 }
228
229 bool ret = ConnectionManager::GetInstance().DisconnectCaller(AbilityContext::token_);
230 if (!ret) {
231 TAG_LOGE(AAFwkTag::UIABILITY, "the service connection is disconnected");
232 }
233 ConnectionManager::GetInstance().ReportConnectionLeakEvent(getpid(), gettid());
234 TAG_LOGD(AAFwkTag::UIABILITY, "end");
235 }
236
237 #ifdef SUPPORT_GRAPHICS
OnSceneCreated()238 void CJUIAbility::OnSceneCreated()
239 {
240 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
241 TAG_LOGD(AAFwkTag::UIABILITY, "ability: %{public}s", GetAbilityName().c_str());
242 UIAbility::OnSceneCreated();
243
244 if (!cjAbilityObj_) {
245 TAG_LOGE(AAFwkTag::UIABILITY, "null cjAbilityObj");
246 return;
247 }
248 cjWindowStage_ = CreateCJWindowStage(GetScene());
249 if (!cjWindowStage_) {
250 TAG_LOGE(AAFwkTag::UIABILITY, "create CJWindowStage object failed");
251 return;
252 }
253
254 {
255 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "onWindowStageCreate");
256 std::string methodName = "OnSceneCreated";
257 AddLifecycleEventBeforeCall(FreezeUtil::TimeoutState::FOREGROUND, methodName);
258 cjAbilityObj_->OnSceneCreated(cjWindowStage_.GetRefPtr());
259 AddLifecycleEventAfterCall(FreezeUtil::TimeoutState::FOREGROUND, methodName);
260 }
261
262 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
263 if (delegator) {
264 TAG_LOGD(AAFwkTag::UIABILITY, "call PostPerformScenceCreated");
265 delegator->PostPerformScenceCreated(CreateADelegatorAbilityProperty());
266 }
267
268 TAG_LOGD(AAFwkTag::UIABILITY, "end");
269 }
270
OnSceneRestored()271 void CJUIAbility::OnSceneRestored()
272 {
273 UIAbility::OnSceneRestored();
274 TAG_LOGD(AAFwkTag::UIABILITY, "called");
275
276 if (!cjAbilityObj_) {
277 TAG_LOGE(AAFwkTag::UIABILITY, "null cjAbilityObj");
278 return;
279 }
280
281 if (!cjWindowStage_) {
282 cjWindowStage_ = CreateCJWindowStage(scene_);
283 if (!cjWindowStage_) {
284 TAG_LOGE(AAFwkTag::UIABILITY, "failed to create CJWindowStage object");
285 return;
286 }
287 }
288 cjAbilityObj_->OnSceneRestored(cjWindowStage_.GetRefPtr());
289
290 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
291 if (delegator) {
292 TAG_LOGD(AAFwkTag::UIABILITY, "call PostPerformScenceRestored");
293 delegator->PostPerformScenceRestored(CreateADelegatorAbilityProperty());
294 }
295 }
296
OnSceneDestroyed()297 void CJUIAbility::OnSceneDestroyed()
298 {
299 TAG_LOGD(AAFwkTag::UIABILITY, "ability is %{public}s", GetAbilityName().c_str());
300 UIAbility::onSceneDestroyed();
301
302 if (!cjAbilityObj_) {
303 TAG_LOGE(AAFwkTag::UIABILITY, "null cjAbilityObj");
304 return;
305 }
306 cjAbilityObj_->OnSceneDestroyed();
307
308 if (scene_ != nullptr) {
309 auto window = scene_->GetMainWindow();
310 if (window != nullptr) {
311 TAG_LOGD(AAFwkTag::UIABILITY, "window UnregisterDisplayMoveListener");
312 window->UnregisterDisplayMoveListener(abilityDisplayMoveListener_);
313 }
314 }
315
316 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
317 if (delegator) {
318 TAG_LOGD(AAFwkTag::UIABILITY, "call PostPerformScenceDestroyed");
319 delegator->PostPerformScenceDestroyed(CreateADelegatorAbilityProperty());
320 }
321 TAG_LOGD(AAFwkTag::UIABILITY, "end");
322 }
323
OnForeground(const Want & want)324 void CJUIAbility::OnForeground(const Want &want)
325 {
326 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
327 TAG_LOGD(AAFwkTag::UIABILITY, "ability: %{public}s", GetAbilityName().c_str());
328
329 UIAbility::OnForeground(want);
330 CallOnForegroundFunc(want);
331 }
332
CallOnForegroundFunc(const Want & want)333 void CJUIAbility::CallOnForegroundFunc(const Want &want)
334 {
335 if (!cjAbilityObj_) {
336 TAG_LOGE(AAFwkTag::UIABILITY, "null cjAbilityObj");
337 return;
338 }
339 std::string methodName = "OnForeground";
340 AddLifecycleEventBeforeCall(FreezeUtil::TimeoutState::FOREGROUND, methodName);
341 cjAbilityObj_->OnForeground(want);
342 AddLifecycleEventAfterCall(FreezeUtil::TimeoutState::FOREGROUND, methodName);
343
344 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
345 if (delegator) {
346 TAG_LOGD(AAFwkTag::UIABILITY, "call PostPerformForeground");
347 delegator->PostPerformForeground(CreateADelegatorAbilityProperty());
348 }
349
350 TAG_LOGD(AAFwkTag::UIABILITY, "end");
351 }
352
OnBackground()353 void CJUIAbility::OnBackground()
354 {
355 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
356 TAG_LOGD(AAFwkTag::UIABILITY, "ability: %{public}s", GetAbilityName().c_str());
357
358 UIAbility::OnBackground();
359
360 if (!cjAbilityObj_) {
361 TAG_LOGE(AAFwkTag::UIABILITY, "null cjAbilityObj");
362 return;
363 }
364 std::string methodName = "OnBackground";
365 AddLifecycleEventBeforeCall(FreezeUtil::TimeoutState::BACKGROUND, methodName);
366 cjAbilityObj_->OnBackground();
367 AddLifecycleEventAfterCall(FreezeUtil::TimeoutState::BACKGROUND, methodName);
368
369 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
370 if (delegator) {
371 TAG_LOGD(AAFwkTag::UIABILITY, "call PostPerformBackground");
372 delegator->PostPerformBackground(CreateADelegatorAbilityProperty());
373 }
374
375 TAG_LOGD(AAFwkTag::UIABILITY, "end");
376 }
377
OnBackPress()378 bool CJUIAbility::OnBackPress()
379 {
380 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
381 TAG_LOGD(AAFwkTag::UIABILITY, "ability: %{public}s", GetAbilityName().c_str());
382 UIAbility::OnBackPress();
383 return true;
384 }
385
OnPrepareTerminate()386 bool CJUIAbility::OnPrepareTerminate()
387 {
388 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
389 TAG_LOGD(AAFwkTag::UIABILITY, "ability: %{public}s", GetAbilityName().c_str());
390 UIAbility::OnPrepareTerminate();
391
392 return true;
393 }
394
GetPageStackFromWant(const Want & want,std::string & pageStack)395 void CJUIAbility::GetPageStackFromWant(const Want &want, std::string &pageStack)
396 {
397 auto stringObj = AAFwk::IString::Query(want.GetParams().GetParam(PAGE_STACK_PROPERTY_NAME));
398 if (stringObj != nullptr) {
399 pageStack = AAFwk::String::Unbox(stringObj);
400 }
401 }
402
IsRestorePageStack(const Want & want)403 bool CJUIAbility::IsRestorePageStack(const Want &want)
404 {
405 return want.GetBoolParam(SUPPORT_CONTINUE_PAGE_STACK_PROPERTY_NAME, true);
406 }
407
RestorePageStack(const Want & want)408 void CJUIAbility::RestorePageStack(const Want &want)
409 {
410 if (IsRestorePageStack(want)) {
411 std::string pageStack;
412 GetPageStackFromWant(want, pageStack);
413 }
414 }
415
AbilityContinuationOrRecover(const Want & want)416 void CJUIAbility::AbilityContinuationOrRecover(const Want &want)
417 {
418 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
419 // multi-instance ability continuation
420 TAG_LOGD(AAFwkTag::UIABILITY, "launch reason: %{public}d", launchParam_.launchReason);
421 if (IsRestoredInContinuation()) {
422 RestorePageStack(want);
423 OnSceneRestored();
424 NotifyContinuationResult(want, true);
425 } else if (ShouldRecoverState(want)) {
426 std::string pageStack = abilityRecovery_->GetSavedPageStack(AppExecFwk::StateReason::DEVELOPER_REQUEST);
427 OnSceneRestored();
428 } else {
429 OnSceneCreated();
430 }
431 }
432
DoOnForeground(const Want & want)433 void CJUIAbility::DoOnForeground(const Want &want)
434 {
435 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
436 if (scene_ == nullptr) {
437 if ((abilityContext_ == nullptr) || (sceneListener_ == nullptr)) {
438 TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext or sceneListener");
439 return;
440 }
441 scene_ = std::make_shared<Rosen::WindowScene>();
442 InitSceneDoOnForeground(scene_, want);
443 } else {
444 auto window = scene_->GetMainWindow();
445 if (window == nullptr) {
446 TAG_LOGE(AAFwkTag::UIABILITY, "null MainWindow");
447 return;
448 }
449 if (want.HasParameter(Want::PARAM_RESV_WINDOW_MODE)) {
450 TAG_LOGI(AAFwkTag::UIABILITY, "recv window mode");
451 auto windowMode = want.GetIntParam(
452 Want::PARAM_RESV_WINDOW_MODE, AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED);
453 window->SetWindowMode(static_cast<Rosen::WindowMode>(windowMode));
454 windowMode_ = windowMode;
455 TAG_LOGD(AAFwkTag::UIABILITY, "set window mode: %{public}d", windowMode);
456 }
457 }
458
459 auto window = scene_->GetMainWindow();
460 if (window == nullptr) {
461 TAG_LOGE(AAFwkTag::UIABILITY, "null window");
462 return;
463 }
464 if (securityFlag_) {
465 window->SetSystemPrivacyMode(true);
466 }
467
468 TAG_LOGD(AAFwkTag::UIABILITY, "move scene to foreground, sceneFlag_: %{public}d", UIAbility::sceneFlag_);
469 AddLifecycleEventBeforeCall(FreezeUtil::TimeoutState::FOREGROUND, METHOD_NAME);
470 scene_->GoForeground(UIAbility::sceneFlag_);
471 }
472
InitSceneDoOnForeground(std::shared_ptr<Rosen::WindowScene> scene,const Want & want)473 void CJUIAbility::InitSceneDoOnForeground(std::shared_ptr<Rosen::WindowScene> scene, const Want &want)
474 {
475 int32_t displayId = static_cast<int32_t>(Rosen::DisplayManager::GetInstance().GetDefaultDisplayId());
476 if (setting_ != nullptr) {
477 std::string strDisplayId = setting_->GetProperty(OHOS::AppExecFwk::AbilityStartSetting::WINDOW_DISPLAY_ID_KEY);
478 std::regex formatRegex("[0-9]{0,9}$");
479 std::smatch sm;
480 bool flag = std::regex_match(strDisplayId, sm, formatRegex);
481 if (flag && !strDisplayId.empty()) {
482 displayId = strtol(strDisplayId.c_str(), nullptr, BASE_DISPLAY_ID_NUM);
483 TAG_LOGD(AAFwkTag::UIABILITY, "displayId: %{public}d", displayId);
484 } else {
485 TAG_LOGE(AAFwkTag::UIABILITY, "formatRegex: [%{public}s] failed", strDisplayId.c_str());
486 }
487 }
488 Rosen::WMError ret = Rosen::WMError::WM_OK;
489 auto option = GetWindowOption(want);
490 auto sessionToken = GetSessionToken();
491 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled() && sessionToken != nullptr) {
492 abilityContext_->SetWeakSessionToken(sessionToken);
493 ret = scene_->Init(displayId, abilityContext_, sceneListener_, option, sessionToken);
494 } else {
495 ret = scene_->Init(displayId, abilityContext_, sceneListener_, option);
496 }
497 if (ret != Rosen::WMError::WM_OK) {
498 TAG_LOGE(AAFwkTag::UIABILITY, "init window scene failed");
499 return;
500 }
501
502 AbilityContinuationOrRecover(want);
503 auto window = scene_->GetMainWindow();
504 if (window) {
505 TAG_LOGD(AAFwkTag::UIABILITY,
506 "call RegisterDisplayMoveListener, windowId: %{public}d", window->GetWindowId());
507 abilityDisplayMoveListener_ = new AbilityDisplayMoveListener(weak_from_this());
508 if (abilityDisplayMoveListener_ == nullptr) {
509 TAG_LOGE(AAFwkTag::UIABILITY, "null abilityDisplayMoveListener_");
510 return;
511 }
512 window->RegisterDisplayMoveListener(abilityDisplayMoveListener_);
513 }
514 }
515
RequestFocus(const Want & want)516 void CJUIAbility::RequestFocus(const Want &want)
517 {
518 TAG_LOGD(AAFwkTag::UIABILITY, "called");
519 if (scene_ == nullptr) {
520 TAG_LOGE(AAFwkTag::UIABILITY, "null scene_");
521 return;
522 }
523 auto window = scene_->GetMainWindow();
524 if (window != nullptr && want.HasParameter(Want::PARAM_RESV_WINDOW_MODE)) {
525 auto windowMode = want.GetIntParam(
526 Want::PARAM_RESV_WINDOW_MODE, AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED);
527 window->SetWindowMode(static_cast<Rosen::WindowMode>(windowMode));
528 TAG_LOGD(AAFwkTag::UIABILITY, "set window mode: %{public}d", windowMode);
529 }
530 AddLifecycleEventBeforeCall(FreezeUtil::TimeoutState::FOREGROUND, METHOD_NAME);
531 scene_->GoForeground(UIAbility::sceneFlag_);
532 TAG_LOGD(AAFwkTag::UIABILITY, "end");
533 }
534
ContinuationRestore(const Want & want)535 void CJUIAbility::ContinuationRestore(const Want &want)
536 {
537 TAG_LOGD(AAFwkTag::UIABILITY, "called");
538 if (!IsRestoredInContinuation() || scene_ == nullptr) {
539 TAG_LOGE(AAFwkTag::UIABILITY, "is not in continuation or null scene_");
540 return;
541 }
542 RestorePageStack(want);
543 OnSceneRestored();
544 NotifyContinuationResult(want, true);
545 }
546
GetCJRuntime()547 const CJRuntime &CJUIAbility::GetCJRuntime()
548 {
549 return cjRuntime_;
550 }
551
ExecuteInsightIntentRepeateForeground(const Want & want,const std::shared_ptr<InsightIntentExecuteParam> & executeParam,std::unique_ptr<InsightIntentExecutorAsyncCallback> callback)552 void CJUIAbility::ExecuteInsightIntentRepeateForeground(const Want &want,
553 const std::shared_ptr<InsightIntentExecuteParam> &executeParam,
554 std::unique_ptr<InsightIntentExecutorAsyncCallback> callback)
555 {
556 TAG_LOGD(AAFwkTag::UIABILITY, "called");
557 if (executeParam == nullptr) {
558 TAG_LOGW(AAFwkTag::UIABILITY, "invalid param");
559 RequestFocus(want);
560 InsightIntentExecutorMgr::TriggerCallbackInner(std::move(callback), ERR_OK);
561 return;
562 }
563
564 auto asyncCallback = [weak = weak_from_this(), want](InsightIntentExecuteResult result) {
565 TAG_LOGD(AAFwkTag::UIABILITY, "begin request focus");
566 auto ability = weak.lock();
567 if (ability == nullptr) {
568 TAG_LOGE(AAFwkTag::UIABILITY, "null ability");
569 return;
570 }
571 ability->RequestFocus(want);
572 };
573 callback->Push(asyncCallback);
574
575 InsightIntentExecutorInfo executeInfo;
576 auto ret = GetInsightIntentExecutorInfo(want, executeParam, executeInfo);
577 if (!ret) {
578 TAG_LOGE(AAFwkTag::UIABILITY, "get intention executor failed");
579 InsightIntentExecutorMgr::TriggerCallbackInner(std::move(callback),
580 static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INVALID_PARAM));
581 return;
582 }
583 }
584
ExecuteInsightIntentMoveToForeground(const Want & want,const std::shared_ptr<InsightIntentExecuteParam> & executeParam,std::unique_ptr<InsightIntentExecutorAsyncCallback> callback)585 void CJUIAbility::ExecuteInsightIntentMoveToForeground(const Want &want,
586 const std::shared_ptr<InsightIntentExecuteParam> &executeParam,
587 std::unique_ptr<InsightIntentExecutorAsyncCallback> callback)
588 {
589 TAG_LOGD(AAFwkTag::UIABILITY, "called");
590 if (executeParam == nullptr) {
591 TAG_LOGW(AAFwkTag::UIABILITY, "param invalid");
592 OnForeground(want);
593 InsightIntentExecutorMgr::TriggerCallbackInner(std::move(callback), ERR_OK);
594 return;
595 }
596
597 UIAbility::OnForeground(want);
598
599 auto asyncCallback = [weak = weak_from_this(), want](InsightIntentExecuteResult result) {
600 TAG_LOGD(AAFwkTag::UIABILITY, "begin call onForeground");
601 auto ability = weak.lock();
602 if (ability == nullptr) {
603 TAG_LOGE(AAFwkTag::UIABILITY, "null ability");
604 return;
605 }
606 ability->CallOnForegroundFunc(want);
607 };
608 callback->Push(asyncCallback);
609
610 InsightIntentExecutorInfo executeInfo;
611 auto ret = GetInsightIntentExecutorInfo(want, executeParam, executeInfo);
612 if (!ret) {
613 TAG_LOGE(AAFwkTag::UIABILITY, "get Intention executor failed");
614 InsightIntentExecutorMgr::TriggerCallbackInner(std::move(callback),
615 static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INVALID_PARAM));
616 return;
617 }
618 }
619
GetInsightIntentExecutorInfo(const Want & want,const std::shared_ptr<InsightIntentExecuteParam> & executeParam,InsightIntentExecutorInfo & executeInfo)620 bool CJUIAbility::GetInsightIntentExecutorInfo(const Want &want,
621 const std::shared_ptr<InsightIntentExecuteParam> &executeParam,
622 InsightIntentExecutorInfo& executeInfo)
623 {
624 TAG_LOGD(AAFwkTag::UIABILITY, "called");
625 auto context = GetAbilityContext();
626 if (executeParam == nullptr || context == nullptr || abilityInfo_ == nullptr || cjWindowStage_ == nullptr) {
627 TAG_LOGE(AAFwkTag::UIABILITY, "invalid param");
628 return false;
629 }
630
631 const WantParams &wantParams = want.GetParams();
632 executeInfo.srcEntry = wantParams.GetStringParam("ohos.insightIntent.srcEntry");
633 executeInfo.hapPath = abilityInfo_->hapPath;
634 executeInfo.esmodule = abilityInfo_->compileMode == AppExecFwk::CompileMode::ES_MODULE;
635 executeInfo.windowMode = windowMode_;
636 executeInfo.token = context->GetToken();
637 executeInfo.executeParam = executeParam;
638 return true;
639 }
640 #endif
641
OnContinue(WantParams & wantParams)642 int32_t CJUIAbility::OnContinue(WantParams &wantParams)
643 {
644 if (!cjAbilityObj_) {
645 TAG_LOGE(AAFwkTag::UIABILITY, "null cjAbilityObj_");
646 return AppExecFwk::ContinuationManagerStage::OnContinueResult::REJECT;
647 }
648 auto res = cjAbilityObj_->OnContinue(wantParams);
649 TAG_LOGD(AAFwkTag::UIABILITY, "end, value: %{public}d", res);
650
651 return res;
652 }
653
OnSaveState(int32_t reason,WantParams & wantParams)654 int32_t CJUIAbility::OnSaveState(int32_t reason, WantParams &wantParams)
655 {
656 return 0;
657 }
658
OnConfigurationUpdated(const Configuration & configuration)659 void CJUIAbility::OnConfigurationUpdated(const Configuration &configuration)
660 {
661 UIAbility::OnConfigurationUpdated(configuration);
662 TAG_LOGD(AAFwkTag::UIABILITY, "called");
663 auto fullConfig = GetAbilityContext()->GetConfiguration();
664 if (!fullConfig) {
665 TAG_LOGE(AAFwkTag::UIABILITY, "null configuration");
666 return;
667 }
668
669 if (!cjAbilityObj_) {
670 TAG_LOGE(AAFwkTag::UIABILITY, "null cjAbilityObj_");
671 return;
672 }
673
674 cjAbilityObj_->OnConfigurationUpdated(fullConfig);
675 TAG_LOGD(AAFwkTag::UIABILITY, "end");
676 }
677
OnMemoryLevel(int level)678 void CJUIAbility::OnMemoryLevel(int level)
679 {
680 UIAbility::OnMemoryLevel(level);
681 TAG_LOGD(AAFwkTag::UIABILITY, "called");
682 }
683
UpdateContextConfiguration()684 void CJUIAbility::UpdateContextConfiguration()
685 {
686 TAG_LOGD(AAFwkTag::UIABILITY, "called");
687 }
688
OnNewWant(const Want & want)689 void CJUIAbility::OnNewWant(const Want &want)
690 {
691 TAG_LOGD(AAFwkTag::UIABILITY, "called");
692 UIAbility::OnNewWant(want);
693
694 #ifdef SUPPORT_GRAPHICS
695 if (scene_) {
696 scene_->OnNewWant(want);
697 }
698 #endif
699 if (!cjAbilityObj_) {
700 TAG_LOGE(AAFwkTag::UIABILITY, "null cjAbilityObj_");
701 return;
702 }
703 std::string methodName = "OnNewWant";
704 AddLifecycleEventBeforeCall(FreezeUtil::TimeoutState::FOREGROUND, methodName);
705 cjAbilityObj_->OnNewWant(want, GetLaunchParam());
706 AddLifecycleEventAfterCall(FreezeUtil::TimeoutState::FOREGROUND, methodName);
707
708 TAG_LOGD(AAFwkTag::UIABILITY, "end");
709 }
710
OnAbilityResult(int requestCode,int resultCode,const Want & resultData)711 void CJUIAbility::OnAbilityResult(int requestCode, int resultCode, const Want &resultData)
712 {
713 TAG_LOGD(AAFwkTag::UIABILITY, "called");
714 UIAbility::OnAbilityResult(requestCode, resultCode, resultData);
715 if (abilityContext_ == nullptr) {
716 TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext_");
717 return;
718 }
719 abilityContext_->OnAbilityResult(requestCode, resultCode, resultData);
720 TAG_LOGD(AAFwkTag::UIABILITY, "end");
721 }
722
CallRequest()723 sptr<IRemoteObject> CJUIAbility::CallRequest()
724 {
725 return nullptr;
726 }
727
CreateADelegatorAbilityProperty()728 std::shared_ptr<AppExecFwk::ADelegatorAbilityProperty> CJUIAbility::CreateADelegatorAbilityProperty()
729 {
730 if (abilityContext_ == nullptr) {
731 TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext_");
732 return nullptr;
733 }
734 auto property = std::make_shared<AppExecFwk::ADelegatorAbilityProperty>();
735 property->token_ = abilityContext_->GetToken();
736 property->name_ = GetAbilityName();
737 property->moduleName_ = GetModuleName();
738 if (GetApplicationInfo() == nullptr || GetApplicationInfo()->bundleName.empty()) {
739 property->fullName_ = GetAbilityName();
740 } else {
741 std::string::size_type pos = GetAbilityName().find(GetApplicationInfo()->bundleName);
742 if (pos == std::string::npos || pos != 0) {
743 property->fullName_ = GetApplicationInfo()->bundleName + "." + GetAbilityName();
744 } else {
745 property->fullName_ = GetAbilityName();
746 }
747 }
748 property->lifecycleState_ = GetState();
749 return property;
750 }
751
Dump(const std::vector<std::string> & params,std::vector<std::string> & info)752 void CJUIAbility::Dump(const std::vector<std::string> ¶ms, std::vector<std::string> &info)
753 {
754 UIAbility::Dump(params, info);
755 TAG_LOGD(AAFwkTag::UIABILITY, "called");
756 if (!cjAbilityObj_) {
757 TAG_LOGE(AAFwkTag::UIABILITY, "null cjAbilityObj_");
758 return;
759 }
760 cjAbilityObj_->Dump(params, info);
761 TAG_LOGD(AAFwkTag::UIABILITY, "dump, size: %{public}zu", info.size());
762 }
763
GetCJAbility()764 std::shared_ptr<CJAbilityObject> CJUIAbility::GetCJAbility()
765 {
766 TAG_LOGD(AAFwkTag::UIABILITY, "called");
767 if (cjAbilityObj_ == nullptr) {
768 TAG_LOGE(AAFwkTag::UIABILITY, "null cjAbility object");
769 }
770 return cjAbilityObj_;
771 }
772 } // namespace AbilityRuntime
773 } // namespace OHOS
774