• 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     handler->PostTask(delayTask, taskName, AbilityManagerService::LOAD_TIMEOUT);
691 }
692 
GetWMSHandler() const693 sptr<IWindowManagerServiceHandler> AbilityRecord::GetWMSHandler() const
694 {
695     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
696     if (!abilityMgr) {
697         HILOG_WARN("%{public}s, Get Ability Manager Service failed.", __func__);
698         return nullptr;
699     }
700     return abilityMgr->GetWMSHandler();
701 }
702 
SetWindowModeAndDisplayId(sptr<AbilityTransitionInfo> & info,const std::shared_ptr<Want> & want) const703 void AbilityRecord::SetWindowModeAndDisplayId(sptr<AbilityTransitionInfo> &info,
704     const std::shared_ptr<Want> &want) const
705 {
706     if (!want) {
707         HILOG_WARN("%{public}s, want is invalid.", __func__);
708         return;
709     }
710     auto mode = want->GetIntParam(Want::PARAM_RESV_WINDOW_MODE, -1);
711     auto displayId = want->GetIntParam(Want::PARAM_RESV_DISPLAY_ID, -1);
712     if (mode != -1) {
713         HILOG_INFO("%{public}s: origin window mode is %{public}d.", __func__, mode);
714         info->mode_ = static_cast<uint32_t>(mode);
715     }
716     if (displayId != -1) {
717         info->displayId_ = static_cast<uint64_t>(displayId);
718     }
719 }
720 
CreateAbilityTransitionInfo(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want) const721 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(
722     const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<Want> &want) const
723 {
724     sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
725     if (startOptions != nullptr) {
726         info->mode_ = static_cast<uint32_t>(startOptions->GetWindowMode());
727         HILOG_INFO("%{public}s: window mode is %{public}d.", __func__, info->mode_);
728         info->displayId_ = static_cast<uint64_t>(startOptions->GetDisplayID());
729     } else {
730         SetWindowModeAndDisplayId(info, want);
731     }
732     return info;
733 }
734 
CreateAbilityTransitionInfo(const AbilityRequest & abilityRequest) const735 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(const AbilityRequest &abilityRequest) const
736 {
737     sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
738     auto abilityStartSetting = abilityRequest.startSetting;
739     if (abilityStartSetting) {
740         auto windowMode = abilityStartSetting->GetProperty(AbilityStartSetting::WINDOW_MODE_KEY);
741         auto displayId = abilityStartSetting->GetProperty(AbilityStartSetting::WINDOW_DISPLAY_ID_KEY);
742         try {
743             info->mode_ = static_cast<uint32_t>(std::stoi(windowMode));
744             info->displayId_ = static_cast<uint64_t>(std::stoi(displayId));
745         } catch (...) {
746             HILOG_WARN("windowMode: stoi(%{public}s) failed", windowMode.c_str());
747             HILOG_WARN("displayId: stoi(%{public}s) failed", displayId.c_str());
748         }
749     } else {
750         SetWindowModeAndDisplayId(info, std::make_shared<Want>(abilityRequest.want));
751     }
752     return info;
753 }
754 
CreateResourceManager() const755 std::shared_ptr<Global::Resource::ResourceManager> AbilityRecord::CreateResourceManager() const
756 {
757     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
758     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
759     UErrorCode status = U_ZERO_ERROR;
760     icu::Locale locale = icu::Locale::forLanguageTag(Global::I18n::LocaleConfig::GetSystemLanguage(), status);
761     resConfig->SetLocaleInfo(locale);
762 
763     std::shared_ptr<Global::Resource::ResourceManager> resourceMgr(Global::Resource::CreateResourceManager());
764     resourceMgr->UpdateResConfig(*resConfig);
765 
766     std::string loadPath;
767     if (system::GetBoolParameter(AbilityRuntime::Constants::COMPRESS_PROPERTY, false) &&
768         !abilityInfo_.hapPath.empty()) {
769         loadPath = abilityInfo_.hapPath;
770     } else {
771         loadPath = abilityInfo_.resourcePath;
772     }
773 
774     if (loadPath.empty()) {
775         HILOG_WARN("Invalid app resource.");
776         return nullptr;
777     }
778 
779     if (!resourceMgr->AddResource(loadPath.c_str())) {
780         HILOG_WARN("%{public}s AddResource failed.", __func__);
781         return nullptr;
782     }
783     return resourceMgr;
784 }
785 
GetPixelMap(const uint32_t windowIconId,std::shared_ptr<Global::Resource::ResourceManager> resourceMgr) const786 std::shared_ptr<Media::PixelMap> AbilityRecord::GetPixelMap(const uint32_t windowIconId,
787     std::shared_ptr<Global::Resource::ResourceManager> resourceMgr) const
788 {
789     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
790     if (resourceMgr == nullptr) {
791         HILOG_WARN("%{public}s resource manager does not exist.", __func__);
792         return nullptr;
793     }
794 
795     Media::SourceOptions opts;
796     uint32_t errorCode = 0;
797     std::unique_ptr<Media::ImageSource> imageSource;
798     if (system::GetBoolParameter(AbilityRuntime::Constants::COMPRESS_PROPERTY, false) &&
799         !abilityInfo_.hapPath.empty()) { // hap is not unzip
800         std::unique_ptr<uint8_t[]> iconOut;
801         size_t len;
802         if (resourceMgr->GetMediaDataById(windowIconId, len, iconOut) != Global::Resource::RState::SUCCESS) {
803             return nullptr;
804         }
805         imageSource = Media::ImageSource::CreateImageSource(iconOut.get(), len, opts, errorCode);
806     } else { // already unzip hap
807         std::string iconPath;
808         if (resourceMgr->GetMediaById(windowIconId, iconPath) != Global::Resource::RState::SUCCESS) {
809             return nullptr;
810         }
811         imageSource = Media::ImageSource::CreateImageSource(iconPath, opts, errorCode);
812     }
813 
814     if (errorCode != 0 || imageSource == nullptr) {
815         HILOG_ERROR("Failed to create icon id %{private}d err %{public}d", windowIconId, errorCode);
816         return nullptr;
817     }
818 
819     Media::DecodeOptions decodeOpts;
820     auto pixelMapPtr = imageSource->CreatePixelMap(decodeOpts, errorCode);
821     if (errorCode != 0) {
822         HILOG_ERROR("Failed to create PixelMap id %{private}d err %{public}d", windowIconId, errorCode);
823         return nullptr;
824     }
825     HILOG_DEBUG("%{public}s OUT.", __func__);
826     return std::shared_ptr<Media::PixelMap>(pixelMapPtr.release());
827 }
828 
CreateAbilityTransitionInfo(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)829 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(
830     const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<Want> &want,
831     const AbilityRequest &abilityRequest)
832 {
833     sptr<AbilityTransitionInfo> info;
834     if (startOptions) {
835         info = CreateAbilityTransitionInfo(startOptions, want);
836     } else {
837         info = CreateAbilityTransitionInfo(abilityRequest);
838     }
839 
840     SetAbilityTransitionInfo(info);
841     SetStartingWindow(true);
842     return info;
843 }
844 
StartingWindowHot(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)845 void AbilityRecord::StartingWindowHot(const std::shared_ptr<StartOptions> &startOptions,
846     const std::shared_ptr<Want> &want, const AbilityRequest &abilityRequest)
847 {
848     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
849     HILOG_INFO("%{public}s was called.", __func__);
850     auto windowHandler = GetWMSHandler();
851     if (!windowHandler) {
852         HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
853         return;
854     }
855 
856     auto pixelMap = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetSnapshot(missionId_);
857     if (!pixelMap) {
858         HILOG_WARN("%{public}s, Get snapshot failed.", __func__);
859     }
860 
861     auto info = CreateAbilityTransitionInfo(startOptions, want, abilityRequest);
862     windowHandler->StartingWindow(info, pixelMap);
863 }
864 
StartingWindowCold(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)865 void AbilityRecord::StartingWindowCold(const std::shared_ptr<StartOptions> &startOptions,
866     const std::shared_ptr<Want> &want, const AbilityRequest &abilityRequest)
867 {
868     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
869     HILOG_INFO("%{public}s was called.", __func__);
870     auto windowHandler = GetWMSHandler();
871     if (!windowHandler) {
872         HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
873         return;
874     }
875 
876     // get bg pixelmap and color.
877     std::shared_ptr<Media::PixelMap> pixelMap = nullptr;
878     uint32_t bgColor = 0;
879     GetColdStartingWindowResource(pixelMap, bgColor);
880 
881     // start window
882     auto info = CreateAbilityTransitionInfo(startOptions, want, abilityRequest);
883     windowHandler->StartingWindow(info, pixelMap, bgColor);
884     startingWindowBg_.reset();
885 }
886 
GetColdStartingWindowResource(std::shared_ptr<Media::PixelMap> & bg,uint32_t & bgColor)887 void AbilityRecord::GetColdStartingWindowResource(std::shared_ptr<Media::PixelMap> &bg, uint32_t &bgColor)
888 {
889     bg = startingWindowBg_;
890     bgColor = bgColor_;
891     if (bg) {
892         return;
893     }
894 
895     auto resourceMgr = CreateResourceManager();
896     if (!resourceMgr) {
897         HILOG_WARN("%{public}s, Get resourceMgr failed.", __func__);
898         return;
899     }
900 
901     auto windowIconId = static_cast<uint32_t>(abilityInfo_.startWindowIconId);
902     bg = GetPixelMap(windowIconId, resourceMgr);
903 
904     auto colorId = static_cast<uint32_t>(abilityInfo_.startWindowBackgroundId);
905     auto colorErrval = resourceMgr->GetColorById(colorId, bgColor);
906     if (colorErrval != OHOS::Global::Resource::RState::SUCCESS) {
907         HILOG_WARN("%{public}s. Failed to GetColorById.", __func__);
908         bgColor = 0xdfffffff;
909     }
910     HILOG_DEBUG("%{public}s colorId is %{public}u, bgColor is %{public}u.", __func__, colorId, bgColor);
911 }
912 
InitColdStartingWindowResource(const std::shared_ptr<Global::Resource::ResourceManager> & resourceMgr)913 void AbilityRecord::InitColdStartingWindowResource(
914     const std::shared_ptr<Global::Resource::ResourceManager> &resourceMgr)
915 {
916     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
917     if (!resourceMgr) {
918         HILOG_ERROR("invalid resourceManager.");
919         return;
920     }
921 
922     startingWindowBg_ = GetPixelMap(static_cast<uint32_t>(abilityInfo_.startWindowIconId), resourceMgr);
923     if (resourceMgr->GetColorById(static_cast<uint32_t>(abilityInfo_.startWindowBackgroundId), bgColor_) !=
924         OHOS::Global::Resource::RState::SUCCESS) {
925         HILOG_WARN("%{public}s. Failed to GetColorById.", __func__);
926         bgColor_ = 0xdfffffff;
927     }
928 
929     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
930     if (startingWindowBg_ && handler) {
931         auto delayTask = [me = weak_from_this()] {
932             auto self = me.lock();
933             if (!self || !self->startingWindowBg_) {
934                 return;
935             }
936             self->startingWindowBg_.reset();
937         };
938         handler->PostTask(delayTask, "release_bg", RELEASE_STARTING_BG_TIMEOUT);
939     }
940 }
941 #endif
942 
BackgroundAbility(const Closure & task)943 void AbilityRecord::BackgroundAbility(const Closure &task)
944 {
945     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
946     HILOG_INFO("Move the ability to background, ability:%{public}s.", abilityInfo_.name.c_str());
947     if (lifecycleDeal_ == nullptr) {
948         HILOG_ERROR("Move the ability to background fail, lifecycleDeal_ is null.");
949         return;
950     }
951     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
952     if (handler && task) {
953         if (!want_.GetBoolParam(DEBUG_APP, false)) {
954             g_abilityRecordEventId_++;
955             eventId_ = g_abilityRecordEventId_;
956             // eventId_ is a unique id of the task.
957             handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::BACKGROUND_TIMEOUT);
958         } else {
959             HILOG_INFO("Is debug mode, no need to handle time out.");
960         }
961     }
962 
963     if (!IsTerminating() || IsRestarting()) {
964         // schedule save ability state before moving to background.
965         SaveAbilityState();
966     }
967 
968     // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
969     // earlier than above actions.
970     currentState_ = AbilityState::BACKGROUNDING;
971     lifecycleDeal_->BackgroundNew(want_, lifeCycleStateInfo_);
972 }
973 
TerminateAbility()974 int AbilityRecord::TerminateAbility()
975 {
976     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
977     HILOG_INFO("Schedule terminate ability to AppMs, ability:%{public}s.", abilityInfo_.name.c_str());
978     HandleDlpClosed();
979     AAFwk::EventInfo eventInfo;
980     eventInfo.bundleName = GetAbilityInfo().bundleName;
981     eventInfo.abilityName = GetAbilityInfo().name;
982     AAFwk::EventReport::SendAbilityEvent(AAFwk::EventName::TERMINATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
983     eventInfo.errCode = DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(token_, clearMissionFlag_);
984     if (eventInfo.errCode != ERR_OK) {
985         AAFwk::EventReport::SendAbilityEvent(
986             AAFwk::EventName::TERMINATE_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
987     }
988     return eventInfo.errCode;
989 }
990 
GetAbilityInfo() const991 const AppExecFwk::AbilityInfo &AbilityRecord::GetAbilityInfo() const
992 {
993     return abilityInfo_;
994 }
995 
GetApplicationInfo() const996 const AppExecFwk::ApplicationInfo &AbilityRecord::GetApplicationInfo() const
997 {
998     return applicationInfo_;
999 }
1000 
GetAbilityState() const1001 AbilityState AbilityRecord::GetAbilityState() const
1002 {
1003     return currentState_;
1004 }
1005 
IsForeground() const1006 bool AbilityRecord::IsForeground() const
1007 {
1008     return currentState_ == AbilityState::FOREGROUND || currentState_ == AbilityState::FOREGROUNDING;
1009 }
1010 
SetAbilityState(AbilityState state)1011 void AbilityRecord::SetAbilityState(AbilityState state)
1012 {
1013     currentState_ = state;
1014     if (state == AbilityState::FOREGROUND || state == AbilityState::ACTIVE || state == AbilityState::BACKGROUND) {
1015         SetRestarting(false);
1016     }
1017 }
1018 
SetScheduler(const sptr<IAbilityScheduler> & scheduler)1019 void AbilityRecord::SetScheduler(const sptr<IAbilityScheduler> &scheduler)
1020 {
1021     HILOG_INFO("%{public}s", __func__);
1022     CHECK_POINTER(lifecycleDeal_);
1023     if (scheduler != nullptr) {
1024         if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1025             auto schedulerObject = scheduler_->AsObject();
1026             if (schedulerObject != nullptr) {
1027                 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1028             }
1029         }
1030         if (schedulerDeathRecipient_ == nullptr) {
1031             std::weak_ptr<AbilityRecord> thisWeakPtr(shared_from_this());
1032             schedulerDeathRecipient_ =
1033                 new AbilitySchedulerRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1034                     auto abilityRecord = thisWeakPtr.lock();
1035                     if (abilityRecord) {
1036                         abilityRecord->OnSchedulerDied(remote);
1037                     }
1038                 });
1039         }
1040         isReady_ = true;
1041         scheduler_ = scheduler;
1042         lifecycleDeal_->SetScheduler(scheduler);
1043         auto schedulerObject = scheduler_->AsObject();
1044         if (schedulerObject != nullptr) {
1045             schedulerObject->AddDeathRecipient(schedulerDeathRecipient_);
1046         }
1047         pid_ = static_cast<int32_t>(IPCSkeleton::GetCallingPid()); // set pid when ability attach to service.
1048         HandleDlpAttached();
1049     } else {
1050         HILOG_ERROR("scheduler is nullptr");
1051         isReady_ = false;
1052         isWindowAttached_ = false;
1053         SetIsNewWant(false);
1054         if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1055             auto schedulerObject = scheduler_->AsObject();
1056             if (schedulerObject != nullptr) {
1057                 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1058             }
1059         }
1060         scheduler_ = scheduler;
1061         pid_ = 0;
1062     }
1063 }
1064 
GetToken() const1065 sptr<Token> AbilityRecord::GetToken() const
1066 {
1067     return token_;
1068 }
1069 
SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)1070 void AbilityRecord::SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
1071 {
1072     preAbilityRecord_ = abilityRecord;
1073 }
1074 
GetPreAbilityRecord() const1075 std::shared_ptr<AbilityRecord> AbilityRecord::GetPreAbilityRecord() const
1076 {
1077     return preAbilityRecord_.lock();
1078 }
1079 
SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)1080 void AbilityRecord::SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
1081 {
1082     nextAbilityRecord_ = abilityRecord;
1083 }
1084 
GetNextAbilityRecord() const1085 std::shared_ptr<AbilityRecord> AbilityRecord::GetNextAbilityRecord() const
1086 {
1087     return nextAbilityRecord_.lock();
1088 }
1089 
SetEventId(int64_t eventId)1090 void AbilityRecord::SetEventId(int64_t eventId)
1091 {
1092     eventId_ = eventId;
1093 }
1094 
GetEventId() const1095 int64_t AbilityRecord::GetEventId() const
1096 {
1097     return eventId_;
1098 }
1099 
IsReady() const1100 bool AbilityRecord::IsReady() const
1101 {
1102     return isReady_;
1103 }
1104 
1105 #ifdef SUPPORT_GRAPHICS
IsWindowAttached() const1106 bool AbilityRecord::IsWindowAttached() const
1107 {
1108     return isWindowAttached_;
1109 }
1110 #endif
1111 
IsLauncherAbility() const1112 bool AbilityRecord::IsLauncherAbility() const
1113 {
1114     return isLauncherAbility_;
1115 }
1116 
IsTerminating() const1117 bool AbilityRecord::IsTerminating() const
1118 {
1119     return isTerminating_;
1120 }
1121 
SetTerminatingState()1122 void AbilityRecord::SetTerminatingState()
1123 {
1124     isTerminating_ = true;
1125 }
1126 
IsNewWant() const1127 bool AbilityRecord::IsNewWant() const
1128 {
1129     return lifeCycleStateInfo_.isNewWant;
1130 }
1131 
SetIsNewWant(bool isNewWant)1132 void AbilityRecord::SetIsNewWant(bool isNewWant)
1133 {
1134     lifeCycleStateInfo_.isNewWant = isNewWant;
1135 }
1136 
IsCreateByConnect() const1137 bool AbilityRecord::IsCreateByConnect() const
1138 {
1139     return isCreateByConnect_;
1140 }
1141 
SetCreateByConnectMode()1142 void AbilityRecord::SetCreateByConnectMode()
1143 {
1144     isCreateByConnect_ = true;
1145 }
1146 
Activate()1147 void AbilityRecord::Activate()
1148 {
1149     HILOG_INFO("Activate.");
1150     CHECK_POINTER(lifecycleDeal_);
1151 
1152     SendEvent(AbilityManagerService::ACTIVE_TIMEOUT_MSG, AbilityManagerService::ACTIVE_TIMEOUT);
1153 
1154     // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
1155     // earlier than above actions.
1156     currentState_ = AbilityState::ACTIVATING;
1157     lifecycleDeal_->Activate(want_, lifeCycleStateInfo_);
1158 
1159     // update ability state to appMgr service when restart
1160     if (IsNewWant()) {
1161         sptr<Token> preToken = nullptr;
1162         if (GetPreAbilityRecord()) {
1163             preToken = GetPreAbilityRecord()->GetToken();
1164         }
1165         DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
1166     }
1167 }
1168 
Inactivate()1169 void AbilityRecord::Inactivate()
1170 {
1171     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1172     HILOG_INFO("Inactivate ability start, ability:%{public}s.", abilityInfo_.name.c_str());
1173     CHECK_POINTER(lifecycleDeal_);
1174 
1175     SendEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, AbilityManagerService::INACTIVE_TIMEOUT);
1176 
1177     // schedule inactive after updating AbilityState and sending timeout message to avoid ability async callback
1178     // earlier than above actions.
1179     currentState_ = AbilityState::INACTIVATING;
1180     lifecycleDeal_->Inactivate(want_, lifeCycleStateInfo_);
1181 }
1182 
Terminate(const Closure & task)1183 void AbilityRecord::Terminate(const Closure &task)
1184 {
1185     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1186     HILOG_INFO("Begin to terminate ability, ability:%{public}s.", abilityInfo_.name.c_str());
1187     CHECK_POINTER(lifecycleDeal_);
1188     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1189     if (handler && task) {
1190         if (!want_.GetBoolParam(DEBUG_APP, false)) {
1191             g_abilityRecordEventId_++;
1192             eventId_ = g_abilityRecordEventId_;
1193             // eventId_ is a unique id of the task.
1194             handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::TERMINATE_TIMEOUT);
1195         } else if (applicationInfo_.asanEnabled) {
1196             g_abilityRecordEventId_++;
1197             eventId_ = g_abilityRecordEventId_;
1198             handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::TERMINATE_TIMEOUT_ASANENABLED);
1199         } else {
1200             HILOG_INFO("Is debug mode, no need to handle time out.");
1201         }
1202     }
1203     // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
1204     // earlier than above actions.
1205     currentState_ = AbilityState::TERMINATING;
1206     lifecycleDeal_->Terminate(want_, lifeCycleStateInfo_);
1207 }
1208 
ConnectAbility()1209 void AbilityRecord::ConnectAbility()
1210 {
1211     HILOG_INFO("Connect ability.");
1212     CHECK_POINTER(lifecycleDeal_);
1213     lifecycleDeal_->ConnectAbility(want_);
1214 }
1215 
DisconnectAbility()1216 void AbilityRecord::DisconnectAbility()
1217 {
1218     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1219     HILOG_INFO("Disconnect ability, ability:%{public}s.", abilityInfo_.name.c_str());
1220     CHECK_POINTER(lifecycleDeal_);
1221     lifecycleDeal_->DisconnectAbility(want_);
1222 }
1223 
CommandAbility()1224 void AbilityRecord::CommandAbility()
1225 {
1226     HILOG_INFO("Command ability, startId_:%{public}d.", startId_);
1227     CHECK_POINTER(lifecycleDeal_);
1228     lifecycleDeal_->CommandAbility(want_, false, startId_);
1229 }
1230 
SaveAbilityState()1231 void AbilityRecord::SaveAbilityState()
1232 {
1233     HILOG_INFO("%{public}s", __func__);
1234     CHECK_POINTER(lifecycleDeal_);
1235     lifecycleDeal_->SaveAbilityState();
1236 }
1237 
SaveAbilityState(const PacMap & inState)1238 void AbilityRecord::SaveAbilityState(const PacMap &inState)
1239 {
1240     HILOG_INFO("%{public}s : pacmap save", __func__);
1241     stateDatas_ = inState;
1242 }
1243 
RestoreAbilityState()1244 void AbilityRecord::RestoreAbilityState()
1245 {
1246     HILOG_INFO("%{public}s", __func__);
1247     CHECK_POINTER(lifecycleDeal_);
1248     lifecycleDeal_->RestoreAbilityState(stateDatas_);
1249     stateDatas_.Clear();
1250     isRestarting_ = false;
1251 }
1252 
SetWant(const Want & want)1253 void AbilityRecord::SetWant(const Want &want)
1254 {
1255     want_ = want;
1256 }
1257 
GetWant() const1258 const Want &AbilityRecord::GetWant() const
1259 {
1260     return want_;
1261 }
1262 
GetRequestCode() const1263 int AbilityRecord::GetRequestCode() const
1264 {
1265     return requestCode_;
1266 }
1267 
SetResult(const std::shared_ptr<AbilityResult> & result)1268 void AbilityRecord::SetResult(const std::shared_ptr<AbilityResult> &result)
1269 {
1270     result_ = result;
1271 }
1272 
GetResult() const1273 std::shared_ptr<AbilityResult> AbilityRecord::GetResult() const
1274 {
1275     return result_;
1276 }
1277 
SendResult()1278 void AbilityRecord::SendResult()
1279 {
1280     HILOG_INFO("Send result to the caller, ability:%{public}s.", abilityInfo_.name.c_str());
1281     std::lock_guard<std::mutex> guard(lock_);
1282     CHECK_POINTER(scheduler_);
1283     CHECK_POINTER(result_);
1284     GrantUriPermission(result_->resultWant_, GetCurrentAccountId(), applicationInfo_.accessTokenId);
1285     scheduler_->SendResult(result_->requestCode_, result_->resultCode_, result_->resultWant_);
1286     // reset result to avoid send result next time
1287     result_.reset();
1288 }
1289 
SendResultToCallers()1290 void AbilityRecord::SendResultToCallers()
1291 {
1292     for (auto caller : GetCallerRecordList()) {
1293         if (caller == nullptr) {
1294             HILOG_WARN("Caller record is nullptr.");
1295             continue;
1296         }
1297         std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
1298         if (callerAbilityRecord != nullptr && callerAbilityRecord->GetResult() != nullptr) {
1299             callerAbilityRecord->SendResult();
1300         } else {
1301             std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord = caller->GetSaCaller();
1302             if (callerSystemAbilityRecord != nullptr) {
1303                 HILOG_INFO("Send result to system ability.");
1304                 callerSystemAbilityRecord->SendResultToSystemAbility(caller->GetRequestCode(),
1305                     callerSystemAbilityRecord->GetResultCode(), callerSystemAbilityRecord->GetResultWant(),
1306                     callerSystemAbilityRecord->GetCallerToken());
1307             }
1308         }
1309     }
1310 }
1311 
SaveResultToCallers(const int resultCode,const Want * resultWant)1312 void AbilityRecord::SaveResultToCallers(const int resultCode, const Want *resultWant)
1313 {
1314     auto callerRecordList = GetCallerRecordList();
1315     if (callerRecordList.empty()) {
1316         HILOG_WARN("callerRecordList is empty.");
1317         return;
1318     }
1319     auto latestCaller = callerRecordList.back();
1320     for (auto caller : callerRecordList) {
1321         if (caller == nullptr) {
1322             HILOG_WARN("Caller record is nullptr.");
1323             continue;
1324         }
1325         if (caller == latestCaller) {
1326             HILOG_INFO("Caller record is the latest.");
1327             SaveResult(resultCode, resultWant, caller);
1328             continue;
1329         }
1330         SaveResult(SEND_RESULT_CANCELED, resultWant, caller);
1331     }
1332 }
1333 
SaveResult(int resultCode,const Want * resultWant,std::shared_ptr<CallerRecord> caller)1334 void AbilityRecord::SaveResult(int resultCode, const Want *resultWant, std::shared_ptr<CallerRecord> caller)
1335 {
1336     std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
1337     if (callerAbilityRecord != nullptr) {
1338         callerAbilityRecord->SetResult(
1339             std::make_shared<AbilityResult>(caller->GetRequestCode(), resultCode, *resultWant));
1340     } else {
1341         std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord = caller->GetSaCaller();
1342         if (callerSystemAbilityRecord != nullptr) {
1343             HILOG_INFO("Caller is system ability.");
1344             Want* newWant = const_cast<Want*>(resultWant);
1345             callerSystemAbilityRecord->SetResultToSystemAbility(callerSystemAbilityRecord, *newWant,
1346                 resultCode);
1347         }
1348     }
1349 }
1350 
SetResultToSystemAbility(std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord,Want & resultWant,int resultCode)1351 void SystemAbilityCallerRecord::SetResultToSystemAbility(
1352     std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord,
1353     Want &resultWant, int resultCode)
1354 {
1355     std::vector<std::string> data;
1356     std::string srcAbilityId = callerSystemAbilityRecord->GetSrcAbilityId();
1357     SplitStr(srcAbilityId, "_", data);
1358     if (data.size() != VECTOR_SIZE) {
1359         HILOG_ERROR("Check data size failed");
1360         return;
1361     }
1362     std::string srcDeviceId = data[0];
1363     HILOG_DEBUG("Get srcDeviceId = %{public}s", srcDeviceId.c_str());
1364     int missionId = atoi(data[1].c_str());
1365     HILOG_INFO("Get missionId = %{public}d", missionId);
1366     resultWant.SetParam(DMS_SRC_NETWORK_ID, srcDeviceId);
1367     resultWant.SetParam(DMS_MISSION_ID, missionId);
1368     callerSystemAbilityRecord->SetResult(resultWant, resultCode);
1369 }
1370 
SendResultToSystemAbility(int requestCode,int resultCode,Want & resultWant,const sptr<IRemoteObject> & callerToken)1371 void SystemAbilityCallerRecord::SendResultToSystemAbility(int requestCode, int resultCode, Want &resultWant,
1372     const sptr<IRemoteObject> &callerToken)
1373 {
1374     HILOG_INFO("%{public}s", __func__);
1375     int32_t callerUid = IPCSkeleton::GetCallingUid();
1376     uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
1377     HILOG_INFO("Try to SendResult, callerUid = %{public}d, AccessTokenId = %{public}u",
1378         callerUid, accessToken);
1379     if (callerToken == nullptr) {
1380         HILOG_ERROR("CallerToken is nullptr");
1381         return;
1382     }
1383     MessageParcel data;
1384     if (!data.WriteInterfaceToken(SYSTEM_ABILITY_TOKEN_CALLBACK)) {
1385         HILOG_ERROR("SendResultToSystemAbility Write interface token failed.");
1386         return;
1387     }
1388     if (!data.WriteParcelable(&resultWant)) {
1389         HILOG_ERROR("fail to WriteParcelable");
1390         return;
1391     }
1392     data.WriteInt32(callerUid);
1393     data.WriteInt32(requestCode);
1394     data.WriteUint32(accessToken);
1395     data.WriteInt32(resultCode);
1396     MessageParcel reply;
1397     MessageOption option(MessageOption::TF_SYNC);
1398     int result = callerToken->SendRequest(ISystemAbilityTokenCallback::SEND_RESULT, data, reply, option);
1399     if (result != ERR_OK) {
1400         HILOG_ERROR("SendResultToSystemAbility error = %{public}d", result);
1401     }
1402 }
1403 
AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> & connRecord)1404 void AbilityRecord::AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> &connRecord)
1405 {
1406     CHECK_POINTER(connRecord);
1407     auto it = std::find(connRecordList_.begin(), connRecordList_.end(), connRecord);
1408     // found it
1409     if (it != connRecordList_.end()) {
1410         HILOG_DEBUG("Found it in list, so no need to add same connection");
1411         return;
1412     }
1413     // no found then add new connection to list
1414     HILOG_DEBUG("No found in list, so add new connection to list");
1415     connRecordList_.push_back(connRecord);
1416 }
1417 
GetConnectRecordList() const1418 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectRecordList() const
1419 {
1420     return connRecordList_;
1421 }
1422 
RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> & connRecord)1423 void AbilityRecord::RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> &connRecord)
1424 {
1425     CHECK_POINTER(connRecord);
1426     connRecordList_.remove(connRecord);
1427 }
1428 
AddCallerRecord(const sptr<IRemoteObject> & callerToken,int requestCode,std::string srcAbilityId)1429 void AbilityRecord::AddCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode, std::string srcAbilityId)
1430 {
1431     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1432     HILOG_INFO("Add caller record.");
1433     if (!srcAbilityId.empty() && IsSystemAbilityCall(callerToken)) {
1434         AddSystemAbilityCallerRecord(callerToken, requestCode, srcAbilityId);
1435         return;
1436     }
1437     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
1438     CHECK_POINTER(abilityRecord);
1439 
1440     auto isExist = [&abilityRecord](const std::shared_ptr<CallerRecord> &callerRecord) {
1441         return (callerRecord->GetCaller() == abilityRecord);
1442     };
1443 
1444     auto record = std::find_if(callerList_.begin(), callerList_.end(), isExist);
1445     if (record != callerList_.end()) {
1446         callerList_.erase(record);
1447     }
1448 
1449     callerList_.emplace_back(std::make_shared<CallerRecord>(requestCode, abilityRecord));
1450 
1451     lifeCycleStateInfo_.caller.requestCode = requestCode;
1452     lifeCycleStateInfo_.caller.deviceId = abilityRecord->GetAbilityInfo().deviceId;
1453     lifeCycleStateInfo_.caller.bundleName = abilityRecord->GetAbilityInfo().bundleName;
1454     lifeCycleStateInfo_.caller.abilityName = abilityRecord->GetAbilityInfo().name;
1455     HILOG_INFO("caller %{public}s, %{public}s",
1456         abilityRecord->GetAbilityInfo().bundleName.c_str(),
1457         abilityRecord->GetAbilityInfo().name.c_str());
1458 }
1459 
IsSystemAbilityCall(const sptr<IRemoteObject> & callerToken)1460 bool AbilityRecord::IsSystemAbilityCall(const sptr<IRemoteObject> &callerToken)
1461 {
1462     if (callerToken == nullptr) {
1463         return false;
1464     }
1465     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
1466     if (abilityRecord != nullptr) {
1467         return false;
1468     }
1469     auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(IPCSkeleton::GetCallingTokenID());
1470     bool isNativeCall = tokenType == Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE;
1471     if (!isNativeCall) {
1472         HILOG_INFO("Is not native call.");
1473         return false;
1474     }
1475     AccessToken::NativeTokenInfo nativeTokenInfo;
1476     int32_t result = AccessToken::AccessTokenKit::GetNativeTokenInfo(IPCSkeleton::GetCallingTokenID(),
1477         nativeTokenInfo);
1478     if (result == ERR_OK && nativeTokenInfo.processName == DMS_PROCESS_NAME) {
1479         HILOG_INFO("Is system ability call.");
1480         return true;
1481     }
1482     return false;
1483 }
1484 
AddSystemAbilityCallerRecord(const sptr<IRemoteObject> & callerToken,int requestCode,std::string srcAbilityId)1485 void AbilityRecord::AddSystemAbilityCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode,
1486     std::string srcAbilityId)
1487 {
1488     HILOG_INFO("Add system ability caller record.");
1489     std::shared_ptr<SystemAbilityCallerRecord> systemAbilityRecord =
1490         std::make_shared<SystemAbilityCallerRecord>(srcAbilityId, callerToken);
1491     auto isExist = [&srcAbilityId](const std::shared_ptr<CallerRecord> &callerRecord) {
1492         std::shared_ptr<SystemAbilityCallerRecord> saCaller = callerRecord->GetSaCaller();
1493         return (saCaller != nullptr && saCaller->GetSrcAbilityId() == srcAbilityId);
1494     };
1495     auto record = std::find_if(callerList_.begin(), callerList_.end(), isExist);
1496     if (record != callerList_.end()) {
1497         HILOG_INFO("Find same system ability caller record.");
1498         callerList_.erase(record);
1499     }
1500     callerList_.emplace_back(std::make_shared<CallerRecord>(requestCode, systemAbilityRecord));
1501     HILOG_INFO("Add system ability record end.");
1502 }
1503 
GetCallerRecordList() const1504 std::list<std::shared_ptr<CallerRecord>> AbilityRecord::GetCallerRecordList() const
1505 {
1506     return callerList_;
1507 }
1508 
GetCallerRecord() const1509 std::shared_ptr<AbilityRecord> AbilityRecord::GetCallerRecord() const
1510 {
1511     if (callerList_.empty()) {
1512         return nullptr;
1513     }
1514     return callerList_.back()->GetCaller();
1515 }
1516 
IsConnectListEmpty()1517 bool AbilityRecord::IsConnectListEmpty()
1518 {
1519     return connRecordList_.empty();
1520 }
1521 
GetConnectingRecord() const1522 std::shared_ptr<ConnectionRecord> AbilityRecord::GetConnectingRecord() const
1523 {
1524     auto connect =
1525         std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
1526             return record->GetConnectState() == ConnectionState::CONNECTING;
1527         });
1528     return (connect != connRecordList_.end()) ? *connect : nullptr;
1529 }
1530 
GetConnectingRecordList()1531 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectingRecordList()
1532 {
1533     std::list<std::shared_ptr<ConnectionRecord>> connectingList;
1534     for (auto record : connRecordList_) {
1535         if (record && record->GetConnectState() == ConnectionState::CONNECTING) {
1536             connectingList.push_back(record);
1537         }
1538     }
1539     return connectingList;
1540 }
1541 
GetDisconnectingRecord() const1542 std::shared_ptr<ConnectionRecord> AbilityRecord::GetDisconnectingRecord() const
1543 {
1544     auto connect =
1545         std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
1546             return record->GetConnectState() == ConnectionState::DISCONNECTING;
1547         });
1548     return (connect != connRecordList_.end()) ? *connect : nullptr;
1549 }
1550 
GetAbilityTypeString(std::string & typeStr)1551 void AbilityRecord::GetAbilityTypeString(std::string &typeStr)
1552 {
1553     AppExecFwk::AbilityType type = GetAbilityInfo().type;
1554     switch (type) {
1555 #ifdef SUPPORT_GRAPHICS
1556         case AppExecFwk::AbilityType::PAGE: {
1557             typeStr = "PAGE";
1558             break;
1559         }
1560 #endif
1561         case AppExecFwk::AbilityType::SERVICE: {
1562             typeStr = "SERVICE";
1563             break;
1564         }
1565         // for config.json type
1566         case AppExecFwk::AbilityType::DATA: {
1567             typeStr = "DATA";
1568             break;
1569         }
1570         default: {
1571             typeStr = "UNKNOWN";
1572             break;
1573         }
1574     }
1575 }
1576 
ConvertAbilityState(const AbilityState & state)1577 std::string AbilityRecord::ConvertAbilityState(const AbilityState &state)
1578 {
1579     auto it = stateToStrMap.find(state);
1580     if (it != stateToStrMap.end()) {
1581         return it->second;
1582     }
1583     return "INVALIDSTATE";
1584 }
1585 
ConvertAppState(const AppState & state)1586 std::string AbilityRecord::ConvertAppState(const AppState &state)
1587 {
1588     auto it = appStateToStrMap_.find(state);
1589     if (it != appStateToStrMap_.end()) {
1590         return it->second;
1591     }
1592     return "INVALIDSTATE";
1593 }
1594 
ConvertLifeCycleToAbilityState(const AbilityLifeCycleState & state)1595 int AbilityRecord::ConvertLifeCycleToAbilityState(const AbilityLifeCycleState &state)
1596 {
1597     auto it = convertStateMap.find(state);
1598     if (it != convertStateMap.end()) {
1599         return it->second;
1600     }
1601     return DEFAULT_INVAL_VALUE;
1602 }
1603 
Dump(std::vector<std::string> & info)1604 void AbilityRecord::Dump(std::vector<std::string> &info)
1605 {
1606     std::string dumpInfo = "      AbilityRecord ID #" + std::to_string(recordId_);
1607     info.push_back(dumpInfo);
1608     dumpInfo = "        app name [" + GetAbilityInfo().applicationName + "]";
1609     info.push_back(dumpInfo);
1610     dumpInfo = "        main name [" + GetAbilityInfo().name + "]";
1611     info.push_back(dumpInfo);
1612     dumpInfo = "        bundle name [" + GetAbilityInfo().bundleName + "]";
1613     info.push_back(dumpInfo);
1614     std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1615     dumpInfo = "        isKeepAlive: " + isKeepAlive;
1616     info.push_back(dumpInfo);
1617     // get ability type(unknown/page/service/provider)
1618     std::string typeStr;
1619     GetAbilityTypeString(typeStr);
1620     dumpInfo = "        ability type [" + typeStr + "]";
1621     info.push_back(dumpInfo);
1622     std::shared_ptr<AbilityRecord> preAbility = GetPreAbilityRecord();
1623     if (preAbility == nullptr) {
1624         dumpInfo = "        previous ability app name [NULL]";
1625         dumpInfo.append("\n");
1626         dumpInfo += "        previous ability file name [NULL]";
1627     } else {
1628         dumpInfo =
1629             "        previous ability app name [" + preAbility->GetAbilityInfo().applicationName + "]";
1630         dumpInfo.append("\n");
1631         dumpInfo += "        previous ability file name [" + preAbility->GetAbilityInfo().name + "]";
1632     }
1633     info.push_back(dumpInfo);
1634     std::shared_ptr<AbilityRecord> nextAbility = GetNextAbilityRecord();
1635     if (nextAbility == nullptr) {
1636         dumpInfo = "        next ability app name [NULL]";
1637         dumpInfo.append("\n");
1638         dumpInfo += "        next ability file name [NULL]";
1639     } else {
1640         dumpInfo =
1641             "        next ability app name [" + nextAbility->GetAbilityInfo().applicationName + "]";
1642         dumpInfo.append("\n");
1643         dumpInfo += "        next ability main name [" + nextAbility->GetAbilityInfo().name + "]";
1644     }
1645     info.push_back(dumpInfo);
1646     dumpInfo = "        state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + "  start time [" +
1647                std::to_string(startTime_) + "]";
1648     info.push_back(dumpInfo);
1649     dumpInfo = "        app state #" + AbilityRecord::ConvertAppState(appState_);
1650     info.push_back(dumpInfo);
1651     dumpInfo = "        ready #" + std::to_string(isReady_) + "  window attached #" +
1652                std::to_string(isWindowAttached_) + "  launcher #" + std::to_string(isLauncherAbility_);
1653     info.push_back(dumpInfo);
1654 
1655     if (isLauncherRoot_) {
1656         dumpInfo = "        can restart num #" + std::to_string(restartCount_);
1657         info.push_back(dumpInfo);
1658     }
1659 }
1660 
DumpAbilityState(std::vector<std::string> & info,bool isClient,const std::vector<std::string> & params)1661 void AbilityRecord::DumpAbilityState(
1662     std::vector<std::string> &info, bool isClient, const std::vector<std::string> &params)
1663 {
1664     HILOG_INFO("%{public}s begin.", __func__);
1665     std::string dumpInfo = "      AbilityRecord ID #" + std::to_string(recordId_);
1666     info.push_back(dumpInfo);
1667     dumpInfo = "        app name [" + GetAbilityInfo().applicationName + "]";
1668     info.push_back(dumpInfo);
1669     dumpInfo = "        main name [" + GetAbilityInfo().name + "]";
1670     info.push_back(dumpInfo);
1671     dumpInfo = "        bundle name [" + GetAbilityInfo().bundleName + "]";
1672     info.push_back(dumpInfo);
1673     std::string typeStr;
1674     GetAbilityTypeString(typeStr);
1675     dumpInfo = "        ability type [" + typeStr + "]";
1676     info.push_back(dumpInfo);
1677 
1678     dumpInfo = "        state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + "  start time [" +
1679                std::to_string(startTime_) + "]";
1680     info.push_back(dumpInfo);
1681     dumpInfo = "        app state #" + AbilityRecord::ConvertAppState(appState_);
1682     info.push_back(dumpInfo);
1683     dumpInfo = "        ready #" + std::to_string(isReady_) + "  window attached #" +
1684                std::to_string(isWindowAttached_) + "  launcher #" + std::to_string(isLauncherAbility_);
1685     info.push_back(dumpInfo);
1686     dumpInfo = "        callee connections: ";
1687     info.push_back(dumpInfo);
1688     if (callContainer_) {
1689         callContainer_->Dump(info);
1690     }
1691 
1692     std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1693     dumpInfo = "        isKeepAlive: " + isKeepAlive;
1694     info.push_back(dumpInfo);
1695     if (isLauncherRoot_) {
1696         dumpInfo = "        can restart num #" + std::to_string(restartCount_);
1697         info.push_back(dumpInfo);
1698     }
1699 
1700     // add dump client info
1701     DumpClientInfo(info, params, isClient, params.empty());
1702 }
1703 
SetStartTime()1704 void AbilityRecord::SetStartTime()
1705 {
1706     if (startTime_ == 0) {
1707         startTime_ = AbilityUtil::SystemTimeMillis();
1708     }
1709 }
1710 
GetStartTime() const1711 int64_t AbilityRecord::GetStartTime() const
1712 {
1713     return startTime_;
1714 }
1715 
DumpService(std::vector<std::string> & info,bool isClient) const1716 void AbilityRecord::DumpService(std::vector<std::string> &info, bool isClient) const
1717 {
1718     std::vector<std::string> params;
1719     DumpService(info, params, isClient);
1720 }
1721 
DumpService(std::vector<std::string> & info,std::vector<std::string> & params,bool isClient) const1722 void AbilityRecord::DumpService(std::vector<std::string> &info, std::vector<std::string> &params, bool isClient) const
1723 {
1724     info.emplace_back("      AbilityRecord ID #" + std::to_string(GetRecordId()) + "   state #" +
1725                       AbilityRecord::ConvertAbilityState(GetAbilityState()) + "   start time [" +
1726                       std::to_string(GetStartTime()) + "]");
1727     info.emplace_back("      main name [" + GetAbilityInfo().name + "]");
1728     info.emplace_back("      bundle name [" + GetAbilityInfo().bundleName + "]");
1729     info.emplace_back("      ability type [SERVICE]");
1730     info.emplace_back("      app state #" + AbilityRecord::ConvertAppState(appState_));
1731 
1732     std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1733     info.emplace_back("        isKeepAlive: " + isKeepAlive);
1734     if (isLauncherRoot_) {
1735         info.emplace_back("      can restart num #" + std::to_string(restartCount_));
1736     }
1737 
1738     info.emplace_back("      Connections: " + std::to_string(connRecordList_.size()));
1739     for (auto &&conn : connRecordList_) {
1740         if (conn) {
1741             conn->Dump(info);
1742         }
1743     }
1744     // add dump client info
1745     DumpClientInfo(info, params, isClient);
1746 }
1747 
OnSchedulerDied(const wptr<IRemoteObject> & remote)1748 void AbilityRecord::OnSchedulerDied(const wptr<IRemoteObject> &remote)
1749 {
1750     HILOG_WARN("On scheduler died.");
1751     auto mission = GetMission();
1752     if (mission) {
1753         HILOG_WARN("On scheduler died. Is app not response Reason:%{public}d", mission->IsANRState());
1754     }
1755     std::lock_guard<std::mutex> guard(lock_);
1756     CHECK_POINTER(scheduler_);
1757 
1758     auto object = remote.promote();
1759     CHECK_POINTER(object);
1760 
1761     if (object != scheduler_->AsObject()) {
1762         HILOG_ERROR("Ability on scheduler died: scheduler is not matches with remote.");
1763         return;
1764     }
1765 
1766     RemoveUriPermission();
1767     if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1768         auto schedulerObject = scheduler_->AsObject();
1769         if (schedulerObject != nullptr) {
1770             schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1771         }
1772     }
1773     scheduler_.clear();
1774     CHECK_POINTER(lifecycleDeal_);
1775     lifecycleDeal_->SetScheduler(nullptr);
1776     isWindowAttached_ = false;
1777 
1778     auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
1779     CHECK_POINTER(abilityManagerService);
1780 
1781     auto handler = abilityManagerService->GetEventHandler();
1782     CHECK_POINTER(handler);
1783 
1784     HILOG_INFO("Ability on scheduler died: '%{public}s'", abilityInfo_.name.c_str());
1785     auto task = [abilityManagerService, ability = shared_from_this()]() {
1786         abilityManagerService->OnAbilityDied(ability);
1787     };
1788     handler->PostTask(task);
1789     auto uriTask = [want = want_, ability = shared_from_this()]() {
1790         ability->SaveResultToCallers(-1, &want);
1791         ability->SendResultToCallers();
1792     };
1793     handler->PostTask(uriTask);
1794     HandleDlpClosed();
1795 }
1796 
SetConnRemoteObject(const sptr<IRemoteObject> & remoteObject)1797 void AbilityRecord::SetConnRemoteObject(const sptr<IRemoteObject> &remoteObject)
1798 {
1799     connRemoteObject_ = remoteObject;
1800 }
1801 
GetConnRemoteObject() const1802 sptr<IRemoteObject> AbilityRecord::GetConnRemoteObject() const
1803 {
1804     return connRemoteObject_;
1805 }
1806 
AddStartId()1807 void AbilityRecord::AddStartId()
1808 {
1809     startId_++;
1810 }
GetStartId() const1811 int AbilityRecord::GetStartId() const
1812 {
1813     return startId_;
1814 }
1815 
SetIsUninstallAbility()1816 void AbilityRecord::SetIsUninstallAbility()
1817 {
1818     isUninstall_ = true;
1819 }
1820 
IsUninstallAbility() const1821 bool AbilityRecord::IsUninstallAbility() const
1822 {
1823     return isUninstall_;
1824 }
1825 
SetLauncherRoot()1826 void AbilityRecord::SetLauncherRoot()
1827 {
1828     isLauncherRoot_ = true;
1829 }
1830 
IsLauncherRoot() const1831 bool AbilityRecord::IsLauncherRoot() const
1832 {
1833     return isLauncherRoot_;
1834 }
1835 
IsAbilityState(const AbilityState & state) const1836 bool AbilityRecord::IsAbilityState(const AbilityState &state) const
1837 {
1838     return (currentState_ == state);
1839 }
1840 
IsActiveState() const1841 bool AbilityRecord::IsActiveState() const
1842 {
1843     return (IsAbilityState(AbilityState::ACTIVE) || IsAbilityState(AbilityState::ACTIVATING) ||
1844             IsAbilityState(AbilityState::INITIAL) || IsAbilityState(AbilityState::FOREGROUND) ||
1845             IsAbilityState(AbilityState::FOREGROUNDING));
1846 }
1847 
SendEvent(uint32_t msg,uint32_t timeOut)1848 void AbilityRecord::SendEvent(uint32_t msg, uint32_t timeOut)
1849 {
1850     if (want_.GetBoolParam(DEBUG_APP, false)) {
1851         HILOG_INFO("Is debug mode, no need to handle time out.");
1852         return;
1853     }
1854     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1855     CHECK_POINTER(handler);
1856 
1857     g_abilityRecordEventId_++;
1858     eventId_ = g_abilityRecordEventId_;
1859     handler->SendEvent(msg, eventId_, timeOut);
1860 }
1861 
SetStartSetting(const std::shared_ptr<AbilityStartSetting> & setting)1862 void AbilityRecord::SetStartSetting(const std::shared_ptr<AbilityStartSetting> &setting)
1863 {
1864     lifeCycleStateInfo_.setting = setting;
1865 }
1866 
GetStartSetting() const1867 std::shared_ptr<AbilityStartSetting> AbilityRecord::GetStartSetting() const
1868 {
1869     return lifeCycleStateInfo_.setting;
1870 }
1871 
SetRestarting(const bool isRestart)1872 void AbilityRecord::SetRestarting(const bool isRestart)
1873 {
1874     isRestarting_ = isRestart;
1875     HILOG_DEBUG("SetRestarting: %{public}d", isRestarting_);
1876     if ((isLauncherRoot_ && IsLauncherAbility()) || isKeepAlive_) {
1877         restartCount_ = isRestart ? (--restartCount_) : restartMax_;
1878         HILOG_INFO("root launcher or resident process's restart count: %{public}d", restartCount_);
1879     }
1880 }
1881 
SetRestarting(const bool isRestart,int32_t canRestartCount)1882 void AbilityRecord::SetRestarting(const bool isRestart, int32_t canRestartCount)
1883 {
1884     isRestarting_ = isRestart;
1885     HILOG_DEBUG("SetRestarting: %{public}d, restart count: %{public}d", isRestarting_, canRestartCount);
1886 
1887     if ((isLauncherRoot_ && IsLauncherAbility()) || isKeepAlive_) {
1888         restartCount_ = isRestart ? canRestartCount : restartMax_;
1889         HILOG_INFO("root launcher or resident process's restart count: %{public}d", restartCount_);
1890     }
1891 }
1892 
GetRestartCount() const1893 int32_t AbilityRecord::GetRestartCount() const
1894 {
1895     return restartCount_;
1896 }
1897 
SetRestartCount(int32_t restartCount)1898 void AbilityRecord::SetRestartCount(int32_t restartCount)
1899 {
1900     restartCount_ = restartCount;
1901 }
1902 
IsRestarting() const1903 bool AbilityRecord::IsRestarting() const
1904 {
1905     return isRestarting_;
1906 }
1907 
SetKeepAlive()1908 void AbilityRecord::SetKeepAlive()
1909 {
1910     isKeepAlive_ = true;
1911 }
1912 
GetRestartTime()1913 int64_t AbilityRecord::GetRestartTime()
1914 {
1915     return restartTime_;
1916 }
1917 
SetRestartTime(const int64_t restartTime)1918 void AbilityRecord::SetRestartTime(const int64_t restartTime)
1919 {
1920     restartTime_ = restartTime;
1921 }
1922 
SetAppState(const AppState & state)1923 void AbilityRecord::SetAppState(const AppState &state)
1924 {
1925     appState_ = state;
1926 }
1927 
GetAppState() const1928 AppState AbilityRecord::GetAppState() const
1929 {
1930     return appState_;
1931 }
1932 
SetLaunchReason(const LaunchReason & reason)1933 void AbilityRecord::SetLaunchReason(const LaunchReason &reason)
1934 {
1935     lifeCycleStateInfo_.launchParam.launchReason = reason;
1936 }
1937 
SetLastExitReason(const LastExitReason & reason)1938 void AbilityRecord::SetLastExitReason(const LastExitReason &reason)
1939 {
1940     lifeCycleStateInfo_.launchParam.lastExitReason = reason;
1941 }
1942 
NotifyContinuationResult(int32_t result)1943 void AbilityRecord::NotifyContinuationResult(int32_t result)
1944 {
1945     HILOG_INFO("NotifyContinuationResult.");
1946     CHECK_POINTER(lifecycleDeal_);
1947 
1948     lifecycleDeal_->NotifyContinuationResult(result);
1949 }
1950 
GetOwnedMissionList() const1951 std::shared_ptr<MissionList> AbilityRecord::GetOwnedMissionList() const
1952 {
1953     return missionList_.lock();
1954 }
1955 
SetMissionList(const std::shared_ptr<MissionList> & missionList)1956 void AbilityRecord::SetMissionList(const std::shared_ptr<MissionList> &missionList)
1957 {
1958     missionList_ = missionList;
1959 }
1960 
SetMission(const std::shared_ptr<Mission> & mission)1961 void AbilityRecord::SetMission(const std::shared_ptr<Mission> &mission)
1962 {
1963     if (mission) {
1964         missionId_ = mission->GetMissionId();
1965         HILOG_INFO("SetMission come, missionId is %{public}d.", missionId_);
1966     }
1967     mission_ = mission;
1968 }
1969 
SetMinimizeReason(bool fromUser)1970 void AbilityRecord::SetMinimizeReason(bool fromUser)
1971 {
1972     minimizeReason_ = fromUser;
1973 }
1974 
SetAppIndex(const int32_t appIndex)1975 void AbilityRecord::SetAppIndex(const int32_t appIndex)
1976 {
1977     appIndex_ = appIndex;
1978 }
1979 
GetAppIndex() const1980 int32_t AbilityRecord::GetAppIndex() const
1981 {
1982     return appIndex_;
1983 }
1984 
IsMinimizeFromUser() const1985 bool AbilityRecord::IsMinimizeFromUser() const
1986 {
1987     return minimizeReason_;
1988 }
1989 
SetClearMissionFlag(bool clearMissionFlag)1990 void AbilityRecord::SetClearMissionFlag(bool clearMissionFlag)
1991 {
1992     clearMissionFlag_= clearMissionFlag;
1993 }
1994 
IsClearMissionFlag()1995 bool AbilityRecord::IsClearMissionFlag()
1996 {
1997     return clearMissionFlag_;
1998 }
1999 
GetMission() const2000 std::shared_ptr<Mission> AbilityRecord::GetMission() const
2001 {
2002     return mission_.lock();
2003 }
2004 
GetMissionId() const2005 int32_t AbilityRecord::GetMissionId() const
2006 {
2007     return missionId_;
2008 }
2009 
SetSpecifiedFlag(const std::string & flag)2010 void AbilityRecord::SetSpecifiedFlag(const std::string &flag)
2011 {
2012     specifiedFlag_ = flag;
2013 }
2014 
GetSpecifiedFlag() const2015 std::string AbilityRecord::GetSpecifiedFlag() const
2016 {
2017     return specifiedFlag_;
2018 }
2019 
2020 // new version  --start
IsStartedByCall() const2021 bool AbilityRecord::IsStartedByCall() const
2022 {
2023     return isStartedByCall_;
2024 }
2025 
SetStartedByCall(const bool isFlag)2026 void AbilityRecord::SetStartedByCall(const bool isFlag)
2027 {
2028     isStartedByCall_ = isFlag;
2029 }
2030 
IsStartToBackground() const2031 bool AbilityRecord::IsStartToBackground() const
2032 {
2033     return isStartToBackground_;
2034 }
2035 
SetStartToBackground(const bool flag)2036 void AbilityRecord::SetStartToBackground(const bool flag)
2037 {
2038     isStartToBackground_ = flag;
2039 }
2040 
IsStartToForeground() const2041 bool AbilityRecord::IsStartToForeground() const
2042 {
2043     return isStartToForeground_;
2044 }
2045 
SetStartToForeground(const bool flag)2046 void AbilityRecord::SetStartToForeground(const bool flag)
2047 {
2048     isStartToForeground_ = flag;
2049 }
2050 
CallRequest()2051 void AbilityRecord::CallRequest()
2052 {
2053     HILOG_INFO("Call Request.");
2054     CHECK_POINTER(scheduler_);
2055 
2056     GrantUriPermission(want_, GetCurrentAccountId(), applicationInfo_.accessTokenId);
2057     // Async call request
2058     scheduler_->CallRequest();
2059 }
2060 
CallRequestDone(const sptr<IRemoteObject> & callStub) const2061 bool AbilityRecord::CallRequestDone(const sptr<IRemoteObject> &callStub) const
2062 {
2063     CHECK_POINTER_RETURN_BOOL(callContainer_);
2064     if (!callContainer_->CallRequestDone(callStub)) {
2065         HILOG_ERROR("Call request failed.");
2066         return false;
2067     }
2068     return true;
2069 }
2070 
Resolve(const AbilityRequest & abilityRequest)2071 ResolveResultType AbilityRecord::Resolve(const AbilityRequest &abilityRequest)
2072 {
2073     auto callback = abilityRequest.connect;
2074     if (abilityRequest.callType != AbilityCallType::CALL_REQUEST_TYPE || !callback) {
2075         HILOG_ERROR("only start by call type can create a call record.");
2076         return ResolveResultType::NG_INNER_ERROR;
2077     }
2078     if (!callContainer_) {
2079         callContainer_ = std::make_shared<CallContainer>();
2080         if (!callContainer_) {
2081             HILOG_ERROR("mark_shared error.");
2082             return ResolveResultType::NG_INNER_ERROR;
2083         }
2084     }
2085 
2086     HILOG_DEBUG("create call record for this resolve. callerUid:%{public}d ,targetname:%{public}s",
2087         abilityRequest.callerUid,
2088         abilityRequest.abilityInfo.name.c_str());
2089 
2090     std::shared_ptr<CallRecord> callRecord = callContainer_->GetCallRecord(callback);
2091     if (!callRecord) {
2092         callRecord = CallRecord::CreateCallRecord(
2093             abilityRequest.callerUid, shared_from_this(), callback, abilityRequest.callerToken);
2094         if (!callRecord) {
2095             HILOG_ERROR("mark_shared error.");
2096             return ResolveResultType::NG_INNER_ERROR;
2097         }
2098     }
2099 
2100     callContainer_->AddCallRecord(callback, callRecord);
2101 
2102     if (callRecord->IsCallState(CallState::REQUESTED) && callRecord->GetCallStub()) {
2103         HILOG_DEBUG("this record has requested.");
2104         if (!callRecord->SchedulerConnectDone()) {
2105             HILOG_DEBUG("this callrecord has requested, but callback failed.");
2106             return ResolveResultType::NG_INNER_ERROR;
2107         }
2108         return ResolveResultType::OK_HAS_REMOTE_OBJ;
2109     }
2110 
2111     callRecord->SetCallState(CallState::REQUESTING);
2112     return ResolveResultType::OK_NO_REMOTE_OBJ;
2113 }
2114 
ReleaseCall(const sptr<IAbilityConnection> & connect)2115 bool AbilityRecord::ReleaseCall(const sptr<IAbilityConnection>& connect)
2116 {
2117     HILOG_DEBUG("ability release call record by callback.");
2118     CHECK_POINTER_RETURN_BOOL(callContainer_);
2119 
2120     return callContainer_->RemoveCallRecord(connect);
2121 }
2122 
IsNeedToCallRequest() const2123 bool AbilityRecord::IsNeedToCallRequest() const
2124 {
2125     HILOG_DEBUG("ability release call record by callback.");
2126     if (callContainer_ == nullptr) {
2127         return false;
2128     }
2129 
2130     return callContainer_->IsNeedToCallRequest();
2131 }
2132 
ContinueAbility(const std::string & deviceId,uint32_t versionCode)2133 void AbilityRecord::ContinueAbility(const std::string& deviceId, uint32_t versionCode)
2134 {
2135     HILOG_INFO("ContinueAbility.");
2136     CHECK_POINTER(lifecycleDeal_);
2137 
2138     lifecycleDeal_->ContinueAbility(deviceId, versionCode);
2139 }
2140 
SetSwitchingPause(bool state)2141 void AbilityRecord::SetSwitchingPause(bool state)
2142 {
2143     isSwitchingPause_ = state;
2144 }
2145 
IsSwitchingPause()2146 bool AbilityRecord::IsSwitchingPause()
2147 {
2148     return isSwitchingPause_;
2149 }
2150 
SetOwnerMissionUserId(int32_t userId)2151 void AbilityRecord::SetOwnerMissionUserId(int32_t userId)
2152 {
2153     ownerMissionUserId_ = userId;
2154 }
2155 
GetOwnerMissionUserId()2156 int32_t AbilityRecord::GetOwnerMissionUserId()
2157 {
2158     return ownerMissionUserId_;
2159 }
2160 
DumpClientInfo(std::vector<std::string> & info,const std::vector<std::string> & params,bool isClient,bool dumpConfig) const2161 void AbilityRecord::DumpClientInfo(std::vector<std::string> &info, const std::vector<std::string> &params,
2162     bool isClient, bool dumpConfig) const
2163 {
2164     if (!isClient || !scheduler_ || !isReady_) {
2165         HILOG_ERROR("something nullptr.");
2166         return;
2167     }
2168     std::unique_lock<std::mutex> lock(dumpLock_);
2169     scheduler_->DumpAbilityInfo(params, info);
2170 
2171     HILOG_INFO("Dump begin wait.");
2172     isDumpTimeout_ = false;
2173     std::chrono::milliseconds timeout { AbilityManagerService::DUMP_TIMEOUT };
2174     if (dumpCondition_.wait_for(lock, timeout) == std::cv_status::timeout) {
2175         isDumpTimeout_ = true;
2176     }
2177     HILOG_INFO("Dump done and begin parse.");
2178     if (!isDumpTimeout_) {
2179         std::lock_guard<std::mutex> infoLock(dumpInfoLock_);
2180         for (auto one : dumpInfos_) {
2181             info.emplace_back(one);
2182         }
2183     }
2184 
2185     if (!dumpConfig) {
2186         HILOG_INFO("not dumpConfig.");
2187         return;
2188     }
2189     AppExecFwk::Configuration config;
2190     if (DelayedSingleton<AppScheduler>::GetInstance()->GetConfiguration(config) == ERR_OK) {
2191         info.emplace_back("          configuration: " + config.GetName());
2192     }
2193 }
2194 
DumpAbilityInfoDone(std::vector<std::string> & infos)2195 void AbilityRecord::DumpAbilityInfoDone(std::vector<std::string> &infos)
2196 {
2197     HILOG_INFO("DumpAbilityInfoDone begin.");
2198     if (isDumpTimeout_) {
2199         HILOG_WARN("%{public}s, dump time out.", __func__);
2200         return;
2201     }
2202     {
2203         std::lock_guard<std::mutex> infoLock(dumpInfoLock_);
2204         dumpInfos_.clear();
2205         for (auto info : infos) {
2206             dumpInfos_.emplace_back(info);
2207         }
2208     }
2209     dumpCondition_.notify_all();
2210 }
2211 
GrantUriPermission(const Want & want,int32_t userId,uint32_t targetTokenId)2212 void AbilityRecord::GrantUriPermission(const Want &want, int32_t userId, uint32_t targetTokenId)
2213 {
2214     if ((want.GetFlags() & (Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION)) == 0) {
2215         HILOG_WARN("Do not call uriPermissionMgr.");
2216         return;
2217     }
2218 
2219     auto bms = AbilityUtil::GetBundleManager();
2220     CHECK_POINTER_IS_NULLPTR(bms);
2221     auto&& uriStr = want.GetUri().ToString();
2222     auto&& uriVec = want.GetStringArrayParam(AbilityConfig::PARAMS_STREAM);
2223     uriVec.emplace_back(uriStr);
2224     HILOG_DEBUG("GrantUriPermission uriVec size: %{public}zu", uriVec.size());
2225     auto upmClient = AAFwk::UriPermissionManagerClient::GetInstance();
2226     auto bundleFlag = AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO;
2227     auto fromTokenId = IPCSkeleton::GetCallingTokenID();
2228     for (auto&& str : uriVec) {
2229         Uri uri(str);
2230         auto&& scheme = uri.GetScheme();
2231         HILOG_INFO("uri scheme is %{public}s.", scheme.c_str());
2232         // only support file scheme
2233         if (scheme != "file") {
2234             HILOG_WARN("only support file uri.");
2235             continue;
2236         }
2237         auto&& authority = uri.GetAuthority();
2238         HILOG_INFO("uri authority is %{public}s.", authority.c_str());
2239         AppExecFwk::BundleInfo uriBundleInfo;
2240         if (!IN_PROCESS_CALL(bms->GetBundleInfo(authority, bundleFlag, uriBundleInfo, userId))) {
2241             HILOG_WARN("To fail to get bundle info according to uri.");
2242             continue;
2243         }
2244         if (uriBundleInfo.applicationInfo.accessTokenId != fromTokenId &&
2245             uriBundleInfo.applicationInfo.accessTokenId != callerAccessTokenId_) {
2246             HILOG_ERROR("the uri does not belong to caller.");
2247             continue;
2248         }
2249         auto ret = IN_PROCESS_CALL(upmClient->GrantUriPermission(uri, want.GetFlags(),
2250             callerAccessTokenId_, targetTokenId));
2251         if (ret) {
2252             isGrantedUriPermission_ = true;
2253         }
2254     }
2255 }
2256 
RemoveUriPermission()2257 void AbilityRecord::RemoveUriPermission()
2258 {
2259     if (isGrantedUriPermission_) {
2260         HILOG_DEBUG("To remove uri permission.");
2261         auto upmClient = AAFwk::UriPermissionManagerClient::GetInstance();
2262         upmClient->RemoveUriPermission(applicationInfo_.accessTokenId);
2263         isGrantedUriPermission_ = false;
2264     }
2265 }
2266 
HandleDlpAttached()2267 void AbilityRecord::HandleDlpAttached()
2268 {
2269     if (abilityInfo_.bundleName == DLP_BUNDLE_NAME) {
2270         DelayedSingleton<ConnectionStateManager>::GetInstance()->AddDlpManager(shared_from_this());
2271     }
2272 
2273     if (appIndex_ > 0) {
2274         DelayedSingleton<ConnectionStateManager>::GetInstance()->AddDlpAbility(shared_from_this());
2275     }
2276 }
2277 
HandleDlpClosed()2278 void AbilityRecord::HandleDlpClosed()
2279 {
2280     if (abilityInfo_.bundleName == DLP_BUNDLE_NAME) {
2281         DelayedSingleton<ConnectionStateManager>::GetInstance()->RemoveDlpManager(shared_from_this());
2282     }
2283 
2284     if (appIndex_ > 0) {
2285         DelayedSingleton<ConnectionStateManager>::GetInstance()->RemoveDlpAbility(shared_from_this());
2286     }
2287 }
2288 
GetCurrentAccountId() const2289 int32_t AbilityRecord::GetCurrentAccountId() const
2290 {
2291     std::vector<int32_t> osActiveAccountIds;
2292     ErrCode ret = DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->
2293             QueryActiveOsAccountIds(osActiveAccountIds);
2294     if (ret != ERR_OK) {
2295         HILOG_ERROR("QueryActiveOsAccountIds failed.");
2296         return DEFAULT_USER_ID;
2297     }
2298     if (osActiveAccountIds.empty()) {
2299         HILOG_ERROR("QueryActiveOsAccountIds is empty, no accounts.");
2300         return DEFAULT_USER_ID;
2301     }
2302 
2303     return osActiveAccountIds.front();
2304 }
2305 
SetWindowMode(int32_t windowMode)2306 void AbilityRecord::SetWindowMode(int32_t windowMode)
2307 {
2308     want_.SetParam(Want::PARAM_RESV_WINDOW_MODE, windowMode);
2309 }
2310 
RemoveWindowMode()2311 void AbilityRecord::RemoveWindowMode()
2312 {
2313     want_.RemoveParam(Want::PARAM_RESV_WINDOW_MODE);
2314 }
2315 
SetPendingState(AbilityState state)2316 void AbilityRecord::SetPendingState(AbilityState state)
2317 {
2318     pendingState_.store(state);
2319 }
2320 
GetPendingState() const2321 AbilityState AbilityRecord::GetPendingState() const
2322 {
2323     return pendingState_.load();
2324 }
2325 
2326 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAbility()2327 int AbilityRecord::BlockAbility()
2328 {
2329     HILOG_INFO("BlockAbility.");
2330     if (scheduler_) {
2331         HILOG_INFO("scheduler_ begin to call BlockAbility %{public}s", __func__);
2332         return scheduler_->BlockAbility();
2333     }
2334     return ERR_NO_INIT;
2335 }
2336 #endif
2337 
IsNeedBackToOtherMissionStack()2338 bool AbilityRecord::IsNeedBackToOtherMissionStack()
2339 {
2340     return isNeedBackToOtherMissionStack_;
2341 }
2342 
SetNeedBackToOtherMissionStack(bool isNeedBackToOtherMissionStack)2343 void AbilityRecord::SetNeedBackToOtherMissionStack(bool isNeedBackToOtherMissionStack)
2344 {
2345     isNeedBackToOtherMissionStack_ = isNeedBackToOtherMissionStack;
2346 }
2347 
GetOtherMissionStackAbilityRecord() const2348 std::shared_ptr<AbilityRecord> AbilityRecord::GetOtherMissionStackAbilityRecord() const
2349 {
2350     return otherMissionStackAbilityRecord_.lock();
2351 }
2352 
SetOtherMissionStackAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)2353 void AbilityRecord::SetOtherMissionStackAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
2354 {
2355     otherMissionStackAbilityRecord_ = abilityRecord;
2356 }
2357 }  // namespace AAFwk
2358 }  // namespace OHOS
2359