• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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_record.h"
17 
18 #include <singleton.h>
19 #include <vector>
20 
21 #include "ability_constants.h"
22 #include "ability_event_handler.h"
23 #include "ability_manager_service.h"
24 #include "ability_scheduler_stub.h"
25 #include "ability_util.h"
26 #include "accesstoken_kit.h"
27 #include "bundle_mgr_client.h"
28 #include "connection_state_manager.h"
29 #include "hitrace_meter.h"
30 #include "image_source.h"
31 #include "in_process_call_wrapper.h"
32 #include "errors.h"
33 #include "event_report.h"
34 #include "hilog_wrapper.h"
35 #include "os_account_manager_wrapper.h"
36 #include "parameters.h"
37 #include "system_ability_token_callback.h"
38 #include "uri_permission_manager_client.h"
39 #ifdef SUPPORT_GRAPHICS
40 #include "image_source.h"
41 #include "locale_config.h"
42 #include "mission_info_mgr.h"
43 #endif
44 #ifdef EFFICIENCY_MANAGER_ENABLE
45 #include "suspend_manager_client.h"
46 #endif // EFFICIENCY_MANAGER_ENABLE
47 
48 
49 namespace OHOS {
50 namespace AAFwk {
51 using namespace OHOS::Security;
52 const std::string DEBUG_APP = "debugApp";
53 const std::string DMS_PROCESS_NAME = "distributedsched";
54 const std::string DMS_MISSION_ID = "dmsMissionId";
55 const std::string DMS_SRC_NETWORK_ID = "dmsSrcNetworkId";
56 const std::string ABILITY_OWNER_USERID = "AbilityMS_Owner_UserId";
57 const std::u16string SYSTEM_ABILITY_TOKEN_CALLBACK = u"ohos.aafwk.ISystemAbilityTokenCallback";
58 const std::string SHOW_ON_LOCK_SCREEN = "ShowOnLockScreen";
59 const std::string DLP_INDEX = "ohos.dlp.params.index";
60 const std::string DLP_BUNDLE_NAME = "com.ohos.dlpmanager";
61 const std::string COMPONENT_STARTUP_NEW_RULES = "component.startup.newRules";
62 const std::string NEED_STARTINGWINDOW = "ohos.ability.NeedStartingWindow";
63 const uint32_t RELEASE_STARTING_BG_TIMEOUT = 15000; // release starting window resource timeout.
64 int64_t AbilityRecord::abilityRecordId = 0;
65 int64_t AbilityRecord::g_abilityRecordEventId_ = 0;
66 const int32_t DEFAULT_USER_ID = 0;
67 const int32_t SEND_RESULT_CANCELED = -1;
68 const int VECTOR_SIZE = 2;
69 const std::map<AbilityState, std::string> AbilityRecord::stateToStrMap = {
70     std::map<AbilityState, std::string>::value_type(INITIAL, "INITIAL"),
71     std::map<AbilityState, std::string>::value_type(INACTIVE, "INACTIVE"),
72     std::map<AbilityState, std::string>::value_type(ACTIVE, "ACTIVE"),
73     std::map<AbilityState, std::string>::value_type(INACTIVATING, "INACTIVATING"),
74     std::map<AbilityState, std::string>::value_type(ACTIVATING, "ACTIVATING"),
75     std::map<AbilityState, std::string>::value_type(TERMINATING, "TERMINATING"),
76     std::map<AbilityState, std::string>::value_type(FOREGROUND, "FOREGROUND"),
77     std::map<AbilityState, std::string>::value_type(BACKGROUND, "BACKGROUND"),
78     std::map<AbilityState, std::string>::value_type(FOREGROUNDING, "FOREGROUNDING"),
79     std::map<AbilityState, std::string>::value_type(BACKGROUNDING, "BACKGROUNDING"),
80     std::map<AbilityState, std::string>::value_type(FOREGROUND_FAILED, "FOREGROUND_FAILED"),
81     std::map<AbilityState, std::string>::value_type(FOREGROUND_INVALID_MODE, "FOREGROUND_INVALID_MODE"),
82     std::map<AbilityState, std::string>::value_type(FOREGROUND_WINDOW_FREEZED, "FOREGROUND_WINDOW_FREEZED"),
83 };
84 const std::map<AppState, std::string> AbilityRecord::appStateToStrMap_ = {
85     std::map<AppState, std::string>::value_type(AppState::BEGIN, "BEGIN"),
86     std::map<AppState, std::string>::value_type(AppState::READY, "READY"),
87     std::map<AppState, std::string>::value_type(AppState::FOREGROUND, "FOREGROUND"),
88     std::map<AppState, std::string>::value_type(AppState::BACKGROUND, "BACKGROUND"),
89     std::map<AppState, std::string>::value_type(AppState::SUSPENDED, "SUSPENDED"),
90     std::map<AppState, std::string>::value_type(AppState::TERMINATED, "TERMINATED"),
91     std::map<AppState, std::string>::value_type(AppState::END, "END"),
92     std::map<AppState, std::string>::value_type(AppState::FOCUS, "FOCUS"),
93 };
94 const std::map<AbilityLifeCycleState, AbilityState> AbilityRecord::convertStateMap = {
95     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INITIAL, INITIAL),
96     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INACTIVE, INACTIVE),
97     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_ACTIVE, ACTIVE),
98     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_FOREGROUND_NEW, FOREGROUND),
99     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_BACKGROUND_NEW, BACKGROUND),
100     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_FOREGROUND_FAILED, FOREGROUND_FAILED),
101     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INVALID_WINDOW_MODE,
102         FOREGROUND_INVALID_MODE),
103     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_WINDOW_FREEZED,
104         FOREGROUND_WINDOW_FREEZED),
105 };
106 
Token(std::weak_ptr<AbilityRecord> abilityRecord)107 Token::Token(std::weak_ptr<AbilityRecord> abilityRecord) : abilityRecord_(abilityRecord)
108 {}
109 
~Token()110 Token::~Token()
111 {}
112 
GetAbilityRecordByToken(const sptr<IRemoteObject> & token)113 std::shared_ptr<AbilityRecord> Token::GetAbilityRecordByToken(const sptr<IRemoteObject> &token)
114 {
115     CHECK_POINTER_AND_RETURN(token, nullptr);
116 
117     std::string descriptor = Str16ToStr8(token->GetObjectDescriptor());
118     if (descriptor != "ohos.aafwk.AbilityToken") {
119         HILOG_ERROR("Input token is not an AbilityToken, token->GetObjectDescriptor(): %{public}s",
120             descriptor.c_str());
121         return nullptr;
122     }
123 
124     // Double check if token is valid
125     sptr<IAbilityToken> theToken = iface_cast<IAbilityToken>(token);
126     if (!theToken) {
127         return nullptr;
128     }
129     if (theToken->GetDescriptor() != u"ohos.aafwk.AbilityToken") {
130         return nullptr;
131     }
132 
133     return (static_cast<Token *>(token.GetRefPtr()))->GetAbilityRecord();
134 }
135 
GetAbilityRecord() const136 std::shared_ptr<AbilityRecord> Token::GetAbilityRecord() const
137 {
138     return abilityRecord_.lock();
139 }
140 
AbilityRecord(const Want & want,const AppExecFwk::AbilityInfo & abilityInfo,const AppExecFwk::ApplicationInfo & applicationInfo,int requestCode)141 AbilityRecord::AbilityRecord(const Want &want, const AppExecFwk::AbilityInfo &abilityInfo,
142     const AppExecFwk::ApplicationInfo &applicationInfo, int requestCode)
143     : want_(want), abilityInfo_(abilityInfo), applicationInfo_(applicationInfo), requestCode_(requestCode)
144 {
145     recordId_ = abilityRecordId++;
146     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
147     if (abilityMgr) {
148         bool isRootLauncher = (applicationInfo_.bundleName == LAUNCHER_BUNDLE_NAME);
149         abilityMgr->GetMaxRestartNum(restartMax_, isRootLauncher);
150         bool flag = abilityMgr->GetStartUpNewRuleFlag();
151         want_.SetParam(COMPONENT_STARTUP_NEW_RULES, flag);
152     }
153     restartCount_ = restartMax_;
154     appIndex_ = want.GetIntParam(DLP_INDEX, 0);
155 }
156 
~AbilityRecord()157 AbilityRecord::~AbilityRecord()
158 {
159     if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
160         auto object = scheduler_->AsObject();
161         if (object != nullptr) {
162             object->RemoveDeathRecipient(schedulerDeathRecipient_);
163         }
164     }
165 }
166 
CreateAbilityRecord(const AbilityRequest & abilityRequest)167 std::shared_ptr<AbilityRecord> AbilityRecord::CreateAbilityRecord(const AbilityRequest &abilityRequest)
168 {
169     std::shared_ptr<AbilityRecord> abilityRecord = std::make_shared<AbilityRecord>(
170         abilityRequest.want, abilityRequest.abilityInfo, abilityRequest.appInfo, abilityRequest.requestCode);
171     CHECK_POINTER_AND_RETURN(abilityRecord, nullptr);
172     abilityRecord->SetUid(abilityRequest.uid);
173     abilityRecord->SetAppIndex(abilityRequest.want.GetIntParam(DLP_INDEX, 0));
174     abilityRecord->SetCallerAccessTokenId(abilityRequest.callerAccessTokenId);
175     if (!abilityRecord->Init()) {
176         HILOG_ERROR("failed to init new ability record");
177         return nullptr;
178     }
179     if (abilityRequest.startSetting != nullptr) {
180         HILOG_INFO("abilityRequest.startSetting...");
181         abilityRecord->SetStartSetting(abilityRequest.startSetting);
182     }
183     if (abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
184         HILOG_INFO("abilityRequest.callType is CALL_REQUEST_TYPE.");
185         abilityRecord->SetStartedByCall(true);
186     }
187     return abilityRecord;
188 }
189 
Init()190 bool AbilityRecord::Init()
191 {
192     lifecycleDeal_ = std::make_unique<LifecycleDeal>();
193     CHECK_POINTER_RETURN_BOOL(lifecycleDeal_);
194 
195     token_ = new (std::nothrow) Token(weak_from_this());
196     CHECK_POINTER_RETURN_BOOL(token_);
197 
198     if (applicationInfo_.isLauncherApp) {
199         isLauncherAbility_ = true;
200     }
201     return true;
202 }
203 
SetUid(int32_t uid)204 void AbilityRecord::SetUid(int32_t uid)
205 {
206     uid_ = uid;
207 }
208 
GetUid()209 int32_t AbilityRecord::GetUid()
210 {
211     return uid_;
212 }
213 
GetPid()214 int32_t AbilityRecord::GetPid()
215 {
216     return pid_;
217 }
218 
LoadAbility()219 int AbilityRecord::LoadAbility()
220 {
221     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
222     HILOG_INFO("Start load ability, name is %{public}s.", abilityInfo_.name.c_str());
223     if (applicationInfo_.asanEnabled) {
224         auto loadTimeOut = AbilityManagerService::LOAD_TIMEOUT_ASANENABLED;
225         SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, loadTimeOut);
226     } else if (abilityInfo_.type != AppExecFwk::AbilityType::DATA) {
227         auto loadTimeOut = want_.GetBoolParam("coldStart", false) ?
228             AbilityManagerService::COLDSTART_LOAD_TIMEOUT : AbilityManagerService::LOAD_TIMEOUT;
229         SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, loadTimeOut);
230     }
231 
232     startTime_ = AbilityUtil::SystemTimeMillis();
233     CHECK_POINTER_AND_RETURN(token_, ERR_INVALID_VALUE);
234     std::string appName = applicationInfo_.name;
235     if (appName.empty()) {
236         HILOG_ERROR("app name is empty");
237         return ERR_INVALID_VALUE;
238     }
239 
240     if (!CanRestartRootLauncher()) {
241         HILOG_ERROR("Root launcher restart is out of max count.");
242         return ERR_INVALID_VALUE;
243     }
244 
245     if (isRestarting_) {
246         restartTime_ = AbilityUtil::SystemTimeMillis();
247     }
248 
249     sptr<Token> callerToken_ = nullptr;
250     if (!callerList_.empty() && callerList_.back()) {
251         auto caller = callerList_.back()->GetCaller();
252         if (caller) {
253             callerToken_ = caller->GetToken();
254         }
255     }
256     want_.SetParam(ABILITY_OWNER_USERID, ownerMissionUserId_);
257     auto result = DelayedSingleton<AppScheduler>::GetInstance()->LoadAbility(
258         token_, callerToken_, abilityInfo_, applicationInfo_, want_);
259     want_.RemoveParam(ABILITY_OWNER_USERID);
260     return result;
261 }
262 
CanRestartRootLauncher()263 bool AbilityRecord::CanRestartRootLauncher()
264 {
265     if (isLauncherRoot_ && isRestarting_ && IsLauncherAbility() && (restartCount_ < 0)) {
266         HILOG_ERROR("Root launcher restart is out of max count.");
267         return false;
268     }
269     return true;
270 }
271 
CanRestartResident()272 bool AbilityRecord::CanRestartResident()
273 {
274     HILOG_DEBUG("isKeepAlive: %{public}d, isRestarting: %{public}d, restartCount: %{public}d",
275         isKeepAlive_, isRestarting_, restartCount_);
276     if (isKeepAlive_ && isRestarting_ && (restartCount_ < 0)) {
277         int restartIntervalTime = 0;
278         auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
279         if (abilityMgr) {
280             abilityMgr->GetRestartIntervalTime(restartIntervalTime);
281         }
282         HILOG_DEBUG("restartTime: %{public}lld, now: %{public}lld, intervalTine:%{public}d",
283             static_cast<unsigned long long>(restartTime_),
284             static_cast<unsigned long long>(AbilityUtil::SystemTimeMillis()), restartIntervalTime);
285         if ((AbilityUtil::SystemTimeMillis() - restartTime_) < restartIntervalTime) {
286             HILOG_ERROR("Resident restart is out of max count");
287             return false;
288         }
289     }
290     return true;
291 }
292 
ForegroundAbility(uint32_t sceneFlag)293 void AbilityRecord::ForegroundAbility(uint32_t sceneFlag)
294 {
295     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
296     HILOG_INFO("Start to foreground ability, name is %{public}s.", abilityInfo_.name.c_str());
297     CHECK_POINTER(lifecycleDeal_);
298 
299     SendEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, AbilityManagerService::FOREGROUND_TIMEOUT);
300 
301     // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
302     // earlier than above actions.
303     currentState_ = AbilityState::FOREGROUNDING;
304     lifeCycleStateInfo_.sceneFlag = sceneFlag;
305     lifecycleDeal_->ForegroundNew(want_, lifeCycleStateInfo_);
306     lifeCycleStateInfo_.sceneFlag = 0;
307     lifeCycleStateInfo_.sceneFlagBak = 0;
308 
309     // update ability state to appMgr service when restart
310     if (IsNewWant()) {
311         sptr<Token> preToken = nullptr;
312         if (GetPreAbilityRecord()) {
313             preToken = GetPreAbilityRecord()->GetToken();
314         }
315         DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
316     }
317 }
318 
ProcessForegroundAbility(uint32_t sceneFlag)319 void AbilityRecord::ProcessForegroundAbility(uint32_t sceneFlag)
320 {
321     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
322     std::string element = GetWant().GetElement().GetURI();
323     HILOG_DEBUG("ability record: %{public}s", element.c_str());
324 
325     if (isReady_) {
326         if (IsAbilityState(AbilityState::FOREGROUND)) {
327             HILOG_DEBUG("Activate %{public}s", element.c_str());
328             ForegroundAbility(sceneFlag);
329         } else {
330             // background to active state
331             HILOG_DEBUG("MoveToForeground, %{public}s", element.c_str());
332             lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
333 #ifdef EFFICIENCY_MANAGER_ENABLE
334             std::string bundleName = GetAbilityInfo().bundleName;
335             int32_t uid = GetUid();
336             SuspendManager::SuspendManagerClient::GetInstance().ThawOneApplication(
337                 uid, bundleName, "THAW_BY_FOREGROUND_ABILITY");
338 #endif // EFFICIENCY_MANAGER_ENABLE
339             DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token_);
340         }
341     } else {
342         HILOG_INFO("To load ability.");
343         lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
344         LoadAbility();
345     }
346 }
347 
GetLabel()348 std::string AbilityRecord::GetLabel()
349 {
350     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
351     std::string strLabel = applicationInfo_.label;
352 
353     if (abilityInfo_.resourcePath.empty()) {
354         HILOG_WARN("resource path is empty.");
355         return strLabel;
356     }
357 
358 #ifdef SUPPORT_GRAPHICS
359     auto resourceMgr = CreateResourceManager();
360     if (!resourceMgr) {
361         return strLabel;
362     }
363 
364     auto result = resourceMgr->GetStringById(applicationInfo_.labelId, strLabel);
365     if (result != OHOS::Global::Resource::RState::SUCCESS) {
366         HILOG_WARN("%{public}s. Failed to GetStringById.", __func__);
367     }
368 
369     InitColdStartingWindowResource(resourceMgr);
370 #endif
371 
372     return strLabel;
373 }
374 
375 #ifdef SUPPORT_GRAPHICS
ProcessForegroundAbility(const std::shared_ptr<AbilityRecord> & callerAbility,uint32_t sceneFlag)376 void AbilityRecord::ProcessForegroundAbility(const std::shared_ptr<AbilityRecord> &callerAbility, uint32_t sceneFlag)
377 {
378     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
379     std::string element = GetWant().GetElement().GetURI();
380     HILOG_DEBUG("SUPPORT_GRAPHICS: ability record: %{public}s", element.c_str());
381 
382     StartingWindowHot();
383     auto flag = !IsForeground();
384     NotifyAnimationFromTerminatingAbility(callerAbility, flag);
385     PostCancelStartingWindowHotTask();
386 
387     if (IsAbilityState(AbilityState::FOREGROUND)) {
388         HILOG_DEBUG("Activate %{public}s", element.c_str());
389         ForegroundAbility(sceneFlag);
390     } else {
391         // background to active state
392         HILOG_DEBUG("MoveToForeground, %{public}s", element.c_str());
393         lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
394         DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token_);
395     }
396 }
397 
NotifyAnimationFromTerminatingAbility(const std::shared_ptr<AbilityRecord> & callerAbility,bool flag)398 void AbilityRecord::NotifyAnimationFromTerminatingAbility(const std::shared_ptr<AbilityRecord>& callerAbility,
399     bool flag)
400 {
401     auto windowHandler = GetWMSHandler();
402     if (!windowHandler) {
403         HILOG_WARN("Get WMS handler failed.");
404         return;
405     }
406 
407     sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
408     if (callerAbility) {
409         auto callerAbilityInfo = callerAbility->GetAbilityInfo();
410         SetAbilityTransitionInfo(callerAbilityInfo, fromInfo);
411         fromInfo->abilityToken_ = callerAbility->GetToken();
412     }
413 
414     if (flag) {
415         fromInfo->reason_ = TransitionReason::BACK_TRANSITION;
416     } else {
417         fromInfo->reason_ = TransitionReason::CLOSE;
418     }
419 
420     auto toInfo = CreateAbilityTransitionInfo();
421     SetAbilityTransitionInfo(abilityInfo_, toInfo);
422 
423     windowHandler->NotifyWindowTransition(fromInfo, toInfo);
424 }
425 
NotifyAnimationFromTerminatingAbility() const426 void AbilityRecord::NotifyAnimationFromTerminatingAbility() const
427 {
428     auto windowHandler = GetWMSHandler();
429     if (!windowHandler) {
430         HILOG_WARN("Get WMS handler failed.");
431         return;
432     }
433 
434     sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
435     SetAbilityTransitionInfo(fromInfo);
436     fromInfo->reason_ = TransitionReason::CLOSE;
437     windowHandler->NotifyWindowTransition(fromInfo, nullptr);
438 }
439 
SetAbilityTransitionInfo(sptr<AbilityTransitionInfo> & info) const440 void AbilityRecord::SetAbilityTransitionInfo(sptr<AbilityTransitionInfo>& info) const
441 {
442     info->abilityToken_ = token_;
443     info->missionId_ = missionId_;
444     info->abilityName_ = abilityInfo_.name;
445     info->bundleName_ = abilityInfo_.bundleName;
446     info->windowModes_ = abilityInfo_.windowModes;
447     info->maxWindowRatio_ = abilityInfo_.maxWindowRatio;
448     info->minWindowRatio_ = abilityInfo_.minWindowRatio;
449     info->maxWindowWidth_ = abilityInfo_.maxWindowWidth;
450     info->minWindowWidth_ = abilityInfo_.minWindowWidth;
451     info->maxWindowHeight_ = abilityInfo_.maxWindowHeight;
452     info->minWindowHeight_ = abilityInfo_.minWindowHeight;
453 }
454 
CreateAbilityTransitionInfo()455 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo()
456 {
457     sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
458     SetAbilityTransitionInfo(info);
459     SetStartingWindow(true);
460     return info;
461 }
462 
StartingWindowHot()463 void AbilityRecord::StartingWindowHot()
464 {
465     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
466     auto windowHandler = GetWMSHandler();
467     if (!windowHandler) {
468         HILOG_WARN("Get WMS handler failed.");
469         return;
470     }
471 
472     auto pixelMap = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetSnapshot(missionId_);
473     if (!pixelMap) {
474         HILOG_WARN("Get snapshot failed.");
475     }
476 
477     auto info = CreateAbilityTransitionInfo();
478     HILOG_INFO("Notify wms to start StartingWindow.");
479     windowHandler->StartingWindow(info, pixelMap);
480 }
481 
ProcessForegroundAbility(bool isRecent,const AbilityRequest & abilityRequest,std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<AbilityRecord> & callerAbility,uint32_t sceneFlag)482 void AbilityRecord::ProcessForegroundAbility(bool isRecent, const AbilityRequest &abilityRequest,
483     std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<AbilityRecord> &callerAbility,
484     uint32_t sceneFlag)
485 {
486     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
487     std::string element = GetWant().GetElement().GetURI();
488     HILOG_DEBUG("SUPPORT_GRAPHICS: ability record: %{public}s", element.c_str());
489     GrantUriPermission(want_, GetCurrentAccountId(), applicationInfo_.accessTokenId);
490 
491     if (isReady_) {
492         auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
493         if (!handler) {
494             HILOG_ERROR("Fail to get AbilityEventHandler.");
495             return;
496         }
497         auto taskName = std::to_string(missionId_) + "_hot";
498         handler->RemoveTask(taskName);
499         StartingWindowTask(isRecent, false, abilityRequest, startOptions);
500         AnimationTask(isRecent, abilityRequest, startOptions, callerAbility);
501         PostCancelStartingWindowHotTask();
502 
503         if (IsAbilityState(AbilityState::FOREGROUND)) {
504             HILOG_DEBUG("Activate %{public}s", element.c_str());
505             ForegroundAbility(sceneFlag);
506         } else {
507             // background to active state
508             HILOG_DEBUG("MoveToForeground, %{public}s", element.c_str());
509             lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
510             DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token_);
511         }
512     } else {
513         HILOG_INFO("SUPPORT_GRAPHICS: to load ability.");
514         lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
515         auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
516         auto needStartingWindow = abilityRequest.want.GetBoolParam(NEED_STARTINGWINDOW, true);
517         if (!isSaCall || needStartingWindow) {
518             StartingWindowTask(isRecent, true, abilityRequest, startOptions);
519             AnimationTask(isRecent, abilityRequest, startOptions, callerAbility);
520             PostCancelStartingWindowColdTask();
521         }
522         LoadAbility();
523     }
524 }
525 
GetWantFromMission() const526 std::shared_ptr<Want> AbilityRecord::GetWantFromMission() const
527 {
528     InnerMissionInfo innerMissionInfo;
529     int getMission = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
530         missionId_, innerMissionInfo);
531     if (getMission != ERR_OK) {
532         HILOG_ERROR("cannot find mission info from MissionInfoList by missionId: %{public}d", missionId_);
533         return nullptr;
534     }
535 
536     return std::make_shared<Want>(innerMissionInfo.missionInfo.want);
537 }
538 
AnimationTask(bool isRecent,const AbilityRequest & abilityRequest,const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<AbilityRecord> & callerAbility)539 void AbilityRecord::AnimationTask(bool isRecent, const AbilityRequest &abilityRequest,
540     const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<AbilityRecord> &callerAbility)
541 {
542     HILOG_INFO("%{public}s was called.", __func__);
543     if (isRecent) {
544         auto want = GetWantFromMission();
545         NotifyAnimationFromRecentTask(startOptions, want);
546     } else {
547         if (!IsForeground()) {
548             NotifyAnimationFromStartingAbility(callerAbility, abilityRequest);
549         }
550     }
551 }
552 
SetShowWhenLocked(const AppExecFwk::AbilityInfo & abilityInfo,sptr<AbilityTransitionInfo> & info) const553 void AbilityRecord::SetShowWhenLocked(const AppExecFwk::AbilityInfo &abilityInfo,
554     sptr<AbilityTransitionInfo> &info) const
555 {
556     std::vector<AppExecFwk::CustomizeData> datas = abilityInfo.metaData.customizeData;
557     for (AppExecFwk::CustomizeData data : datas) {
558         if (data.name == SHOW_ON_LOCK_SCREEN) {
559             info->isShowWhenLocked_ = true;
560             break;
561         }
562     }
563 }
564 
SetAbilityTransitionInfo(const AppExecFwk::AbilityInfo & abilityInfo,sptr<AbilityTransitionInfo> & info) const565 void AbilityRecord::SetAbilityTransitionInfo(const AppExecFwk::AbilityInfo &abilityInfo,
566     sptr<AbilityTransitionInfo> &info) const
567 {
568     info->abilityName_ = abilityInfo.name;
569     info->bundleName_ = abilityInfo.bundleName;
570     info->windowModes_ = abilityInfo.windowModes;
571     SetShowWhenLocked(abilityInfo, info);
572 }
573 
NotifyAnimationFromRecentTask(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want) const574 void AbilityRecord::NotifyAnimationFromRecentTask(const std::shared_ptr<StartOptions> &startOptions,
575     const std::shared_ptr<Want> &want) const
576 {
577     auto windowHandler = GetWMSHandler();
578     if (!windowHandler) {
579         HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
580         return;
581     }
582 
583     auto toInfo = CreateAbilityTransitionInfo(startOptions, want);
584     toInfo->abilityToken_ = token_;
585     toInfo->missionId_ = missionId_;
586     SetAbilityTransitionInfo(abilityInfo_, toInfo);
587     sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
588     fromInfo->isRecent_ = true;
589     windowHandler->NotifyWindowTransition(fromInfo, toInfo);
590 }
591 
NotifyAnimationFromStartingAbility(const std::shared_ptr<AbilityRecord> & callerAbility,const AbilityRequest & abilityRequest) const592 void AbilityRecord::NotifyAnimationFromStartingAbility(const std::shared_ptr<AbilityRecord> &callerAbility,
593     const AbilityRequest &abilityRequest) const
594 {
595     auto windowHandler = GetWMSHandler();
596     if (!windowHandler) {
597         HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
598         return;
599     }
600 
601     sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
602     if (callerAbility) {
603         auto callerAbilityInfo = callerAbility->GetAbilityInfo();
604         SetAbilityTransitionInfo(callerAbilityInfo, fromInfo);
605         fromInfo->abilityToken_ = callerAbility->GetToken();
606     } else {
607         fromInfo->abilityToken_ = abilityRequest.callerToken;
608     }
609 
610     auto toInfo = CreateAbilityTransitionInfo(abilityRequest);
611     toInfo->abilityToken_ = token_;
612     toInfo->missionId_ = missionId_;
613     SetAbilityTransitionInfo(abilityInfo_, toInfo);
614 
615     windowHandler->NotifyWindowTransition(fromInfo, toInfo);
616 }
617 
StartingWindowTask(bool isRecent,bool isCold,const AbilityRequest & abilityRequest,std::shared_ptr<StartOptions> & startOptions)618 void AbilityRecord::StartingWindowTask(bool isRecent, bool isCold, const AbilityRequest &abilityRequest,
619     std::shared_ptr<StartOptions> &startOptions)
620 {
621     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
622     HILOG_INFO("%{public}s was called.", __func__);
623     if (isRecent) {
624         auto want = GetWantFromMission();
625         if (isCold) {
626             StartingWindowCold(startOptions, want, abilityRequest);
627         } else {
628             StartingWindowHot(startOptions, want, abilityRequest);
629         }
630     } else {
631         std::shared_ptr<Want> want = nullptr;
632         if (isCold) {
633             StartingWindowCold(startOptions, want, abilityRequest);
634         } else {
635             StartingWindowHot(startOptions, want, abilityRequest);
636         }
637     }
638 }
639 
PostCancelStartingWindowHotTask()640 void AbilityRecord::PostCancelStartingWindowHotTask()
641 {
642     if (want_.GetBoolParam(DEBUG_APP, false)) {
643         HILOG_INFO("PostCancelStartingWindowHotTask was called, debug mode, just return.");
644         return;
645     }
646     HILOG_INFO("PostCancelStartingWindowHotTask was called.");
647     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
648     CHECK_POINTER_LOG(handler, "Fail to get AbilityEventHandler.");
649 
650     auto windowHandler = GetWMSHandler();
651     CHECK_POINTER_LOG(windowHandler, "PostCancelStartingWindowColdTask, Get WMS handler failed.");
652 
653     auto abilityRecord(shared_from_this());
654     auto delayTask = [windowHandler, abilityRecord] {
655         if (windowHandler && abilityRecord && abilityRecord->IsStartingWindow() &&
656             abilityRecord->GetAbilityState() != AbilityState::FOREGROUNDING) {
657             HILOG_INFO("PostCancelStartingWindowHotTask, call windowHandler CancelStartingWindow.");
658             windowHandler->CancelStartingWindow(abilityRecord->GetToken());
659             abilityRecord->SetStartingWindow(false);
660         }
661     };
662     auto taskName = std::to_string(missionId_) + "_hot";
663     handler->PostTask(delayTask, taskName, AbilityManagerService::FOREGROUND_TIMEOUT);
664 }
665 
PostCancelStartingWindowColdTask()666 void AbilityRecord::PostCancelStartingWindowColdTask()
667 {
668     if (want_.GetBoolParam(DEBUG_APP, false)) {
669         HILOG_INFO("PostCancelStartingWindowColdTask was called, debug mode, just return.");
670         return;
671     }
672     HILOG_INFO("PostCancelStartingWindowColdTask was called.");
673     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
674     CHECK_POINTER_LOG(handler, "Fail to get AbilityEventHandler.");
675 
676     auto windowHandler = GetWMSHandler();
677     CHECK_POINTER_LOG(windowHandler, "PostCancelStartingWindowColdTask, Get WMS handler failed.");
678 
679     auto abilityRecord(shared_from_this());
680     auto delayTask = [windowHandler, abilityRecord] {
681         if (windowHandler && abilityRecord && abilityRecord->IsStartingWindow() &&
682             (abilityRecord->GetScheduler() == nullptr ||
683             abilityRecord->GetAbilityState() != AbilityState::FOREGROUNDING)) {
684             HILOG_INFO("PostCancelStartingWindowColdTask, call windowHandler CancelStartingWindow.");
685             windowHandler->CancelStartingWindow(abilityRecord->GetToken());
686             abilityRecord->SetStartingWindow(false);
687         }
688     };
689     auto taskName = std::to_string(missionId_) + "_cold";
690     if (applicationInfo_.asanEnabled) {
691         handler->PostTask(delayTask, taskName, AbilityManagerService::LOAD_TIMEOUT_ASANENABLED);
692     } else {
693         handler->PostTask(delayTask, taskName, AbilityManagerService::LOAD_TIMEOUT);
694     }
695 }
696 
GetWMSHandler() const697 sptr<IWindowManagerServiceHandler> AbilityRecord::GetWMSHandler() const
698 {
699     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
700     if (!abilityMgr) {
701         HILOG_WARN("%{public}s, Get Ability Manager Service failed.", __func__);
702         return nullptr;
703     }
704     return abilityMgr->GetWMSHandler();
705 }
706 
SetWindowModeAndDisplayId(sptr<AbilityTransitionInfo> & info,const std::shared_ptr<Want> & want) const707 void AbilityRecord::SetWindowModeAndDisplayId(sptr<AbilityTransitionInfo> &info,
708     const std::shared_ptr<Want> &want) const
709 {
710     if (!want) {
711         HILOG_WARN("%{public}s, want is invalid.", __func__);
712         return;
713     }
714     auto mode = want->GetIntParam(Want::PARAM_RESV_WINDOW_MODE, -1);
715     auto displayId = want->GetIntParam(Want::PARAM_RESV_DISPLAY_ID, -1);
716     if (mode != -1) {
717         HILOG_INFO("%{public}s: origin window mode is %{public}d.", __func__, mode);
718         info->mode_ = static_cast<uint32_t>(mode);
719     }
720     if (displayId != -1) {
721         info->displayId_ = static_cast<uint64_t>(displayId);
722     }
723 }
724 
CreateAbilityTransitionInfo(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want) const725 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(
726     const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<Want> &want) const
727 {
728     sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
729     if (startOptions != nullptr) {
730         info->mode_ = static_cast<uint32_t>(startOptions->GetWindowMode());
731         HILOG_INFO("%{public}s: window mode is %{public}d.", __func__, info->mode_);
732         info->displayId_ = static_cast<uint64_t>(startOptions->GetDisplayID());
733     } else {
734         SetWindowModeAndDisplayId(info, want);
735     }
736     return info;
737 }
738 
CreateAbilityTransitionInfo(const AbilityRequest & abilityRequest) const739 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(const AbilityRequest &abilityRequest) const
740 {
741     sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
742     auto abilityStartSetting = abilityRequest.startSetting;
743     if (abilityStartSetting) {
744         auto windowMode = abilityStartSetting->GetProperty(AbilityStartSetting::WINDOW_MODE_KEY);
745         auto displayId = abilityStartSetting->GetProperty(AbilityStartSetting::WINDOW_DISPLAY_ID_KEY);
746         try {
747             info->mode_ = static_cast<uint32_t>(std::stoi(windowMode));
748             info->displayId_ = static_cast<uint64_t>(std::stoi(displayId));
749         } catch (...) {
750             HILOG_WARN("windowMode: stoi(%{public}s) failed", windowMode.c_str());
751             HILOG_WARN("displayId: stoi(%{public}s) failed", displayId.c_str());
752         }
753     } else {
754         SetWindowModeAndDisplayId(info, std::make_shared<Want>(abilityRequest.want));
755     }
756     return info;
757 }
758 
CreateResourceManager() const759 std::shared_ptr<Global::Resource::ResourceManager> AbilityRecord::CreateResourceManager() const
760 {
761     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
762     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
763     UErrorCode status = U_ZERO_ERROR;
764     icu::Locale locale = icu::Locale::forLanguageTag(Global::I18n::LocaleConfig::GetSystemLanguage(), status);
765     resConfig->SetLocaleInfo(locale);
766 
767     std::shared_ptr<Global::Resource::ResourceManager> resourceMgr(Global::Resource::CreateResourceManager());
768     resourceMgr->UpdateResConfig(*resConfig);
769 
770     std::string loadPath;
771     if (system::GetBoolParameter(AbilityRuntime::Constants::COMPRESS_PROPERTY, false) &&
772         !abilityInfo_.hapPath.empty()) {
773         loadPath = abilityInfo_.hapPath;
774     } else {
775         loadPath = abilityInfo_.resourcePath;
776     }
777 
778     if (loadPath.empty()) {
779         HILOG_WARN("Invalid app resource.");
780         return nullptr;
781     }
782 
783     if (!resourceMgr->AddResource(loadPath.c_str())) {
784         HILOG_WARN("%{public}s AddResource failed.", __func__);
785         return nullptr;
786     }
787     return resourceMgr;
788 }
789 
GetPixelMap(const uint32_t windowIconId,std::shared_ptr<Global::Resource::ResourceManager> resourceMgr) const790 std::shared_ptr<Media::PixelMap> AbilityRecord::GetPixelMap(const uint32_t windowIconId,
791     std::shared_ptr<Global::Resource::ResourceManager> resourceMgr) const
792 {
793     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
794     if (resourceMgr == nullptr) {
795         HILOG_WARN("%{public}s resource manager does not exist.", __func__);
796         return nullptr;
797     }
798 
799     Media::SourceOptions opts;
800     uint32_t errorCode = 0;
801     std::unique_ptr<Media::ImageSource> imageSource;
802     if (system::GetBoolParameter(AbilityRuntime::Constants::COMPRESS_PROPERTY, false) &&
803         !abilityInfo_.hapPath.empty()) { // hap is not unzip
804         std::unique_ptr<uint8_t[]> iconOut;
805         size_t len;
806         if (resourceMgr->GetMediaDataById(windowIconId, len, iconOut) != Global::Resource::RState::SUCCESS) {
807             return nullptr;
808         }
809         imageSource = Media::ImageSource::CreateImageSource(iconOut.get(), len, opts, errorCode);
810     } else { // already unzip hap
811         std::string iconPath;
812         if (resourceMgr->GetMediaById(windowIconId, iconPath) != Global::Resource::RState::SUCCESS) {
813             return nullptr;
814         }
815         imageSource = Media::ImageSource::CreateImageSource(iconPath, opts, errorCode);
816     }
817 
818     if (errorCode != 0 || imageSource == nullptr) {
819         HILOG_ERROR("Failed to create icon id %{private}d err %{public}d", windowIconId, errorCode);
820         return nullptr;
821     }
822 
823     Media::DecodeOptions decodeOpts;
824     auto pixelMapPtr = imageSource->CreatePixelMap(decodeOpts, errorCode);
825     if (errorCode != 0) {
826         HILOG_ERROR("Failed to create PixelMap id %{private}d err %{public}d", windowIconId, errorCode);
827         return nullptr;
828     }
829     HILOG_DEBUG("%{public}s OUT.", __func__);
830     return std::shared_ptr<Media::PixelMap>(pixelMapPtr.release());
831 }
832 
CreateAbilityTransitionInfo(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)833 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(
834     const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<Want> &want,
835     const AbilityRequest &abilityRequest)
836 {
837     sptr<AbilityTransitionInfo> info;
838     if (startOptions) {
839         info = CreateAbilityTransitionInfo(startOptions, want);
840     } else {
841         info = CreateAbilityTransitionInfo(abilityRequest);
842     }
843 
844     SetAbilityTransitionInfo(info);
845     SetStartingWindow(true);
846     return info;
847 }
848 
StartingWindowHot(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)849 void AbilityRecord::StartingWindowHot(const std::shared_ptr<StartOptions> &startOptions,
850     const std::shared_ptr<Want> &want, const AbilityRequest &abilityRequest)
851 {
852     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
853     HILOG_INFO("%{public}s was called.", __func__);
854     auto windowHandler = GetWMSHandler();
855     if (!windowHandler) {
856         HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
857         return;
858     }
859 
860     auto pixelMap = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetSnapshot(missionId_);
861     if (!pixelMap) {
862         HILOG_WARN("%{public}s, Get snapshot failed.", __func__);
863     }
864 
865     auto info = CreateAbilityTransitionInfo(startOptions, want, abilityRequest);
866     windowHandler->StartingWindow(info, pixelMap);
867 }
868 
StartingWindowCold(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)869 void AbilityRecord::StartingWindowCold(const std::shared_ptr<StartOptions> &startOptions,
870     const std::shared_ptr<Want> &want, const AbilityRequest &abilityRequest)
871 {
872     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
873     HILOG_INFO("%{public}s was called.", __func__);
874     auto windowHandler = GetWMSHandler();
875     if (!windowHandler) {
876         HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
877         return;
878     }
879 
880     // get bg pixelmap and color.
881     std::shared_ptr<Media::PixelMap> pixelMap = nullptr;
882     uint32_t bgColor = 0;
883     GetColdStartingWindowResource(pixelMap, bgColor);
884 
885     // start window
886     auto info = CreateAbilityTransitionInfo(startOptions, want, abilityRequest);
887     windowHandler->StartingWindow(info, pixelMap, bgColor);
888     startingWindowBg_.reset();
889 }
890 
GetColdStartingWindowResource(std::shared_ptr<Media::PixelMap> & bg,uint32_t & bgColor)891 void AbilityRecord::GetColdStartingWindowResource(std::shared_ptr<Media::PixelMap> &bg, uint32_t &bgColor)
892 {
893     bg = startingWindowBg_;
894     bgColor = bgColor_;
895     if (bg) {
896         return;
897     }
898 
899     auto resourceMgr = CreateResourceManager();
900     if (!resourceMgr) {
901         HILOG_WARN("%{public}s, Get resourceMgr failed.", __func__);
902         return;
903     }
904 
905     auto windowIconId = static_cast<uint32_t>(abilityInfo_.startWindowIconId);
906     bg = GetPixelMap(windowIconId, resourceMgr);
907 
908     auto colorId = static_cast<uint32_t>(abilityInfo_.startWindowBackgroundId);
909     auto colorErrval = resourceMgr->GetColorById(colorId, bgColor);
910     if (colorErrval != OHOS::Global::Resource::RState::SUCCESS) {
911         HILOG_WARN("%{public}s. Failed to GetColorById.", __func__);
912         bgColor = 0xdfffffff;
913     }
914     HILOG_DEBUG("%{public}s colorId is %{public}u, bgColor is %{public}u.", __func__, colorId, bgColor);
915 }
916 
InitColdStartingWindowResource(const std::shared_ptr<Global::Resource::ResourceManager> & resourceMgr)917 void AbilityRecord::InitColdStartingWindowResource(
918     const std::shared_ptr<Global::Resource::ResourceManager> &resourceMgr)
919 {
920     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
921     if (!resourceMgr) {
922         HILOG_ERROR("invalid resourceManager.");
923         return;
924     }
925 
926     startingWindowBg_ = GetPixelMap(static_cast<uint32_t>(abilityInfo_.startWindowIconId), resourceMgr);
927     if (resourceMgr->GetColorById(static_cast<uint32_t>(abilityInfo_.startWindowBackgroundId), bgColor_) !=
928         OHOS::Global::Resource::RState::SUCCESS) {
929         HILOG_WARN("%{public}s. Failed to GetColorById.", __func__);
930         bgColor_ = 0xdfffffff;
931     }
932 
933     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
934     if (startingWindowBg_ && handler) {
935         auto delayTask = [me = weak_from_this()] {
936             auto self = me.lock();
937             if (!self || !self->startingWindowBg_) {
938                 return;
939             }
940             self->startingWindowBg_.reset();
941         };
942         handler->PostTask(delayTask, "release_bg", RELEASE_STARTING_BG_TIMEOUT);
943     }
944 }
945 
SetCompleteFirstFrameDrawing(const bool flag)946 void AbilityRecord::SetCompleteFirstFrameDrawing(const bool flag)
947 {
948     isCompleteFirstFrameDrawing_ = flag;
949 }
950 
IsCompleteFirstFrameDrawing() const951 bool AbilityRecord::IsCompleteFirstFrameDrawing() const
952 {
953     return isCompleteFirstFrameDrawing_;
954 }
955 #endif
956 
BackgroundAbility(const Closure & task)957 void AbilityRecord::BackgroundAbility(const Closure &task)
958 {
959     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
960     HILOG_INFO("Move the ability to background, ability:%{public}s.", abilityInfo_.name.c_str());
961     if (lifecycleDeal_ == nullptr) {
962         HILOG_ERROR("Move the ability to background fail, lifecycleDeal_ is null.");
963         return;
964     }
965     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
966     if (handler && task) {
967         if (!want_.GetBoolParam(DEBUG_APP, false)) {
968             g_abilityRecordEventId_++;
969             eventId_ = g_abilityRecordEventId_;
970             // eventId_ is a unique id of the task.
971             handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::BACKGROUND_TIMEOUT);
972         } else {
973             HILOG_INFO("Is debug mode, no need to handle time out.");
974         }
975     }
976 
977     if (!IsTerminating() || IsRestarting()) {
978         // schedule save ability state before moving to background.
979         SaveAbilityState();
980     }
981 
982     // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
983     // earlier than above actions.
984     currentState_ = AbilityState::BACKGROUNDING;
985     lifecycleDeal_->BackgroundNew(want_, lifeCycleStateInfo_);
986 }
987 
TerminateAbility()988 int AbilityRecord::TerminateAbility()
989 {
990     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
991     HILOG_INFO("Schedule terminate ability to AppMs, ability:%{public}s.", abilityInfo_.name.c_str());
992     HandleDlpClosed();
993     AAFwk::EventInfo eventInfo;
994     eventInfo.bundleName = GetAbilityInfo().bundleName;
995     eventInfo.abilityName = GetAbilityInfo().name;
996     AAFwk::EventReport::SendAbilityEvent(AAFwk::EventName::TERMINATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
997     eventInfo.errCode = DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(token_, clearMissionFlag_);
998     if (eventInfo.errCode != ERR_OK) {
999         AAFwk::EventReport::SendAbilityEvent(
1000             AAFwk::EventName::TERMINATE_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1001     }
1002     return eventInfo.errCode;
1003 }
1004 
GetAbilityInfo() const1005 const AppExecFwk::AbilityInfo &AbilityRecord::GetAbilityInfo() const
1006 {
1007     return abilityInfo_;
1008 }
1009 
GetApplicationInfo() const1010 const AppExecFwk::ApplicationInfo &AbilityRecord::GetApplicationInfo() const
1011 {
1012     return applicationInfo_;
1013 }
1014 
GetAbilityState() const1015 AbilityState AbilityRecord::GetAbilityState() const
1016 {
1017     return currentState_;
1018 }
1019 
IsForeground() const1020 bool AbilityRecord::IsForeground() const
1021 {
1022     return currentState_ == AbilityState::FOREGROUND || currentState_ == AbilityState::FOREGROUNDING;
1023 }
1024 
SetAbilityState(AbilityState state)1025 void AbilityRecord::SetAbilityState(AbilityState state)
1026 {
1027     currentState_ = state;
1028     if (state == AbilityState::FOREGROUND || state == AbilityState::ACTIVE || state == AbilityState::BACKGROUND) {
1029         SetRestarting(false);
1030     }
1031 }
1032 
SetScheduler(const sptr<IAbilityScheduler> & scheduler)1033 void AbilityRecord::SetScheduler(const sptr<IAbilityScheduler> &scheduler)
1034 {
1035     HILOG_INFO("%{public}s", __func__);
1036     CHECK_POINTER(lifecycleDeal_);
1037     if (scheduler != nullptr) {
1038         if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1039             auto schedulerObject = scheduler_->AsObject();
1040             if (schedulerObject != nullptr) {
1041                 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1042             }
1043         }
1044         if (schedulerDeathRecipient_ == nullptr) {
1045             std::weak_ptr<AbilityRecord> thisWeakPtr(shared_from_this());
1046             schedulerDeathRecipient_ =
1047                 new AbilitySchedulerRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1048                     auto abilityRecord = thisWeakPtr.lock();
1049                     if (abilityRecord) {
1050                         abilityRecord->OnSchedulerDied(remote);
1051                     }
1052                 });
1053         }
1054         isReady_ = true;
1055         scheduler_ = scheduler;
1056         lifecycleDeal_->SetScheduler(scheduler);
1057         auto schedulerObject = scheduler_->AsObject();
1058         if (schedulerObject != nullptr) {
1059             schedulerObject->AddDeathRecipient(schedulerDeathRecipient_);
1060         }
1061         pid_ = static_cast<int32_t>(IPCSkeleton::GetCallingPid()); // set pid when ability attach to service.
1062         HandleDlpAttached();
1063     } else {
1064         HILOG_ERROR("scheduler is nullptr");
1065         isReady_ = false;
1066         isWindowAttached_ = false;
1067         SetIsNewWant(false);
1068         if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1069             auto schedulerObject = scheduler_->AsObject();
1070             if (schedulerObject != nullptr) {
1071                 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1072             }
1073         }
1074         scheduler_ = scheduler;
1075         pid_ = 0;
1076     }
1077 }
1078 
GetToken() const1079 sptr<Token> AbilityRecord::GetToken() const
1080 {
1081     return token_;
1082 }
1083 
SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)1084 void AbilityRecord::SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
1085 {
1086     preAbilityRecord_ = abilityRecord;
1087 }
1088 
GetPreAbilityRecord() const1089 std::shared_ptr<AbilityRecord> AbilityRecord::GetPreAbilityRecord() const
1090 {
1091     return preAbilityRecord_.lock();
1092 }
1093 
SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)1094 void AbilityRecord::SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
1095 {
1096     nextAbilityRecord_ = abilityRecord;
1097 }
1098 
GetNextAbilityRecord() const1099 std::shared_ptr<AbilityRecord> AbilityRecord::GetNextAbilityRecord() const
1100 {
1101     return nextAbilityRecord_.lock();
1102 }
1103 
SetEventId(int64_t eventId)1104 void AbilityRecord::SetEventId(int64_t eventId)
1105 {
1106     eventId_ = eventId;
1107 }
1108 
GetEventId() const1109 int64_t AbilityRecord::GetEventId() const
1110 {
1111     return eventId_;
1112 }
1113 
IsReady() const1114 bool AbilityRecord::IsReady() const
1115 {
1116     return isReady_;
1117 }
1118 
1119 #ifdef SUPPORT_GRAPHICS
IsWindowAttached() const1120 bool AbilityRecord::IsWindowAttached() const
1121 {
1122     return isWindowAttached_;
1123 }
1124 #endif
1125 
IsLauncherAbility() const1126 bool AbilityRecord::IsLauncherAbility() const
1127 {
1128     return isLauncherAbility_;
1129 }
1130 
IsTerminating() const1131 bool AbilityRecord::IsTerminating() const
1132 {
1133     return isTerminating_;
1134 }
1135 
SetTerminatingState()1136 void AbilityRecord::SetTerminatingState()
1137 {
1138     isTerminating_ = true;
1139 }
1140 
IsNewWant() const1141 bool AbilityRecord::IsNewWant() const
1142 {
1143     return lifeCycleStateInfo_.isNewWant;
1144 }
1145 
SetIsNewWant(bool isNewWant)1146 void AbilityRecord::SetIsNewWant(bool isNewWant)
1147 {
1148     lifeCycleStateInfo_.isNewWant = isNewWant;
1149 }
1150 
IsCreateByConnect() const1151 bool AbilityRecord::IsCreateByConnect() const
1152 {
1153     return isCreateByConnect_;
1154 }
1155 
SetCreateByConnectMode()1156 void AbilityRecord::SetCreateByConnectMode()
1157 {
1158     isCreateByConnect_ = true;
1159 }
1160 
Activate()1161 void AbilityRecord::Activate()
1162 {
1163     HILOG_INFO("Activate.");
1164     CHECK_POINTER(lifecycleDeal_);
1165 
1166     SendEvent(AbilityManagerService::ACTIVE_TIMEOUT_MSG, AbilityManagerService::ACTIVE_TIMEOUT);
1167 
1168     // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
1169     // earlier than above actions.
1170     currentState_ = AbilityState::ACTIVATING;
1171     lifecycleDeal_->Activate(want_, lifeCycleStateInfo_);
1172 
1173     // update ability state to appMgr service when restart
1174     if (IsNewWant()) {
1175         sptr<Token> preToken = nullptr;
1176         if (GetPreAbilityRecord()) {
1177             preToken = GetPreAbilityRecord()->GetToken();
1178         }
1179         DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
1180     }
1181 }
1182 
Inactivate()1183 void AbilityRecord::Inactivate()
1184 {
1185     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1186     HILOG_INFO("Inactivate ability start, ability:%{public}s.", abilityInfo_.name.c_str());
1187     CHECK_POINTER(lifecycleDeal_);
1188 
1189     SendEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, AbilityManagerService::INACTIVE_TIMEOUT);
1190 
1191     // schedule inactive after updating AbilityState and sending timeout message to avoid ability async callback
1192     // earlier than above actions.
1193     currentState_ = AbilityState::INACTIVATING;
1194     lifecycleDeal_->Inactivate(want_, lifeCycleStateInfo_);
1195 }
1196 
Terminate(const Closure & task)1197 void AbilityRecord::Terminate(const Closure &task)
1198 {
1199     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1200     HILOG_INFO("Begin to terminate ability, ability:%{public}s.", abilityInfo_.name.c_str());
1201     CHECK_POINTER(lifecycleDeal_);
1202     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1203     if (handler && task) {
1204         if (!want_.GetBoolParam(DEBUG_APP, false)) {
1205             g_abilityRecordEventId_++;
1206             eventId_ = g_abilityRecordEventId_;
1207             // eventId_ is a unique id of the task.
1208             handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::TERMINATE_TIMEOUT);
1209         } else if (applicationInfo_.asanEnabled) {
1210             g_abilityRecordEventId_++;
1211             eventId_ = g_abilityRecordEventId_;
1212             handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::TERMINATE_TIMEOUT_ASANENABLED);
1213         } else {
1214             HILOG_INFO("Is debug mode, no need to handle time out.");
1215         }
1216     }
1217     // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
1218     // earlier than above actions.
1219     currentState_ = AbilityState::TERMINATING;
1220     lifecycleDeal_->Terminate(want_, lifeCycleStateInfo_);
1221 }
1222 
ConnectAbility()1223 void AbilityRecord::ConnectAbility()
1224 {
1225     HILOG_INFO("Connect ability.");
1226     CHECK_POINTER(lifecycleDeal_);
1227     lifecycleDeal_->ConnectAbility(want_);
1228 }
1229 
DisconnectAbility()1230 void AbilityRecord::DisconnectAbility()
1231 {
1232     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1233     HILOG_INFO("Disconnect ability, ability:%{public}s.", abilityInfo_.name.c_str());
1234     CHECK_POINTER(lifecycleDeal_);
1235     lifecycleDeal_->DisconnectAbility(want_);
1236 }
1237 
CommandAbility()1238 void AbilityRecord::CommandAbility()
1239 {
1240     HILOG_INFO("Command ability, startId_:%{public}d.", startId_);
1241     CHECK_POINTER(lifecycleDeal_);
1242     lifecycleDeal_->CommandAbility(want_, false, startId_);
1243 }
1244 
SaveAbilityState()1245 void AbilityRecord::SaveAbilityState()
1246 {
1247     HILOG_INFO("%{public}s", __func__);
1248     CHECK_POINTER(lifecycleDeal_);
1249     lifecycleDeal_->SaveAbilityState();
1250 }
1251 
SaveAbilityState(const PacMap & inState)1252 void AbilityRecord::SaveAbilityState(const PacMap &inState)
1253 {
1254     HILOG_INFO("%{public}s : pacmap save", __func__);
1255     stateDatas_ = inState;
1256 }
1257 
RestoreAbilityState()1258 void AbilityRecord::RestoreAbilityState()
1259 {
1260     HILOG_INFO("%{public}s", __func__);
1261     CHECK_POINTER(lifecycleDeal_);
1262     lifecycleDeal_->RestoreAbilityState(stateDatas_);
1263     stateDatas_.Clear();
1264     isRestarting_ = false;
1265 }
1266 
SetWant(const Want & want)1267 void AbilityRecord::SetWant(const Want &want)
1268 {
1269     want_ = want;
1270 }
1271 
GetWant() const1272 const Want &AbilityRecord::GetWant() const
1273 {
1274     return want_;
1275 }
1276 
GetRequestCode() const1277 int AbilityRecord::GetRequestCode() const
1278 {
1279     return requestCode_;
1280 }
1281 
SetResult(const std::shared_ptr<AbilityResult> & result)1282 void AbilityRecord::SetResult(const std::shared_ptr<AbilityResult> &result)
1283 {
1284     result_ = result;
1285 }
1286 
GetResult() const1287 std::shared_ptr<AbilityResult> AbilityRecord::GetResult() const
1288 {
1289     return result_;
1290 }
1291 
SendResult()1292 void AbilityRecord::SendResult()
1293 {
1294     HILOG_INFO("Send result to the caller, ability:%{public}s.", abilityInfo_.name.c_str());
1295     std::lock_guard<std::mutex> guard(lock_);
1296     CHECK_POINTER(scheduler_);
1297     CHECK_POINTER(result_);
1298     GrantUriPermission(result_->resultWant_, GetCurrentAccountId(), applicationInfo_.accessTokenId);
1299     scheduler_->SendResult(result_->requestCode_, result_->resultCode_, result_->resultWant_);
1300     // reset result to avoid send result next time
1301     result_.reset();
1302 }
1303 
SendResultToCallers()1304 void AbilityRecord::SendResultToCallers()
1305 {
1306     for (auto caller : GetCallerRecordList()) {
1307         if (caller == nullptr) {
1308             HILOG_WARN("Caller record is nullptr.");
1309             continue;
1310         }
1311         std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
1312         if (callerAbilityRecord != nullptr && callerAbilityRecord->GetResult() != nullptr) {
1313             callerAbilityRecord->SendResult();
1314         } else {
1315             std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord = caller->GetSaCaller();
1316             if (callerSystemAbilityRecord != nullptr) {
1317                 HILOG_INFO("Send result to system ability.");
1318                 callerSystemAbilityRecord->SendResultToSystemAbility(caller->GetRequestCode(),
1319                     callerSystemAbilityRecord->GetResultCode(), callerSystemAbilityRecord->GetResultWant(),
1320                     callerSystemAbilityRecord->GetCallerToken());
1321             }
1322         }
1323     }
1324 }
1325 
SaveResultToCallers(const int resultCode,const Want * resultWant)1326 void AbilityRecord::SaveResultToCallers(const int resultCode, const Want *resultWant)
1327 {
1328     auto callerRecordList = GetCallerRecordList();
1329     if (callerRecordList.empty()) {
1330         HILOG_WARN("callerRecordList is empty.");
1331         return;
1332     }
1333     auto latestCaller = callerRecordList.back();
1334     for (auto caller : callerRecordList) {
1335         if (caller == nullptr) {
1336             HILOG_WARN("Caller record is nullptr.");
1337             continue;
1338         }
1339         if (caller == latestCaller) {
1340             HILOG_INFO("Caller record is the latest.");
1341             SaveResult(resultCode, resultWant, caller);
1342             continue;
1343         }
1344         SaveResult(SEND_RESULT_CANCELED, resultWant, caller);
1345     }
1346 }
1347 
SaveResult(int resultCode,const Want * resultWant,std::shared_ptr<CallerRecord> caller)1348 void AbilityRecord::SaveResult(int resultCode, const Want *resultWant, std::shared_ptr<CallerRecord> caller)
1349 {
1350     std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
1351     if (callerAbilityRecord != nullptr) {
1352         callerAbilityRecord->SetResult(
1353             std::make_shared<AbilityResult>(caller->GetRequestCode(), resultCode, *resultWant));
1354     } else {
1355         std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord = caller->GetSaCaller();
1356         if (callerSystemAbilityRecord != nullptr) {
1357             HILOG_INFO("Caller is system ability.");
1358             Want* newWant = const_cast<Want*>(resultWant);
1359             callerSystemAbilityRecord->SetResultToSystemAbility(callerSystemAbilityRecord, *newWant,
1360                 resultCode);
1361         }
1362     }
1363 }
1364 
SetResultToSystemAbility(std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord,Want & resultWant,int resultCode)1365 void SystemAbilityCallerRecord::SetResultToSystemAbility(
1366     std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord,
1367     Want &resultWant, int resultCode)
1368 {
1369     std::vector<std::string> data;
1370     std::string srcAbilityId = callerSystemAbilityRecord->GetSrcAbilityId();
1371     SplitStr(srcAbilityId, "_", data);
1372     if (data.size() != VECTOR_SIZE) {
1373         HILOG_ERROR("Check data size failed");
1374         return;
1375     }
1376     std::string srcDeviceId = data[0];
1377     HILOG_DEBUG("Get srcDeviceId = %{public}s", srcDeviceId.c_str());
1378     int missionId = atoi(data[1].c_str());
1379     HILOG_INFO("Get missionId = %{public}d", missionId);
1380     resultWant.SetParam(DMS_SRC_NETWORK_ID, srcDeviceId);
1381     resultWant.SetParam(DMS_MISSION_ID, missionId);
1382     callerSystemAbilityRecord->SetResult(resultWant, resultCode);
1383 }
1384 
SendResultToSystemAbility(int requestCode,int resultCode,Want & resultWant,const sptr<IRemoteObject> & callerToken)1385 void SystemAbilityCallerRecord::SendResultToSystemAbility(int requestCode, int resultCode, Want &resultWant,
1386     const sptr<IRemoteObject> &callerToken)
1387 {
1388     HILOG_INFO("%{public}s", __func__);
1389     int32_t callerUid = IPCSkeleton::GetCallingUid();
1390     uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
1391     HILOG_INFO("Try to SendResult, callerUid = %{public}d, AccessTokenId = %{public}u",
1392         callerUid, accessToken);
1393     if (callerToken == nullptr) {
1394         HILOG_ERROR("CallerToken is nullptr");
1395         return;
1396     }
1397     MessageParcel data;
1398     if (!data.WriteInterfaceToken(SYSTEM_ABILITY_TOKEN_CALLBACK)) {
1399         HILOG_ERROR("SendResultToSystemAbility Write interface token failed.");
1400         return;
1401     }
1402     if (!data.WriteParcelable(&resultWant)) {
1403         HILOG_ERROR("fail to WriteParcelable");
1404         return;
1405     }
1406     data.WriteInt32(callerUid);
1407     data.WriteInt32(requestCode);
1408     data.WriteUint32(accessToken);
1409     data.WriteInt32(resultCode);
1410     MessageParcel reply;
1411     MessageOption option(MessageOption::TF_SYNC);
1412     int result = callerToken->SendRequest(ISystemAbilityTokenCallback::SEND_RESULT, data, reply, option);
1413     if (result != ERR_OK) {
1414         HILOG_ERROR("SendResultToSystemAbility error = %{public}d", result);
1415     }
1416 }
1417 
AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> & connRecord)1418 void AbilityRecord::AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> &connRecord)
1419 {
1420     CHECK_POINTER(connRecord);
1421     auto it = std::find(connRecordList_.begin(), connRecordList_.end(), connRecord);
1422     // found it
1423     if (it != connRecordList_.end()) {
1424         HILOG_DEBUG("Found it in list, so no need to add same connection");
1425         return;
1426     }
1427     // no found then add new connection to list
1428     HILOG_DEBUG("No found in list, so add new connection to list");
1429     connRecordList_.push_back(connRecord);
1430 }
1431 
GetConnectRecordList() const1432 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectRecordList() const
1433 {
1434     return connRecordList_;
1435 }
1436 
RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> & connRecord)1437 void AbilityRecord::RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> &connRecord)
1438 {
1439     CHECK_POINTER(connRecord);
1440     connRecordList_.remove(connRecord);
1441 }
1442 
AddCallerRecord(const sptr<IRemoteObject> & callerToken,int requestCode,std::string srcAbilityId)1443 void AbilityRecord::AddCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode, std::string srcAbilityId)
1444 {
1445     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1446     HILOG_INFO("Add caller record.");
1447     if (!srcAbilityId.empty() && IsSystemAbilityCall(callerToken)) {
1448         AddSystemAbilityCallerRecord(callerToken, requestCode, srcAbilityId);
1449         return;
1450     }
1451     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
1452     CHECK_POINTER(abilityRecord);
1453 
1454     auto isExist = [&abilityRecord](const std::shared_ptr<CallerRecord> &callerRecord) {
1455         return (callerRecord->GetCaller() == abilityRecord);
1456     };
1457 
1458     auto record = std::find_if(callerList_.begin(), callerList_.end(), isExist);
1459     if (record != callerList_.end()) {
1460         callerList_.erase(record);
1461     }
1462 
1463     callerList_.emplace_back(std::make_shared<CallerRecord>(requestCode, abilityRecord));
1464 
1465     lifeCycleStateInfo_.caller.requestCode = requestCode;
1466     lifeCycleStateInfo_.caller.deviceId = abilityRecord->GetAbilityInfo().deviceId;
1467     lifeCycleStateInfo_.caller.bundleName = abilityRecord->GetAbilityInfo().bundleName;
1468     lifeCycleStateInfo_.caller.abilityName = abilityRecord->GetAbilityInfo().name;
1469     HILOG_INFO("caller %{public}s, %{public}s",
1470         abilityRecord->GetAbilityInfo().bundleName.c_str(),
1471         abilityRecord->GetAbilityInfo().name.c_str());
1472 }
1473 
IsSystemAbilityCall(const sptr<IRemoteObject> & callerToken)1474 bool AbilityRecord::IsSystemAbilityCall(const sptr<IRemoteObject> &callerToken)
1475 {
1476     if (callerToken == nullptr) {
1477         return false;
1478     }
1479     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
1480     if (abilityRecord != nullptr) {
1481         return false;
1482     }
1483     auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(IPCSkeleton::GetCallingTokenID());
1484     bool isNativeCall = tokenType == Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE;
1485     if (!isNativeCall) {
1486         HILOG_INFO("Is not native call.");
1487         return false;
1488     }
1489     AccessToken::NativeTokenInfo nativeTokenInfo;
1490     int32_t result = AccessToken::AccessTokenKit::GetNativeTokenInfo(IPCSkeleton::GetCallingTokenID(),
1491         nativeTokenInfo);
1492     if (result == ERR_OK && nativeTokenInfo.processName == DMS_PROCESS_NAME) {
1493         HILOG_INFO("Is system ability call.");
1494         return true;
1495     }
1496     return false;
1497 }
1498 
AddSystemAbilityCallerRecord(const sptr<IRemoteObject> & callerToken,int requestCode,std::string srcAbilityId)1499 void AbilityRecord::AddSystemAbilityCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode,
1500     std::string srcAbilityId)
1501 {
1502     HILOG_INFO("Add system ability caller record.");
1503     std::shared_ptr<SystemAbilityCallerRecord> systemAbilityRecord =
1504         std::make_shared<SystemAbilityCallerRecord>(srcAbilityId, callerToken);
1505     auto isExist = [&srcAbilityId](const std::shared_ptr<CallerRecord> &callerRecord) {
1506         std::shared_ptr<SystemAbilityCallerRecord> saCaller = callerRecord->GetSaCaller();
1507         return (saCaller != nullptr && saCaller->GetSrcAbilityId() == srcAbilityId);
1508     };
1509     auto record = std::find_if(callerList_.begin(), callerList_.end(), isExist);
1510     if (record != callerList_.end()) {
1511         HILOG_INFO("Find same system ability caller record.");
1512         callerList_.erase(record);
1513     }
1514     callerList_.emplace_back(std::make_shared<CallerRecord>(requestCode, systemAbilityRecord));
1515     HILOG_INFO("Add system ability record end.");
1516 }
1517 
GetCallerRecordList() const1518 std::list<std::shared_ptr<CallerRecord>> AbilityRecord::GetCallerRecordList() const
1519 {
1520     return callerList_;
1521 }
1522 
GetCallerRecord() const1523 std::shared_ptr<AbilityRecord> AbilityRecord::GetCallerRecord() const
1524 {
1525     if (callerList_.empty()) {
1526         return nullptr;
1527     }
1528     return callerList_.back()->GetCaller();
1529 }
1530 
IsConnectListEmpty()1531 bool AbilityRecord::IsConnectListEmpty()
1532 {
1533     return connRecordList_.empty();
1534 }
1535 
GetConnectingRecord() const1536 std::shared_ptr<ConnectionRecord> AbilityRecord::GetConnectingRecord() const
1537 {
1538     auto connect =
1539         std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
1540             return record->GetConnectState() == ConnectionState::CONNECTING;
1541         });
1542     return (connect != connRecordList_.end()) ? *connect : nullptr;
1543 }
1544 
GetConnectingRecordList()1545 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectingRecordList()
1546 {
1547     std::list<std::shared_ptr<ConnectionRecord>> connectingList;
1548     for (auto record : connRecordList_) {
1549         if (record && record->GetConnectState() == ConnectionState::CONNECTING) {
1550             connectingList.push_back(record);
1551         }
1552     }
1553     return connectingList;
1554 }
1555 
GetDisconnectingRecord() const1556 std::shared_ptr<ConnectionRecord> AbilityRecord::GetDisconnectingRecord() const
1557 {
1558     auto connect =
1559         std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
1560             return record->GetConnectState() == ConnectionState::DISCONNECTING;
1561         });
1562     return (connect != connRecordList_.end()) ? *connect : nullptr;
1563 }
1564 
GetAbilityTypeString(std::string & typeStr)1565 void AbilityRecord::GetAbilityTypeString(std::string &typeStr)
1566 {
1567     AppExecFwk::AbilityType type = GetAbilityInfo().type;
1568     switch (type) {
1569 #ifdef SUPPORT_GRAPHICS
1570         case AppExecFwk::AbilityType::PAGE: {
1571             typeStr = "PAGE";
1572             break;
1573         }
1574 #endif
1575         case AppExecFwk::AbilityType::SERVICE: {
1576             typeStr = "SERVICE";
1577             break;
1578         }
1579         // for config.json type
1580         case AppExecFwk::AbilityType::DATA: {
1581             typeStr = "DATA";
1582             break;
1583         }
1584         default: {
1585             typeStr = "UNKNOWN";
1586             break;
1587         }
1588     }
1589 }
1590 
ConvertAbilityState(const AbilityState & state)1591 std::string AbilityRecord::ConvertAbilityState(const AbilityState &state)
1592 {
1593     auto it = stateToStrMap.find(state);
1594     if (it != stateToStrMap.end()) {
1595         return it->second;
1596     }
1597     return "INVALIDSTATE";
1598 }
1599 
ConvertAppState(const AppState & state)1600 std::string AbilityRecord::ConvertAppState(const AppState &state)
1601 {
1602     auto it = appStateToStrMap_.find(state);
1603     if (it != appStateToStrMap_.end()) {
1604         return it->second;
1605     }
1606     return "INVALIDSTATE";
1607 }
1608 
ConvertLifeCycleToAbilityState(const AbilityLifeCycleState & state)1609 int AbilityRecord::ConvertLifeCycleToAbilityState(const AbilityLifeCycleState &state)
1610 {
1611     auto it = convertStateMap.find(state);
1612     if (it != convertStateMap.end()) {
1613         return it->second;
1614     }
1615     return DEFAULT_INVAL_VALUE;
1616 }
1617 
Dump(std::vector<std::string> & info)1618 void AbilityRecord::Dump(std::vector<std::string> &info)
1619 {
1620     std::string dumpInfo = "      AbilityRecord ID #" + std::to_string(recordId_);
1621     info.push_back(dumpInfo);
1622     dumpInfo = "        app name [" + GetAbilityInfo().applicationName + "]";
1623     info.push_back(dumpInfo);
1624     dumpInfo = "        main name [" + GetAbilityInfo().name + "]";
1625     info.push_back(dumpInfo);
1626     dumpInfo = "        bundle name [" + GetAbilityInfo().bundleName + "]";
1627     info.push_back(dumpInfo);
1628     std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1629     dumpInfo = "        isKeepAlive: " + isKeepAlive;
1630     info.push_back(dumpInfo);
1631     // get ability type(unknown/page/service/provider)
1632     std::string typeStr;
1633     GetAbilityTypeString(typeStr);
1634     dumpInfo = "        ability type [" + typeStr + "]";
1635     info.push_back(dumpInfo);
1636     std::shared_ptr<AbilityRecord> preAbility = GetPreAbilityRecord();
1637     if (preAbility == nullptr) {
1638         dumpInfo = "        previous ability app name [NULL]";
1639         dumpInfo.append("\n");
1640         dumpInfo += "        previous ability file name [NULL]";
1641     } else {
1642         dumpInfo =
1643             "        previous ability app name [" + preAbility->GetAbilityInfo().applicationName + "]";
1644         dumpInfo.append("\n");
1645         dumpInfo += "        previous ability file name [" + preAbility->GetAbilityInfo().name + "]";
1646     }
1647     info.push_back(dumpInfo);
1648     std::shared_ptr<AbilityRecord> nextAbility = GetNextAbilityRecord();
1649     if (nextAbility == nullptr) {
1650         dumpInfo = "        next ability app name [NULL]";
1651         dumpInfo.append("\n");
1652         dumpInfo += "        next ability file name [NULL]";
1653     } else {
1654         dumpInfo =
1655             "        next ability app name [" + nextAbility->GetAbilityInfo().applicationName + "]";
1656         dumpInfo.append("\n");
1657         dumpInfo += "        next ability main name [" + nextAbility->GetAbilityInfo().name + "]";
1658     }
1659     info.push_back(dumpInfo);
1660     dumpInfo = "        state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + "  start time [" +
1661                std::to_string(startTime_) + "]";
1662     info.push_back(dumpInfo);
1663     dumpInfo = "        app state #" + AbilityRecord::ConvertAppState(appState_);
1664     info.push_back(dumpInfo);
1665     dumpInfo = "        ready #" + std::to_string(isReady_) + "  window attached #" +
1666                std::to_string(isWindowAttached_) + "  launcher #" + std::to_string(isLauncherAbility_);
1667     info.push_back(dumpInfo);
1668 
1669     if (isLauncherRoot_) {
1670         dumpInfo = "        can restart num #" + std::to_string(restartCount_);
1671         info.push_back(dumpInfo);
1672     }
1673 }
1674 
DumpAbilityState(std::vector<std::string> & info,bool isClient,const std::vector<std::string> & params)1675 void AbilityRecord::DumpAbilityState(
1676     std::vector<std::string> &info, bool isClient, const std::vector<std::string> &params)
1677 {
1678     HILOG_INFO("%{public}s begin.", __func__);
1679     std::string dumpInfo = "      AbilityRecord ID #" + std::to_string(recordId_);
1680     info.push_back(dumpInfo);
1681     dumpInfo = "        app name [" + GetAbilityInfo().applicationName + "]";
1682     info.push_back(dumpInfo);
1683     dumpInfo = "        main name [" + GetAbilityInfo().name + "]";
1684     info.push_back(dumpInfo);
1685     dumpInfo = "        bundle name [" + GetAbilityInfo().bundleName + "]";
1686     info.push_back(dumpInfo);
1687     std::string typeStr;
1688     GetAbilityTypeString(typeStr);
1689     dumpInfo = "        ability type [" + typeStr + "]";
1690     info.push_back(dumpInfo);
1691 
1692     dumpInfo = "        state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + "  start time [" +
1693                std::to_string(startTime_) + "]";
1694     info.push_back(dumpInfo);
1695     dumpInfo = "        app state #" + AbilityRecord::ConvertAppState(appState_);
1696     info.push_back(dumpInfo);
1697     dumpInfo = "        ready #" + std::to_string(isReady_) + "  window attached #" +
1698                std::to_string(isWindowAttached_) + "  launcher #" + std::to_string(isLauncherAbility_);
1699     info.push_back(dumpInfo);
1700     dumpInfo = "        callee connections: ";
1701     info.push_back(dumpInfo);
1702     if (callContainer_) {
1703         callContainer_->Dump(info);
1704     }
1705 
1706     std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1707     dumpInfo = "        isKeepAlive: " + isKeepAlive;
1708     info.push_back(dumpInfo);
1709     if (isLauncherRoot_) {
1710         dumpInfo = "        can restart num #" + std::to_string(restartCount_);
1711         info.push_back(dumpInfo);
1712     }
1713 
1714     // add dump client info
1715     DumpClientInfo(info, params, isClient, params.empty());
1716 }
1717 
SetStartTime()1718 void AbilityRecord::SetStartTime()
1719 {
1720     if (startTime_ == 0) {
1721         startTime_ = AbilityUtil::SystemTimeMillis();
1722     }
1723 }
1724 
GetStartTime() const1725 int64_t AbilityRecord::GetStartTime() const
1726 {
1727     return startTime_;
1728 }
1729 
DumpService(std::vector<std::string> & info,bool isClient) const1730 void AbilityRecord::DumpService(std::vector<std::string> &info, bool isClient) const
1731 {
1732     std::vector<std::string> params;
1733     DumpService(info, params, isClient);
1734 }
1735 
DumpService(std::vector<std::string> & info,std::vector<std::string> & params,bool isClient) const1736 void AbilityRecord::DumpService(std::vector<std::string> &info, std::vector<std::string> &params, bool isClient) const
1737 {
1738     info.emplace_back("      AbilityRecord ID #" + std::to_string(GetRecordId()) + "   state #" +
1739                       AbilityRecord::ConvertAbilityState(GetAbilityState()) + "   start time [" +
1740                       std::to_string(GetStartTime()) + "]");
1741     info.emplace_back("      main name [" + GetAbilityInfo().name + "]");
1742     info.emplace_back("      bundle name [" + GetAbilityInfo().bundleName + "]");
1743     info.emplace_back("      ability type [SERVICE]");
1744     info.emplace_back("      app state #" + AbilityRecord::ConvertAppState(appState_));
1745 
1746     std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1747     info.emplace_back("        isKeepAlive: " + isKeepAlive);
1748     if (isLauncherRoot_) {
1749         info.emplace_back("      can restart num #" + std::to_string(restartCount_));
1750     }
1751 
1752     info.emplace_back("      Connections: " + std::to_string(connRecordList_.size()));
1753     for (auto &&conn : connRecordList_) {
1754         if (conn) {
1755             conn->Dump(info);
1756         }
1757     }
1758     // add dump client info
1759     DumpClientInfo(info, params, isClient);
1760 }
1761 
OnSchedulerDied(const wptr<IRemoteObject> & remote)1762 void AbilityRecord::OnSchedulerDied(const wptr<IRemoteObject> &remote)
1763 {
1764     HILOG_WARN("On scheduler died.");
1765     auto mission = GetMission();
1766     if (mission) {
1767         HILOG_WARN("On scheduler died. Is app not response Reason:%{public}d", mission->IsANRState());
1768     }
1769     std::lock_guard<std::mutex> guard(lock_);
1770     CHECK_POINTER(scheduler_);
1771 
1772     auto object = remote.promote();
1773     CHECK_POINTER(object);
1774 
1775     if (object != scheduler_->AsObject()) {
1776         HILOG_ERROR("Ability on scheduler died: scheduler is not matches with remote.");
1777         return;
1778     }
1779 
1780     RemoveUriPermission();
1781     if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1782         auto schedulerObject = scheduler_->AsObject();
1783         if (schedulerObject != nullptr) {
1784             schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1785         }
1786     }
1787     CHECK_POINTER(lifecycleDeal_);
1788     lifecycleDeal_->SetScheduler(nullptr);
1789     isWindowAttached_ = false;
1790 
1791     auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
1792     CHECK_POINTER(abilityManagerService);
1793 
1794     auto handler = abilityManagerService->GetEventHandler();
1795     CHECK_POINTER(handler);
1796 
1797     HILOG_INFO("Ability on scheduler died: '%{public}s'", abilityInfo_.name.c_str());
1798     auto task = [abilityManagerService, ability = shared_from_this()]() {
1799         abilityManagerService->OnAbilityDied(ability);
1800     };
1801     handler->PostTask(task);
1802     auto uriTask = [want = want_, ability = shared_from_this()]() {
1803         ability->SaveResultToCallers(-1, &want);
1804         ability->SendResultToCallers();
1805     };
1806     handler->PostTask(uriTask);
1807     HandleDlpClosed();
1808 }
1809 
SetConnRemoteObject(const sptr<IRemoteObject> & remoteObject)1810 void AbilityRecord::SetConnRemoteObject(const sptr<IRemoteObject> &remoteObject)
1811 {
1812     connRemoteObject_ = remoteObject;
1813 }
1814 
GetConnRemoteObject() const1815 sptr<IRemoteObject> AbilityRecord::GetConnRemoteObject() const
1816 {
1817     return connRemoteObject_;
1818 }
1819 
AddStartId()1820 void AbilityRecord::AddStartId()
1821 {
1822     startId_++;
1823 }
GetStartId() const1824 int AbilityRecord::GetStartId() const
1825 {
1826     return startId_;
1827 }
1828 
SetIsUninstallAbility()1829 void AbilityRecord::SetIsUninstallAbility()
1830 {
1831     isUninstall_ = true;
1832 }
1833 
IsUninstallAbility() const1834 bool AbilityRecord::IsUninstallAbility() const
1835 {
1836     return isUninstall_;
1837 }
1838 
SetLauncherRoot()1839 void AbilityRecord::SetLauncherRoot()
1840 {
1841     isLauncherRoot_ = true;
1842 }
1843 
IsLauncherRoot() const1844 bool AbilityRecord::IsLauncherRoot() const
1845 {
1846     return isLauncherRoot_;
1847 }
1848 
IsAbilityState(const AbilityState & state) const1849 bool AbilityRecord::IsAbilityState(const AbilityState &state) const
1850 {
1851     return (currentState_ == state);
1852 }
1853 
IsActiveState() const1854 bool AbilityRecord::IsActiveState() const
1855 {
1856     return (IsAbilityState(AbilityState::ACTIVE) || IsAbilityState(AbilityState::ACTIVATING) ||
1857             IsAbilityState(AbilityState::INITIAL) || IsAbilityState(AbilityState::FOREGROUND) ||
1858             IsAbilityState(AbilityState::FOREGROUNDING));
1859 }
1860 
SendEvent(uint32_t msg,uint32_t timeOut)1861 void AbilityRecord::SendEvent(uint32_t msg, uint32_t timeOut)
1862 {
1863     if (want_.GetBoolParam(DEBUG_APP, false)) {
1864         HILOG_INFO("Is debug mode, no need to handle time out.");
1865         return;
1866     }
1867     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1868     CHECK_POINTER(handler);
1869 
1870     g_abilityRecordEventId_++;
1871     eventId_ = g_abilityRecordEventId_;
1872     handler->SendEvent(msg, eventId_, timeOut);
1873 }
1874 
SetStartSetting(const std::shared_ptr<AbilityStartSetting> & setting)1875 void AbilityRecord::SetStartSetting(const std::shared_ptr<AbilityStartSetting> &setting)
1876 {
1877     lifeCycleStateInfo_.setting = setting;
1878 }
1879 
GetStartSetting() const1880 std::shared_ptr<AbilityStartSetting> AbilityRecord::GetStartSetting() const
1881 {
1882     return lifeCycleStateInfo_.setting;
1883 }
1884 
SetRestarting(const bool isRestart)1885 void AbilityRecord::SetRestarting(const bool isRestart)
1886 {
1887     isRestarting_ = isRestart;
1888     HILOG_DEBUG("SetRestarting: %{public}d", isRestarting_);
1889     if ((isLauncherRoot_ && IsLauncherAbility()) || isKeepAlive_) {
1890         restartCount_ = isRestart ? (--restartCount_) : restartMax_;
1891         HILOG_INFO("root launcher or resident process's restart count: %{public}d", restartCount_);
1892     }
1893 }
1894 
SetRestarting(const bool isRestart,int32_t canRestartCount)1895 void AbilityRecord::SetRestarting(const bool isRestart, int32_t canRestartCount)
1896 {
1897     isRestarting_ = isRestart;
1898     HILOG_DEBUG("SetRestarting: %{public}d, restart count: %{public}d", isRestarting_, canRestartCount);
1899 
1900     if ((isLauncherRoot_ && IsLauncherAbility()) || isKeepAlive_) {
1901         restartCount_ = isRestart ? canRestartCount : restartMax_;
1902         HILOG_INFO("root launcher or resident process's restart count: %{public}d", restartCount_);
1903     }
1904 }
1905 
GetRestartCount() const1906 int32_t AbilityRecord::GetRestartCount() const
1907 {
1908     return restartCount_;
1909 }
1910 
SetRestartCount(int32_t restartCount)1911 void AbilityRecord::SetRestartCount(int32_t restartCount)
1912 {
1913     restartCount_ = restartCount;
1914 }
1915 
IsRestarting() const1916 bool AbilityRecord::IsRestarting() const
1917 {
1918     return isRestarting_;
1919 }
1920 
SetKeepAlive()1921 void AbilityRecord::SetKeepAlive()
1922 {
1923     isKeepAlive_ = true;
1924 }
1925 
GetRestartTime()1926 int64_t AbilityRecord::GetRestartTime()
1927 {
1928     return restartTime_;
1929 }
1930 
SetRestartTime(const int64_t restartTime)1931 void AbilityRecord::SetRestartTime(const int64_t restartTime)
1932 {
1933     restartTime_ = restartTime;
1934 }
1935 
SetAppState(const AppState & state)1936 void AbilityRecord::SetAppState(const AppState &state)
1937 {
1938     appState_ = state;
1939 }
1940 
GetAppState() const1941 AppState AbilityRecord::GetAppState() const
1942 {
1943     return appState_;
1944 }
1945 
SetLaunchReason(const LaunchReason & reason)1946 void AbilityRecord::SetLaunchReason(const LaunchReason &reason)
1947 {
1948     lifeCycleStateInfo_.launchParam.launchReason = reason;
1949 }
1950 
SetLastExitReason(const LastExitReason & reason)1951 void AbilityRecord::SetLastExitReason(const LastExitReason &reason)
1952 {
1953     lifeCycleStateInfo_.launchParam.lastExitReason = reason;
1954 }
1955 
NotifyContinuationResult(int32_t result)1956 void AbilityRecord::NotifyContinuationResult(int32_t result)
1957 {
1958     HILOG_INFO("NotifyContinuationResult.");
1959     CHECK_POINTER(lifecycleDeal_);
1960 
1961     lifecycleDeal_->NotifyContinuationResult(result);
1962 }
1963 
GetOwnedMissionList() const1964 std::shared_ptr<MissionList> AbilityRecord::GetOwnedMissionList() const
1965 {
1966     return missionList_.lock();
1967 }
1968 
SetMissionList(const std::shared_ptr<MissionList> & missionList)1969 void AbilityRecord::SetMissionList(const std::shared_ptr<MissionList> &missionList)
1970 {
1971     missionList_ = missionList;
1972 }
1973 
SetMission(const std::shared_ptr<Mission> & mission)1974 void AbilityRecord::SetMission(const std::shared_ptr<Mission> &mission)
1975 {
1976     if (mission) {
1977         missionId_ = mission->GetMissionId();
1978         HILOG_INFO("SetMission come, missionId is %{public}d.", missionId_);
1979     }
1980     mission_ = mission;
1981 }
1982 
SetMinimizeReason(bool fromUser)1983 void AbilityRecord::SetMinimizeReason(bool fromUser)
1984 {
1985     minimizeReason_ = fromUser;
1986 }
1987 
SetAppIndex(const int32_t appIndex)1988 void AbilityRecord::SetAppIndex(const int32_t appIndex)
1989 {
1990     appIndex_ = appIndex;
1991 }
1992 
GetAppIndex() const1993 int32_t AbilityRecord::GetAppIndex() const
1994 {
1995     return appIndex_;
1996 }
1997 
IsMinimizeFromUser() const1998 bool AbilityRecord::IsMinimizeFromUser() const
1999 {
2000     return minimizeReason_;
2001 }
2002 
SetClearMissionFlag(bool clearMissionFlag)2003 void AbilityRecord::SetClearMissionFlag(bool clearMissionFlag)
2004 {
2005     clearMissionFlag_= clearMissionFlag;
2006 }
2007 
IsClearMissionFlag()2008 bool AbilityRecord::IsClearMissionFlag()
2009 {
2010     return clearMissionFlag_;
2011 }
2012 
GetMission() const2013 std::shared_ptr<Mission> AbilityRecord::GetMission() const
2014 {
2015     return mission_.lock();
2016 }
2017 
GetMissionId() const2018 int32_t AbilityRecord::GetMissionId() const
2019 {
2020     return missionId_;
2021 }
2022 
SetSpecifiedFlag(const std::string & flag)2023 void AbilityRecord::SetSpecifiedFlag(const std::string &flag)
2024 {
2025     specifiedFlag_ = flag;
2026 }
2027 
GetSpecifiedFlag() const2028 std::string AbilityRecord::GetSpecifiedFlag() const
2029 {
2030     return specifiedFlag_;
2031 }
2032 
2033 // new version  --start
IsStartedByCall() const2034 bool AbilityRecord::IsStartedByCall() const
2035 {
2036     return isStartedByCall_;
2037 }
2038 
SetStartedByCall(const bool isFlag)2039 void AbilityRecord::SetStartedByCall(const bool isFlag)
2040 {
2041     isStartedByCall_ = isFlag;
2042 }
2043 
IsStartToBackground() const2044 bool AbilityRecord::IsStartToBackground() const
2045 {
2046     return isStartToBackground_;
2047 }
2048 
SetStartToBackground(const bool flag)2049 void AbilityRecord::SetStartToBackground(const bool flag)
2050 {
2051     isStartToBackground_ = flag;
2052 }
2053 
IsStartToForeground() const2054 bool AbilityRecord::IsStartToForeground() const
2055 {
2056     return isStartToForeground_;
2057 }
2058 
SetStartToForeground(const bool flag)2059 void AbilityRecord::SetStartToForeground(const bool flag)
2060 {
2061     isStartToForeground_ = flag;
2062 }
2063 
CallRequest()2064 void AbilityRecord::CallRequest()
2065 {
2066     HILOG_INFO("Call Request.");
2067     CHECK_POINTER(scheduler_);
2068 
2069     GrantUriPermission(want_, GetCurrentAccountId(), applicationInfo_.accessTokenId);
2070     // Async call request
2071     scheduler_->CallRequest();
2072 }
2073 
CallRequestDone(const sptr<IRemoteObject> & callStub) const2074 bool AbilityRecord::CallRequestDone(const sptr<IRemoteObject> &callStub) const
2075 {
2076     CHECK_POINTER_RETURN_BOOL(callContainer_);
2077     if (!callContainer_->CallRequestDone(callStub)) {
2078         HILOG_ERROR("Call request failed.");
2079         return false;
2080     }
2081     return true;
2082 }
2083 
Resolve(const AbilityRequest & abilityRequest)2084 ResolveResultType AbilityRecord::Resolve(const AbilityRequest &abilityRequest)
2085 {
2086     auto callback = abilityRequest.connect;
2087     if (abilityRequest.callType != AbilityCallType::CALL_REQUEST_TYPE || !callback) {
2088         HILOG_ERROR("only start by call type can create a call record.");
2089         return ResolveResultType::NG_INNER_ERROR;
2090     }
2091     if (!callContainer_) {
2092         callContainer_ = std::make_shared<CallContainer>();
2093         if (!callContainer_) {
2094             HILOG_ERROR("mark_shared error.");
2095             return ResolveResultType::NG_INNER_ERROR;
2096         }
2097     }
2098 
2099     HILOG_DEBUG("create call record for this resolve. callerUid:%{public}d ,targetname:%{public}s",
2100         abilityRequest.callerUid,
2101         abilityRequest.abilityInfo.name.c_str());
2102 
2103     std::shared_ptr<CallRecord> callRecord = callContainer_->GetCallRecord(callback);
2104     if (!callRecord) {
2105         callRecord = CallRecord::CreateCallRecord(
2106             abilityRequest.callerUid, shared_from_this(), callback, abilityRequest.callerToken);
2107         if (!callRecord) {
2108             HILOG_ERROR("mark_shared error.");
2109             return ResolveResultType::NG_INNER_ERROR;
2110         }
2111     }
2112 
2113     callContainer_->AddCallRecord(callback, callRecord);
2114 
2115     if (callRecord->IsCallState(CallState::REQUESTED) && callRecord->GetCallStub()) {
2116         HILOG_DEBUG("this record has requested.");
2117         if (!callRecord->SchedulerConnectDone()) {
2118             HILOG_DEBUG("this callrecord has requested, but callback failed.");
2119             return ResolveResultType::NG_INNER_ERROR;
2120         }
2121         return ResolveResultType::OK_HAS_REMOTE_OBJ;
2122     }
2123 
2124     callRecord->SetCallState(CallState::REQUESTING);
2125     return ResolveResultType::OK_NO_REMOTE_OBJ;
2126 }
2127 
ReleaseCall(const sptr<IAbilityConnection> & connect)2128 bool AbilityRecord::ReleaseCall(const sptr<IAbilityConnection>& connect)
2129 {
2130     HILOG_DEBUG("ability release call record by callback.");
2131     CHECK_POINTER_RETURN_BOOL(callContainer_);
2132 
2133     return callContainer_->RemoveCallRecord(connect);
2134 }
2135 
IsNeedToCallRequest() const2136 bool AbilityRecord::IsNeedToCallRequest() const
2137 {
2138     HILOG_DEBUG("ability release call record by callback.");
2139     if (callContainer_ == nullptr) {
2140         return false;
2141     }
2142 
2143     return callContainer_->IsNeedToCallRequest();
2144 }
2145 
ContinueAbility(const std::string & deviceId,uint32_t versionCode)2146 void AbilityRecord::ContinueAbility(const std::string& deviceId, uint32_t versionCode)
2147 {
2148     HILOG_INFO("ContinueAbility.");
2149     CHECK_POINTER(lifecycleDeal_);
2150 
2151     lifecycleDeal_->ContinueAbility(deviceId, versionCode);
2152 }
2153 
SetSwitchingPause(bool state)2154 void AbilityRecord::SetSwitchingPause(bool state)
2155 {
2156     isSwitchingPause_ = state;
2157 }
2158 
IsSwitchingPause()2159 bool AbilityRecord::IsSwitchingPause()
2160 {
2161     return isSwitchingPause_;
2162 }
2163 
SetOwnerMissionUserId(int32_t userId)2164 void AbilityRecord::SetOwnerMissionUserId(int32_t userId)
2165 {
2166     ownerMissionUserId_ = userId;
2167 }
2168 
GetOwnerMissionUserId()2169 int32_t AbilityRecord::GetOwnerMissionUserId()
2170 {
2171     return ownerMissionUserId_;
2172 }
2173 
DumpClientInfo(std::vector<std::string> & info,const std::vector<std::string> & params,bool isClient,bool dumpConfig) const2174 void AbilityRecord::DumpClientInfo(std::vector<std::string> &info, const std::vector<std::string> &params,
2175     bool isClient, bool dumpConfig) const
2176 {
2177     if (!isClient || !scheduler_ || !isReady_) {
2178         HILOG_ERROR("something nullptr.");
2179         return;
2180     }
2181     std::unique_lock<std::mutex> lock(dumpLock_);
2182     scheduler_->DumpAbilityInfo(params, info);
2183 
2184     HILOG_INFO("Dump begin wait.");
2185     isDumpTimeout_ = false;
2186     std::chrono::milliseconds timeout { AbilityManagerService::DUMP_TIMEOUT };
2187     if (dumpCondition_.wait_for(lock, timeout) == std::cv_status::timeout) {
2188         isDumpTimeout_ = true;
2189     }
2190     HILOG_INFO("Dump done and begin parse.");
2191     if (!isDumpTimeout_) {
2192         std::lock_guard<std::mutex> infoLock(dumpInfoLock_);
2193         for (auto one : dumpInfos_) {
2194             info.emplace_back(one);
2195         }
2196     }
2197 
2198     if (!dumpConfig) {
2199         HILOG_INFO("not dumpConfig.");
2200         return;
2201     }
2202     AppExecFwk::Configuration config;
2203     if (DelayedSingleton<AppScheduler>::GetInstance()->GetConfiguration(config) == ERR_OK) {
2204         info.emplace_back("          configuration: " + config.GetName());
2205     }
2206 }
2207 
DumpAbilityInfoDone(std::vector<std::string> & infos)2208 void AbilityRecord::DumpAbilityInfoDone(std::vector<std::string> &infos)
2209 {
2210     HILOG_INFO("DumpAbilityInfoDone begin.");
2211     if (isDumpTimeout_) {
2212         HILOG_WARN("%{public}s, dump time out.", __func__);
2213         return;
2214     }
2215     {
2216         std::lock_guard<std::mutex> infoLock(dumpInfoLock_);
2217         dumpInfos_.clear();
2218         for (auto info : infos) {
2219             dumpInfos_.emplace_back(info);
2220         }
2221     }
2222     dumpCondition_.notify_all();
2223 }
2224 
GrantUriPermission(const Want & want,int32_t userId,uint32_t targetTokenId)2225 void AbilityRecord::GrantUriPermission(const Want &want, int32_t userId, uint32_t targetTokenId)
2226 {
2227     if ((want.GetFlags() & (Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION)) == 0) {
2228         HILOG_WARN("Do not call uriPermissionMgr.");
2229         return;
2230     }
2231 
2232     auto bms = AbilityUtil::GetBundleManager();
2233     CHECK_POINTER_IS_NULLPTR(bms);
2234     auto&& uriStr = want.GetUri().ToString();
2235     auto&& uriVec = want.GetStringArrayParam(AbilityConfig::PARAMS_STREAM);
2236     uriVec.emplace_back(uriStr);
2237     HILOG_DEBUG("GrantUriPermission uriVec size: %{public}zu", uriVec.size());
2238     auto upmClient = AAFwk::UriPermissionManagerClient::GetInstance();
2239     auto bundleFlag = AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO;
2240     auto fromTokenId = IPCSkeleton::GetCallingTokenID();
2241     for (auto&& str : uriVec) {
2242         Uri uri(str);
2243         auto&& scheme = uri.GetScheme();
2244         HILOG_INFO("uri scheme is %{public}s.", scheme.c_str());
2245         // only support file scheme
2246         if (scheme != "file") {
2247             HILOG_WARN("only support file uri.");
2248             continue;
2249         }
2250         auto&& authority = uri.GetAuthority();
2251         HILOG_INFO("uri authority is %{public}s.", authority.c_str());
2252         AppExecFwk::BundleInfo uriBundleInfo;
2253         if (!IN_PROCESS_CALL(bms->GetBundleInfo(authority, bundleFlag, uriBundleInfo, userId))) {
2254             HILOG_WARN("To fail to get bundle info according to uri.");
2255             continue;
2256         }
2257         if (uriBundleInfo.applicationInfo.accessTokenId != fromTokenId &&
2258             uriBundleInfo.applicationInfo.accessTokenId != callerAccessTokenId_) {
2259             HILOG_ERROR("the uri does not belong to caller.");
2260             continue;
2261         }
2262         auto ret = IN_PROCESS_CALL(upmClient->GrantUriPermission(uri, want.GetFlags(),
2263             callerAccessTokenId_, targetTokenId));
2264         if (ret) {
2265             isGrantedUriPermission_ = true;
2266         }
2267     }
2268 }
2269 
RemoveUriPermission()2270 void AbilityRecord::RemoveUriPermission()
2271 {
2272     if (isGrantedUriPermission_) {
2273         HILOG_DEBUG("To remove uri permission.");
2274         auto upmClient = AAFwk::UriPermissionManagerClient::GetInstance();
2275         upmClient->RemoveUriPermission(applicationInfo_.accessTokenId);
2276         isGrantedUriPermission_ = false;
2277     }
2278 }
2279 
HandleDlpAttached()2280 void AbilityRecord::HandleDlpAttached()
2281 {
2282     if (abilityInfo_.bundleName == DLP_BUNDLE_NAME) {
2283         DelayedSingleton<ConnectionStateManager>::GetInstance()->AddDlpManager(shared_from_this());
2284     }
2285 
2286     if (appIndex_ > 0) {
2287         DelayedSingleton<ConnectionStateManager>::GetInstance()->AddDlpAbility(shared_from_this());
2288     }
2289 }
2290 
HandleDlpClosed()2291 void AbilityRecord::HandleDlpClosed()
2292 {
2293     if (abilityInfo_.bundleName == DLP_BUNDLE_NAME) {
2294         DelayedSingleton<ConnectionStateManager>::GetInstance()->RemoveDlpManager(shared_from_this());
2295     }
2296 
2297     if (appIndex_ > 0) {
2298         DelayedSingleton<ConnectionStateManager>::GetInstance()->RemoveDlpAbility(shared_from_this());
2299     }
2300 }
2301 
GetCurrentAccountId() const2302 int32_t AbilityRecord::GetCurrentAccountId() const
2303 {
2304     std::vector<int32_t> osActiveAccountIds;
2305     ErrCode ret = DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->
2306             QueryActiveOsAccountIds(osActiveAccountIds);
2307     if (ret != ERR_OK) {
2308         HILOG_ERROR("QueryActiveOsAccountIds failed.");
2309         return DEFAULT_USER_ID;
2310     }
2311     if (osActiveAccountIds.empty()) {
2312         HILOG_ERROR("QueryActiveOsAccountIds is empty, no accounts.");
2313         return DEFAULT_USER_ID;
2314     }
2315 
2316     return osActiveAccountIds.front();
2317 }
2318 
SetWindowMode(int32_t windowMode)2319 void AbilityRecord::SetWindowMode(int32_t windowMode)
2320 {
2321     want_.SetParam(Want::PARAM_RESV_WINDOW_MODE, windowMode);
2322 }
2323 
RemoveWindowMode()2324 void AbilityRecord::RemoveWindowMode()
2325 {
2326     want_.RemoveParam(Want::PARAM_RESV_WINDOW_MODE);
2327 }
2328 
SetPendingState(AbilityState state)2329 void AbilityRecord::SetPendingState(AbilityState state)
2330 {
2331     pendingState_.store(state);
2332 }
2333 
GetPendingState() const2334 AbilityState AbilityRecord::GetPendingState() const
2335 {
2336     return pendingState_.load();
2337 }
2338 
2339 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAbility()2340 int AbilityRecord::BlockAbility()
2341 {
2342     HILOG_INFO("BlockAbility.");
2343     if (scheduler_) {
2344         HILOG_INFO("scheduler_ begin to call BlockAbility %{public}s", __func__);
2345         return scheduler_->BlockAbility();
2346     }
2347     return ERR_NO_INIT;
2348 }
2349 #endif
2350 
IsNeedBackToOtherMissionStack()2351 bool AbilityRecord::IsNeedBackToOtherMissionStack()
2352 {
2353     return isNeedBackToOtherMissionStack_;
2354 }
2355 
SetNeedBackToOtherMissionStack(bool isNeedBackToOtherMissionStack)2356 void AbilityRecord::SetNeedBackToOtherMissionStack(bool isNeedBackToOtherMissionStack)
2357 {
2358     isNeedBackToOtherMissionStack_ = isNeedBackToOtherMissionStack;
2359 }
2360 
GetOtherMissionStackAbilityRecord() const2361 std::shared_ptr<AbilityRecord> AbilityRecord::GetOtherMissionStackAbilityRecord() const
2362 {
2363     return otherMissionStackAbilityRecord_.lock();
2364 }
2365 
SetOtherMissionStackAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)2366 void AbilityRecord::SetOtherMissionStackAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
2367 {
2368     otherMissionStackAbilityRecord_ = abilityRecord;
2369 }
2370 }  // namespace AAFwk
2371 }  // namespace OHOS
2372