预加载通知方案修改

Signed-off-by: zhangyuhang72 <zhangyuhang72@huawei.com>
Change-Id: I107024477cfa39dd787634bdb3858e7238d262ed
This commit is contained in:
zhangyuhang72
2025-07-21 17:02:59 +08:00
parent ba8df929b7
commit feeef4e7a6
51 changed files with 439 additions and 236 deletions
@@ -968,6 +968,10 @@ enum {
START_UI_ABILITIES_SPECIFIED_FAILED_ERROR = 2097382,
ERR_PRELOAD_APP_RECORD_ALREADY_EXIST = 2097383,
ERR_NOTIFY_PRELOAD_ABILITY_NO_CHANGE = 2097384,
ERR_NOTIFY_PRELOAD_ABILITY_HAS_OTHER = 2097385,
/**
* Native error(3000000) for target bundle not exist.
@@ -512,7 +512,7 @@ public:
return ERR_OK;
}
virtual int32_t NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token)
virtual int32_t NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token, bool isPreForeground)
{
return ERR_OK;
}
@@ -449,7 +449,7 @@ public:
virtual int32_t PreloadApplicationByPhase(const std::string &bundleName, int32_t userId, int32_t appIndex,
AppExecFwk::PreloadPhase preloadPhase) override;
virtual int32_t NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token) override;
virtual int32_t NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token, bool isPreForeground) override;
virtual int32_t CheckPreloadAppRecordExist(const std::string &bundleName, int32_t userId, int32_t appIndex,
bool &isExist) override;
@@ -984,7 +984,7 @@ public:
int32_t PreloadApplicationByPhase(const std::string &bundleName, int32_t userId, int32_t appIndex,
AppExecFwk::PreloadPhase preloadPhase);
int32_t NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token);
int32_t NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token, bool isPreForeground);
int32_t CheckPreloadAppRecordExist(const std::string &bundleName, int32_t userId, int32_t appIndex,
bool &isExist);
@@ -161,7 +161,7 @@ public:
*
* @param preloadProcessData Preload process data.
*/
virtual void OnPreloadProcessStateChanged(const PreloadProcessData &preloadProcessData) override;
virtual void OnProcessPreForegroundChanged(const PreloadProcessData &preloadProcessData) override;
private:
bool WriteInterfaceToken(MessageParcel &data);
@@ -158,7 +158,7 @@ public:
*/
virtual void OnKeepAliveStateChanged(const ProcessData &processData) override;
virtual void OnPreloadProcessStateChanged(const PreloadProcessData &preloadProcessData) override;
virtual void OnProcessPreForegroundChanged(const PreloadProcessData &preloadProcessData) override;
private:
int32_t HandleOnForegroundApplicationChanged(MessageParcel &data, MessageParcel &reply);
@@ -197,7 +197,7 @@ private:
int32_t HandleOnKeepAliveStateChanged(MessageParcel &data, MessageParcel &reply);
int32_t HandleOnPreloadProcessStateChanged(MessageParcel &data, MessageParcel &reply);
int32_t HandleOnProcessPreForegroundChanged(MessageParcel &data, MessageParcel &reply);
static std::mutex callbackMutex_;
@@ -164,7 +164,7 @@ public:
*
* @param preloadProcessData Preload process data.
*/
virtual void OnPreloadProcessStateChanged(const PreloadProcessData &preloadProcessData) {};
virtual void OnProcessPreForegroundChanged(const PreloadProcessData &preloadProcessData) {};
enum class Message {
TRANSACT_ON_FOREGROUND_APPLICATION_CHANGED = 0,
@@ -31,9 +31,9 @@ struct PreloadProcessData : public Parcelable {
bool ReadFromParcel(Parcel &parcel);
bool isPreForeground = false;
pid_t pid = 0;
int32_t uid = 0;
int32_t state = 0;
std::string bundleName;
};
} // namespace AppExecFwk
@@ -61,6 +61,7 @@ struct RunningProcessInfo : public Parcelable {
bool isStrictMode = false;
bool isDebugApp = false;
bool isExiting = false;
bool isPreForeground = false;
std::int32_t pid_;
std::int32_t uid_;
std::int32_t bundleType = 0;
@@ -1588,7 +1588,7 @@ int32_t AmsMgrProxy::PreloadApplicationByPhase(const std::string &bundleName, in
return reply.ReadInt32();
}
int32_t AmsMgrProxy::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token)
int32_t AmsMgrProxy::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token, bool isPreForeground)
{
if (token == nullptr) {
TAG_LOGE(AAFwkTag::APPMGR, "token null.");
@@ -1596,7 +1596,7 @@ int32_t AmsMgrProxy::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token)
}
MessageParcel data;
MessageParcel reply;
MessageOption option(MessageOption::TF_ASYNC);
MessageOption option;
if (!WriteInterfaceToken(data)) {
TAG_LOGE(AAFwkTag::APPMGR, "Write interface token failed.");
return AAFwk::ERR_WRITE_INTERFACE_TOKEN_FAILED;
@@ -1605,6 +1605,7 @@ int32_t AmsMgrProxy::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token)
TAG_LOGE(AAFwkTag::APPMGR, "Write token failed.");
return AAFwk::ERR_WRITE_CALLER_TOKEN_FAILED;
}
PARCEL_UTIL_WRITE_RET_INT(data, Bool, isPreForeground);
auto ret = SendTransactCmd(
static_cast<uint32_t>(IAmsMgr::Message::NOTIFY_PRELOAD_ABILITY_STATE_CHANGED), data, reply, option);
@@ -1612,7 +1613,7 @@ int32_t AmsMgrProxy::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token)
TAG_LOGE(AAFwkTag::APPMGR, "Send request failed, err: %{public}d.", ret);
return ret;
}
return NO_ERROR;
return reply.ReadInt32();
}
int32_t AmsMgrProxy::CheckPreloadAppRecordExist(const std::string &bundleName, int32_t userId, int32_t appIndex,
@@ -1000,11 +1000,16 @@ int32_t AmsMgrStub::HandleNotifyPreloadAbilityStateChanged(MessageParcel &data,
{
HITRACE_METER(HITRACE_TAG_APP);
sptr<IRemoteObject> token = data.ReadRemoteObject();
bool isPreForeground = data.ReadBool();
if (token == nullptr) {
TAG_LOGE(AAFwkTag::APPMGR, "null token");
return AAFwk::INVALID_CALLER_TOKEN;
}
NotifyPreloadAbilityStateChanged(token);
auto ret = NotifyPreloadAbilityStateChanged(token, isPreForeground);
if (!reply.WriteInt32(ret)) {
TAG_LOGE(AAFwkTag::APPMGR, "Fail to write ret");
return AAFwk::ERR_WRITE_RESULT_CODE_FAILED;
}
return NO_ERROR;
}
@@ -1635,7 +1635,7 @@ int32_t AppMgrClient::PreloadApplicationByPhase(const std::string &bundleName, i
return amsService->PreloadApplicationByPhase(bundleName, userId, appIndex, preloadPhase);
}
int32_t AppMgrClient::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token)
int32_t AppMgrClient::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token, bool isPreForeground)
{
if (mgrHolder_ == nullptr) {
TAG_LOGE(AAFwkTag::APPMGR, "mgrHolder is nullptr.");
@@ -1651,7 +1651,7 @@ int32_t AppMgrClient::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token
TAG_LOGE(AAFwkTag::APPMGR, "amsService is nullptr.");
return ERROR_SERVICE_NOT_CONNECTED;
}
return amsService->NotifyPreloadAbilityStateChanged(token);
return amsService->NotifyPreloadAbilityStateChanged(token, isPreForeground);
}
int32_t AppMgrClient::CheckPreloadAppRecordExist(const std::string &bundleName, int32_t userId, int32_t appIndex,
@@ -440,17 +440,17 @@ void ApplicationStateObserverProxy::OnKeepAliveStateChanged(const ProcessData &p
}
}
void ApplicationStateObserverProxy::OnPreloadProcessStateChanged(const PreloadProcessData &preloadProcessData)
void ApplicationStateObserverProxy::OnProcessPreForegroundChanged(const PreloadProcessData &preloadProcessData)
{
MessageParcel data;
MessageParcel reply;
MessageOption option(MessageOption::TF_ASYNC);
if (!WriteInterfaceToken(data)) {
TAG_LOGE(AAFwkTag::APPMGR, "OnPreloadProcessStateChanged, WriteInterfaceToken failed");
TAG_LOGE(AAFwkTag::APPMGR, "OnProcessPreForegroundChanged, WriteInterfaceToken failed");
return;
}
if (!data.WriteParcelable(&preloadProcessData)) {
TAG_LOGE(AAFwkTag::APPMGR, "OnPreloadProcessStateChanged write preloadProcessData failed");
TAG_LOGE(AAFwkTag::APPMGR, "OnProcessPreForegroundChanged write preloadProcessData failed");
return;
}
int32_t ret = SendTransactCmd(
@@ -458,7 +458,7 @@ void ApplicationStateObserverProxy::OnPreloadProcessStateChanged(const PreloadPr
data, reply, option);
if (ret != NO_ERROR && ret != ERR_INVALID_STUB) {
TAG_LOGW(AAFwkTag::APPMGR,
"OnPreloadProcessStateChanged ssendRequest is wrong, error code: %{public}d, pid:%{public}d.",
"OnProcessPreForegroundChanged ssendRequest is wrong, error code: %{public}d, pid:%{public}d.",
ret, preloadProcessData.pid);
}
}
@@ -70,7 +70,7 @@ int ApplicationStateObserverStub::OnRemoteRequest(
case Message::TRANSACT_ON_KEEP_ALIVE_STATE_CHANGED:
return HandleOnKeepAliveStateChanged(data, reply);
case Message::TRANSACT_ON_PRELOAD_PROCESS_STATE_CHANGED:
return HandleOnPreloadProcessStateChanged(data, reply);
return HandleOnProcessPreForegroundChanged(data, reply);
}
TAG_LOGW(AAFwkTag::APPMGR, "ApplicationStateObserverStub::OnRemoteRequest, default case, need check");
return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
@@ -136,7 +136,7 @@ void ApplicationStateObserverStub::OnProcessBindingRelationChanged(const Process
void ApplicationStateObserverStub::OnKeepAliveStateChanged(const ProcessData &processData)
{}
void ApplicationStateObserverStub::OnPreloadProcessStateChanged(const PreloadProcessData &preloadProcessData)
void ApplicationStateObserverStub::OnProcessPreForegroundChanged(const PreloadProcessData &preloadProcessData)
{}
int32_t ApplicationStateObserverStub::HandleOnForegroundApplicationChanged(MessageParcel &data, MessageParcel &reply)
@@ -379,7 +379,7 @@ int32_t ApplicationStateObserverStub::HandleOnKeepAliveStateChanged(MessageParce
return NO_ERROR;
}
int32_t ApplicationStateObserverStub::HandleOnPreloadProcessStateChanged(MessageParcel &data, MessageParcel &reply)
int32_t ApplicationStateObserverStub::HandleOnProcessPreForegroundChanged(MessageParcel &data, MessageParcel &reply)
{
std::unique_ptr<PreloadProcessData> preloadProcessData(data.ReadParcelable<PreloadProcessData>());
if (!preloadProcessData) {
@@ -387,7 +387,7 @@ int32_t ApplicationStateObserverStub::HandleOnPreloadProcessStateChanged(Message
return ERR_APPEXECFWK_PARCEL_ERROR;
}
OnPreloadProcessStateChanged(*preloadProcessData);
OnProcessPreForegroundChanged(*preloadProcessData);
return NO_ERROR;
}
@@ -21,15 +21,19 @@ namespace OHOS {
namespace AppExecFwk {
bool PreloadProcessData::ReadFromParcel(Parcel &parcel)
{
isPreForeground = parcel.ReadBool();
pid = parcel.ReadInt32();
uid = parcel.ReadInt32();
state = parcel.ReadInt32();
bundleName = parcel.ReadString();
return true;
}
bool PreloadProcessData::Marshalling(Parcel &parcel) const
{
if (!parcel.WriteBool(isPreForeground)) {
TAG_LOGE(AAFwkTag::APPMGR, "write isPreForeground failed.");
return false;
}
if (!parcel.WriteInt32(pid)) {
TAG_LOGE(AAFwkTag::APPMGR, "write pid failed.");
return false;
@@ -38,10 +42,6 @@ bool PreloadProcessData::Marshalling(Parcel &parcel) const
TAG_LOGE(AAFwkTag::APPMGR, "write uid failed.");
return false;
}
if (!parcel.WriteInt32(state)) {
TAG_LOGE(AAFwkTag::APPMGR, "write state failed.");
return false;
}
if (!parcel.WriteString(bundleName)) {
TAG_LOGE(AAFwkTag::APPMGR, "write bundleName failed.");
return false;
@@ -49,6 +49,7 @@ bool RunningProcessInfo::ReadFromParcel(Parcel &parcel)
isTestMode = parcel.ReadBool();
isDebugApp = parcel.ReadBool();
isExiting = parcel.ReadBool();
isPreForeground = parcel.ReadBool();
int32_t bundleTypeData;
READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, bundleTypeData);
bundleType = static_cast<int32_t>(bundleTypeData);
@@ -102,6 +103,7 @@ bool RunningProcessInfo::Marshalling(Parcel &parcel) const
WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, isTestMode);
WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, isDebugApp);
WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, isExiting);
WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, isPreForeground);
WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(bundleType));
if (!parcel.WriteStringVector(bundleNames)) {
TAG_LOGE(AAFwkTag::APPMGR, "write bundleNames failed.");
@@ -1266,6 +1266,16 @@ public:
return isPreloaded_.load();
}
inline void SetFrozenByPreload(bool isFrozenByPreload)
{
isFrozenByPreload_.store(isFrozenByPreload);
}
inline bool IsFrozenByPreload() const
{
return isFrozenByPreload_.load();
}
void SendEvent(uint32_t msg, uint32_t timeOut, int32_t param = -1, bool isExtension = false,
const std::string &taskName = "");
@@ -1508,6 +1518,7 @@ private:
std::atomic_bool isLastWantBackgroundDriven_ = false;
std::atomic<int32_t> scenarios_ = 0;
std::atomic<bool> isPreloaded_ = false;
std::atomic<bool> isFrozenByPreload_ = false;
};
} // namespace AAFwk
} // namespace OHOS
+1 -1
View File
@@ -616,7 +616,7 @@ public:
int32_t PreloadApplicationByPhase(const std::string &bundleName, int32_t userId, int32_t appIndex,
AppExecFwk::PreloadPhase preloadPhase);
int32_t NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token);
int32_t NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token, bool isPreForeground);
int32_t CheckPreloadAppRecordExist(const std::string &bundleName, int32_t userId, int32_t appIndex, bool &isExist);
@@ -31,10 +31,6 @@ public:
static bool IsHiddenStart(const StartOptions &options);
static int32_t CheckHiddenStartSupported(const StartOptions &options);
static bool IsPreloadStart(const StartOptions &options);
static int32_t CheckPreloadStartSupported();
};
}
}
@@ -1782,8 +1782,6 @@ int AbilityManagerService::StartUIAbilityForOptionWrap(const Want &want, const S
options.processOptions != nullptr &&
options.processOptions->isStartFromNDK) {
ret = CheckStartSelfUIAbilityStartOptions(want, options);
} else if (HiddenStartUtils::IsPreloadStart(options)) {
ret = HiddenStartUtils::CheckPreloadStartSupported();
} else {
ret = CheckProcessOptions(want, options, userId);
}
@@ -502,6 +502,12 @@ void AbilityRecord::ProcessForegroundAbility(uint32_t tokenId, uint32_t sceneFla
PostForegroundTimeoutTask();
if (IsAbilityState(AbilityState::FOREGROUND)) {
TAG_LOGD(AAFwkTag::ABILITYMGR, "Activate %{public}s", element.c_str());
if (IsFrozenByPreload()) {
SetFrozenByPreload(false);
auto ret =
DelayedSingleton<AppScheduler>::GetInstance()->NotifyPreloadAbilityStateChanged(token_, false);
TAG_LOGI(AAFwkTag::ABILITYMGR, "NotifyPreloadAbilityStateChanged by start, ret: %{public}d", ret);
}
ForegroundAbility(sceneFlag);
} else {
// background to active state
+2 -2
View File
@@ -750,14 +750,14 @@ int32_t AppScheduler::PreloadApplicationByPhase(const std::string &bundleName, i
return IN_PROCESS_CALL(appMgrClient_->PreloadApplicationByPhase(bundleName, userId, appIndex, preloadPhase));
}
int32_t AppScheduler::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token)
int32_t AppScheduler::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token, bool isPreForeground)
{
HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
if (appMgrClient_ == nullptr) {
TAG_LOGE(AAFwkTag::ABILITYMGR, "null appMgrClient");
return INNER_ERR;
}
return IN_PROCESS_CALL(appMgrClient_->NotifyPreloadAbilityStateChanged(token));
return IN_PROCESS_CALL(appMgrClient_->NotifyPreloadAbilityStateChanged(token, isPreForeground));
}
int32_t AppScheduler::CheckPreloadAppRecordExist(const std::string &bundleName, int32_t userId, int32_t appIndex,
@@ -539,7 +539,8 @@ int UIAbilityLifecycleManager::AbilityTransactionDone(const sptr<IRemoteObject>
if (state == AbilityLifeCycleState::ABILITY_STATE_FOREGROUND_NEW &&
abilityRecord->IsPreloadStart() && !abilityRecord->IsPreloaded()) {
abilityRecord->SetPreloaded();
auto ret = DelayedSingleton<AppScheduler>::GetInstance()->NotifyPreloadAbilityStateChanged(token);
abilityRecord->SetFrozenByPreload(true);
auto ret = DelayedSingleton<AppScheduler>::GetInstance()->NotifyPreloadAbilityStateChanged(token, true);
TAG_LOGI(AAFwkTag::ABILITYMGR, "NotifyPreloadAbilityStateChanged ret: %{public}d", ret);
}
abilityRecord->RemoveSignatureInfo();
@@ -26,7 +26,8 @@ namespace OHOS {
namespace AAFwk {
bool HiddenStartUtils::IsHiddenStart(const StartOptions &options)
{
if (!PermissionVerification::GetInstance()->VerifyStartUIAbilityToHiddenPermission()) {
if (!PermissionVerification::GetInstance()->VerifyStartUIAbilityToHiddenPermission() &&
!PermissionVerification::GetInstance()->VerifyPreloadApplicationPermission()) {
return false;
}
@@ -41,48 +42,23 @@ bool HiddenStartUtils::IsHiddenStart(const StartOptions &options)
return true;
}
bool HiddenStartUtils::IsPreloadStart(const StartOptions &options)
{
if (!PermissionVerification::GetInstance()->VerifyPreloadApplicationPermission()) {
return false;
}
if (options.processOptions == nullptr) {
return false;
}
if (options.processOptions->startupVisibility != OHOS::AAFwk::StartupVisibility::STARTUP_HIDE) {
return false;
}
return options.processOptions->isPreloadStart;
}
int32_t HiddenStartUtils::CheckHiddenStartSupported(const StartOptions &options)
{
if (!AppUtils::GetInstance().IsStartOptionsWithAnimation()) {
if (!AppUtils::GetInstance().IsStartOptionsWithAnimation() &&
!AppUtils::GetInstance().IsPreloadApplicationEnabled()) {
TAG_LOGE(AAFwkTag::ABILITYMGR, "start ability silently is not supported in this device");
return ERR_NOT_SUPPORTED_PRODUCT_TYPE;
}
if (options.processOptions == nullptr ||
(!ProcessOptions::IsNewHiddenProcessMode(options.processOptions->processMode) &&
!ProcessOptions::IsNoAttachmentMode(options.processOptions->processMode))) {
!ProcessOptions::IsNoAttachmentMode(options.processOptions->processMode) &&
!options.processOptions->isPreloadStart)) {
TAG_LOGE(AAFwkTag::ABILITYMGR, "this processMode is not supported in hidden start");
return ERR_INVALID_VALUE;
}
return ERR_OK;
}
int32_t HiddenStartUtils::CheckPreloadStartSupported()
{
if (!AppUtils::GetInstance().IsPreloadApplicationEnabled()) {
TAG_LOGE(AAFwkTag::ABILITYMGR, "preload is not supported");
return ERR_NOT_SUPPORTED_PRODUCT_TYPE;
}
return ERR_OK;
}
}
}
+1 -1
View File
@@ -464,7 +464,7 @@ public:
virtual int32_t PreloadApplicationByPhase(const std::string &bundleName, int32_t userId, int32_t appIndex,
AppExecFwk::PreloadPhase preloadPhase) override;
virtual int32_t NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token) override;
virtual int32_t NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token, bool isPreForeground) override;
virtual int32_t CheckPreloadAppRecordExist(const std::string &bundleName, int32_t userId, int32_t appIndex,
bool &isExist) override;
@@ -255,7 +255,7 @@ public:
virtual int32_t PreloadApplication(const std::string &bundleName, int32_t userId,
AppExecFwk::PreloadMode preloadMode, int32_t appIndex);
virtual int32_t NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token);
virtual int32_t NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token, bool isPreForeground);
/**
* Launch Application Finished
@@ -735,6 +735,8 @@ public:
void SendAppStartupTypeEvent(const std::shared_ptr<AbilityRunningRecord> &ability, const AppStartType startType);
void SetKilling();
bool IsKilling() const;
void SetPreForeground(bool isPreForeground);
bool IsPreForeground() const;
void SetAppIndex(const int32_t appIndex);
int32_t GetAppIndex() const;
void SetInstanceKey(const std::string& instanceKey);
@@ -1216,6 +1218,7 @@ private:
bool isExtensionSandBox_ = false;
std::atomic<bool> isKilling_ = false;
std::atomic_bool isSpawned_ = false;
std::atomic<bool> isPreForeground_ = false;
int32_t appRecordId_ = 0;
int32_t mainUid_;
@@ -90,7 +90,7 @@ public:
void OnPageHide(const PageStateData pageStateData);
void OnAppCacheStateChanged(const std::shared_ptr<AppRunningRecord> &appRecord, ApplicationState state);
void OnKeepAliveStateChanged(const std::shared_ptr<AppRunningRecord> &appRecord);
void OnPreloadProcessStateChanged(std::shared_ptr<AppRunningRecord> appRecord, ApplicationState state);
void OnProcessPreForegroundChanged(std::shared_ptr<AppRunningRecord> appRecord);
private:
void HandleOnWindowShow(const std::shared_ptr<AppRunningRecord> &appRecord);
@@ -140,7 +140,7 @@ private:
void HandleOnProcessBindingRelationChanged(const std::shared_ptr<AppRunningRecord> &appRecord,
const UIExtensionProcessBindInfo &bindInfo, int32_t bindingRelation);
void HandleOnKeepAliveStateChanged(const std::shared_ptr<AppRunningRecord> &appRecord);
void HandleOnPreloadProcessStateChanged(std::shared_ptr<AppRunningRecord> appRecord, ApplicationState state);
void HandleOnProcessPreForegroundChanged(std::shared_ptr<AppRunningRecord> appRecord);
private:
std::shared_ptr<AAFwk::TaskHandlerWrap> handler_;
+2 -2
View File
@@ -851,7 +851,7 @@ int32_t AmsMgrScheduler::PreloadApplicationByPhase(const std::string &bundleName
return amsMgrServiceInner_->PreloadApplicationByPhase(bundleName, userId, appIndex, preloadPhase);
}
int32_t AmsMgrScheduler::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token)
int32_t AmsMgrScheduler::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token, bool isPreForeground)
{
if (!IsReady()) {
TAG_LOGE(AAFwkTag::APPMGR, "appMgrServiceInner is not ready.");
@@ -861,7 +861,7 @@ int32_t AmsMgrScheduler::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> to
TAG_LOGE(AAFwkTag::APPMGR, "Not foundation call.");
return ERR_PERMISSION_DENIED;
}
return amsMgrServiceInner_->NotifyPreloadAbilityStateChanged(token);
return amsMgrServiceInner_->NotifyPreloadAbilityStateChanged(token, isPreForeground);
}
int32_t AmsMgrScheduler::CheckPreloadAppRecordExist(const std::string &bundleName, int32_t userId, int32_t appIndex,
+22 -13
View File
@@ -748,7 +748,7 @@ void AppMgrServiceInner::reportpreLoadTask(const std::shared_ptr<AppRunningRecor
}
}
int32_t AppMgrServiceInner::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token)
int32_t AppMgrServiceInner::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject> token, bool isPreForeground)
{
HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
TAG_LOGD(AAFwkTag::APPMGR, "NotifyPreloadAbilityStateChanged");
@@ -761,10 +761,21 @@ int32_t AppMgrServiceInner::NotifyPreloadAbilityStateChanged(sptr<IRemoteObject>
TAG_LOGE(AAFwkTag::APPMGR, "appRecord not exist");
return ERR_NULL_OBJECT;
}
TAG_LOGI(AAFwkTag::APPMGR, "NotifyPreloadAbilityStateChanged bundle:%{public}s, pid:%{public}d",
appRecord->GetBundleName().c_str(), appRecord->GetPid());
DelayedSingleton<AppStateObserverManager>::GetInstance()->OnPreloadProcessStateChanged(appRecord,
ApplicationState::APP_STATE_PRE_FOREGROUND);
if (appRecord->IsPreForeground() == isPreForeground) {
TAG_LOGI(AAFwkTag::APPMGR,"NotifyPreloadAbilityStateChanged, pid:%{public}d, isPreForeground Same:%{public}d",
appRecord->GetPid(), isPreForeground);
return AAFwk::ERR_NOTIFY_PRELOAD_ABILITY_NO_CHANGE;
}
if (isPreForeground && appRecord->GetAbilities().size() > 1) {
TAG_LOGI(AAFwkTag::APPMGR,"NotifyPreloadAbilityStateChanged, has other ability, pid:%{public}d",
appRecord->GetPid());
return AAFwk::ERR_NOTIFY_PRELOAD_ABILITY_HAS_OTHER;
}
TAG_LOGI(AAFwkTag::APPMGR,
"NotifyPreloadAbilityStateChanged bundle:%{public}s, pid:%{public}d, isPreForeground:%{public}d",
appRecord->GetBundleName().c_str(), appRecord->GetPid(), isPreForeground);
appRecord->SetPreForeground(isPreForeground);
DelayedSingleton<AppStateObserverManager>::GetInstance()->OnProcessPreForegroundChanged(appRecord);
return ERR_OK;
}
@@ -2880,6 +2891,7 @@ void AppMgrServiceInner::GetRunningProcess(const std::shared_ptr<AppRunningRecor
info.isDebugApp = appRecord->IsDebug();
info.isExiting = appRecord->IsTerminating() || appRecord->IsKilling()
|| appRecord->GetRestartAppFlag() || appRecord->IsUserRequestCleaning();
info.isPreForeground = appRecord->IsPreForeground();
info.isCached = DelayedSingleton<CacheProcessManager>::GetInstance()->IsCachedProcess(appRecord);
if (appRecord->GetUserTestInfo() != nullptr && system::GetBoolParameter(DEVELOPER_MODE_STATE, false)) {
info.isTestMode = true;
@@ -3177,18 +3189,15 @@ void AppMgrServiceInner::UpdateAbilityState(const sptr<IRemoteObject> &token, co
{
HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
TAG_LOGD(AAFwkTag::APPMGR, "state %{public}d.", static_cast<int32_t>(state));
if (!token) {
TAG_LOGE(AAFwkTag::APPMGR, "token null");
return;
}
CHECK_POINTER_AND_RETURN_LOG(token, "token null");
if (state == AbilityState::ABILITY_STATE_FOREGROUND) {
AbilityRuntime::FreezeUtil::GetInstance().AppendLifecycleEvent(token, "ServiceInner::UpdateAbilityState");
}
auto appRecord = GetAppRunningRecordByAbilityToken(token);
if (!appRecord) {
TAG_LOGE(AAFwkTag::APPMGR, "app unexist");
return;
CHECK_POINTER_AND_RETURN_LOG(appRecord, "app unexist");
if (appRecord->IsPreForeground() && state == AbilityState::ABILITY_STATE_FOREGROUND) {
appRecord->SetPreForeground(false);
DelayedSingleton<AppStateObserverManager>::GetInstance()->OnProcessPreForegroundChanged(appRecord);
}
auto abilityRecord = appRecord->GetAbilityRunningRecordByToken(token);
if (!abilityRecord) {
@@ -1891,6 +1891,16 @@ bool AppRunningRecord::IsKilling() const
return isKilling_.load();
}
void AppRunningRecord::SetPreForeground(bool isPreForeground)
{
isPreForeground_.store(isPreForeground);
}
bool AppRunningRecord::IsPreForeground() const
{
return isPreForeground_.load();
}
bool AppRunningRecord::NeedUpdateConfigurationBackground()
{
bool needUpdate = false;
@@ -1364,11 +1364,10 @@ void AppStateObserverManager::HandleOnKeepAliveStateChanged(const std::shared_pt
}
}
void AppStateObserverManager::OnPreloadProcessStateChanged(std::shared_ptr<AppRunningRecord> appRecord,
ApplicationState state)
void AppStateObserverManager::OnProcessPreForegroundChanged(std::shared_ptr<AppRunningRecord> appRecord)
{
HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
TAG_LOGI(AAFwkTag::APPMGR, "OnPreloadProcessStateChanged");
TAG_LOGI(AAFwkTag::APPMGR, "OnProcessPreForegroundChanged");
if (!appRecord) {
TAG_LOGE(AAFwkTag::APPMGR, "null appRecord");
return;
@@ -1378,20 +1377,19 @@ void AppStateObserverManager::OnPreloadProcessStateChanged(std::shared_ptr<AppRu
return;
}
auto task = [weak = weak_from_this(), appRecord, state]() {
auto task = [weak = weak_from_this(), appRecord]() {
auto self = weak.lock();
if (self == nullptr) {
TAG_LOGE(AAFwkTag::APPMGR, "null self");
return;
}
TAG_LOGD(AAFwkTag::APPMGR, "OnPreloadProcessStateChanged task.");
self->HandleOnPreloadProcessStateChanged(appRecord, state);
TAG_LOGD(AAFwkTag::APPMGR, "OnProcessPreForegroundChanged task.");
self->HandleOnProcessPreForegroundChanged(appRecord);
};
handler_->SubmitTask(task);
}
void AppStateObserverManager::HandleOnPreloadProcessStateChanged(
std::shared_ptr<AppRunningRecord> appRecord, ApplicationState state)
void AppStateObserverManager::HandleOnProcessPreForegroundChanged(std::shared_ptr<AppRunningRecord> appRecord)
{
HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
if (appRecord == nullptr) {
@@ -1401,20 +1399,20 @@ void AppStateObserverManager::HandleOnPreloadProcessStateChanged(
auto bundleName = appRecord->GetBundleName();
PreloadProcessData preloadProcessData;
preloadProcessData.isPreForeground = appRecord->IsPreForeground();
preloadProcessData.pid = appRecord->GetPid();
preloadProcessData.uid = appRecord->GetUid();
preloadProcessData.state = static_cast<int32_t>(state);
preloadProcessData.bundleName = bundleName;
TAG_LOGI(AAFwkTag::APPMGR,
"HandleOnPreloadProcessStateChanged, pid:%{public}d, bundle:%{public}s, uid:%{public}d, state:%{public}d",
preloadProcessData.pid, bundleName.c_str(), preloadProcessData.uid, preloadProcessData.state);
"HandleOnProcessPreForegroundChanged, pid:%{public}d, bundle:%{public}s, uid:%{public}d, isPreFore:%{public}d",
preloadProcessData.pid, bundleName.c_str(), preloadProcessData.uid, preloadProcessData.isPreForeground);
auto appStateObserverMapCopy = GetAppStateObserverMapCopy();
for (auto it = appStateObserverMapCopy.begin(); it != appStateObserverMapCopy.end(); ++it) {
const auto &bundleNames = it->second.bundleNames;
auto iter = std::find(bundleNames.begin(), bundleNames.end(), bundleName);
if ((bundleNames.empty() || iter != bundleNames.end()) && it->first != nullptr) {
it->first->OnPreloadProcessStateChanged(preloadProcessData);
it->first->OnProcessPreForegroundChanged(preloadProcessData);
}
}
}
@@ -86,7 +86,7 @@ public:
MOCK_METHOD2(DumpHeapMemory, int32_t(const int32_t pid, OHOS::AppExecFwk::MallocInfo &mallocInfo));
MOCK_METHOD1(GetProcessRunningInformation, int32_t(RunningProcessInfo &info));
MOCK_METHOD4(PreloadApplicationByPhase, int32_t(const std::string&, int32_t, int32_t, AppExecFwk::PreloadPhase));
MOCK_METHOD1(NotifyPreloadAbilityStateChanged, int32_t(sptr<IRemoteObject>));
MOCK_METHOD2(NotifyPreloadAbilityStateChanged, int32_t(sptr<IRemoteObject>, bool));
MOCK_METHOD3(CheckPreloadAppRecordExist, bool(const std::string&, int32_t, int32_t));
MOCK_CONST_METHOD0(IsFoundationCall, bool());
@@ -84,7 +84,7 @@ public:
MOCK_METHOD4(SendRequest, int(uint32_t, MessageParcel&, MessageParcel&, MessageOption&));
MOCK_METHOD4(PreloadApplicationByPhase, int32_t(const std::string&, int32_t, int32_t, AppExecFwk::PreloadPhase));
MOCK_METHOD1(NotifyPreloadAbilityStateChanged, int32_t(sptr<IRemoteObject>));
MOCK_METHOD2(NotifyPreloadAbilityStateChanged, int32_t(sptr<IRemoteObject>, bool));
MOCK_METHOD4(CheckPreloadAppRecordExist, int32_t(const std::string&, int32_t, int32_t, bool &));
int InvokeSendRequest(uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option)
@@ -82,7 +82,7 @@ public:
int32_t childProcessCount, const sptr<IRemoteObject> &callback, const std::string &customProcessName));
#endif // SUPPORT_CHILD_PROCESS
MOCK_METHOD4(PreloadApplicationByPhase, int32_t(const std::string&, int32_t, int32_t, AppExecFwk::PreloadPhase));
MOCK_METHOD1(NotifyPreloadAbilityStateChanged, int32_t(sptr<IRemoteObject>));
MOCK_METHOD2(NotifyPreloadAbilityStateChanged, int32_t(sptr<IRemoteObject>, bool));
MOCK_METHOD3(CheckPreloadAppRecordExist, bool(const std::string&, int32_t, int32_t));
MOCK_CONST_METHOD0(IsFoundationCall, bool());
@@ -3264,5 +3264,25 @@ HWTEST_F(AbilityRecordTest, AbilityRecord_ProcessForegroundAbility_002, TestSize
abilityRecord_->ProcessForegroundAbility(tokenId);
EXPECT_EQ(abilityRecord_->lifeCycleStateInfo_.sceneFlagBak, 0);
}
/*
* Feature: AbilityRecord
* Function: ProcessForegroundAbility
* SubFunction: ProcessForegroundAbility
* FunctionPoints: NA
* EnvConditions: NA
* CaseDescription: Verify AbilityRecord ProcessForegroundAbility
*/
HWTEST_F(AbilityRecordTest, AbilityRecord_ProcessForegroundAbility_003, TestSize.Level1)
{
EXPECT_NE(abilityRecord_, nullptr);
uint32_t tokenId = 0;
abilityRecord_->isReady_ = true;
abilityRecord_->currentState_ = AbilityState::FOREGROUND;
abilityRecord_->pid_ = pid_;
abilityRecord_->SetFrozenByPreload(true);
abilityRecord_->ProcessForegroundAbility(tokenId);
EXPECT_EQ(abilityRecord_->IsFrozenByPreload(), false);
}
} // namespace AAFwk
} // namespace OHOS
@@ -638,7 +638,7 @@ HWTEST_F(AmsAppMgrClientTest, NotifyPreloadAbilityStateChanged_001, TestSize.Lev
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_001 start");
client_->mgrHolder_ = nullptr;
int32_t result = client_->NotifyPreloadAbilityStateChanged(token_);
int32_t result = client_->NotifyPreloadAbilityStateChanged(token_, true);
EXPECT_EQ(result, AppMgrResultCode::ERROR_SERVICE_NOT_CONNECTED);
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_001 end");
}
@@ -656,7 +656,7 @@ HWTEST_F(AmsAppMgrClientTest, NotifyPreloadAbilityStateChanged_002, TestSize.Lev
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_002 start");
client_->SetServiceManager(nullptr);
int32_t result = client_->NotifyPreloadAbilityStateChanged(token_);
int32_t result = client_->NotifyPreloadAbilityStateChanged(token_, true);
EXPECT_EQ(result, AppMgrResultCode::ERROR_SERVICE_NOT_CONNECTED);
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_002 end");
}
@@ -680,7 +680,7 @@ HWTEST_F(AmsAppMgrClientTest, NotifyPreloadAbilityStateChanged_003, TestSize.Lev
.Times(1)
.WillOnce(Return(amsMgrScheduler));
int32_t result = client_->NotifyPreloadAbilityStateChanged(token_);
int32_t result = client_->NotifyPreloadAbilityStateChanged(token_, true);
EXPECT_EQ(result, AppMgrResultCode::ERROR_SERVICE_NOT_CONNECTED);
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_003 end");
}
@@ -704,11 +704,11 @@ HWTEST_F(AmsAppMgrClientTest, NotifyPreloadAbilityStateChanged_004, TestSize.Lev
.Times(1)
.WillOnce(Return(mockAmsMgrScheduler));
EXPECT_CALL(*mockAmsMgrScheduler, NotifyPreloadAbilityStateChanged(_))
EXPECT_CALL(*mockAmsMgrScheduler, NotifyPreloadAbilityStateChanged(_, _))
.Times(1)
.WillOnce(Return(AppMgrResultCode::RESULT_OK));
int32_t result = client_->NotifyPreloadAbilityStateChanged(token_);
int32_t result = client_->NotifyPreloadAbilityStateChanged(token_, true);
EXPECT_EQ(result, ERR_OK);
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_004 end");
}
@@ -232,7 +232,7 @@ HWTEST_F(AmsMgrProxyTest, NotifyPreloadAbilityStateChanged_0100, TestSize.Level1
GTEST_LOG_(INFO) << "NotifyPreloadAbilityStateChanged_0100 start";
ASSERT_NE(amsMgrProxy_, nullptr);
auto result = amsMgrProxy_->NotifyPreloadAbilityStateChanged(nullptr);
auto result = amsMgrProxy_->NotifyPreloadAbilityStateChanged(nullptr, true);
EXPECT_EQ(result, AAFwk::INVALID_CALLER_TOKEN);
GTEST_LOG_(INFO) << "NotifyPreloadAbilityStateChanged_0100 end";
}
@@ -252,7 +252,7 @@ HWTEST_F(AmsMgrProxyTest, NotifyPreloadAbilityStateChanged_0200, TestSize.Level1
.WillOnce(Return(ERR_NULL_OBJECT));
sptr<IRemoteObject> token = new (std::nothrow) MockAbilityToken();
auto result = amsMgrProxy_->NotifyPreloadAbilityStateChanged(token);
auto result = amsMgrProxy_->NotifyPreloadAbilityStateChanged(token, true);
EXPECT_EQ(result, ERR_NULL_OBJECT);
GTEST_LOG_(INFO) << "NotifyPreloadAbilityStateChanged_0200 end";
}
@@ -272,7 +272,7 @@ HWTEST_F(AmsMgrProxyTest, NotifyPreloadAbilityStateChanged_0300, TestSize.Level1
.WillOnce(Return(ERR_OK));
sptr<IRemoteObject> token = new (std::nothrow) MockAbilityToken();
auto result = amsMgrProxy_->NotifyPreloadAbilityStateChanged(token);
auto result = amsMgrProxy_->NotifyPreloadAbilityStateChanged(token, true);
EXPECT_EQ(result, ERR_OK);
GTEST_LOG_(INFO) << "NotifyPreloadAbilityStateChanged_0300 end";
}
@@ -2358,7 +2358,7 @@ HWTEST_F(AmsMgrSchedulerSecondTest, NotifyPreloadAbilityStateChanged_001, TestSi
std::shared_ptr<AmsMgrScheduler> amsMgrScheduler =
std::make_shared<AmsMgrScheduler>(nullptr, nullptr);
int32_t ret = amsMgrScheduler->NotifyPreloadAbilityStateChanged(nullptr);
int32_t ret = amsMgrScheduler->NotifyPreloadAbilityStateChanged(nullptr, true);
EXPECT_EQ(ret, AAFwk::ERR_APP_MGR_SERVICE_NOT_READY);
TAG_LOGI(AAFwkTag::TEST, "AmsMgrSchedulerSecondTest_NotifyPreloadAbilityStateChanged_001 end");
}
@@ -2376,7 +2376,7 @@ HWTEST_F(AmsMgrSchedulerSecondTest, NotifyPreloadAbilityStateChanged_002, TestSi
std::shared_ptr<AmsMgrScheduler> amsMgrScheduler =
std::make_shared<AmsMgrScheduler>(appMgrServiceInner, taskHandler_);
int32_t ret = amsMgrScheduler->NotifyPreloadAbilityStateChanged(nullptr);
int32_t ret = amsMgrScheduler->NotifyPreloadAbilityStateChanged(nullptr, true);
EXPECT_EQ(ret, ERR_PERMISSION_DENIED);
TAG_LOGI(AAFwkTag::TEST, "AmsMgrSchedulerSecondTest_NotifyPreloadAbilityStateChanged_002 end");
}
@@ -2391,11 +2391,11 @@ HWTEST_F(AmsMgrSchedulerSecondTest, NotifyPreloadAbilityStateChanged_003, TestSi
TAG_LOGI(AAFwkTag::TEST, "AmsMgrSchedulerSecondTest_NotifyPreloadAbilityStateChanged_003 start");
auto appMgrServiceInner = std::make_shared<MockAppMgrServiceInner>();
EXPECT_CALL(*appMgrServiceInner, IsFoundationCall()).WillOnce(Return(true));
EXPECT_CALL(*appMgrServiceInner, NotifyPreloadAbilityStateChanged(_)).WillOnce(Return(ERR_OK));
EXPECT_CALL(*appMgrServiceInner, NotifyPreloadAbilityStateChanged(_, _)).WillOnce(Return(ERR_OK));
std::shared_ptr<AmsMgrScheduler> amsMgrScheduler =
std::make_shared<AmsMgrScheduler>(appMgrServiceInner, taskHandler_);
int32_t ret = amsMgrScheduler->NotifyPreloadAbilityStateChanged(nullptr);
int32_t ret = amsMgrScheduler->NotifyPreloadAbilityStateChanged(nullptr, true);
EXPECT_EQ(ret, ERR_OK);
TAG_LOGI(AAFwkTag::TEST, "AmsMgrSchedulerSecondTest_NotifyPreloadAbilityStateChanged_003 end");
}
@@ -1240,5 +1240,15 @@ void AppRunningRecord::SetDebugFromLocal(bool isDebugFromLocal)
{
isDebugFromLocal_ = isDebugFromLocal;
}
void AppRunningRecord::SetPreForeground(bool isPreForeground)
{
isPreForeground_.store(isPreForeground);
}
bool AppRunningRecord::IsPreForeground() const
{
return isPreForeground_.load();
}
} // namespace AppExecFwk
} // namespace OHOS
@@ -1270,5 +1270,15 @@ void AppRunningRecord::SetSupportMultiProcessDeviceFeature(bool support)
{
supportMultiProcessDeviceFeature_ = support;
}
void AppRunningRecord::SetPreForeground(bool isPreForeground)
{
isPreForeground_.store(isPreForeground);
}
bool AppRunningRecord::IsPreForeground() const
{
return isPreForeground_.load();
}
} // namespace AppExecFwk
} // namespace OHOS
@@ -219,6 +219,7 @@ public:
int getCallingPid_ = 0;
bool setAssertionPauseFlagCalled_ = false;
bool getAbilitiesCalled_ = false;
std::map<const sptr<IRemoteObject>, std::shared_ptr<AppExecFwk::AbilityRunningRecord>> abilitiesMap_;
bool notifyAppPreCacheCalled_ = false;
bool notifyStartResidentProcessCalled_ = false;
bool notifyStartKeepAliveProcessCalled_ = false;
@@ -286,6 +287,7 @@ public:
resetRunningRecordFunctionFlagExtend();
setAssertionPauseFlagCalled_ = false;
getAbilitiesCalled_ = false;
abilitiesMap_.clear();
notifyAppPreCacheCalled_ = false;
notifyStartResidentProcessCalled_ = false;
notifyStartKeepAliveProcessCalled_ = false;
@@ -175,8 +175,7 @@ const std::string &AppRunningRecord::GetAppIdentifier() const
const std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> AppRunningRecord::GetAbilities()
{
AAFwk::MyStatus::GetInstance().getAbilitiesCalled_ = true;
std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> abilitiesMap;
return abilitiesMap;
return AAFwk::MyStatus::GetInstance().abilitiesMap_;
}
sptr<IAppScheduler> AppRunningRecord::GetApplicationClient() const
@@ -1343,5 +1342,15 @@ void AppRunningRecord::SetKeepAliveAppService(bool isKeepAliveAppService)
{
isKeepAliveAppService_ = isKeepAliveAppService;
}
void AppRunningRecord::SetPreForeground(bool isPreForeground)
{
isPreForeground_.store(isPreForeground);
}
bool AppRunningRecord::IsPreForeground() const
{
return isPreForeground_.load();
}
} // namespace AppExecFwk
} // namespace OHOS
@@ -1748,6 +1748,46 @@ HWTEST_F(AppMgrServiceInnerSecondTest, UpdateAbilityState_001, TestSize.Level1)
TAG_LOGI(AAFwkTag::TEST, "UpdateAbilityState_001 end");
}
/**
* @tc.name: UpdateAbilityState_002
* @tc.desc: update ability state.
* @tc.type: FUNC
* @tc.require: issueI5W4S7
*/
HWTEST_F(AppMgrServiceInnerSecondTest, UpdateAbilityState_002, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::TEST, "UpdateAbilityState_002 start");
auto appMgrServiceInner = std::make_shared<AppMgrServiceInner>();
EXPECT_NE(appMgrServiceInner, nullptr);
BundleInfo bundleInfo;
HapModuleInfo hapModuleInfo;
std::shared_ptr<AAFwk::Want> want;
std::string processName = "test_processName";
auto loadParam = std::make_shared<AbilityRuntime::LoadParam>();
OHOS::sptr<IRemoteObject> token = sptr<IRemoteObject>(new (std::nothrow) MockAbilityToken());
loadParam->token = token;
std::shared_ptr<AppRunningRecord> appRecord = appMgrServiceInner->CreateAppRunningRecord(loadParam,
applicationInfo_, nullptr, processName, bundleInfo, hapModuleInfo, want);
ASSERT_NE(appRecord, nullptr);
appRecord->AddModule(applicationInfo_, abilityInfo_, token, hapModuleInfo, nullptr, 0);
appRecord->SetPreForeground(false);
appMgrServiceInner->UpdateAbilityState(token, AbilityState::ABILITY_STATE_FOREGROUND);
EXPECT_EQ(appRecord->IsPreForeground(), false);
appRecord->SetPreForeground(true);
appMgrServiceInner->UpdateAbilityState(token, AbilityState::ABILITY_STATE_CREATE);
EXPECT_EQ(appRecord->IsPreForeground(), true);
appRecord->SetPreForeground(true);
appMgrServiceInner->UpdateAbilityState(token, AbilityState::ABILITY_STATE_FOREGROUND);
EXPECT_EQ(appRecord->IsPreForeground(), false);
TAG_LOGI(AAFwkTag::TEST, "UpdateAbilityState_002 end");
}
/**
* @tc.name: KillProcessByAbilityToken_001
* @tc.desc: kill process by ability token.
@@ -1270,5 +1270,15 @@ void AppRunningRecord::SetSupportMultiProcessDeviceFeature(bool support)
{
supportMultiProcessDeviceFeature_ = support;
}
void AppRunningRecord::SetPreForeground(bool isPreForeground)
{
isPreForeground_.store(isPreForeground);
}
bool AppRunningRecord::IsPreForeground() const
{
return isPreForeground_.load();
}
} // namespace AppExecFwk
} // namespace OHOS
@@ -2023,7 +2023,7 @@ HWTEST_F(AppMgrServiceInnerTenthTest, NotifyPreloadAbilityStateChanged_001, Test
auto appMgrServiceInner = std::make_shared<AppMgrServiceInner>();
AAFwk::MyStatus::GetInstance().resetRunningRecordFunctionFlag();
auto ret = appMgrServiceInner->NotifyPreloadAbilityStateChanged(nullptr);
auto ret = appMgrServiceInner->NotifyPreloadAbilityStateChanged(nullptr, true);
EXPECT_EQ(ret, AAFwk::INVALID_CALLER_TOKEN);
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_001 end");
}
@@ -2041,7 +2041,7 @@ HWTEST_F(AppMgrServiceInnerTenthTest, NotifyPreloadAbilityStateChanged_002, Test
AAFwk::MyStatus::GetInstance().getAppRunningByToken_ = nullptr;
sptr<IRemoteObject> token = new MockAppScheduler();
auto ret = appMgrServiceInner->NotifyPreloadAbilityStateChanged(token);
auto ret = appMgrServiceInner->NotifyPreloadAbilityStateChanged(token, true);
EXPECT_NE(ret, ERR_OK);
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_002 end");
}
@@ -2057,13 +2057,90 @@ HWTEST_F(AppMgrServiceInnerTenthTest, NotifyPreloadAbilityStateChanged_003, Test
auto appMgrServiceInner = std::make_shared<AppMgrServiceInner>();
AAFwk::MyStatus::GetInstance().resetRunningRecordFunctionFlag();
AAFwk::MyStatus::GetInstance().getAppRunningByToken_ = std::make_shared<AppRunningRecord>(nullptr, 0, "");
auto appRecord = std::make_shared<AppRunningRecord>(nullptr, 0, "");
AAFwk::MyStatus::GetInstance().getAppRunningByToken_ = appRecord;
appRecord->SetPreForeground(true);
sptr<IRemoteObject> token = new MockAppScheduler();
auto ret = appMgrServiceInner->NotifyPreloadAbilityStateChanged(token);
auto ret = appMgrServiceInner->NotifyPreloadAbilityStateChanged(token, true);
EXPECT_NE(ret, ERR_OK);
AAFwk::MyStatus::GetInstance().getAppRunningByToken_ = nullptr;
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_004 end");
}
/**
* @tc.name: NotifyPreloadAbilityStateChanged_004
* @tc.desc: Test NotifyPreloadAbilityStateChanged
* @tc.type: FUNC
*/
HWTEST_F(AppMgrServiceInnerTenthTest, NotifyPreloadAbilityStateChanged_004, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_004 start");
auto appMgrServiceInner = std::make_shared<AppMgrServiceInner>();
AAFwk::MyStatus::GetInstance().resetRunningRecordFunctionFlag();
auto appRecord = std::make_shared<AppRunningRecord>(nullptr, 0, "");
AAFwk::MyStatus::GetInstance().getAppRunningByToken_ = appRecord;
appRecord->SetPreForeground(true);
sptr<IRemoteObject> token = new MockAppScheduler();
auto ret = appMgrServiceInner->NotifyPreloadAbilityStateChanged(token, false);
EXPECT_EQ(ret, ERR_OK);
AAFwk::MyStatus::GetInstance().getAppRunningByToken_ = nullptr;
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_003 end");
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_004 end");
}
/**
* @tc.name: NotifyPreloadAbilityStateChanged_005
* @tc.desc: Test NotifyPreloadAbilityStateChanged
* @tc.type: FUNC
*/
HWTEST_F(AppMgrServiceInnerTenthTest, NotifyPreloadAbilityStateChanged_005, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_005 start");
auto appMgrServiceInner = std::make_shared<AppMgrServiceInner>();
AAFwk::MyStatus::GetInstance().resetRunningRecordFunctionFlag();
AAFwk::MyStatus::GetInstance().getAppRunningByToken_ = std::make_shared<AppRunningRecord>(nullptr, 0, "");
auto &abilitiesMap = AAFwk::MyStatus::GetInstance().abilitiesMap_;
auto abilityInfo1 = std::make_shared<AbilityInfo>();
sptr<IRemoteObject> token1 = new MockAppScheduler();
auto abilityRecord1 = std::make_shared<AbilityRunningRecord>(abilityInfo1, token1, 1);
auto abilityInfo2 = std::make_shared<AbilityInfo>();
sptr<IRemoteObject> token2 = new MockAppScheduler();
auto abilityRecord2 = std::make_shared<AbilityRunningRecord>(abilityInfo2, token2, 2);
abilitiesMap[token1] = abilityRecord1;
abilitiesMap[token2] = abilityRecord2;
sptr<IRemoteObject> token = new MockAppScheduler();
auto ret = appMgrServiceInner->NotifyPreloadAbilityStateChanged(token, true);
EXPECT_NE(ret, ERR_OK);
AAFwk::MyStatus::GetInstance().getAppRunningByToken_ = nullptr;
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_005 end");
}
/**
* @tc.name: NotifyPreloadAbilityStateChanged_006
* @tc.desc: Test NotifyPreloadAbilityStateChanged
* @tc.type: FUNC
*/
HWTEST_F(AppMgrServiceInnerTenthTest, NotifyPreloadAbilityStateChanged_006, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_006 start");
auto appMgrServiceInner = std::make_shared<AppMgrServiceInner>();
AAFwk::MyStatus::GetInstance().resetRunningRecordFunctionFlag();
AAFwk::MyStatus::GetInstance().getAppRunningByToken_ = std::make_shared<AppRunningRecord>(nullptr, 0, "");
sptr<IRemoteObject> token = new MockAppScheduler();
auto ret = appMgrServiceInner->NotifyPreloadAbilityStateChanged(token, true);
EXPECT_EQ(ret, ERR_OK);
AAFwk::MyStatus::GetInstance().getAppRunningByToken_ = nullptr;
TAG_LOGI(AAFwkTag::TEST, "NotifyPreloadAbilityStateChanged_006 end");
}
/**
@@ -1286,5 +1286,26 @@ HWTEST_F(AppRunningRecordTest, AppRunningRecord_OnWindowVisibilityChangedWithPen
EXPECT_EQ(appRunningRecord->pendingState_, ApplicationPendingState::READY);
EXPECT_EQ(appRunningRecord->watchdogVisibilityState_, WatchdogVisibilityState::WATCHDOG_STATE_UNVISIBILITY);
}
/**
* @tc.name: AppRunningRecord_SetPreForeground_0100
* @tc.desc: Test SetPreForeground works.
* @tc.type: FUNC
*/
HWTEST_F(AppRunningRecordTest, AppRunningRecord_SetPreForeground_0100, TestSize.Level1)
{
std::shared_ptr<ApplicationInfo> appInfo = std::make_shared<ApplicationInfo>();
ASSERT_NE(appInfo, nullptr);
int32_t recordId = RECORD_ID;
std::string processName;
auto appRunningRecord = std::make_shared<AppRunningRecord>(appInfo, recordId, processName);
ASSERT_NE(appRunningRecord, nullptr);
appRunningRecord->SetPreForeground(true);
EXPECT_EQ(appRunningRecord->IsPreForeground(), true);
appRunningRecord->SetPreForeground(false);
EXPECT_EQ(appRunningRecord->IsPreForeground(), false);
}
} // namespace AppExecFwk
} // namespace OHOS
@@ -1166,7 +1166,7 @@ HWTEST_F(AppSchedulerTest, AppScheduler_PreloadApplicationByPhase_0100, TestSize
HWTEST_F(AppSchedulerTest, AppScheduler_NotifyPreloadAbilityStateChanged_0100, TestSize.Level1)
{
DelayedSingleton<AppScheduler>::GetInstance()->appMgrClient_ = nullptr;
auto result = DelayedSingleton<AppScheduler>::GetInstance()->NotifyPreloadAbilityStateChanged(nullptr);
auto result = DelayedSingleton<AppScheduler>::GetInstance()->NotifyPreloadAbilityStateChanged(nullptr, true);
EXPECT_EQ(result, INNER_ERR);
}
@@ -52,7 +52,7 @@ public:
MOCK_METHOD(void, OnWindowHidden, (const ProcessData &processData), (override));
MOCK_METHOD(void, OnWindowShow, (const ProcessData &processData), (override));
MOCK_METHOD(void, OnKeepAliveStateChanged, (const ProcessData &processData), (override));
MOCK_METHOD(void, OnPreloadProcessStateChanged, (const PreloadProcessData &preloadProcessData), (override));
MOCK_METHOD(void, OnProcessPreForegroundChanged, (const PreloadProcessData &preloadProcessData), (override));
sptr<IRemoteObject> AsObject() override
{
@@ -673,15 +673,15 @@ HWTEST_F(AppStateObserverManagerTestSecond, HandleOnKeepAliveStateChanged_002, T
/*
* Feature: AppStateObserverManager
* Function: OnPreloadProcessStateChanged_001
* Function: OnProcessPreForegroundChanged_001
* SubFunction: NA
* FunctionPoints: AppStateObserverManager OnPreloadProcessStateChanged
* FunctionPoints: AppStateObserverManager OnProcessPreForegroundChanged
* EnvConditions: NA
* CaseDescription: Verify OnPreloadProcessStateChanged
* CaseDescription: Verify OnProcessPreForegroundChanged
*/
HWTEST_F(AppStateObserverManagerTestSecond, OnPreloadProcessStateChanged_001, TestSize.Level2)
HWTEST_F(AppStateObserverManagerTestSecond, OnProcessPreForegroundChanged_001, TestSize.Level2)
{
GTEST_LOG_(INFO) << "OnPreloadProcessStateChanged_001 start";
GTEST_LOG_(INFO) << "OnProcessPreForegroundChanged_001 start";
auto manager = std::make_shared<AppStateObserverManager>();
manager->handler_ = nullptr;
@@ -691,22 +691,22 @@ HWTEST_F(AppStateObserverManagerTestSecond, OnPreloadProcessStateChanged_001, Te
appRecord->mainBundleName_ = "com.ohos.unittest";
manager->appStateObserverMap_.emplace(observer, AppStateObserverInfo{0, {"com.ohos.unittest"}});
EXPECT_CALL(*mockObserver, OnPreloadProcessStateChanged(_)).Times(0);
manager->OnPreloadProcessStateChanged(appRecord, ApplicationState::APP_STATE_PRE_FOREGROUND);
GTEST_LOG_(INFO) << "OnPreloadProcessStateChanged_001 end";
EXPECT_CALL(*mockObserver, OnProcessPreForegroundChanged(_)).Times(0);
manager->OnProcessPreForegroundChanged(appRecord);
GTEST_LOG_(INFO) << "OnProcessPreForegroundChanged_001 end";
}
/*
* Feature: AppStateObserverManager
* Function: OnPreloadProcessStateChanged_002
* Function: OnProcessPreForegroundChanged_002
* SubFunction: NA
* FunctionPoints: AppStateObserverManager OnPreloadProcessStateChanged
* FunctionPoints: AppStateObserverManager OnProcessPreForegroundChanged
* EnvConditions: NA
* CaseDescription: Verify OnPreloadProcessStateChanged
* CaseDescription: Verify OnProcessPreForegroundChanged
*/
HWTEST_F(AppStateObserverManagerTestSecond, OnPreloadProcessStateChanged_002, TestSize.Level2)
HWTEST_F(AppStateObserverManagerTestSecond, OnProcessPreForegroundChanged_002, TestSize.Level2)
{
GTEST_LOG_(INFO) << "OnPreloadProcessStateChanged_002 start";
GTEST_LOG_(INFO) << "OnProcessPreForegroundChanged_002 start";
auto manager = std::make_shared<AppStateObserverManager>();
auto mockHandler = std::make_shared<MockTaskHandlerWrap>();
manager->handler_ = mockHandler;
@@ -714,22 +714,22 @@ HWTEST_F(AppStateObserverManagerTestSecond, OnPreloadProcessStateChanged_002, Te
auto mockObserver = new MockApplicationStateObserver();
sptr<IApplicationStateObserver> observer(mockObserver);
EXPECT_CALL(*mockObserver, OnPreloadProcessStateChanged(_)).Times(0);
manager->OnPreloadProcessStateChanged(nullptr, ApplicationState::APP_STATE_PRE_FOREGROUND);
GTEST_LOG_(INFO) << "OnPreloadProcessStateChanged_002 end";
EXPECT_CALL(*mockObserver, OnProcessPreForegroundChanged(_)).Times(0);
manager->OnProcessPreForegroundChanged(nullptr);
GTEST_LOG_(INFO) << "OnProcessPreForegroundChanged_002 end";
}
/*
* Feature: AppStateObserverManager
* Function: OnPreloadProcessStateChanged_003
* Function: OnProcessPreForegroundChanged_003
* SubFunction: NA
* FunctionPoints: AppStateObserverManager OnPreloadProcessStateChanged
* FunctionPoints: AppStateObserverManager OnProcessPreForegroundChanged
* EnvConditions: NA
* CaseDescription: Verify OnPreloadProcessStateChanged
* CaseDescription: Verify OnProcessPreForegroundChanged
*/
HWTEST_F(AppStateObserverManagerTestSecond, OnPreloadProcessStateChanged_003, TestSize.Level2)
HWTEST_F(AppStateObserverManagerTestSecond, OnProcessPreForegroundChanged_003, TestSize.Level2)
{
GTEST_LOG_(INFO) << "OnPreloadProcessStateChanged_003 start";
GTEST_LOG_(INFO) << "OnProcessPreForegroundChanged_003 start";
auto manager = std::make_shared<AppStateObserverManager>();
auto mockHandler = std::make_shared<MockTaskHandlerWrap>();
manager->handler_ = mockHandler;
@@ -740,22 +740,22 @@ HWTEST_F(AppStateObserverManagerTestSecond, OnPreloadProcessStateChanged_003, Te
appRecord->mainBundleName_ = "com.ohos.unittest";
manager->appStateObserverMap_.emplace(observer, AppStateObserverInfo{0, {"com.ohos.unittest"}});
EXPECT_CALL(*mockObserver, OnPreloadProcessStateChanged(_)).Times(1);
manager->OnPreloadProcessStateChanged(appRecord, ApplicationState::APP_STATE_PRE_FOREGROUND);
GTEST_LOG_(INFO) << "OnPreloadProcessStateChanged_003 end";
EXPECT_CALL(*mockObserver, OnProcessPreForegroundChanged(_)).Times(1);
manager->OnProcessPreForegroundChanged(appRecord);
GTEST_LOG_(INFO) << "OnProcessPreForegroundChanged_003 end";
}
/*
* Feature: AppStateObserverManager
* Function: HandleOnPreloadProcessStateChanged_001
* Function: HandleOnProcessPreForegroundChanged_001
* SubFunction: NA
* FunctionPoints: AppStateObserverManager HandleOnPreloadProcessStateChanged
* FunctionPoints: AppStateObserverManager HandleOnProcessPreForegroundChanged
* EnvConditions: NA
* CaseDescription: Verify HandleOnPreloadProcessStateChanged
* CaseDescription: Verify HandleOnProcessPreForegroundChanged
*/
HWTEST_F(AppStateObserverManagerTestSecond, HandleOnPreloadProcessStateChanged_001, TestSize.Level2)
HWTEST_F(AppStateObserverManagerTestSecond, HandleOnProcessPreForegroundChanged_001, TestSize.Level2)
{
GTEST_LOG_(INFO) << "HandleOnPreloadProcessStateChanged_001 start";
GTEST_LOG_(INFO) << "HandleOnProcessPreForegroundChanged_001 start";
auto manager = std::make_shared<AppStateObserverManager>();
auto mockObserver = new MockApplicationStateObserver();
sptr<IApplicationStateObserver> observer(mockObserver);
@@ -764,22 +764,22 @@ HWTEST_F(AppStateObserverManagerTestSecond, HandleOnPreloadProcessStateChanged_0
appRecord->mainBundleName_ = "com.ohos.unittest";
manager->appStateObserverMap_.emplace(observer, AppStateObserverInfo{0, {}});
EXPECT_CALL(*mockObserver, OnPreloadProcessStateChanged(_)).Times(1);
manager->HandleOnPreloadProcessStateChanged(appRecord, ApplicationState::APP_STATE_PRE_FOREGROUND);
GTEST_LOG_(INFO) << "HandleOnPreloadProcessStateChanged_001 end";
EXPECT_CALL(*mockObserver, OnProcessPreForegroundChanged(_)).Times(1);
manager->HandleOnProcessPreForegroundChanged(appRecord);
GTEST_LOG_(INFO) << "HandleOnProcessPreForegroundChanged_001 end";
}
/*
* Feature: AppStateObserverManager
* Function: HandleOnPreloadProcessStateChanged_002
* Function: HandleOnProcessPreForegroundChanged_002
* SubFunction: NA
* FunctionPoints: AppStateObserverManager HandleOnPreloadProcessStateChanged
* FunctionPoints: AppStateObserverManager HandleOnProcessPreForegroundChanged
* EnvConditions: NA
* CaseDescription: Verify HandleOnPreloadProcessStateChanged
* CaseDescription: Verify HandleOnProcessPreForegroundChanged
*/
HWTEST_F(AppStateObserverManagerTestSecond, HandleOnPreloadProcessStateChanged_002, TestSize.Level2)
HWTEST_F(AppStateObserverManagerTestSecond, HandleOnProcessPreForegroundChanged_002, TestSize.Level2)
{
GTEST_LOG_(INFO) << "HandleOnPreloadProcessStateChanged_002 start";
GTEST_LOG_(INFO) << "HandleOnProcessPreForegroundChanged_002 start";
auto manager = std::make_shared<AppStateObserverManager>();
auto mockObserver = new MockApplicationStateObserver();
sptr<IApplicationStateObserver> observer(mockObserver);
@@ -788,22 +788,22 @@ HWTEST_F(AppStateObserverManagerTestSecond, HandleOnPreloadProcessStateChanged_0
appRecord->mainBundleName_ = "com.ohos.unittest";
manager->appStateObserverMap_.emplace(observer, AppStateObserverInfo{0, {"com.ohos.nonexist"}});
EXPECT_CALL(*mockObserver, OnPreloadProcessStateChanged(_)).Times(0);
manager->HandleOnPreloadProcessStateChanged(appRecord, ApplicationState::APP_STATE_PRE_FOREGROUND);
GTEST_LOG_(INFO) << "HandleOnPreloadProcessStateChanged_002 end";
EXPECT_CALL(*mockObserver, OnProcessPreForegroundChanged(_)).Times(0);
manager->HandleOnProcessPreForegroundChanged(appRecord);
GTEST_LOG_(INFO) << "HandleOnProcessPreForegroundChanged_002 end";
}
/*
* Feature: AppStateObserverManager
* Function: HandleOnPreloadProcessStateChanged_003
* Function: HandleOnProcessPreForegroundChanged_003
* SubFunction: NA
* FunctionPoints: AppStateObserverManager HandleOnPreloadProcessStateChanged
* FunctionPoints: AppStateObserverManager HandleOnProcessPreForegroundChanged
* EnvConditions: NA
* CaseDescription: Verify HandleOnPreloadProcessStateChanged
* CaseDescription: Verify HandleOnProcessPreForegroundChanged
*/
HWTEST_F(AppStateObserverManagerTestSecond, HandleOnPreloadProcessStateChanged_003, TestSize.Level2)
HWTEST_F(AppStateObserverManagerTestSecond, HandleOnProcessPreForegroundChanged_003, TestSize.Level2)
{
GTEST_LOG_(INFO) << "HandleOnPreloadProcessStateChanged_003 start";
GTEST_LOG_(INFO) << "HandleOnProcessPreForegroundChanged_003 start";
auto manager = std::make_shared<AppStateObserverManager>();
auto mockObserver = new MockApplicationStateObserver();
sptr<IApplicationStateObserver> observer(mockObserver);
@@ -812,22 +812,22 @@ HWTEST_F(AppStateObserverManagerTestSecond, HandleOnPreloadProcessStateChanged_0
appRecord->mainBundleName_ = "com.ohos.unittest";
manager->appStateObserverMap_.emplace(nullptr, AppStateObserverInfo{0, {"com.ohos.unittest"}});
EXPECT_CALL(*mockObserver, OnPreloadProcessStateChanged(_)).Times(0);
manager->HandleOnPreloadProcessStateChanged(appRecord, ApplicationState::APP_STATE_PRE_FOREGROUND);
GTEST_LOG_(INFO) << "HandleOnPreloadProcessStateChanged_003 end";
EXPECT_CALL(*mockObserver, OnProcessPreForegroundChanged(_)).Times(0);
manager->HandleOnProcessPreForegroundChanged(appRecord);
GTEST_LOG_(INFO) << "HandleOnProcessPreForegroundChanged_003 end";
}
/*
* Feature: AppStateObserverManager
* Function: HandleOnPreloadProcessStateChanged_004
* Function: HandleOnProcessPreForegroundChanged_004
* SubFunction: NA
* FunctionPoints: AppStateObserverManager HandleOnPreloadProcessStateChanged
* FunctionPoints: AppStateObserverManager HandleOnProcessPreForegroundChanged
* EnvConditions: NA
* CaseDescription: Verify HandleOnPreloadProcessStateChanged
* CaseDescription: Verify HandleOnProcessPreForegroundChanged
*/
HWTEST_F(AppStateObserverManagerTestSecond, HandleOnPreloadProcessStateChanged_004, TestSize.Level2)
HWTEST_F(AppStateObserverManagerTestSecond, HandleOnProcessPreForegroundChanged_004, TestSize.Level2)
{
GTEST_LOG_(INFO) << "HandleOnPreloadProcessStateChanged_004 start";
GTEST_LOG_(INFO) << "HandleOnProcessPreForegroundChanged_004 start";
auto manager = std::make_shared<AppStateObserverManager>();
auto mockObserver = new MockApplicationStateObserver();
sptr<IApplicationStateObserver> observer(mockObserver);
@@ -836,44 +836,44 @@ HWTEST_F(AppStateObserverManagerTestSecond, HandleOnPreloadProcessStateChanged_0
appRecord->mainBundleName_ = "com.ohos.unittest";
manager->appStateObserverMap_.emplace(nullptr, AppStateObserverInfo{0, {}});
EXPECT_CALL(*mockObserver, OnPreloadProcessStateChanged(_)).Times(0);
manager->HandleOnPreloadProcessStateChanged(appRecord, ApplicationState::APP_STATE_PRE_FOREGROUND);
GTEST_LOG_(INFO) << "HandleOnPreloadProcessStateChanged_004 end";
EXPECT_CALL(*mockObserver, OnProcessPreForegroundChanged(_)).Times(0);
manager->HandleOnProcessPreForegroundChanged(appRecord);
GTEST_LOG_(INFO) << "HandleOnProcessPreForegroundChanged_004 end";
}
/*
* Feature: AppStateObserverManager
* Function: HandleOnPreloadProcessStateChanged_005
* Function: HandleOnProcessPreForegroundChanged_005
* SubFunction: NA
* FunctionPoints: AppStateObserverManager HandleOnPreloadProcessStateChanged
* FunctionPoints: AppStateObserverManager HandleOnProcessPreForegroundChanged
* EnvConditions: NA
* CaseDescription: Verify HandleOnPreloadProcessStateChanged
* CaseDescription: Verify HandleOnProcessPreForegroundChanged
*/
HWTEST_F(AppStateObserverManagerTestSecond, HandleOnPreloadProcessStateChanged_005, TestSize.Level2)
HWTEST_F(AppStateObserverManagerTestSecond, HandleOnProcessPreForegroundChanged_005, TestSize.Level2)
{
GTEST_LOG_(INFO) << "HandleOnPreloadProcessStateChanged_005 start";
GTEST_LOG_(INFO) << "HandleOnProcessPreForegroundChanged_005 start";
auto manager = std::make_shared<AppStateObserverManager>();
auto mockObserver = new MockApplicationStateObserver();
sptr<IApplicationStateObserver> observer(mockObserver);
manager->appStateObserverMap_.emplace(observer, AppStateObserverInfo{0, {"com.ohos.unittest"}});
EXPECT_CALL(*mockObserver, OnPreloadProcessStateChanged(_)).Times(0);
EXPECT_CALL(*mockObserver, OnProcessPreForegroundChanged(_)).Times(0);
manager->HandleOnPreloadProcessStateChanged(nullptr, ApplicationState::APP_STATE_PRE_FOREGROUND);
GTEST_LOG_(INFO) << "HandleOnPreloadProcessStateChanged_005 end";
manager->HandleOnProcessPreForegroundChanged(nullptr);
GTEST_LOG_(INFO) << "HandleOnProcessPreForegroundChanged_005 end";
}
/*
* Feature: AppStateObserverManager
* Function: HandleOnPreloadProcessStateChanged_006
* Function: HandleOnProcessPreForegroundChanged_006
* SubFunction: NA
* FunctionPoints: AppStateObserverManager HandleOnPreloadProcessStateChanged
* FunctionPoints: AppStateObserverManager HandleOnProcessPreForegroundChanged
* EnvConditions: NA
* CaseDescription: Verify HandleOnPreloadProcessStateChanged
* CaseDescription: Verify HandleOnProcessPreForegroundChanged
*/
HWTEST_F(AppStateObserverManagerTestSecond, HandleOnPreloadProcessStateChanged_006, TestSize.Level2)
HWTEST_F(AppStateObserverManagerTestSecond, HandleOnProcessPreForegroundChanged_006, TestSize.Level2)
{
GTEST_LOG_(INFO) << "HandleOnPreloadProcessStateChanged_006 start";
GTEST_LOG_(INFO) << "HandleOnProcessPreForegroundChanged_006 start";
auto manager = std::make_shared<AppStateObserverManager>();
auto mockObserver = new MockApplicationStateObserver();
sptr<IApplicationStateObserver> observer(mockObserver);
@@ -882,9 +882,9 @@ HWTEST_F(AppStateObserverManagerTestSecond, HandleOnPreloadProcessStateChanged_0
appRecord->mainBundleName_ = "com.ohos.unittest";
manager->appStateObserverMap_.emplace(observer, AppStateObserverInfo{0, {"com.ohos.unittest"}});
EXPECT_CALL(*mockObserver, OnPreloadProcessStateChanged(_)).Times(1);
manager->HandleOnPreloadProcessStateChanged(appRecord, ApplicationState::APP_STATE_PRE_FOREGROUND);
GTEST_LOG_(INFO) << "HandleOnPreloadProcessStateChanged_006 end";
EXPECT_CALL(*mockObserver, OnProcessPreForegroundChanged(_)).Times(1);
manager->HandleOnProcessPreForegroundChanged(appRecord);
GTEST_LOG_(INFO) << "HandleOnProcessPreForegroundChanged_006 end";
}
} // namespace AppExecFwk
} // namespace OHOS
@@ -1277,5 +1277,15 @@ void AppRunningRecord::SetKeepAliveAppService(bool isKeepAliveAppService)
{
isKeepAliveAppService_ = isKeepAliveAppService;
}
void AppRunningRecord::SetPreForeground(bool isPreForeground)
{
isPreForeground_.store(isPreForeground);
}
bool AppRunningRecord::IsPreForeground() const
{
return isPreForeground_.load();
}
} // namespace AppExecFwk
} // namespace OHOS
@@ -54,10 +54,18 @@ HWTEST_F(HiddenStartUtilsTest, HiddenStartUtils_IsHiddenStart_001, TestSize.Leve
auto utils = std::make_shared<HiddenStartUtils>();
MyFlag::retVerifyStartUIAbilityToHiddenPermission = false;
MyFlag::retVerifyPreloadApplicationPermission = false;
bool result = utils->IsHiddenStart(options);
EXPECT_EQ(result, false);
MyFlag::retVerifyStartUIAbilityToHiddenPermission = true;
MyFlag::retVerifyPreloadApplicationPermission = false;
options.processOptions = nullptr;
result = utils->IsHiddenStart(options);
EXPECT_EQ(result, false);
MyFlag::retVerifyStartUIAbilityToHiddenPermission = true;
MyFlag::retVerifyPreloadApplicationPermission = true;
options.processOptions = nullptr;
result = utils->IsHiddenStart(options);
EXPECT_EQ(result, false);
@@ -85,6 +93,13 @@ HWTEST_F(HiddenStartUtilsTest, HiddenStartUtils_CheckHiddenStartSupported_001, T
EXPECT_EQ(result, ERR_NOT_SUPPORTED_PRODUCT_TYPE);
AppUtils::isStartOptionsWithAnimation_ = true;
AppUtils::isPreloadApplicationEnabled_ = false;
options.processOptions = nullptr;
result = utils->CheckHiddenStartSupported(options);
EXPECT_EQ(result, ERR_INVALID_VALUE);
AppUtils::isStartOptionsWithAnimation_ = true;
AppUtils::isPreloadApplicationEnabled_ = true;
options.processOptions = nullptr;
result = utils->CheckHiddenStartSupported(options);
EXPECT_EQ(result, ERR_INVALID_VALUE);
@@ -94,47 +109,5 @@ HWTEST_F(HiddenStartUtilsTest, HiddenStartUtils_CheckHiddenStartSupported_001, T
result = utils->CheckHiddenStartSupported(options);
EXPECT_EQ(result, ERR_OK);
}
/* *
* @tc.name: HiddenStartUtils_IsPreloadStart_001
* @tc.desc: IsPreloadStart
* @tc.type: FUNC
*/
HWTEST_F(HiddenStartUtilsTest, HiddenStartUtils_IsPreloadStart_001, TestSize.Level1)
{
StartOptions options;
auto utils = std::make_shared<HiddenStartUtils>();
int32_t result = utils->IsPreloadStart(options);
EXPECT_FALSE(result);
MyFlag::retVerifyPreloadApplicationPermission = true;
result = utils->IsPreloadStart(options);
EXPECT_FALSE(result);
options.processOptions = std::make_shared<ProcessOptions>();
options.processOptions->startupVisibility = OHOS::AAFwk::StartupVisibility::STARTUP_HIDE;
result = utils->IsPreloadStart(options);
EXPECT_FALSE(result);
options.processOptions->isPreloadStart = true;
result = utils->IsPreloadStart(options);
EXPECT_TRUE(result);
}
/* *
* @tc.name: HiddenStartUtils_CheckPreloadStartSupported_001
* @tc.desc: CheckPreloadStartSupported
* @tc.type: FUNC
*/
HWTEST_F(HiddenStartUtilsTest, HiddenStartUtils_CheckPreloadStartSupported_001, TestSize.Level1)
{
auto utils = std::make_shared<HiddenStartUtils>();
int32_t result = utils->CheckPreloadStartSupported();
EXPECT_EQ(result, ERR_NOT_SUPPORTED_PRODUCT_TYPE);
AppUtils::isPreloadApplicationEnabled_ = true;
result = utils->CheckPreloadStartSupported();
EXPECT_EQ(result, ERR_OK);
}
} // namespace AAFwk
} // namespace OHOS