• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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