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> &params, 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