1 /*
2 * Copyright (c) 2021-2023 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 "ability_impl.h"
17
18 #include "ability_runtime/js_ability.h"
19 #include "ability_transaction_callback_info.h"
20 #include "data_ability_predicates.h"
21 #include "hilog_wrapper.h"
22 #include "hitrace_meter.h"
23 #include "ohos_application.h"
24 #include "scene_board_judgement.h"
25 #include "values_bucket.h"
26
27 namespace OHOS {
28 namespace AppExecFwk {
29 namespace {
30 const std::string PERMISSION_KEY = "ohos.user.grant.permission";
31 const std::string GRANTED_RESULT_KEY = "ohos.user.grant.permission.result";
32 }
33
Init(std::shared_ptr<OHOSApplication> & application,const std::shared_ptr<AbilityLocalRecord> & record,std::shared_ptr<Ability> & ability,std::shared_ptr<AbilityHandler> & handler,const sptr<IRemoteObject> & token)34 void AbilityImpl::Init(std::shared_ptr<OHOSApplication> &application, const std::shared_ptr<AbilityLocalRecord> &record,
35 std::shared_ptr<Ability> &ability, std::shared_ptr<AbilityHandler> &handler, const sptr<IRemoteObject> &token)
36 {
37 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
38 HILOG_DEBUG("AbilityImpl::init begin");
39 if ((token == nullptr) || (application == nullptr) || (handler == nullptr) || (record == nullptr) ||
40 ability == nullptr) {
41 HILOG_ERROR("AbilityImpl::init failed, token is nullptr, application is nullptr, handler is nullptr, record is "
42 "nullptr, ability is nullptr");
43 return;
44 }
45
46 token_ = record->GetToken();
47 record->SetAbilityImpl(shared_from_this());
48 ability_ = ability;
49 handler_ = handler;
50 auto info = record->GetAbilityInfo();
51 isStageBasedModel_ = info && info->isStageBasedModel;
52 #ifdef SUPPORT_GRAPHICS
53 if (info && info->type == AbilityType::PAGE) {
54 ability_->SetSceneListener(sptr<WindowLifeCycleImpl>(new WindowLifeCycleImpl(token_, shared_from_this())));
55 }
56 #endif
57 ability_->Init(record->GetAbilityInfo(), application, handler, token);
58 lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL;
59 abilityLifecycleCallbacks_ = application;
60 HILOG_DEBUG("AbilityImpl::init end");
61 }
62
Start(const Want & want,sptr<AAFwk::SessionInfo> sessionInfo)63 void AbilityImpl::Start(const Want &want, sptr<AAFwk::SessionInfo> sessionInfo)
64 {
65 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
66 HILOG_DEBUG("%{public}s begin.", __func__);
67 if (ability_ == nullptr || ability_->GetAbilityInfo() == nullptr || abilityLifecycleCallbacks_ == nullptr) {
68 HILOG_ERROR("AbilityImpl::Start ability_ or abilityLifecycleCallbacks_ is nullptr");
69 return;
70 }
71 #ifdef SUPPORT_GRAPHICS
72 if ((ability_->GetAbilityInfo()->type == AbilityType::PAGE) &&
73 (!ability_->GetAbilityInfo()->isStageBasedModel)) {
74 ability_->HandleCreateAsContinuation(want);
75 }
76
77 if ((ability_->GetAbilityInfo()->type == AbilityType::PAGE) &&
78 (ability_->GetAbilityInfo()->isStageBasedModel)) {
79 ability_->HandleCreateAsRecovery(want);
80 }
81 #endif
82 HILOG_DEBUG("AbilityImpl::Start");
83 ability_->OnStart(want, sessionInfo);
84 #ifdef SUPPORT_GRAPHICS
85 if ((ability_->GetAbilityInfo()->type == AppExecFwk::AbilityType::PAGE) &&
86 (ability_->GetAbilityInfo()->isStageBasedModel)) {
87 lifecycleState_ = AAFwk::ABILITY_STATE_STARTED_NEW;
88 } else {
89 #endif
90 if (ability_->GetAbilityInfo()->type == AbilityType::DATA) {
91 lifecycleState_ = AAFwk::ABILITY_STATE_ACTIVE;
92 } else {
93 lifecycleState_ = AAFwk::ABILITY_STATE_INACTIVE;
94 }
95 #ifdef SUPPORT_GRAPHICS
96 }
97 #endif
98
99 abilityLifecycleCallbacks_->OnAbilityStart(ability_);
100 HILOG_DEBUG("%{public}s end.", __func__);
101 }
102
Stop()103 void AbilityImpl::Stop()
104 {
105 HILOG_DEBUG("%{public}s begin.", __func__);
106 if (ability_ == nullptr || ability_->GetAbilityInfo() == nullptr || abilityLifecycleCallbacks_ == nullptr) {
107 HILOG_ERROR("AbilityImpl::Stop ability_ or abilityLifecycleCallbacks_ is nullptr");
108 return;
109 }
110
111 ability_->OnStop();
112 StopCallback();
113 HILOG_DEBUG("%{public}s end.", __func__);
114 }
115
Stop(bool & isAsyncCallback)116 void AbilityImpl::Stop(bool &isAsyncCallback)
117 {
118 HILOG_DEBUG("%{public}s begin.", __func__);
119 if (ability_ == nullptr || ability_->GetAbilityInfo() == nullptr || abilityLifecycleCallbacks_ == nullptr) {
120 HILOG_ERROR("AbilityImpl::Stop ability_ or abilityLifecycleCallbacks_ is nullptr");
121 isAsyncCallback = false;
122 return;
123 }
124
125 auto *callbackInfo = AbilityTransactionCallbackInfo<>::Create();
126 if (callbackInfo == nullptr) {
127 ability_->OnStop();
128 StopCallback();
129 isAsyncCallback = false;
130 return;
131 }
132 std::weak_ptr<AbilityImpl> weakPtr = shared_from_this();
133 auto asyncCallback = [abilityImplWeakPtr = weakPtr, state = ABILITY_STATE_INITIAL]() {
134 auto abilityImpl = abilityImplWeakPtr.lock();
135 if (abilityImpl == nullptr) {
136 HILOG_ERROR("abilityImpl is nullptr.");
137 return;
138 }
139 abilityImpl->StopCallback();
140 abilityImpl->AbilityTransactionCallback(state);
141 };
142 callbackInfo->Push(asyncCallback);
143
144 ability_->OnStop(callbackInfo, isAsyncCallback);
145 if (!isAsyncCallback) {
146 StopCallback();
147 AbilityTransactionCallbackInfo<>::Destroy(callbackInfo);
148 }
149 // else: callbackInfo will be destroyed after the async callback
150 HILOG_DEBUG("%{public}s end.", __func__);
151 }
152
StopCallback()153 void AbilityImpl::StopCallback()
154 {
155 if (ability_ == nullptr || ability_->GetAbilityInfo() == nullptr || abilityLifecycleCallbacks_ == nullptr) {
156 HILOG_ERROR("AbilityImpl::Stop ability_ or abilityLifecycleCallbacks_ is nullptr");
157 return;
158 }
159 #ifdef SUPPORT_GRAPHICS
160 if ((ability_->GetAbilityInfo()->type == AppExecFwk::AbilityType::PAGE) &&
161 (ability_->GetAbilityInfo()->isStageBasedModel)) {
162 lifecycleState_ = AAFwk::ABILITY_STATE_STOPED_NEW;
163 } else {
164 #endif
165 lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL;
166 #ifdef SUPPORT_GRAPHICS
167 }
168 #endif
169 abilityLifecycleCallbacks_->OnAbilityStop(ability_);
170 ability_->DestroyInstance(); // Release window and ability.
171 }
172
Active()173 void AbilityImpl::Active()
174 {
175 HILOG_DEBUG("%{public}s begin.", __func__);
176 if (ability_ == nullptr || ability_->GetAbilityInfo() == nullptr || abilityLifecycleCallbacks_ == nullptr) {
177 HILOG_ERROR("AbilityImpl::Active ability_ or abilityLifecycleCallbacks_ is nullptr");
178 return;
179 }
180
181 ability_->OnActive();
182 #ifdef SUPPORT_GRAPHICS
183 if ((lifecycleState_ == AAFwk::ABILITY_STATE_INACTIVE) && (ability_->GetAbilityInfo()->type == AbilityType::PAGE)) {
184 ability_->OnTopActiveAbilityChanged(true);
185 ability_->OnWindowFocusChanged(true);
186 }
187 #endif
188 lifecycleState_ = AAFwk::ABILITY_STATE_ACTIVE;
189 abilityLifecycleCallbacks_->OnAbilityActive(ability_);
190 HILOG_DEBUG("%{public}s end.", __func__);
191 }
192
Inactive()193 void AbilityImpl::Inactive()
194 {
195 HILOG_DEBUG("%{public}s begin.", __func__);
196 if (ability_ == nullptr || ability_->GetAbilityInfo() == nullptr || abilityLifecycleCallbacks_ == nullptr) {
197 HILOG_ERROR("AbilityImpl::Inactive ability_ or abilityLifecycleCallbacks_ is nullptr");
198 return;
199 }
200
201 ability_->OnInactive();
202 #ifdef SUPPORT_GRAPHICS
203 if ((lifecycleState_ == AAFwk::ABILITY_STATE_ACTIVE) && (ability_->GetAbilityInfo()->type == AbilityType::PAGE)) {
204 ability_->OnTopActiveAbilityChanged(false);
205 ability_->OnWindowFocusChanged(false);
206 }
207 #endif
208 lifecycleState_ = AAFwk::ABILITY_STATE_INACTIVE;
209 abilityLifecycleCallbacks_->OnAbilityInactive(ability_);
210 HILOG_DEBUG("%{public}s end.", __func__);
211 }
212
213
Share(WantParams & wantParam)214 int32_t AbilityImpl::Share(WantParams &wantParam)
215 {
216 HILOG_DEBUG("%{public}s begin.", __func__);
217 if (ability_ == nullptr) {
218 HILOG_ERROR("AbilityImpl::OnShare ability_ is nullptr ");
219 return ERR_INVALID_VALUE;
220 }
221 return ability_->OnShare(wantParam);
222 }
223
IsStageBasedModel() const224 bool AbilityImpl::IsStageBasedModel() const
225 {
226 return isStageBasedModel_;
227 }
228
DispatchSaveAbilityState()229 void AbilityImpl::DispatchSaveAbilityState()
230 {
231 HILOG_DEBUG("%{public}s begin.", __func__);
232 if (ability_ == nullptr || abilityLifecycleCallbacks_ == nullptr) {
233 HILOG_ERROR("AbilityImpl::DispatchSaveAbilityState ability_ or abilityLifecycleCallbacks_ is nullptr");
234 return;
235 }
236
237 needSaveDate_ = true;
238 HILOG_DEBUG("%{public}s end.", __func__);
239 }
240
DispatchRestoreAbilityState(const PacMap & inState)241 void AbilityImpl::DispatchRestoreAbilityState(const PacMap &inState)
242 {
243 HILOG_DEBUG("%{public}s begin.", __func__);
244 if (ability_ == nullptr) {
245 HILOG_ERROR("AbilityImpl::DispatchRestoreAbilityState ability_ is nullptr");
246 return;
247 }
248
249 hasSaveData_ = true;
250 restoreData_ = inState;
251 HILOG_DEBUG("%{public}s end.", __func__);
252 }
253
HandleAbilityTransaction(const Want & want,const AAFwk::LifeCycleStateInfo & targetState,sptr<AAFwk::SessionInfo> sessionInfo)254 void AbilityImpl::HandleAbilityTransaction(const Want &want, const AAFwk::LifeCycleStateInfo &targetState,
255 sptr<AAFwk::SessionInfo> sessionInfo)
256 {}
257
HandleShareData(const int32_t & requestCode)258 void AbilityImpl::HandleShareData(const int32_t &requestCode)
259 {}
260
AbilityTransactionCallback(const AAFwk::AbilityLifeCycleState & state)261 void AbilityImpl::AbilityTransactionCallback(const AAFwk::AbilityLifeCycleState &state)
262 {}
263
ConnectAbility(const Want & want)264 sptr<IRemoteObject> AbilityImpl::ConnectAbility(const Want &want)
265 {
266 HILOG_DEBUG("%{public}s begin.", __func__);
267 if (ability_ == nullptr) {
268 HILOG_ERROR("AbilityImpl::ConnectAbility ability_ is nullptr");
269 return nullptr;
270 }
271 sptr<IRemoteObject> object = ability_->OnConnect(want);
272 lifecycleState_ = AAFwk::ABILITY_STATE_ACTIVE;
273 abilityLifecycleCallbacks_->OnAbilityActive(ability_);
274 HILOG_DEBUG("%{public}s end.", __func__);
275
276 return object;
277 }
278
DisconnectAbility(const Want & want)279 void AbilityImpl::DisconnectAbility(const Want &want)
280 {
281 if (ability_ == nullptr) {
282 HILOG_ERROR("Disconnect ability error, ability_ is nullptr.");
283 return;
284 }
285 HILOG_DEBUG("Disconnect ability begin, ability:%{public}s.", ability_->GetAbilityName().c_str());
286 ability_->OnDisconnect(want);
287 }
288
CommandAbility(const Want & want,bool restart,int startId)289 void AbilityImpl::CommandAbility(const Want &want, bool restart, int startId)
290 {
291 HILOG_DEBUG("%{public}s begin.", __func__);
292 if (ability_ == nullptr) {
293 HILOG_ERROR("AbilityImpl::CommandAbility ability_ is nullptr");
294 return;
295 }
296 ability_->OnCommand(want, restart, startId);
297 lifecycleState_ = AAFwk::ABILITY_STATE_ACTIVE;
298 abilityLifecycleCallbacks_->OnAbilityActive(ability_);
299 HILOG_DEBUG("%{public}s end.", __func__);
300 }
301
PrepareTerminateAbility()302 bool AbilityImpl::PrepareTerminateAbility()
303 {
304 HILOG_DEBUG("call");
305 if (ability_ == nullptr) {
306 HILOG_ERROR("ability_ is nullptr.");
307 return false;
308 }
309 bool ret = ability_->OnPrepareTerminate();
310 HILOG_DEBUG("end, ret = %{public}d", ret);
311 return ret;
312 }
313
GetCurrentState()314 int AbilityImpl::GetCurrentState()
315 {
316 return lifecycleState_;
317 }
318
SendResult(int requestCode,int resultCode,const Want & resultData)319 void AbilityImpl::SendResult(int requestCode, int resultCode, const Want &resultData)
320 {
321 HILOG_DEBUG("%{public}s begin.", __func__);
322 if (ability_ == nullptr) {
323 HILOG_ERROR("AbilityImpl::SendResult ability_ is nullptr");
324 return;
325 }
326
327 ability_->OnAbilityResult(requestCode, resultCode, resultData);
328 // for api5 FeatureAbility::startAbilityForResult
329 ability_->OnFeatureAbilityResult(requestCode, resultCode, resultData);
330 HILOG_DEBUG("%{public}s end.", __func__);
331 }
332
NewWant(const Want & want)333 void AbilityImpl::NewWant(const Want &want)
334 {
335 HILOG_DEBUG("%{public}s begin.", __func__);
336 if (ability_ == nullptr) {
337 HILOG_ERROR("AbilityImpl::NewWant ability_ is nullptr");
338 return;
339 }
340 ability_->SetWant(want);
341 ability_->OnNewWant(want);
342 #ifdef SUPPORT_GRAPHICS
343 ability_->ContinuationRestore(want);
344 #endif
345 HILOG_DEBUG("%{public}s end.", __func__);
346 }
347
GetFileTypes(const Uri & uri,const std::string & mimeTypeFilter)348 std::vector<std::string> AbilityImpl::GetFileTypes(const Uri &uri, const std::string &mimeTypeFilter)
349 {
350 HILOG_DEBUG("AbilityImpl::GetFileTypes");
351 std::vector<std::string> types;
352 return types;
353 }
354
OpenFile(const Uri & uri,const std::string & mode)355 int AbilityImpl::OpenFile(const Uri &uri, const std::string &mode)
356 {
357 HILOG_DEBUG("AbilityImpl::OpenFile");
358 return -1;
359 }
360
OpenRawFile(const Uri & uri,const std::string & mode)361 int AbilityImpl::OpenRawFile(const Uri &uri, const std::string &mode)
362 {
363 HILOG_DEBUG("AbilityImpl::OpenRawFile");
364 return -1;
365 }
366
Insert(const Uri & uri,const NativeRdb::ValuesBucket & value)367 int AbilityImpl::Insert(const Uri &uri, const NativeRdb::ValuesBucket &value)
368 {
369 HILOG_DEBUG("AbilityImpl::Insert");
370 return -1;
371 }
372
Call(const Uri & uri,const std::string & method,const std::string & arg,const AppExecFwk::PacMap & pacMap)373 std::shared_ptr<AppExecFwk::PacMap> AbilityImpl::Call(
374 const Uri &uri, const std::string &method, const std::string &arg, const AppExecFwk::PacMap &pacMap)
375 {
376 HILOG_DEBUG("AbilityImpl::Call");
377 return nullptr;
378 }
379
Update(const Uri & uri,const NativeRdb::ValuesBucket & value,const NativeRdb::DataAbilityPredicates & predicates)380 int AbilityImpl::Update(
381 const Uri &uri, const NativeRdb::ValuesBucket &value, const NativeRdb::DataAbilityPredicates &predicates)
382 {
383 HILOG_DEBUG("AbilityImpl::Update");
384 return -1;
385 }
386
Delete(const Uri & uri,const NativeRdb::DataAbilityPredicates & predicates)387 int AbilityImpl::Delete(const Uri &uri, const NativeRdb::DataAbilityPredicates &predicates)
388 {
389 HILOG_DEBUG("AbilityImpl::Delete");
390 return -1;
391 }
392
Query(const Uri & uri,std::vector<std::string> & columns,const NativeRdb::DataAbilityPredicates & predicates)393 std::shared_ptr<NativeRdb::AbsSharedResultSet> AbilityImpl::Query(
394 const Uri &uri, std::vector<std::string> &columns, const NativeRdb::DataAbilityPredicates &predicates)
395 {
396 HILOG_DEBUG("AbilityImpl::Query");
397 return nullptr;
398 }
399
GetType(const Uri & uri)400 std::string AbilityImpl::GetType(const Uri &uri)
401 {
402 HILOG_DEBUG("AbilityImpl::GetType");
403 return "";
404 }
405
Reload(const Uri & uri,const PacMap & extras)406 bool AbilityImpl::Reload(const Uri &uri, const PacMap &extras)
407 {
408 return false;
409 }
410
BatchInsert(const Uri & uri,const std::vector<NativeRdb::ValuesBucket> & values)411 int AbilityImpl::BatchInsert(const Uri &uri, const std::vector<NativeRdb::ValuesBucket> &values)
412 {
413 HILOG_DEBUG("AbilityImpl::BatchInsert");
414 return -1;
415 }
416
SetUriString(const std::string & uri)417 void AbilityImpl::SetUriString(const std::string &uri)
418 {
419 HILOG_DEBUG("%{public}s begin.", __func__);
420 if (ability_ == nullptr) {
421 HILOG_ERROR("AbilityImpl::SetUriString ability_ is nullptr");
422 return;
423 }
424 ability_->SetUriString(uri);
425 HILOG_DEBUG("%{public}s end.", __func__);
426 }
427
SetLifeCycleStateInfo(const AAFwk::LifeCycleStateInfo & info)428 void AbilityImpl::SetLifeCycleStateInfo(const AAFwk::LifeCycleStateInfo &info)
429 {
430 if (ability_ == nullptr) {
431 HILOG_ERROR("AbilityImpl::SetLifeCycleStateInfo ability_ is nullptr");
432 return;
433 }
434 ability_->SetLifeCycleStateInfo(info);
435 }
436
CheckAndRestore()437 bool AbilityImpl::CheckAndRestore()
438 {
439 HILOG_DEBUG("AbilityImpl::CheckAndRestore called start");
440 if (!hasSaveData_) {
441 HILOG_ERROR("AbilityImpl::CheckAndRestore hasSaveData_ is false");
442 return false;
443 }
444
445 if (ability_ == nullptr) {
446 HILOG_ERROR("AbilityImpl::CheckAndRestore ability_ is nullptr");
447 return false;
448 }
449 ability_->OnRestoreAbilityState(restoreData_);
450
451 HILOG_DEBUG("AbilityImpl::CheckAndRestore called end");
452 return true;
453 }
454
CheckAndSave()455 bool AbilityImpl::CheckAndSave()
456 {
457 HILOG_DEBUG("AbilityImpl::CheckAndSave called start");
458 if (!needSaveDate_) {
459 HILOG_ERROR("AbilityImpl::CheckAndSave needSaveDate_ is false");
460 return false;
461 }
462
463 if (ability_ == nullptr) {
464 HILOG_ERROR("AbilityImpl::CheckAndSave ability_ is nullptr");
465 return false;
466 }
467
468 ability_->OnSaveAbilityState(restoreData_);
469 abilityLifecycleCallbacks_->OnAbilitySaveState(restoreData_);
470
471 needSaveDate_ = false;
472
473 HILOG_DEBUG("AbilityImpl::CheckAndSave called end");
474 return true;
475 }
476
GetRestoreData()477 PacMap &AbilityImpl::GetRestoreData()
478 {
479 return restoreData_;
480 }
481
SetCallingContext(const std::string & deviceId,const std::string & bundleName,const std::string & abilityName,const std::string & moduleName)482 void AbilityImpl::SetCallingContext(const std::string &deviceId, const std::string &bundleName,
483 const std::string &abilityName, const std::string &moduleName)
484 {
485 if (ability_ != nullptr) {
486 ability_->SetCallingContext(deviceId, bundleName, abilityName, moduleName);
487 }
488 }
489
NormalizeUri(const Uri & uri)490 Uri AbilityImpl::NormalizeUri(const Uri &uri)
491 {
492 HILOG_DEBUG("AbilityImpl::NormalizeUri");
493 return uri;
494 }
495
DenormalizeUri(const Uri & uri)496 Uri AbilityImpl::DenormalizeUri(const Uri &uri)
497 {
498 HILOG_DEBUG("AbilityImpl::DenormalizeUri");
499 return uri;
500 }
501
ScheduleUpdateConfiguration(const Configuration & config)502 void AbilityImpl::ScheduleUpdateConfiguration(const Configuration &config)
503 {
504 HILOG_DEBUG("%{public}s begin.", __func__);
505 if (ability_ == nullptr) {
506 HILOG_ERROR("AbilityImpl::ScheduleUpdateConfiguration ability_ is nullptr");
507 return;
508 }
509
510 if (lifecycleState_ != AAFwk::ABILITY_STATE_INITIAL) {
511 HILOG_INFO("ability name: [%{public}s]", ability_->GetAbilityName().c_str());
512 ability_->OnConfigurationUpdatedNotify(config);
513 }
514
515 HILOG_DEBUG("%{public}s end.", __func__);
516 }
517
CreatePostEventTimeouter(std::string taskstr)518 std::shared_ptr<AbilityPostEventTimeout> AbilityImpl::CreatePostEventTimeouter(std::string taskstr)
519 {
520 if (ability_ == nullptr) {
521 HILOG_ERROR("AbilityImpl::CreatePostEventTimeouter ability_ is nullptr");
522 return nullptr;
523 }
524
525 return ability_->CreatePostEventTimeouter(taskstr);
526 }
527
ExecuteBatch(const std::vector<std::shared_ptr<DataAbilityOperation>> & operations)528 std::vector<std::shared_ptr<DataAbilityResult>> AbilityImpl::ExecuteBatch(
529 const std::vector<std::shared_ptr<DataAbilityOperation>> &operations)
530 {
531 HILOG_DEBUG("AbilityImpl::ExecuteBatch");
532 std::vector<std::shared_ptr<DataAbilityResult>> results;
533 return results;
534 }
535
ContinueAbility(const std::string & deviceId,uint32_t versionCode)536 void AbilityImpl::ContinueAbility(const std::string& deviceId, uint32_t versionCode)
537 {
538 if (ability_ == nullptr) {
539 HILOG_ERROR("AbilityImpl::ContinueAbility ability_ is nullptr");
540 return;
541 }
542 ability_->ContinueAbilityWithStack(deviceId, versionCode);
543 }
544
NotifyContinuationResult(int32_t result)545 void AbilityImpl::NotifyContinuationResult(int32_t result)
546 {
547 if (ability_ == nullptr) {
548 HILOG_ERROR("AbilityImpl::NotifyContinuationResult ability_ is nullptr");
549 return;
550 }
551 ability_->OnCompleteContinuation(result);
552 }
553
NotifyMemoryLevel(int32_t level)554 void AbilityImpl::NotifyMemoryLevel(int32_t level)
555 {
556 if (ability_ == nullptr) {
557 HILOG_ERROR("AbilityImpl::NotifyMemoryLevel ability_ is nullptr");
558 return;
559 }
560 ability_->OnMemoryLevel(level);
561 }
562
563 #ifdef SUPPORT_GRAPHICS
AfterUnFocused()564 void AbilityImpl::AfterUnFocused()
565 {
566 AfterFocusedCommon(false);
567 }
568
AfterFocused()569 void AbilityImpl::AfterFocused()
570 {
571 AfterFocusedCommon(true);
572 }
573
AfterFocusedCommon(bool isFocused)574 void AbilityImpl::AfterFocusedCommon(bool isFocused)
575 {
576 auto task = [abilityImpl = weak_from_this(), focuseMode = isFocused]() {
577 auto impl = abilityImpl.lock();
578 if (impl == nullptr) {
579 return;
580 }
581
582 if (!impl->ability_ || !impl->ability_->GetAbilityInfo()) {
583 HILOG_WARN("AbilityImpl::%{public}s failed", focuseMode ? "AfterFocused" : "AfterUnFocused");
584 return;
585 }
586 HILOG_INFO("isStageBasedModel: %{public}d", impl->ability_->GetAbilityInfo()->isStageBasedModel);
587
588 if (impl->ability_->GetAbilityInfo()->isStageBasedModel) {
589 auto abilityContext = impl->ability_->GetAbilityContext();
590 if (abilityContext == nullptr) {
591 return;
592 }
593 auto applicationContext = abilityContext->GetApplicationContext();
594 if (applicationContext == nullptr || applicationContext->IsAbilityLifecycleCallbackEmpty()) {
595 return;
596 }
597 auto& jsAbility = static_cast<AbilityRuntime::JsAbility&>(*(impl->ability_));
598 if (focuseMode) {
599 applicationContext->DispatchWindowStageFocus(jsAbility.GetJsAbility(), jsAbility.GetJsWindowStage());
600 } else {
601 applicationContext->DispatchWindowStageUnfocus(jsAbility.GetJsAbility(), jsAbility.GetJsWindowStage());
602 }
603 return;
604 }
605
606 if (impl->ability_->GetWant() == nullptr) {
607 HILOG_WARN("want is nullptr.");
608 return;
609 }
610 auto info = impl->ability_->GetLifeCycleStateInfo();
611 if (focuseMode) {
612 info.state = AbilityLifeCycleState::ABILITY_STATE_ACTIVE;
613 } else {
614 info.state = AbilityLifeCycleState::ABILITY_STATE_INACTIVE;
615 }
616 info.isNewWant = false;
617 impl->HandleAbilityTransaction(*(impl->ability_->GetWant()), info);
618 };
619
620 if (handler_) {
621 handler_->PostTask(task);
622 }
623 HILOG_DEBUG("end.");
624 }
625
AfterForeground()626 void AbilityImpl::WindowLifeCycleImpl::AfterForeground()
627 {
628 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
629 HILOG_DEBUG("%{public}s begin.", __func__);
630 auto owner = owner_.lock();
631 if (owner == nullptr || !owner->IsStageBasedModel()) {
632 HILOG_ERROR("Not stage mode ability or abilityImpl is nullptr.");
633 return;
634 }
635 bool needNotifyAMS = false;
636 {
637 std::lock_guard<std::mutex> lock(owner->notifyForegroundLock_);
638 if (owner->notifyForegroundByAbility_) {
639 owner->notifyForegroundByAbility_ = false;
640 needNotifyAMS = true;
641 } else {
642 HILOG_DEBUG("Notify foreground by window, but client's foreground is running.");
643 owner->notifyForegroundByWindow_ = true;
644 }
645 }
646
647 if (needNotifyAMS) {
648 HILOG_INFO("Stage mode ability, window after foreground, notify ability manager service.");
649 PacMap restoreData;
650 AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_,
651 AbilityLifeCycleState::ABILITY_STATE_FOREGROUND_NEW, restoreData);
652 }
653 }
654
AfterBackground()655 void AbilityImpl::WindowLifeCycleImpl::AfterBackground()
656 {
657 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
658 HILOG_DEBUG("%{public}s begin.", __func__);
659 auto owner = owner_.lock();
660 if (owner && !owner->IsStageBasedModel()) {
661 return;
662 }
663
664 HILOG_INFO("UIAbility, window after background.");
665 PacMap restoreData;
666 AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_,
667 AbilityLifeCycleState::ABILITY_STATE_BACKGROUND_NEW, restoreData);
668 }
669
AfterFocused()670 void AbilityImpl::WindowLifeCycleImpl::AfterFocused()
671 {
672 HILOG_DEBUG("%{public}s begin.", __func__);
673 auto owner = owner_.lock();
674 if (owner) {
675 owner->AfterFocused();
676 }
677 HILOG_DEBUG("%{public}s end.", __func__);
678 }
679
AfterUnfocused()680 void AbilityImpl::WindowLifeCycleImpl::AfterUnfocused()
681 {
682 HILOG_DEBUG("%{public}s begin.", __func__);
683 auto owner = owner_.lock();
684 if (owner) {
685 owner->AfterUnFocused();
686 }
687 HILOG_DEBUG("%{public}s end.", __func__);
688 }
689
ForegroundFailed(int32_t type)690 void AbilityImpl::WindowLifeCycleImpl::ForegroundFailed(int32_t type)
691 {
692 HILOG_DEBUG("%{public}s begin.", __func__);
693 PacMap restoreData;
694 switch (type) {
695 case static_cast<int32_t>(OHOS::Rosen::WMError::WM_ERROR_INVALID_OPERATION): {
696 HILOG_DEBUG("window was freezed.");
697 AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_,
698 AbilityLifeCycleState::ABILITY_STATE_WINDOW_FREEZED, restoreData);
699 break;
700 }
701 case static_cast<int32_t>(OHOS::Rosen::WMError::WM_ERROR_INVALID_WINDOW_MODE_OR_SIZE): {
702 auto owner = owner_.lock();
703 if (owner == nullptr || !owner->IsStageBasedModel()) {
704 HILOG_ERROR("Not stage mode ability or abilityImpl is nullptr.");
705 return;
706 }
707
708 HILOG_DEBUG("The ability is stage mode, schedule foreground invalid mode.");
709 AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_,
710 AbilityLifeCycleState::ABILITY_STATE_INVALID_WINDOW_MODE, restoreData);
711 break;
712 }
713 case static_cast<int32_t>(OHOS::Rosen::WMError::WM_DO_NOTHING): {
714 AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_,
715 AbilityLifeCycleState::ABILITY_STATE_DO_NOTHING, restoreData);
716 break;
717 }
718 default: {
719 AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_,
720 AbilityLifeCycleState::ABILITY_STATE_FOREGROUND_FAILED, restoreData);
721 }
722 }
723 }
724
Foreground(const Want & want)725 void AbilityImpl::Foreground(const Want &want)
726 {
727 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
728 HILOG_DEBUG("%{public}s begin.", __func__);
729 if (ability_ == nullptr || ability_->GetAbilityInfo() == nullptr || abilityLifecycleCallbacks_ == nullptr) {
730 HILOG_ERROR("AbilityImpl::Foreground ability_ or abilityLifecycleCallbacks_ is nullptr");
731 return;
732 }
733
734 HILOG_DEBUG("AbilityImpl::Foreground");
735 ability_->OnForeground(want);
736 if ((ability_->GetAbilityInfo()->type == AppExecFwk::AbilityType::PAGE) &&
737 (ability_->GetAbilityInfo()->isStageBasedModel)) {
738 lifecycleState_ = AAFwk::ABILITY_STATE_FOREGROUND_NEW;
739 } else {
740 lifecycleState_ = AAFwk::ABILITY_STATE_INACTIVE;
741 }
742 {
743 std::lock_guard<std::mutex> lock(notifyForegroundLock_);
744 notifyForegroundByAbility_ = true;
745 }
746 abilityLifecycleCallbacks_->OnAbilityForeground(ability_);
747 HILOG_INFO("%{public}s end.", __func__);
748 }
749
BackgroundFailed(int32_t type)750 void AbilityImpl::WindowLifeCycleImpl::BackgroundFailed(int32_t type)
751 {
752 HILOG_DEBUG("%{public}s begin.", __func__);
753 if (type == static_cast<int32_t>(OHOS::Rosen::WMError::WM_DO_NOTHING)) {
754 PacMap restoreData;
755 AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_,
756 AbilityLifeCycleState::ABILITY_STATE_BACKGROUND_FAILED, restoreData);
757 }
758 }
759
Background()760 void AbilityImpl::Background()
761 {
762 HILOG_DEBUG("%{public}s begin.", __func__);
763 if (ability_ == nullptr || ability_->GetAbilityInfo() == nullptr || abilityLifecycleCallbacks_ == nullptr) {
764 HILOG_ERROR("AbilityImpl::Background ability_ or abilityLifecycleCallbacks_ is nullptr");
765 return;
766 }
767 ability_->OnLeaveForeground();
768 ability_->OnBackground();
769 if ((ability_->GetAbilityInfo()->type == AppExecFwk::AbilityType::PAGE) &&
770 (ability_->GetAbilityInfo()->isStageBasedModel)) {
771 lifecycleState_ = AAFwk::ABILITY_STATE_BACKGROUND_NEW;
772 } else {
773 lifecycleState_ = AAFwk::ABILITY_STATE_BACKGROUND;
774 }
775 abilityLifecycleCallbacks_->OnAbilityBackground(ability_);
776 HILOG_INFO("%{public}s end.", __func__);
777 }
778
DoKeyDown(const std::shared_ptr<MMI::KeyEvent> & keyEvent)779 void AbilityImpl::DoKeyDown(const std::shared_ptr<MMI::KeyEvent>& keyEvent)
780 {
781 HILOG_DEBUG("AbilityImpl::DoKeyDown called");
782 }
783
DoKeyUp(const std::shared_ptr<MMI::KeyEvent> & keyEvent)784 void AbilityImpl::DoKeyUp(const std::shared_ptr<MMI::KeyEvent>& keyEvent)
785 {
786 HILOG_DEBUG("AbilityImpl::DoKeyUp called");
787 }
788
DoPointerEvent(std::shared_ptr<MMI::PointerEvent> & pointerEvent)789 void AbilityImpl::DoPointerEvent(std::shared_ptr<MMI::PointerEvent>& pointerEvent)
790 {
791 HILOG_DEBUG("AbilityImpl::DoPointerEvent called");
792 }
793
OnInputEvent(std::shared_ptr<MMI::KeyEvent> keyEvent) const794 void AbilityImpl::InputEventConsumerImpl::OnInputEvent(std::shared_ptr<MMI::KeyEvent> keyEvent) const
795 {
796 int32_t code = keyEvent->GetKeyAction();
797 if (code == MMI::KeyEvent::KEY_ACTION_DOWN) {
798 abilityImpl_->DoKeyDown(keyEvent);
799 HILOG_DEBUG("AbilityImpl::OnKeyDown keyAction: %{public}d.", code);
800 } else if (code == MMI::KeyEvent::KEY_ACTION_UP) {
801 abilityImpl_->DoKeyUp(keyEvent);
802 HILOG_DEBUG("AbilityImpl::DoKeyUp keyAction: %{public}d.", code);
803 }
804 }
805
OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const806 void AbilityImpl::InputEventConsumerImpl::OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const
807 {
808 HILOG_DEBUG("AbilityImpl::DoPointerEvent called.");
809 abilityImpl_->DoPointerEvent(pointerEvent);
810 }
811 #endif
812 } // namespace AppExecFwk
813 } // namespace OHOS
814