diff --git a/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h b/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h index fd36397f62477ec45af4ff427cb209cfd89e63d7..b95b4560f873b5c9cabc5212c0965c95688a383d 100755 --- a/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h +++ b/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h @@ -228,6 +228,17 @@ public: return 0; } + virtual int SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) override + { + return 0; + } + + virtual bool IsUserAStabilityTest() override + { + return true; + } + enum RequestCode { E_STATE_INITIAL = 0, E_STATE_INACTIVE, diff --git a/frameworks/kits/test/mock/AMS/mock_ability_manager_service.h b/frameworks/kits/test/mock/AMS/mock_ability_manager_service.h index 6e2af77dfd3d02d8809c70055fc10007972d185f..ad5d44601d653a4298c0c7877e51381b259fb43d 100644 --- a/frameworks/kits/test/mock/AMS/mock_ability_manager_service.h +++ b/frameworks/kits/test/mock/AMS/mock_ability_manager_service.h @@ -195,6 +195,17 @@ public: return 0; } + virtual int SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) override + { + return 0; + } + + virtual bool IsUserAStabilityTest() override + { + return true; + } + AbilityLifeCycleState curstate_ = AbilityLifeCycleState::ABILITY_STATE_INITIAL; sptr abilityScheduler_; // kit interface used to schedule ability life Want want_; diff --git a/frameworks/kits/test/mock/AMS/mock_serviceability_manager_service.h b/frameworks/kits/test/mock/AMS/mock_serviceability_manager_service.h index 90a6d7f0fbd4648369d2abfb68aba47ecd6bad33..499e4d506f6b672f05e9b893849adef7f09ab292 100755 --- a/frameworks/kits/test/mock/AMS/mock_serviceability_manager_service.h +++ b/frameworks/kits/test/mock/AMS/mock_serviceability_manager_service.h @@ -211,6 +211,17 @@ public: return 0; } + virtual int SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) override + { + return 0; + } + + virtual bool IsUserAStabilityTest() override + { + return true; + } + sptr abilityScheduler_ = nullptr; // kit interface used to schedule ability life Want want_; bool startAbility = false; diff --git a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h index 4357ee24a3c76fc40fa9f8b51c587f20dee25fdc..6e57722b2e60f72a2753a2b431c1034151d831dc 100755 --- a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h +++ b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h @@ -44,6 +44,7 @@ #include "start_options.h" #include "stop_user_callback.h" #include "remote_mission_listener_interface.h" +#include "iability_controller.h" namespace OHOS { @@ -565,6 +566,22 @@ public: virtual int UnRegisterMissionListener(const std::string &deviceId, const sptr &listener) = 0; + + /** + * Set ability controller. + * + * @param abilityController, The ability controller. + * @return Returns ERR_OK on success, others on failure. + */ + virtual int SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) = 0; + + /** + * Is user a stability test. + * + * @return Returns true if user is a stability test. + */ + virtual bool IsUserAStabilityTest() = 0; /** * @brief Register the snapshot handler @@ -725,6 +742,12 @@ public: // ipc id for move mission to front (50) STOP_USER, + // ipc id for set ability controller (51) + SET_ABILITY_CONTROLLER, + + // ipc id for get stability test flag (52) + IS_USER_A_STABILITY_TEST, + // ipc id 1001-2000 for DMS // ipc id for starting ability (1001) START_ABILITY = 1001, diff --git a/services/abilitymgr/include/ability_manager_proxy.h b/services/abilitymgr/include/ability_manager_proxy.h index ed35e559fbf1f0a4b0e67c33ff2e595399163ee1..9255eb5f31ad727db261685e741cf8d5ac9f802f 100755 --- a/services/abilitymgr/include/ability_manager_proxy.h +++ b/services/abilitymgr/include/ability_manager_proxy.h @@ -530,6 +530,22 @@ public: virtual int UnRegisterMissionListener(const std::string &deviceId, const sptr &listener) override; + + /** + * Set ability controller. + * + * @param abilityController, The ability controller. + * @return Returns ERR_OK on success, others on failure. + */ + virtual int SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) override; + + /** + * Is user a stability test. + * + * @return Returns true if user is a stability test. + */ + virtual bool IsUserAStabilityTest() override; virtual int RegisterSnapshotHandler(const sptr& handler) override; diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index 0b8611b6f2b720ce7a9e6d17342d88df3eddeb7e..34b2b658a99cb6b05cbb2addd7f3065875fd0b47 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -46,6 +46,7 @@ namespace OHOS { namespace AAFwk { enum class ServiceRunningState { STATE_NOT_START, STATE_RUNNING }; +using OHOS::AppExecFwk::IAbilityController; class PendingWantManager; /** @@ -712,6 +713,25 @@ public: virtual int32_t GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) override; + /** + * Set ability controller. + * + * @param abilityController, The ability controller. + * @return Returns ERR_OK on success, others on failure. + */ + virtual int SetAbilityController(const sptr &abilityController, bool imAStabilityTest) override; + + /** + * Is user a stability test. + * + * @return Returns true if user is a stability test. + */ + virtual bool IsUserAStabilityTest() override; + + bool IsAbilityControllerStarting(const Want &want, const std::string &bundleName); + + bool IsAbilityControllerResuming(const std::string &bundleName); + // MSG 0 - 20 represents timeout message static constexpr uint32_t LOAD_TIMEOUT_MSG = 0; static constexpr uint32_t ACTIVE_TIMEOUT_MSG = 1; @@ -911,6 +931,9 @@ private: std::shared_ptr kernalAbilityManager_; sptr snapshotHandler_; std::shared_ptr userController_; + sptr abilityController_ = nullptr; + bool controllerIsAStabilityTest_ = false; + std::recursive_mutex globalLock_; }; } // namespace AAFwk diff --git a/services/abilitymgr/include/ability_manager_stub.h b/services/abilitymgr/include/ability_manager_stub.h index 21aa80c8c3da4f0cd18edd053940fea62117fc33..1f377e1bfb476c1e452dec1e98e33b8645781dfa 100755 --- a/services/abilitymgr/include/ability_manager_stub.h +++ b/services/abilitymgr/include/ability_manager_stub.h @@ -131,6 +131,9 @@ private: int RegisterSnapshotHandlerInner(MessageParcel &data, MessageParcel &reply); int GetMissionSnapshotInfoInner(MessageParcel &data, MessageParcel &reply); + int SetAbilityControllerInner(MessageParcel &data, MessageParcel &reply); + int IsUserAStabilityTestInner(MessageParcel &data, MessageParcel &reply); + using RequestFuncType = int (AbilityManagerStub::*)(MessageParcel &data, MessageParcel &reply); std::map requestFuncMap_; }; diff --git a/services/abilitymgr/src/ability_manager_proxy.cpp b/services/abilitymgr/src/ability_manager_proxy.cpp index 559c1dcbf6121a171986905ea5c3c9aae70ee53c..fc3a387d67efe68b9bc7755cfc4a11b68d41654a 100755 --- a/services/abilitymgr/src/ability_manager_proxy.cpp +++ b/services/abilitymgr/src/ability_manager_proxy.cpp @@ -2085,5 +2085,50 @@ int AbilityManagerProxy::RegisterSnapshotHandler(const sptr& h } return reply.ReadInt32(); } + +int AbilityManagerProxy::SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) +{ + if (!abilityController) { + HILOG_ERROR("abilityController nullptr"); + return ERR_INVALID_VALUE; + } + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!WriteInterfaceToken(data)) { + return INNER_ERR; + } + if (!data.WriteRemoteObject(abilityController->AsObject())) { + HILOG_ERROR("abilityController write failed."); + return ERR_INVALID_VALUE; + } + if (!data.WriteBool(imAStabilityTest)) { + HILOG_ERROR("imAStabilityTest write failed."); + return ERR_INVALID_VALUE; + } + auto error = Remote()->SendRequest(IAbilityManager::SET_ABILITY_CONTROLLER, data, reply, option); + if (error != NO_ERROR) { + HILOG_ERROR("Send request error: %{public}d", error); + return error; + } + return reply.ReadInt32(); +} + +bool AbilityManagerProxy::IsUserAStabilityTest() +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!WriteInterfaceToken(data)) { + return false; + } + auto error = Remote()->SendRequest(IAbilityManager::IS_USER_A_STABILITY_TEST, data, reply, option); + if (error != NO_ERROR) { + HILOG_ERROR("Send request error: %{public}d", error); + return false; + } + return reply.ReadBool(); +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 84ac7d14a0dc8f5d6b6b11fe3166032beeb33589..3d52850edcc1ca404404b45e84f2ad096db7287b 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -272,6 +272,10 @@ int AbilityManagerService::StartAbility( return connectManager_->StartAbility(abilityRequest); } + if (!IsAbilityControllerStarting(want, abilityInfo.bundleName)) { + return ERR_WOULD_BLOCK; + } + if (useNewMission_) { if (IsSystemUiApp(abilityRequest.abilityInfo)) { return kernalAbilityManager_->StartAbility(abilityRequest); @@ -329,11 +333,15 @@ int AbilityManagerService::StartAbility(const Want &want, const AbilityStartSett HILOG_ERROR("Only support for page type ability."); return ERR_INVALID_VALUE; } + + if (!IsAbilityControllerStarting(want, abilityInfo.bundleName)) { + return ERR_WOULD_BLOCK; + } + if (useNewMission_) { if (IsSystemUiApp(abilityRequest.abilityInfo)) { return kernalAbilityManager_->StartAbility(abilityRequest); } - return currentMissionListManager_->StartAbility(abilityRequest); } else { if (IsSystemUiApp(abilityRequest.abilityInfo)) { @@ -382,6 +390,9 @@ int AbilityManagerService::StartAbility(const Want &want, const StartOptions &st } } + if (!IsAbilityControllerStarting(want, abilityInfo.bundleName)) { + return ERR_WOULD_BLOCK; + } if (IsSystemUiApp(abilityRequest.abilityInfo)) { if (useNewMission_) { return kernalAbilityManager_->StartAbility(abilityRequest); @@ -439,6 +450,10 @@ int AbilityManagerService::TerminateAbility(const sptr &token, in RequestPermission(resultWant); } + if (!IsAbilityControllerResuming(abilityRecord->GetAbilityInfo().bundleName)) { + return ERR_WOULD_BLOCK; + } + if (useNewMission_) { return currentMissionListManager_->TerminateAbility(abilityRecord, resultCode, resultWant); } else { @@ -577,11 +592,17 @@ int AbilityManagerService::TerminateAbilityByCaller(const sptr &c case AppExecFwk::AbilityType::EXTENSION: { auto result = connectManager_->TerminateAbility(abilityRecord, requestCode); if (result == NO_FOUND_ABILITY_BY_CALLER) { + if (!IsAbilityControllerResuming(abilityRecord->GetAbilityInfo().bundleName)) { + return ERR_WOULD_BLOCK; + } return currentStackManager_->TerminateAbility(abilityRecord, requestCode); } return result; } case AppExecFwk::AbilityType::PAGE: { + if (!IsAbilityControllerResuming(abilityRecord->GetAbilityInfo().bundleName)) { + return ERR_WOULD_BLOCK; + } auto result = currentStackManager_->TerminateAbility(abilityRecord, requestCode); if (result == NO_FOUND_ABILITY_BY_CALLER) { return connectManager_->TerminateAbility(abilityRecord, requestCode); @@ -614,6 +635,10 @@ int AbilityManagerService::MinimizeAbility(const sptr &token) return ERR_INVALID_VALUE; } + if (!IsAbilityControllerResuming(abilityRecord->GetAbilityInfo().bundleName)) { + return ERR_WOULD_BLOCK; + } + if (useNewMission_) { return currentMissionListManager_->MinimizeAbility(token); } else { @@ -2863,5 +2888,49 @@ void AbilityManagerService::InitPendWantManager(int32_t userId, bool switchUser) } } } + +int AbilityManagerService::SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) +{ + HILOG_DEBUG("%{public}s, imAStabilityTest: %{public}d", __func__, imAStabilityTest); + std::lock_guard guard(globalLock_); + abilityController_ = abilityController; + controllerIsAStabilityTest_ = imAStabilityTest; + return ERR_OK; +} + +bool AbilityManagerService::IsUserAStabilityTest() +{ + std::lock_guard guard(globalLock_); + bool ret = abilityController_ != nullptr && controllerIsAStabilityTest_; + HILOG_DEBUG("%{public}s, isUserAStabilityTest: %{public}d", __func__, ret); + return ret; +} + +bool AbilityManagerService::IsAbilityControllerStarting(const Want &want, const std::string &bundleName) +{ + if (abilityController_ != nullptr) { + HILOG_DEBUG("%{public}s, controllerIsAStabilityTest_: %{public}d", __func__, controllerIsAStabilityTest_); + bool isStart = abilityController_->AbilityStarting(want, bundleName); + if (!isStart) { + HILOG_INFO("Not finishing start ability because controller starting: %{public}s", bundleName.c_str()); + return false; + } + } + return true; +} + +bool AbilityManagerService::IsAbilityControllerResuming(const std::string &bundleName) +{ + if (abilityController_ != nullptr) { + HILOG_DEBUG("%{public}s, controllerIsAStabilityTest_: %{public}d", __func__, controllerIsAStabilityTest_); + bool isResume = abilityController_->AbilityResuming(bundleName); + if (!isResume) { + HILOG_INFO("Not finishing terminate ability because controller resuming: %{public}s", bundleName.c_str()); + return false; + } + } + return true; +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index bfb6d7b5cd4f464bcfc8082a32e94900c402fc3c..b94cf6b91ae2e39a3bfdf0b6ab463621966317a3 100755 --- a/services/abilitymgr/src/ability_manager_stub.cpp +++ b/services/abilitymgr/src/ability_manager_stub.cpp @@ -125,6 +125,8 @@ void AbilityManagerStub::SecondStepInit() requestFuncMap_[MOVE_MISSION_TO_FRONT] = &AbilityManagerStub::MoveMissionToFrontInner; requestFuncMap_[START_USER] = &AbilityManagerStub::StartUserInner; requestFuncMap_[STOP_USER] = &AbilityManagerStub::StopUserInner; + requestFuncMap_[SET_ABILITY_CONTROLLER] = &AbilityManagerStub::SetAbilityControllerInner; + requestFuncMap_[IS_USER_A_STABILITY_TEST] = &AbilityManagerStub::IsUserAStabilityTestInner; } int AbilityManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) @@ -1206,5 +1208,34 @@ int AbilityManagerStub::GetMissionSnapshotInfoInner(MessageParcel &data, Message reply.WriteParcelable(&missionSnapshot); return result; } + +int AbilityManagerStub::SetAbilityControllerInner(MessageParcel &data, MessageParcel &reply) +{ + sptr controller = + iface_cast(data.ReadRemoteObject()); + if (controller == nullptr) { + HILOG_ERROR("AbilityManagerStub: setAbilityControllerInner controller readParcelable failed!"); + return ERR_NULL_OBJECT; + } + bool imAStabilityTest = data.ReadBool(); + int32_t result = SetAbilityController(controller, imAStabilityTest); + HILOG_INFO("AbilityManagerStub: setAbilityControllerInner result = %{public}d", result); + if (!reply.WriteInt32(result)) { + HILOG_ERROR("setAbilityControllerInner failed."); + return ERR_INVALID_VALUE; + } + return NO_ERROR; +} + +int AbilityManagerStub::IsUserAStabilityTestInner(MessageParcel &data, MessageParcel &reply) +{ + bool result = IsUserAStabilityTest(); + HILOG_INFO("AbilityManagerStub: isUserAStabilityTest result = %{public}d", result); + if (!reply.WriteBool(result)) { + HILOG_ERROR("isUserAStabilityTest failed."); + return ERR_INVALID_VALUE; + } + return NO_ERROR; +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h b/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h index 3f452557446df0df8c303e841ead73170aef159f..4bbdfa5e31e0846ed1db806081b09fa7d0955d3c 100755 --- a/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h @@ -334,6 +334,18 @@ public: { return 0; } + + virtual int SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) override + { + return 0; + } + + virtual bool IsUserAStabilityTest() override + { + return true; + } + MOCK_METHOD2(TerminateAbilityByCaller, int(const sptr &callerToken, int requestCode)); MOCK_METHOD3(StartAbility, int(const Want &want, const sptr &callerToken, int requestCode)); MOCK_METHOD2( diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h b/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h index 77f2a6c4c091082a1f1d8aeb2c3505f66c535fbf..0075b557b5048753cb402b27dc740e2fe664555f 100755 --- a/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h @@ -376,6 +376,17 @@ public: { return 0; } + + virtual int SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) override + { + return 0; + } + + virtual bool IsUserAStabilityTest() override + { + return true; + } }; } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_test/ability_manager_stub_mock.h b/services/abilitymgr/test/unittest/phone/ability_manager_test/ability_manager_stub_mock.h index f576842ebcea1d939d2c133721a45173b5e0ae77..2ed83816db6f8b2a5dcade0925a03d31ffc6c1f3 100755 --- a/services/abilitymgr/test/unittest/phone/ability_manager_test/ability_manager_stub_mock.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_test/ability_manager_stub_mock.h @@ -138,6 +138,17 @@ public: { return 0; } + + virtual int SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) override + { + return 0; + } + + virtual bool IsUserAStabilityTest() override + { + return true; + } }; } // namespace AAFwk } // namespace OHOS diff --git a/services/test/mock/include/mock_ability_manager_proxy.h b/services/test/mock/include/mock_ability_manager_proxy.h index 9963caba0f4d62fe0eb6756064b8a3c602549437..44bef71f3080aa17cebad92e214f89df3d0d9c0b 100644 --- a/services/test/mock/include/mock_ability_manager_proxy.h +++ b/services/test/mock/include/mock_ability_manager_proxy.h @@ -90,6 +90,17 @@ public: MOCK_METHOD1(GetPendingWantUserId, int(const sptr &target)); MOCK_METHOD1(SetShowOnLockScreen, int(bool isAllow)); + virtual int SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) override + { + return 0; + } + + virtual bool IsUserAStabilityTest() override + { + return true; + } + public: int id_; }; diff --git a/services/test/mock/include/mock_ability_mgr_service.h b/services/test/mock/include/mock_ability_mgr_service.h index cad93a239f64e20afcaa5c2dbe39ca175a1b1370..a95f9080f8163e01ddb6a3d5c06c176b90b8cb06 100755 --- a/services/test/mock/include/mock_ability_mgr_service.h +++ b/services/test/mock/include/mock_ability_mgr_service.h @@ -145,6 +145,17 @@ public: return 0; } + virtual int SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) override + { + return 0; + } + + virtual bool IsUserAStabilityTest() override + { + return true; + } + void Wait() { sem_.Wait(); diff --git a/tools/test/mock/mock_ability_manager_stub.h b/tools/test/mock/mock_ability_manager_stub.h index 0f0dd565e6a2684e76a1866bf9205507ce82b595..73fe0ad0e5b38a59abbda26b9bf1d1340ef3d177 100755 --- a/tools/test/mock/mock_ability_manager_stub.h +++ b/tools/test/mock/mock_ability_manager_stub.h @@ -169,6 +169,15 @@ public: { return 0; } + virtual int SetAbilityController(const sptr &abilityController, + bool imAStabilityTest) override + { + return 0; + } + virtual bool IsUserAStabilityTest() override + { + return true; + } public: std::string powerState_; };