mirror of
https://github.com/openharmony/ability_ability_runtime.git
synced 2026-08-24 22:21:36 -04:00
Signed-off-by: caochunlei <caochunlei1@huawei.com>
This commit is contained in:
@@ -69,6 +69,12 @@ NativeValue* JsAbilityContext::StartAbility(NativeEngine* engine, NativeCallback
|
||||
return (me != nullptr) ? me->OnStartAbility(*engine, *info) : nullptr;
|
||||
}
|
||||
|
||||
NativeValue* JsAbilityContext::StartRecentAbility(NativeEngine* engine, NativeCallbackInfo* info)
|
||||
{
|
||||
JsAbilityContext* me = CheckParamsAndGetThis<JsAbilityContext>(engine, info);
|
||||
return (me != nullptr) ? me->OnStartAbility(*engine, *info, true) : nullptr;
|
||||
}
|
||||
|
||||
NativeValue* JsAbilityContext::StartAbilityWithAccount(NativeEngine* engine, NativeCallbackInfo* info)
|
||||
{
|
||||
JsAbilityContext* me = CheckParamsAndGetThis<JsAbilityContext>(engine, info);
|
||||
@@ -167,7 +173,7 @@ NativeValue* JsAbilityContext::IsTerminating(NativeEngine* engine, NativeCallbac
|
||||
return (me != nullptr) ? me->OnIsTerminating(*engine, *info) : nullptr;
|
||||
}
|
||||
|
||||
NativeValue* JsAbilityContext::OnStartAbility(NativeEngine& engine, NativeCallbackInfo& info)
|
||||
NativeValue* JsAbilityContext::OnStartAbility(NativeEngine& engine, NativeCallbackInfo& info, bool isStartRecent)
|
||||
{
|
||||
HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
|
||||
HILOG_INFO("OnStartAbility is called.");
|
||||
@@ -190,6 +196,12 @@ NativeValue* JsAbilityContext::OnStartAbility(NativeEngine& engine, NativeCallba
|
||||
reinterpret_cast<napi_value>(info.argv[1]), startOptions);
|
||||
unwrapArgc++;
|
||||
}
|
||||
|
||||
if (isStartRecent) {
|
||||
HILOG_INFO("OnStartRecentAbility is called");
|
||||
want.SetParam(Want::PARAM_RESV_START_RECENT, true);
|
||||
}
|
||||
|
||||
AsyncTask::CompleteCallback complete =
|
||||
[weak = context_, want, startOptions, unwrapArgc](NativeEngine& engine, AsyncTask& task, int32_t status) {
|
||||
auto context = weak.lock();
|
||||
@@ -1163,6 +1175,8 @@ NativeValue* CreateJsAbilityContext(NativeEngine& engine, std::shared_ptr<Abilit
|
||||
JsAbilityContext::RequestPermissionsFromUser);
|
||||
BindNativeFunction(engine, *object, "restoreWindowStage", moduleName, JsAbilityContext::RestoreWindowStage);
|
||||
BindNativeFunction(engine, *object, "isTerminating", moduleName, JsAbilityContext::IsTerminating);
|
||||
BindNativeFunction(engine, *object, "startRecentAbility", moduleName,
|
||||
JsAbilityContext::StartRecentAbility);
|
||||
|
||||
#ifdef SUPPORT_GRAPHICS
|
||||
BindNativeFunction(engine, *object, "setMissionLabel", moduleName, JsAbilityContext::SetMissionLabel);
|
||||
|
||||
@@ -72,6 +72,12 @@ public:
|
||||
return (me != nullptr) ? me->OnStartAbility(*engine, *info) : nullptr;
|
||||
}
|
||||
|
||||
static NativeValue* StartRecentAbility(NativeEngine* engine, NativeCallbackInfo* info)
|
||||
{
|
||||
JsServiceExtensionContext* me = CheckParamsAndGetThis<JsServiceExtensionContext>(engine, info);
|
||||
return (me != nullptr) ? me->OnStartAbility(*engine, *info, true) : nullptr;
|
||||
}
|
||||
|
||||
static NativeValue* StartAbilityByCall(NativeEngine* engine, NativeCallbackInfo* info)
|
||||
{
|
||||
JsServiceExtensionContext* me = CheckParamsAndGetThis<JsServiceExtensionContext>(engine, info);
|
||||
@@ -134,7 +140,7 @@ public:
|
||||
|
||||
private:
|
||||
std::weak_ptr<ServiceExtensionContext> context_;
|
||||
NativeValue* OnStartAbility(NativeEngine& engine, NativeCallbackInfo& info)
|
||||
NativeValue* OnStartAbility(NativeEngine& engine, NativeCallbackInfo& info, bool isStartRecent = false)
|
||||
{
|
||||
HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
|
||||
HILOG_INFO("OnStartAbility is called");
|
||||
@@ -152,6 +158,11 @@ private:
|
||||
return engine.CreateUndefined();
|
||||
}
|
||||
|
||||
if (isStartRecent) {
|
||||
HILOG_INFO("OnStartRecentAbility is called");
|
||||
want.SetParam(Want::PARAM_RESV_START_RECENT, true);
|
||||
}
|
||||
|
||||
AsyncTask::CompleteCallback complete =
|
||||
[weak = context_, want, startOptions, unwrapArgc](NativeEngine& engine, AsyncTask& task, int32_t status) {
|
||||
HILOG_INFO("startAbility begin");
|
||||
@@ -872,6 +883,8 @@ NativeValue* CreateJsServiceExtensionContext(NativeEngine& engine, std::shared_p
|
||||
JsServiceExtensionContext::StopServiceExtensionAbility);
|
||||
BindNativeFunction(engine, *object, "stopServiceExtensionAbilityWithAccount", moduleName,
|
||||
JsServiceExtensionContext::StopServiceExtensionAbilityWithAccount);
|
||||
BindNativeFunction(engine, *object, "startRecentAbility", moduleName,
|
||||
JsServiceExtensionContext::StartRecentAbility);
|
||||
|
||||
return objValue;
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@ public:
|
||||
static void Finalizer(NativeEngine* engine, void* data, void* hint);
|
||||
|
||||
static NativeValue* StartAbility(NativeEngine* engine, NativeCallbackInfo* info);
|
||||
static NativeValue* StartRecentAbility(NativeEngine* engine, NativeCallbackInfo* info);
|
||||
static NativeValue* StartAbilityWithAccount(NativeEngine* engine, NativeCallbackInfo* info);
|
||||
static NativeValue* StartAbilityByCall(NativeEngine* engine, NativeCallbackInfo* info);
|
||||
static NativeValue* StartAbilityForResult(NativeEngine* engine, NativeCallbackInfo* info);
|
||||
@@ -75,7 +76,7 @@ private:
|
||||
#endif
|
||||
|
||||
private:
|
||||
NativeValue* OnStartAbility(NativeEngine& engine, NativeCallbackInfo& info);
|
||||
NativeValue* OnStartAbility(NativeEngine& engine, NativeCallbackInfo& info, bool isStartRecent = false);
|
||||
NativeValue* OnStartAbilityWithAccount(NativeEngine& engine, NativeCallbackInfo& info);
|
||||
NativeValue* OnStartAbilityByCall(NativeEngine& engine, NativeCallbackInfo& info);
|
||||
NativeValue* OnStartAbilityForResult(NativeEngine& engine, NativeCallbackInfo& info);
|
||||
|
||||
@@ -198,6 +198,7 @@ struct AbilityRequest {
|
||||
int requestCode = -1;
|
||||
bool restart = false;
|
||||
int32_t restartCount = -1;
|
||||
bool startRecent = false;
|
||||
|
||||
// call ability
|
||||
int callerUid = -1;
|
||||
|
||||
@@ -55,6 +55,13 @@ public:
|
||||
*/
|
||||
bool IsSpecifiedAbility() const;
|
||||
|
||||
/**
|
||||
* check whether ability contains by this mission is standard.
|
||||
*
|
||||
* @return is ability contains by this mission is standard.
|
||||
*/
|
||||
bool IsStandardAbility() const;
|
||||
|
||||
/**
|
||||
* get owner mission list.
|
||||
*
|
||||
@@ -188,6 +195,16 @@ public:
|
||||
return needNotifyUpdateLabel_;
|
||||
}
|
||||
|
||||
inline void UpdateMissionTime(const std::string &missionTime)
|
||||
{
|
||||
missionTime_ = missionTime;
|
||||
}
|
||||
|
||||
inline std::string GetMissionTime() const
|
||||
{
|
||||
return missionTime_;
|
||||
}
|
||||
|
||||
private:
|
||||
int32_t missionId_;
|
||||
int32_t startMethod_;
|
||||
@@ -200,6 +217,7 @@ private:
|
||||
bool isANRState_ = false;
|
||||
bool needNotify_ = true;
|
||||
bool needNotifyUpdateLabel_ = false;
|
||||
std::string missionTime_ = "0";
|
||||
};
|
||||
} // namespace AAFwk
|
||||
} // namespace OHOS
|
||||
|
||||
@@ -97,10 +97,12 @@ public:
|
||||
*
|
||||
* @param missionName name of mission.
|
||||
* @param flag name of specified mission flag.
|
||||
* @param isFindRecentStandard find recent standard mission.
|
||||
* @param info found mission info.
|
||||
* @return true if success.
|
||||
*/
|
||||
bool FindReusedMissionInfo(const std::string &missionName, const std::string &flag, InnerMissionInfo &info);
|
||||
bool FindReusedMissionInfo(const std::string &missionName, const std::string &flag,
|
||||
bool isFindRecentStandard, InnerMissionInfo &info);
|
||||
|
||||
/**
|
||||
* @brief Delete all the mission info.
|
||||
|
||||
@@ -70,6 +70,14 @@ public:
|
||||
*/
|
||||
std::shared_ptr<Mission> GetSpecifiedMission(const std::string& missionName, const std::string& flag) const;
|
||||
|
||||
/**
|
||||
* Get recent standard mission by name.
|
||||
*
|
||||
* @param missionName target mission name.
|
||||
* @return founded mission.
|
||||
*/
|
||||
std::shared_ptr<Mission> GetRecentStandardMission(const std::string& missionName) const;
|
||||
|
||||
/**
|
||||
* Get top mission of this mission list.
|
||||
*
|
||||
|
||||
@@ -392,11 +392,12 @@ private:
|
||||
const std::shared_ptr<AbilityRecord> &callerAbility, const AbilityRequest &abilityRequest);
|
||||
std::shared_ptr<Mission> GetReusedMission(const AbilityRequest &abilityRequest);
|
||||
std::shared_ptr<Mission> GetReusedSpecifiedMission(const AbilityRequest &abilityRequest);
|
||||
std::shared_ptr<Mission> GetReusedStandardMission(const AbilityRequest &abilityRequest);
|
||||
void GetTargetMissionAndAbility(const AbilityRequest &abilityRequest, std::shared_ptr<Mission> &targetMission,
|
||||
std::shared_ptr<AbilityRecord> &targetRecord);
|
||||
bool HandleReusedMissionAndAbility(const AbilityRequest &abilityRequest, std::shared_ptr<Mission> &targetMission,
|
||||
std::shared_ptr<AbilityRecord> &targetRecord);
|
||||
std::string GetMissionName(const AbilityRequest &abilityRequest, bool isStandard) const;
|
||||
std::string GetMissionName(const AbilityRequest &abilityRequest) const;
|
||||
bool CreateOrReusedMissionInfo(const AbilityRequest &abilityRequest, InnerMissionInfo &info) const;
|
||||
void MoveMissionToTargetList(bool isCallFromLauncher,
|
||||
const std::shared_ptr<MissionList> &targetMissionList,
|
||||
|
||||
@@ -3269,6 +3269,11 @@ int AbilityManagerService::GenerateAbilityRequest(
|
||||
HILOG_INFO("GenerateAbilityRequest, moduleName: %{public}s.", request.abilityInfo.moduleName.c_str());
|
||||
request.want.SetModuleName(request.abilityInfo.moduleName);
|
||||
|
||||
if (want.GetBoolParam(Want::PARAM_RESV_START_RECENT, false) &&
|
||||
AAFwk::PermissionVerification::GetInstance()->VerifyMissionPermission()) {
|
||||
request.startRecent = true;
|
||||
}
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -68,6 +68,15 @@ bool Mission::IsSpecifiedAbility() const
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Mission::IsStandardAbility() const
|
||||
{
|
||||
if (abilityRecord_) {
|
||||
return abilityRecord_->GetAbilityInfo().launchMode == AppExecFwk::LaunchMode::STANDARD;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void Mission::SetSpecifiedFlag(const std::string &flag)
|
||||
{
|
||||
specifiedFlag_ = flag;
|
||||
|
||||
@@ -289,25 +289,32 @@ int MissionInfoMgr::GetInnerMissionInfoById(int32_t missionId, InnerMissionInfo
|
||||
}
|
||||
|
||||
bool MissionInfoMgr::FindReusedMissionInfo(const std::string &missionName,
|
||||
const std::string &flag, InnerMissionInfo &info)
|
||||
const std::string &flag, bool isFindRecentStandard, InnerMissionInfo &info)
|
||||
{
|
||||
if (missionName.empty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
std::lock_guard<std::recursive_mutex> lock(mutex_);
|
||||
auto it = std::find_if(missionInfoList_.begin(), missionInfoList_.end(),
|
||||
[&missionName, &flag](const InnerMissionInfo item) {
|
||||
if (item.launchMode == static_cast<int32_t>(AppExecFwk::LaunchMode::STANDARD)) {
|
||||
[&missionName, &flag, &isFindRecentStandard](const InnerMissionInfo item) {
|
||||
if (missionName != item.missionName) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// already sorted, return head of list
|
||||
if (isFindRecentStandard && item.launchMode == static_cast<int32_t>(AppExecFwk::LaunchMode::STANDARD)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (item.launchMode == static_cast<int32_t>(AppExecFwk::LaunchMode::SINGLETON)) {
|
||||
return missionName == item.missionName;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (item.launchMode == static_cast<int32_t>(AppExecFwk::LaunchMode::SPECIFIED)) {
|
||||
return missionName == item.missionName && flag == item.specifiedFlag;
|
||||
return flag == item.specifiedFlag;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -94,6 +94,25 @@ std::shared_ptr<Mission> MissionList::GetSpecifiedMission(
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<Mission> MissionList::GetRecentStandardMission(const std::string &missionName) const
|
||||
{
|
||||
if (missionName.empty()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::string missionTime = "0";
|
||||
std::shared_ptr<Mission> result = nullptr;
|
||||
for (auto& mission : missions_) {
|
||||
if (mission && mission->IsStandardAbility() && mission->GetMissionName() == missionName &&
|
||||
mission->GetMissionTime() >= missionTime) {
|
||||
result = mission;
|
||||
missionTime = mission->GetMissionTime();
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
std::shared_ptr<AbilityRecord> MissionList::GetAbilityRecordByToken(const sptr<IRemoteObject> &token) const
|
||||
{
|
||||
for (auto mission : missions_) {
|
||||
|
||||
@@ -384,30 +384,46 @@ bool MissionListManager::HandleReusedMissionAndAbility(const AbilityRequest &abi
|
||||
HILOG_DEBUG("mission exists. No update required");
|
||||
return true;
|
||||
}
|
||||
HILOG_DEBUG("mission exists. need to be updated");
|
||||
return false;
|
||||
|
||||
auto missionId = targetMission->GetMissionId();
|
||||
HILOG_INFO("mission exists. need to be updated, missionId:%{public}d", missionId);
|
||||
InnerMissionInfo info;
|
||||
if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
|
||||
targetMission->GetMissionId(), info) == 0) {
|
||||
info.missionInfo.time = GetCurrentTime();
|
||||
info.missionInfo.runningState = 0;
|
||||
info.startMethod = CallType2StartMethod(abilityRequest.callType);
|
||||
DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
|
||||
targetMission->UpdateMissionId(missionId, info.startMethod);
|
||||
targetMission->UpdateMissionTime(info.missionInfo.time);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string MissionListManager::GetMissionName(const AbilityRequest &abilityRequest, bool isStandard) const
|
||||
std::string MissionListManager::GetMissionName(const AbilityRequest &abilityRequest) const
|
||||
{
|
||||
int32_t appIndex = abilityRequest.want.GetIntParam(DLP_INDEX, 0);
|
||||
std::string missionName = isStandard ? abilityRequest.abilityInfo.bundleName :
|
||||
AbilityUtil::ConvertBundleNameSingleton(
|
||||
abilityRequest.abilityInfo.bundleName, abilityRequest.abilityInfo.name,
|
||||
abilityRequest.abilityInfo.moduleName, appIndex);
|
||||
|
||||
return missionName;
|
||||
return AbilityUtil::ConvertBundleNameSingleton(abilityRequest.abilityInfo.bundleName,
|
||||
abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName, appIndex);
|
||||
}
|
||||
|
||||
bool MissionListManager::CreateOrReusedMissionInfo(const AbilityRequest &abilityRequest, InnerMissionInfo &info) const
|
||||
{
|
||||
// get mission name.
|
||||
bool reUsedMissionInfo = false;
|
||||
bool isStandard = abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD;
|
||||
std::string missionName = GetMissionName(abilityRequest, isStandard);
|
||||
bool needFind = false;
|
||||
bool isFindRecentStandard = abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD &&
|
||||
abilityRequest.startRecent;
|
||||
if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::STANDARD || isFindRecentStandard) {
|
||||
needFind = true;
|
||||
}
|
||||
|
||||
std::string missionName = GetMissionName(abilityRequest);
|
||||
auto mgr = DelayedSingleton<MissionInfoMgr>::GetInstance();
|
||||
if (!isStandard && !abilityRequest.abilityInfo.applicationInfo.isLauncherApp && mgr &&
|
||||
mgr->FindReusedMissionInfo(missionName, abilityRequest.specifiedFlag, info) && info.missionInfo.id > 0) {
|
||||
if (needFind && !abilityRequest.abilityInfo.applicationInfo.isLauncherApp && mgr &&
|
||||
mgr->FindReusedMissionInfo(missionName, abilityRequest.specifiedFlag, isFindRecentStandard, info)
|
||||
&& info.missionInfo.id > 0) {
|
||||
reUsedMissionInfo = true;
|
||||
}
|
||||
HILOG_INFO("try find reused mission info. result:%{public}d", reUsedMissionInfo);
|
||||
@@ -439,27 +455,21 @@ void MissionListManager::GetTargetMissionAndAbility(const AbilityRequest &abilit
|
||||
targetMission = std::make_shared<Mission>(info.missionInfo.id, targetRecord,
|
||||
info.missionName, info.startMethod);
|
||||
targetMission->SetLockedState(info.missionInfo.lockedState);
|
||||
targetMission->UpdateMissionTime(info.missionInfo.time);
|
||||
targetRecord->SetMission(targetMission);
|
||||
targetRecord->SetOwnerMissionUserId(userId_);
|
||||
} else {
|
||||
HILOG_DEBUG("Update old mission data.");
|
||||
auto state = targetMission->UpdateMissionId(info.missionInfo.id, info.startMethod);
|
||||
if (!state) {
|
||||
HILOG_INFO("targetMission UpdateMissionId(%{public}d, %{public}d) failed", info.missionInfo.id,
|
||||
info.startMethod);
|
||||
|
||||
// handle specified
|
||||
if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
|
||||
targetMission->SetSpecifiedFlag(abilityRequest.specifiedFlag);
|
||||
targetRecord->SetSpecifiedFlag(abilityRequest.specifiedFlag);
|
||||
}
|
||||
HILOG_DEBUG("Update MissionId (%{public}d, %{public}d) end", info.missionInfo.id, info.startMethod);
|
||||
}
|
||||
|
||||
if (!findReusedMissionInfo && targetRecord) {
|
||||
info.missionInfo.label = targetRecord->GetLabel();
|
||||
}
|
||||
|
||||
if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
|
||||
targetMission->SetSpecifiedFlag(abilityRequest.specifiedFlag);
|
||||
targetRecord->SetSpecifiedFlag(abilityRequest.specifiedFlag);
|
||||
}
|
||||
|
||||
if (abilityRequest.abilityInfo.applicationInfo.isLauncherApp || abilityRequest.abilityInfo.excludeFromMissions) {
|
||||
return;
|
||||
}
|
||||
@@ -572,14 +582,16 @@ std::shared_ptr<Mission> MissionListManager::GetReusedMission(const AbilityReque
|
||||
return GetReusedSpecifiedMission(abilityRequest);
|
||||
}
|
||||
|
||||
if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD) {
|
||||
return GetReusedStandardMission(abilityRequest);
|
||||
}
|
||||
|
||||
if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::SINGLETON) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<Mission> reUsedMission = nullptr;
|
||||
int32_t appIndex = abilityRequest.want.GetIntParam(DLP_INDEX, 0);
|
||||
std::string missionName = AbilityUtil::ConvertBundleNameSingleton(abilityRequest.abilityInfo.bundleName,
|
||||
abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName, appIndex);
|
||||
std::string missionName = GetMissionName(abilityRequest);
|
||||
|
||||
// find launcher first.
|
||||
if (abilityRequest.abilityInfo.applicationInfo.isLauncherApp) {
|
||||
@@ -611,9 +623,7 @@ std::shared_ptr<Mission> MissionListManager::GetReusedSpecifiedMission(const Abi
|
||||
|
||||
// specified mission name format is same as singleton.
|
||||
std::shared_ptr<Mission> reUsedMission = nullptr;
|
||||
int32_t appIndex = abilityRequest.want.GetIntParam(DLP_INDEX, 0);
|
||||
std::string missionName = AbilityUtil::ConvertBundleNameSingleton(abilityRequest.abilityInfo.bundleName,
|
||||
abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName, appIndex);
|
||||
std::string missionName = GetMissionName(abilityRequest);
|
||||
std::string flag = abilityRequest.specifiedFlag;
|
||||
|
||||
// find launcher first.
|
||||
@@ -638,6 +648,49 @@ std::shared_ptr<Mission> MissionListManager::GetReusedSpecifiedMission(const Abi
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<Mission> MissionListManager::GetReusedStandardMission(const AbilityRequest &abilityRequest)
|
||||
{
|
||||
if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::STANDARD) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (!abilityRequest.startRecent) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// all mission name format is same.
|
||||
std::string missionName = GetMissionName(abilityRequest);
|
||||
std::shared_ptr<Mission> reUsedMission = nullptr;
|
||||
|
||||
// find launcher first, if find it in launcher list, no need to find in other list.
|
||||
if (abilityRequest.abilityInfo.applicationInfo.isLauncherApp) {
|
||||
if ((reUsedMission = launcherList_->GetRecentStandardMission(missionName)) != nullptr) {
|
||||
return reUsedMission;
|
||||
}
|
||||
}
|
||||
|
||||
// try find it from current and default standard.
|
||||
std::string missionTime = "0";
|
||||
for (const auto &missionList : currentMissionLists_) {
|
||||
if (!missionList) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto mission = missionList->GetRecentStandardMission(missionName);
|
||||
if (mission && mission->GetMissionTime() >= missionTime) {
|
||||
missionTime = mission->GetMissionTime();
|
||||
reUsedMission = mission;
|
||||
}
|
||||
}
|
||||
|
||||
auto mission = defaultStandardList_->GetRecentStandardMission(missionName);
|
||||
if (mission && mission->GetMissionTime() >= missionTime) {
|
||||
reUsedMission = mission;
|
||||
}
|
||||
|
||||
return reUsedMission;
|
||||
}
|
||||
|
||||
void MissionListManager::MoveMissionToTargetList(bool isCallFromLauncher,
|
||||
const std::shared_ptr<MissionList> &targetMissionList,
|
||||
const std::shared_ptr<Mission> &mission)
|
||||
@@ -1031,10 +1084,12 @@ void MissionListManager::CompleteForegroundSuccess(const std::shared_ptr<Ability
|
||||
|
||||
auto mission = abilityRecord->GetMission();
|
||||
if (mission) {
|
||||
auto currentTime = GetCurrentTime();
|
||||
mission->UpdateMissionTime(currentTime);
|
||||
InnerMissionInfo info;
|
||||
if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
|
||||
mission->GetMissionId(), info) == 0) {
|
||||
info.missionInfo.time = GetCurrentTime();
|
||||
info.missionInfo.time = currentTime;
|
||||
info.missionInfo.runningState = 0;
|
||||
DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ namespace OHOS {
|
||||
namespace {
|
||||
constexpr size_t FOO_MAX_LEN = 1024;
|
||||
constexpr size_t U32_AT_SIZE = 4;
|
||||
constexpr uint8_t ENABLE = 2;
|
||||
}
|
||||
|
||||
uint32_t GetU32Data(const char* ptr)
|
||||
@@ -43,6 +44,7 @@ bool DoSomethingInterestingWithMyAPI(const char* data, size_t size)
|
||||
{
|
||||
int32_t int32Param = static_cast<int32_t>(GetU32Data(data));
|
||||
std::string stringParam(data, size);
|
||||
bool boolParam = *data % ENABLE;
|
||||
InnerMissionInfo innerMissionInfo;
|
||||
|
||||
// fuzz for MissionInfoMgr
|
||||
@@ -52,7 +54,7 @@ bool DoSomethingInterestingWithMyAPI(const char* data, size_t size)
|
||||
MissionInfo missionInfo;
|
||||
missionInfoMgr->GetMissionInfoById(int32Param, missionInfo);
|
||||
missionInfoMgr->GetInnerMissionInfoById(int32Param, innerMissionInfo);
|
||||
missionInfoMgr->FindReusedMissionInfo(stringParam, stringParam, innerMissionInfo);
|
||||
missionInfoMgr->FindReusedMissionInfo(stringParam, stringParam, boolParam, innerMissionInfo);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -90,4 +92,3 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
|
||||
ch = nullptr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@ bool DoSomethingInterestingWithMyAPI(const char* data, size_t size)
|
||||
missionListManager->StartAbilityLocked(abilityRecord, abilityRecord, abilityRequest);
|
||||
std::shared_ptr<Mission> mission = std::make_shared<Mission>(int32Param, abilityRecord);
|
||||
missionListManager->HandleReusedMissionAndAbility(abilityRequest, mission, abilityRecord);
|
||||
missionListManager->GetMissionName(abilityRequest, boolParam);
|
||||
missionListManager->GetMissionName(abilityRequest);
|
||||
InnerMissionInfo innerMissionInfo;
|
||||
missionListManager->CreateOrReusedMissionInfo(abilityRequest, innerMissionInfo);
|
||||
missionListManager->GetTargetMissionAndAbility(abilityRequest, mission, abilityRecord);
|
||||
@@ -165,4 +165,3 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
|
||||
ch = nullptr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -388,44 +388,50 @@ HWTEST_F(MissionInfoMgrTest, FindReusedMissionInfo_001, TestSize.Level1)
|
||||
int userId = 0;
|
||||
missionInfoMgr->Init(userId);
|
||||
InnerMissionInfo missionInfo;
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("", "", missionInfo));
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("test", "", missionInfo));
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("", "", false, missionInfo));
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("test", "", false, missionInfo));
|
||||
|
||||
missionInfo.missionInfo.id = 1;
|
||||
missionInfo.launchMode = static_cast<int32_t>(AppExecFwk::LaunchMode::STANDARD);
|
||||
missionInfoMgr->missionInfoList_.push_back(missionInfo);
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("test", "", missionInfo));
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("test", "", false, missionInfo));
|
||||
|
||||
missionInfoMgr->missionInfoList_.clear();
|
||||
missionInfo.launchMode = static_cast<int32_t>(AppExecFwk::LaunchMode::SINGLETON);
|
||||
missionInfoMgr->missionInfoList_.push_back(missionInfo);
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("test", "", missionInfo));
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("test", "", false, missionInfo));
|
||||
missionInfoMgr->missionInfoList_.clear();
|
||||
missionInfo.missionName = "test";
|
||||
missionInfoMgr->missionInfoList_.push_back(missionInfo);
|
||||
EXPECT_TRUE(missionInfoMgr->FindReusedMissionInfo("test", "", missionInfo));
|
||||
EXPECT_TRUE(missionInfoMgr->FindReusedMissionInfo("test", "", false, missionInfo));
|
||||
|
||||
missionInfoMgr->missionInfoList_.clear();
|
||||
missionInfo.launchMode = static_cast<int32_t>(AppExecFwk::LaunchMode::SPECIFIED);
|
||||
missionInfoMgr->missionInfoList_.push_back(missionInfo);
|
||||
EXPECT_TRUE(missionInfoMgr->FindReusedMissionInfo("test", "", missionInfo));
|
||||
EXPECT_TRUE(missionInfoMgr->FindReusedMissionInfo("test", "", false, missionInfo));
|
||||
|
||||
missionInfoMgr->missionInfoList_.clear();
|
||||
missionInfo.missionName = "test1";
|
||||
missionInfoMgr->missionInfoList_.push_back(missionInfo);
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("test", "", missionInfo));
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("test", "", false, missionInfo));
|
||||
|
||||
missionInfoMgr->missionInfoList_.clear();
|
||||
missionInfo.missionName = "test";
|
||||
missionInfo.specifiedFlag = "flag";
|
||||
missionInfoMgr->missionInfoList_.push_back(missionInfo);
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("test", "", missionInfo));
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("test", "", false, missionInfo));
|
||||
|
||||
missionInfoMgr->missionInfoList_.clear();
|
||||
missionInfo.specifiedFlag = "";
|
||||
missionInfo.launchMode = 1000;
|
||||
missionInfoMgr->missionInfoList_.push_back(missionInfo);
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("test", "", missionInfo));
|
||||
EXPECT_FALSE(missionInfoMgr->FindReusedMissionInfo("test", "", false, missionInfo));
|
||||
|
||||
missionInfoMgr->missionInfoList_.clear();
|
||||
missionInfo.missionName = "test";
|
||||
missionInfo.launchMode = static_cast<int32_t>(AppExecFwk::LaunchMode::STANDARD);
|
||||
missionInfoMgr->missionInfoList_.push_back(missionInfo);
|
||||
EXPECT_TRUE(missionInfoMgr->FindReusedMissionInfo("test", "", true, missionInfo));
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user