diff --git a/interfaces/inner_api/include/form_render_interface.h b/interfaces/inner_api/include/form_render_interface.h index 7c90d4a3a61fcf7d6aa496ed61461beac8dc3a49..94ac6b5295d7a65c45b53ea1c38db71b7e8e4c12 100644 --- a/interfaces/inner_api/include/form_render_interface.h +++ b/interfaces/inner_api/include/form_render_interface.h @@ -68,6 +68,8 @@ public: virtual int32_t OnUnlock() { return ERR_OK; } + virtual int32_t SetVisibleChange(const int64_t &formId, bool isVisible, const Want &want) { return ERR_OK; } + virtual int32_t RecycleForm(const int64_t &formId, const Want &want) { return ERR_OK; } virtual int32_t RecoverForm(const FormJsInfo &formJsInfo, const Want &want) { return ERR_OK; } @@ -93,6 +95,7 @@ public: FORM_RECYCLE_FORM = 3107, FORM_RECOVER_FORM = 3108, FORM_RUN_CACHED_CONFIG = 3109, + FORM_SET_VISIBLE_CHANGE = 3110, }; }; } // namespace AppExecFwk diff --git a/interfaces/inner_api/include/form_render_proxy.h b/interfaces/inner_api/include/form_render_proxy.h index 368923795d07bfaf744a4a3744b12bc5b00b4976..23f62cd4ef77646a90b93965a3738bd3c2562558 100644 --- a/interfaces/inner_api/include/form_render_proxy.h +++ b/interfaces/inner_api/include/form_render_proxy.h @@ -64,6 +64,8 @@ public: int32_t OnUnlock() override; + int32_t SetVisibleChange(const int64_t &formId, bool isVisible, const Want &want) override; + int32_t RecycleForm(const int64_t &formId, const Want &want) override; int32_t RecoverForm(const FormJsInfo &formJsInfo, const Want &want) override; diff --git a/interfaces/inner_api/include/form_render_stub.h b/interfaces/inner_api/include/form_render_stub.h index 2b067431c47bf47ddcb780a71342b6d9423c75e5..f95fcb47a667b9e9d0aa8c940f5087ac9c50b795 100644 --- a/interfaces/inner_api/include/form_render_stub.h +++ b/interfaces/inner_api/include/form_render_stub.h @@ -73,6 +73,8 @@ private: int32_t HandleOnUnlock(MessageParcel &data, MessageParcel &reply); + int32_t HandleSetVisibleChange(MessageParcel &data, MessageParcel &reply); + int32_t HandleRecycleForm(MessageParcel &data, MessageParcel &reply); int32_t HandleRecoverForm(MessageParcel &data, MessageParcel &reply); diff --git a/interfaces/inner_api/src/form_render_proxy.cpp b/interfaces/inner_api/src/form_render_proxy.cpp index 527e8d04ab5058126d22674bdf3c47ce32ba3da1..95da24f783cb75502ab1d9c5bba871499ce55eea 100644 --- a/interfaces/inner_api/src/form_render_proxy.cpp +++ b/interfaces/inner_api/src/form_render_proxy.cpp @@ -225,6 +225,42 @@ int32_t FormRenderProxy::OnUnlock() return ERR_OK; } +int32_t FormRenderProxy::SetVisibleChange(const int64_t &formId, bool isVisible, const Want &want) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option(MessageOption::TF_ASYNC); + HILOG_ERROR("begin"); + + if (!WriteInterfaceToken(data)) { + HILOG_ERROR("error to write interface token"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + + if (!data.WriteInt64(formId)) { + HILOG_ERROR("write formId failed"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (!data.WriteBool(isVisible)) { + HILOG_ERROR("write isVisible failed"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + + if (!data.WriteParcelable(&want)) { + HILOG_ERROR("write want failed"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + + int32_t error = SendTransactCmd( + IFormRender::Message::FORM_SET_VISIBLE_CHANGE, data, reply, option); + if (error != ERR_OK) { + HILOG_ERROR("SendRequest:%{public}d failed", error); + return error; + } + HILOG_ERROR("end"); + return ERR_OK; +} + int FormRenderProxy::SendTransactCmd(IFormRender::Message code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { diff --git a/interfaces/inner_api/src/form_render_stub.cpp b/interfaces/inner_api/src/form_render_stub.cpp index 7775a9d3e8c50e99b922cb192b993e7392aa8e04..5a93c72a754aa275b8aa3c2674bf7002133fc3d6 100644 --- a/interfaces/inner_api/src/form_render_stub.cpp +++ b/interfaces/inner_api/src/form_render_stub.cpp @@ -64,6 +64,8 @@ int FormRenderStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageP case static_cast(IFormRender::Message::FORM_RUN_CACHED_CONFIG): RunCachedConfigurationUpdated(); return ERR_OK; + case static_cast(IFormRender::Message::FORM_SET_VISIBLE_CHANGE): + return HandleSetVisibleChange(data, reply); default: return IPCObjectStub::OnRemoteRequest(code, data, reply, option); } @@ -167,6 +169,22 @@ int32_t FormRenderStub::HandleOnUnlock(MessageParcel &data, MessageParcel &reply return result; } +int32_t FormRenderStub::HandleSetVisibleChange(MessageParcel &data, MessageParcel &reply) +{ + HILOG_ERROR("begin"); + int64_t formId = data.ReadInt64(); + bool isVisible = data.ReadBool(); + std::unique_ptr want(data.ReadParcelable()); + if (!want) { + HILOG_ERROR("error to ReadParcelable"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + int32_t result = SetVisibleChange(formId, isVisible, *want); + reply.WriteInt32(result); + HILOG_ERROR("end"); + return result; +} + template int32_t FormRenderStub::GetParcelableInfos(MessageParcel &reply, std::vector &parcelableInfos) { diff --git a/services/form_render_service/include/form_render_impl.h b/services/form_render_service/include/form_render_impl.h index 5f867cfcf1fe9d198bd22934eb24f60991d468f5..e8a0284d535884bc42315e6cbcf4a89bf1d4887b 100644 --- a/services/form_render_service/include/form_render_impl.h +++ b/services/form_render_service/include/form_render_impl.h @@ -91,6 +91,8 @@ public: int32_t OnUnlock() override; + int32_t SetVisibleChange(const int64_t &formId, bool isVisible, const Want &want) override; + int32_t RecycleForm(const int64_t &formId, const Want &want) override; int32_t RecoverForm(const FormJsInfo &formJsInfo, const Want &want) override; diff --git a/services/form_render_service/include/form_render_record.h b/services/form_render_service/include/form_render_record.h index f99dd94dcf8fbf96bbfee1a1a97ddb9fa51a14d0..5ef7eba120b2d928f5ca795a21fe743a0043a321 100644 --- a/services/form_render_service/include/form_render_record.h +++ b/services/form_render_service/include/form_render_record.h @@ -107,6 +107,10 @@ public: int32_t OnUnlock(); + int32_t SetVisibleChange(const int64_t &formId, bool isVisible); + + int32_t HandleSetVisibleChange(const int64_t &formId, bool isVisible); + int32_t ReloadFormRecord(const std::vector &&formJsInfos, const Want &want); int32_t HandleReloadFormRecord(const std::vector &&formJsInfos, const Want &want); diff --git a/services/form_render_service/src/form_render_impl.cpp b/services/form_render_service/src/form_render_impl.cpp index 63e88c645a8e8721dcdfa7554c53eb8ddd515195..12d9d272d059114617b02a331fd4f0612ce898fa 100644 --- a/services/form_render_service/src/form_render_impl.cpp +++ b/services/form_render_service/src/form_render_impl.cpp @@ -37,6 +37,7 @@ namespace { constexpr int32_t RENDER_FORM_FAILED = -1; constexpr int32_t RELOAD_FORM_FAILED = -1; constexpr int32_t RECYCLE_FORM_FAILED = -1; +constexpr int32_t SET_VISIBLE_CHANGE_FAILED = -1; constexpr int32_t FORM_RENDER_TASK_DELAY_TIME = 20; // ms constexpr int32_t ENABLE_FORM_FAILED = -1; } @@ -259,6 +260,38 @@ int32_t FormRenderImpl::OnUnlock() return ERR_OK; } +int32_t FormRenderImpl::SetVisibleChange(const int64_t &formId, bool isVisible, const Want &want) +{ + HILOG_INFO("SetVisibleChange start"); + if (formId <= 0) { + HILOG_ERROR("formId is negative"); + return ERR_APPEXECFWK_FORM_INVALID_FORM_ID; + } + + std::string uid = want.GetStringParam(Constants::FORM_SUPPLY_UID); + if (uid.empty()) { + HILOG_ERROR("empty uid,formId:%{public}" PRId64, formId); + return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED; + } + HILOG_INFO("formId:%{public}" PRId64 ",uid:%{public}s", formId, uid.c_str()); + + std::lock_guard lock(renderRecordMutex_); + if (auto search = renderRecordMap_.find(uid); search != renderRecordMap_.end()) { + if (search->second == nullptr) { + HILOG_ERROR("null renderRecord of %{public}s", std::to_string(formId).c_str()); + return SET_VISIBLE_CHANGE_FAILED; + } + auto ret = search->second->SetVisibleChange(formId, isVisible); + if (ret != ERR_OK) { + return ret; + } + } else { + HILOG_ERROR("can't find render record of %{public}s", std::to_string(formId).c_str()); + return SET_VISIBLE_CHANGE_FAILED; + } + return ERR_OK; +} + void FormRenderImpl::OnConfigurationUpdated( const std::shared_ptr& configuration) { diff --git a/services/form_render_service/src/form_render_record.cpp b/services/form_render_service/src/form_render_record.cpp index 8411ad25df249c6601200e33ecebb7315e94d063..977c598495fd4affd2341bbdaea74594cfae7b7e 100644 --- a/services/form_render_service/src/form_render_record.cpp +++ b/services/form_render_service/src/form_render_record.cpp @@ -42,6 +42,7 @@ namespace FormRender { constexpr int32_t RENDER_FORM_FAILED = -1; constexpr int32_t RELOAD_FORM_FAILED = -1; constexpr int32_t RECYCLE_FORM_FAILED = -1; +constexpr int32_t SET_VISIBLE_CHANGE_FAILED = -1; constexpr int32_t ADD_THREAD_FAIL = -1; constexpr int32_t CHECK_THREAD_TIME = 3; constexpr uint64_t WATCHDOG_TIMEOUT = 5 * 1000; @@ -1288,6 +1289,51 @@ int32_t FormRenderRecord::HandleOnUnlock() return ERR_OK; } +int32_t FormRenderRecord::SetVisibleChange(const int64_t &formId, bool isVisible) +{ + HILOG_INFO("SetVisibleChange, formId:%{public}s", std::to_string(formId).c_str()); + std::shared_ptr eventHandler = nullptr; + { + std::lock_guard lock(eventHandlerMutex_); + eventHandler = eventHandler_; + } + auto task = [thisWeakPtr = weak_from_this(), formId, isVisible]() { + auto renderRecord = thisWeakPtr.lock(); + if (renderRecord == nullptr) { + HILOG_ERROR("null renderRecord"); + return; + } + + renderRecord->HandleSetVisibleChange(formId, isVisible); + }; + + if (eventHandler == nullptr) { + HILOG_ERROR("null eventHandler"); + return SET_VISIBLE_CHANGE_FAILED; + } + eventHandler->PostSyncTask(task, "SetVisibleChange"); + return ERR_OK; +} + +int32_t FormRenderRecord::HandleSetVisibleChange(const int64_t &formId, bool isVisible) +{ + HILOG_INFO("HandleSetVisibleChange begin,formId:%{public}s", std::to_string(formId).c_str()); + MarkThreadAlive(); + + std::lock_guard lock(formRendererGroupMutex_); + auto search = formRendererGroupMap_.find(formId); + if (search == formRendererGroupMap_.end()) { + HILOG_ERROR("invalid FormRendererGroup"); + return SET_VISIBLE_CHANGE_FAILED; + } + if (!search->second) { + HILOG_ERROR("FormRendererGroup was founded but null"); + return SET_VISIBLE_CHANGE_FAILED; + } + search->second->SetVisibleChange(isVisible); + return ERR_OK; +} + int32_t FormRenderRecord::HandleReloadFormRecord(const std::vector &&formJsInfos, const Want &want) { HILOG_INFO("Reload record in js thread"); diff --git a/services/include/form_mgr_adapter.h b/services/include/form_mgr_adapter.h index fd74edeab94f20b799a2cd07196cb4a3ed5cbac4..6cb508e725d63801fae851e6d5a87e389b77c875 100644 --- a/services/include/form_mgr_adapter.h +++ b/services/include/form_mgr_adapter.h @@ -1192,6 +1192,8 @@ private: int DeleteCommonForm(const int64_t formId, const sptr &callerToken); void CheckUpdateFormRecord(const int64_t formId, const FormItemInfo &info, FormRecord &record); + + void SetVisibleChange(const int64_t formId, const int32_t formVisibleType); }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/include/form_render_mgr.h b/services/include/form_render_mgr.h index 0899d561fc10bbc34ff615307d42b52f26a50afe..b8dedd5a92a2287a1627016365486e49ce43b179 100644 --- a/services/include/form_render_mgr.h +++ b/services/include/form_render_mgr.h @@ -52,6 +52,8 @@ public: void NotifyScreenOn(); + void SetVisibleChange(int64_t formId, bool isVisible); + ErrCode StopRenderingForm(int64_t formId, const FormRecord &formRecord, const std::string &compId = "", const sptr &hostToken = nullptr); diff --git a/services/include/form_render_mgr_inner.h b/services/include/form_render_mgr_inner.h index 370f69d577bbed94de9772b0643f7a00f28c5f8a..e7b02c0b80754d2c1ec2d28e98f36faff95944ec 100644 --- a/services/include/form_render_mgr_inner.h +++ b/services/include/form_render_mgr_inner.h @@ -70,6 +70,8 @@ public: void NotifyScreenOn(); + void PostSetVisibleChangeTask(int64_t formId, bool isVisible); + int32_t GetReRenderCount() const; sptr GetRenderRemoteObj() const; diff --git a/services/include/form_task_mgr.h b/services/include/form_task_mgr.h index 30010683c1ac801b24b85835f369e2f6930e6509..2859a7e798fd4cba697a9c5d9334e9eed41305f6 100644 --- a/services/include/form_task_mgr.h +++ b/services/include/form_task_mgr.h @@ -224,6 +224,8 @@ public: void PostOnUnlock(const sptr &remoteObject); + void PostSetVisibleChange(int64_t formId, bool isVisible, const sptr &remoteObject); + /** * @brief Post Form visible/invisible notify. * @param formIds the Ids of forms need to notify. @@ -474,6 +476,8 @@ private: void OnUnlock(const sptr &remoteObject); + void SetVisibleChange(int64_t formId, bool isVisible, const sptr &remoteObject); + void RemoveConnection(int32_t connectId); /** diff --git a/services/src/form_mgr_adapter.cpp b/services/src/form_mgr_adapter.cpp index 8c804ffed12e40f2d86999258c7904a40bd23cf6..3ad04e72c4a32b9b194567ecbb9a93c2641f4b5f 100644 --- a/services/src/form_mgr_adapter.cpp +++ b/services/src/form_mgr_adapter.cpp @@ -823,6 +823,18 @@ int FormMgrAdapter::RequestForm(const int64_t formId, const sptr return FormProviderMgr::GetInstance().RefreshForm(matchedFormId, reqWant, true); } +void FormMgrAdapter::SetVisibleChange(const int64_t formId, const int32_t formVisibleType) +{ + if (formId <= 0 + || (formVisibleType != Constants::FORM_VISIBLE && formVisibleType != Constants::FORM_INVISIBLE)) { + HILOG_WARN("param is not right"); + return; + } + + bool isVisible = (formVisibleType == Constants::FORM_VISIBLE) ? true : false; + FormRenderMgr::GetInstance().SetVisibleChange(formId, isVisible); +} + ErrCode FormMgrAdapter::NotifyWhetherVisibleForms(const std::vector &formIds, const sptr &callerToken, const int32_t formVisibleType) { @@ -855,7 +867,7 @@ ErrCode FormMgrAdapter::NotifyWhetherVisibleForms(const std::vector &fo if (!isFormShouldUpdateProviderInfoToHost(matchedFormId, userId, callerToken, formRecord)) { continue; } - + SetVisibleChange(matchedFormId, formVisibleType); PaddingNotifyVisibleFormsMap(formVisibleType, formId, formInstanceMaps); // Update info to host and check if the form was created by the system application. diff --git a/services/src/form_render_mgr.cpp b/services/src/form_render_mgr.cpp index 64bfeafbeaac5e2fc8967090a5c43564f1522718..91292e15b1d0a101605f258d64bbe096a30190f3 100644 --- a/services/src/form_render_mgr.cpp +++ b/services/src/form_render_mgr.cpp @@ -238,6 +238,20 @@ void FormRenderMgr::OnUnlock() ExecAcquireProviderTask(); } +void FormRenderMgr::SetVisibleChange(int64_t formId, bool isVisible) +{ + HILOG_INFO("call."); + int32_t userId = FormUtil::GetCurrentAccountId(); + auto renderIter = renderInners_.find(userId); + if (renderIter != renderInners_.end()) { + renderIter->second->PostSetVisibleChangeTask(formId, isVisible); + } + auto sandboxIter = sandboxInners_.find(userId); + if (sandboxIter != sandboxInners_.end()) { + sandboxIter->second->PostSetVisibleChangeTask(formId, isVisible); + } +} + ErrCode FormRenderMgr::StopRenderingForm( int64_t formId, const FormRecord &formRecord, const std::string &compId, const sptr &hostToken) { diff --git a/services/src/form_render_mgr_inner.cpp b/services/src/form_render_mgr_inner.cpp index 77b60ce106cc97c45a432e6016c2a3a92ce0750a..0c10fcc612868bf8443e5f898fe823a93ca1b086 100644 --- a/services/src/form_render_mgr_inner.cpp +++ b/services/src/form_render_mgr_inner.cpp @@ -264,6 +264,18 @@ void FormRenderMgrInner::NotifyScreenOn() remoteFormRenderer->RunCachedConfigurationUpdated(); } +void FormRenderMgrInner::PostSetVisibleChangeTask(int64_t formId, bool isVisible) +{ + HILOG_INFO("call"); + sptr remoteObject; + auto ret = GetRenderObject(remoteObject); + if (ret != ERR_OK) { + HILOG_ERROR("null remoteObjectGotten"); + return; + } + FormTaskMgr::GetInstance().PostSetVisibleChange(formId, isVisible, remoteObject); +} + ErrCode FormRenderMgrInner::StopRenderingForm(int64_t formId, const FormRecord &formRecord, const std::string &compId, const sptr &hostToken) { diff --git a/services/src/form_task_mgr.cpp b/services/src/form_task_mgr.cpp index 6db1ea6daca204bfed94e8e8f5af0185b6673882..6af640c2941ccdf819f63d787b867c155175c729 100644 --- a/services/src/form_task_mgr.cpp +++ b/services/src/form_task_mgr.cpp @@ -983,6 +983,46 @@ void FormTaskMgr::PostOnUnlock(const sptr &remoteObject) HILOG_DEBUG("end"); } +void FormTaskMgr::SetVisibleChange(int64_t formId, bool isVisible, const sptr &remoteObject) +{ + HILOG_INFO("begin"); + sptr remoteFormRender = iface_cast(remoteObject); + if (remoteFormRender == nullptr) { + HILOG_ERROR("get formRenderProxy failed"); + return; + } + + FormRecord formRecord; + if (!FormDataMgr::GetInstance().GetFormRecord(formId, formRecord)) { + HILOG_ERROR("form %{public}" PRId64 " not exist", formId); + return; + } + + Want want; + want.SetParam(Constants::FORM_SUPPLY_UID, std::to_string(formRecord.providerUserId) + formRecord.bundleName); + + int32_t error = remoteFormRender->SetVisibleChange(formId, isVisible, want); + if (error != ERR_OK) { + HILOG_ERROR("fail"); + return; + } + HILOG_INFO("end"); +} + +void FormTaskMgr::PostSetVisibleChange(int64_t formId, bool isVisible, const sptr &remoteObject) +{ + HILOG_INFO("call"); + if (serialQueue_ == nullptr) { + HILOG_ERROR("null serialQueue_"); + return; + } + auto task = [formId, isVisible, remoteObject]() { + FormTaskMgr::GetInstance().SetVisibleChange(formId, isVisible, remoteObject); + }; + serialQueue_->ScheduleTask(FORM_TASK_DELAY_TIME, task); + HILOG_INFO("end"); +} + void FormTaskMgr::RemoveConnection(int32_t connectId) { auto formSupplyCallback = FormSupplyCallback::GetInstance(); diff --git a/test/fuzztest/formrendermgrinner_fuzzer/formrendermgrinner_fuzzer.cpp b/test/fuzztest/formrendermgrinner_fuzzer/formrendermgrinner_fuzzer.cpp index afe3eaa14f956bb064e7441ac10b80544511999f..54f29bd1ced25edcc2cdd85193d5607e6ae01034 100644 --- a/test/fuzztest/formrendermgrinner_fuzzer/formrendermgrinner_fuzzer.cpp +++ b/test/fuzztest/formrendermgrinner_fuzzer/formrendermgrinner_fuzzer.cpp @@ -68,6 +68,7 @@ bool DoSomethingInterestingWithMyAPI(const char* data, size_t size) formRenderMgrInner.OnRenderingBlock(bundleName); formRenderMgrInner.ReleaseRenderer(formId, formRecord, compId); formRenderMgrInner.PostOnUnlockTask(); + formRenderMgrInner.PostSetVisibleChangeTask(formId, true); formRenderMgrInner.GetReRenderCount(); formRenderMgrInner.GetRenderRemoteObj(); sptr remoteObject = nullptr; diff --git a/test/fuzztest/formrenderstub_fuzzer/formrenderstub_fuzzer.cpp b/test/fuzztest/formrenderstub_fuzzer/formrenderstub_fuzzer.cpp index 70829194493c97e18de6f333954e22dbe4fd0d64..759e685abe9371c730ab6aba9b71327818e2bbde 100755 --- a/test/fuzztest/formrenderstub_fuzzer/formrenderstub_fuzzer.cpp +++ b/test/fuzztest/formrenderstub_fuzzer/formrenderstub_fuzzer.cpp @@ -85,6 +85,7 @@ bool DoSomethingInterestingWithMyAPI(const char* data, size_t size) formRenderStub->HandleReloadForm(datas, reply); formRenderStub->HandleStopRenderingForm(datas, reply); formRenderStub->HandleOnUnlock(datas, reply); + formRenderStub->HandleSetVisibleChange(datas, reply); formRenderStub->HandleRecoverForm(datas, reply); return true; } diff --git a/test/unittest/fms_form_render_impl_test/fms_form_render_impl_test.cpp b/test/unittest/fms_form_render_impl_test/fms_form_render_impl_test.cpp index 4483e990cd38fe50646fd8df7db26ea2b7a3c8fb..860365c51ad7b829c5a3fb9cbdaac2641eaa7270 100755 --- a/test/unittest/fms_form_render_impl_test/fms_form_render_impl_test.cpp +++ b/test/unittest/fms_form_render_impl_test/fms_form_render_impl_test.cpp @@ -40,6 +40,7 @@ namespace { constexpr int32_t RENDER_FORM_FAILED = -1; constexpr int32_t RELOAD_FORM_FAILED = -1; constexpr int32_t RECYCLE_FORM_FAILED = -1; +constexpr int32_t SET_VISIBLE_CHANGE_FAILED = -1; } // namespace class FormRenderImplTest : public testing::Test { @@ -881,6 +882,110 @@ HWTEST_F(FormRenderImplTest, FormRenderImplTest_042, TestSize.Level0) EXPECT_TRUE(formRenderImpl.isVerified_); } +/** +* @tc.name: FormRenderImplTest_043 +* @tc.desc: 1.Verify SetVisibleChange interface executes as expected. +* 2.call SetVisibleChange +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderImplTest, FormRenderImplTest_043, TestSize.Level0) +{ + FormRenderImpl formRenderImpl; + int64_t formId{ 0 }; + Want want; + + EXPECT_EQ(formRenderImpl.SetVisibleChange(formId, true, want), ERR_APPEXECFWK_FORM_INVALID_FORM_ID); +} + +/** +* @tc.name: FormRenderImplTest_044 +* @tc.desc: 1.Verify SetVisibleChange interface executes as expected. +* 2.call SetVisibleChange +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderImplTest, FormRenderImplTest_044, TestSize.Level0) +{ + FormRenderImpl formRenderImpl; + int64_t formId{ 3 }; + Want want; + EXPECT_EQ(formRenderImpl.SetVisibleChange(formId, true, want), ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED); +} + +/** +* @tc.name: FormRenderImplTest_045 +* @tc.desc: 1.Verify SetVisibleChange interface executes as expected. +* 2.call SetVisibleChange +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderImplTest, FormRenderImplTest_045, TestSize.Level0) +{ + FormRenderImpl formRenderImpl; + int64_t formId{ 3 }; + std::string uid{ "202410101010" }; + Want want; + want.SetParam(Constants::FORM_SUPPLY_UID, uid); + EXPECT_EQ(formRenderImpl.SetVisibleChange(formId, true, want), SET_VISIBLE_CHANGE_FAILED); +} + +/** +* @tc.name: FormRenderImplTest_046 +* @tc.desc: 1.Verify SetVisibleChange interface executes as expected. +* 2.call SetVisibleChange +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderImplTest, FormRenderImplTest_046, TestSize.Level0) +{ + FormRenderImpl formRenderImpl; + int64_t formId{ 3 }; + Want want; + std::string uid{ "202410101010" }; + want.SetParam(Constants::FORM_SUPPLY_UID, uid); + formRenderImpl.renderRecordMap_.emplace("2024101010", nullptr); + EXPECT_EQ(formRenderImpl.SetVisibleChange(formId, true, want), SET_VISIBLE_CHANGE_FAILED); +} + +/** +* @tc.name: FormRenderImplTest_047 +* @tc.desc: 1.Verify SetVisibleChange interface executes as expected. +* 2.call SetVisibleChange +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderImplTest, FormRenderImplTest_047, TestSize.Level0) +{ + FormRenderImpl formRenderImpl; + int64_t formId{ 3 }; + Want want; + std::string uid{ "202410101010" }; + want.SetParam(Constants::FORM_SUPPLY_UID, uid); + auto formRenderRecord = FormRenderRecord::Create("bundleName", "2024101010"); + formRenderImpl.renderRecordMap_.emplace("2024101010", formRenderRecord); + EXPECT_EQ(formRenderImpl.SetVisibleChange(formId, true, want), SET_VISIBLE_CHANGE_FAILED); +} + +/** +* @tc.name: FormRenderImplTest_048 +* @tc.desc: 1.Verify SetVisibleChange interface executes as expected. +* 2.call SetVisibleChange +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderImplTest, FormRenderImplTest_048, TestSize.Level0) +{ + FormRenderImpl formRenderImpl; + int64_t formId{ 3 }; + Want want; + std::string uid{ "202410101010" }; + want.SetParam(Constants::FORM_SUPPLY_UID, uid); + auto formRenderRecord = FormRenderRecord::Create("bundleName", uid); + EXPECT_TRUE(formRenderRecord); + FormJsInfo formJsInfo; + formJsInfo.formId = formId; + std::shared_ptr context = nullptr; + std::shared_ptr runtime = nullptr; + formRenderRecord->GetFormRendererGroup(formJsInfo, context, runtime); + formRenderImpl.renderRecordMap_.emplace(uid, formRenderRecord); + EXPECT_EQ(formRenderImpl.SetVisibleChange(formId, true, want), ERR_OK); +} + /** * @tc.name: RunCachedConfigurationUpdatedTest_001 * @tc.desc: Verify RunCachedConfigurationUpdated interface executes as expected. diff --git a/test/unittest/fms_form_render_proxy_test/fms_form_render_proxy_test.cpp b/test/unittest/fms_form_render_proxy_test/fms_form_render_proxy_test.cpp index 2fa3ebc26a35e62b6f5b50ab8ced4bf5ecdd06d7..badabfab9b4d519cba626a047a091b3d5edc3347 100755 --- a/test/unittest/fms_form_render_proxy_test/fms_form_render_proxy_test.cpp +++ b/test/unittest/fms_form_render_proxy_test/fms_form_render_proxy_test.cpp @@ -213,6 +213,21 @@ HWTEST_F(FormRenderProxyTest, FormRenderProxyTest_0011, TestSize.Level1) { GTEST_LOG_(INFO) << "FormRenderProxyTest_0011 test ends"; } +/** +* @tc.name: FormRenderProxyTest_0012 +* @tc.desc: test SetVisibleChange function. +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderProxyTest, FormRenderProxyTest_0012, TestSize.Level1) { + GTEST_LOG_(INFO) << "FormRenderProxyTest_0012 starts"; + Want want = {}; + EXPECT_CALL(*mockIRemoteObject_, SendRequest(_, _, _, _)).Times(1) + .WillOnce(Return(ERR_OK)); + int result = formRenderProxy_->SetVisibleChange(TEST_FORM_ID, true, want); + EXPECT_EQ(result, ERR_OK); + GTEST_LOG_(INFO) << "FormRenderProxyTest_0012 test ends"; +} + /** * @tc.name: RunCachedConfigurationUpdated_001 * @tc.desc: test RunCachedConfigurationUpdated function. diff --git a/test/unittest/fms_form_render_stub_test/fms_form_render_stub_test.cpp b/test/unittest/fms_form_render_stub_test/fms_form_render_stub_test.cpp index 15038a4d434ef79f88d0f0d89b303c685a8e2e34..99ea61f8ccaa925f0349c9f61b6b91b2b9311616 100755 --- a/test/unittest/fms_form_render_stub_test/fms_form_render_stub_test.cpp +++ b/test/unittest/fms_form_render_stub_test/fms_form_render_stub_test.cpp @@ -917,6 +917,49 @@ HWTEST_F(FormRenderStubTest, FormRenderStubTest_024, TestSize.Level0) EXPECT_EQ(result, ERR_OK); } +/** +* @tc.name: FormRenderStubTest_025 +* @tc.desc: 1.Verify OnRemoteRequest and HandleSetVisibleChange interface executes as expected. +* 2.Want is nullptr +* 3.The interface return value ERR_APPEXECFWK_PARCEL_ERROR. +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderStubTest, FormRenderStubTest_025, TestSize.Level0) +{ + sptr callback = new (std::nothrow) MockFormRenderImpl(); + uint32_t code = static_cast(IFormRender::Message::FORM_SET_VISIBLE_CHANGE); + MessageParcel data; + MessageParcel reply; + MessageOption option{MessageOption::TF_ASYNC}; + data.WriteInterfaceToken(u"ohos.appexecfwk.FormRender"); + data.WriteInt64(1); + data.WriteBool(true); + auto result = callback->OnRemoteRequest(code, data, reply, option); + EXPECT_EQ(result, ERR_APPEXECFWK_PARCEL_ERROR); +} + +/** +* @tc.name: FormRenderStubTest_026 +* @tc.desc: 1.Verify OnRemoteRequest and HandleSetVisibleChange interface executes as expected. +* 2.The interface return value ERR_OK. +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderStubTest, FormRenderStubTest_026, TestSize.Level0) +{ + Want want = {}; + sptr callback = new (std::nothrow) MockFormRenderImpl(); + uint32_t code = static_cast(IFormRender::Message::FORM_SET_VISIBLE_CHANGE); + MessageParcel data; + MessageParcel reply; + MessageOption option{MessageOption::TF_ASYNC}; + data.WriteInterfaceToken(u"ohos.appexecfwk.FormRender"); + data.WriteInt64(1); + data.WriteBool(true); + data.WriteParcelable(&want); + auto result = callback->OnRemoteRequest(code, data, reply, option); + EXPECT_EQ(result, ERR_OK); +} + /** * @tc.name: IFormSupplyTest_001 * @tc.desc: Test OnRenderingBlock function diff --git a/test/unittest/frs_form_render_record_test/frs_form_render_record_test.cpp b/test/unittest/frs_form_render_record_test/frs_form_render_record_test.cpp index a9de1850bc9057f5bb2c12e55a09df2614862433..55ce9775711086f0498a5a9b83e1f62960278434 100644 --- a/test/unittest/frs_form_render_record_test/frs_form_render_record_test.cpp +++ b/test/unittest/frs_form_render_record_test/frs_form_render_record_test.cpp @@ -40,6 +40,7 @@ constexpr int32_t RELOAD_FORM_FAILED = -1; constexpr int32_t RENDER_FORM_ID = -1; constexpr int32_t RENDER_FORM_FAILED = -1; constexpr int32_t RECYCLE_FORM_FAILED = -1; +constexpr int32_t SET_VISIBLE_CHANGE_FAILED = -1; constexpr int32_t FORM_ID = 1; } #define private public @@ -1719,6 +1720,89 @@ HWTEST_F(FormRenderRecordTest, FormRenderRecordTest_090, TestSize.Level0) GTEST_LOG_(INFO) << "FormRenderRecordTest_090 end"; } +/** +* @tc.name: FormRenderRecordTest_091 +* @tc.desc: Test HandleSetVisibleChange +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderRecordTest, FormRenderRecordTest_091, TestSize.Level0) +{ + EXPECT_TRUE(formRenderRecordPtr_); + formRenderRecordPtr_->formRendererGroupMap_.clear(); + + int64_t formId = 15; + EXPECT_EQ(SET_VISIBLE_CHANGE_FAILED, formRenderRecordPtr_->HandleSetVisibleChange(formId, true)); +} + +/** +* @tc.name: FormRenderRecordTest_092 +* @tc.desc: Test HandleSetVisibleChange +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderRecordTest, FormRenderRecordTest_092, TestSize.Level0) +{ + EXPECT_TRUE(formRenderRecordPtr_); + formRenderRecordPtr_->formRendererGroupMap_.clear(); + + int64_t formId = 15; + formRenderRecordPtr_->formRendererGroupMap_.emplace(formId, nullptr); + EXPECT_EQ(SET_VISIBLE_CHANGE_FAILED, formRenderRecordPtr_->HandleSetVisibleChange(formId, true)); +} + +/** +* @tc.name: FormRenderRecordTest_093 +* @tc.desc: Test HandleSetVisibleChange +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderRecordTest, FormRenderRecordTest_093, TestSize.Level0) +{ + EXPECT_TRUE(formRenderRecordPtr_); + formRenderRecordPtr_->formRendererGroupMap_.clear(); + + int64_t formId = 15; + std::shared_ptr context = nullptr; + std::shared_ptr runtime = nullptr; + std::shared_ptr handler = nullptr; + auto group = std::make_shared(context, runtime, handler); + formRenderRecordPtr_->formRendererGroupMap_.emplace(formId, group); + EXPECT_EQ(ERR_OK, formRenderRecordPtr_->HandleSetVisibleChange(formId, true)); +} + +/** +* @tc.name: FormRenderRecordTest_094 +* @tc.desc: Verify SetVisibleChange +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderRecordTest, FormRenderRecordTest_094, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FormRenderRecordTest_094 start"; + + ASSERT_NE(formRenderRecordPtr_, nullptr); + int64_t formId = FORM_ID; + formRenderRecordPtr_->eventHandler_ = nullptr; + EXPECT_EQ(formRenderRecordPtr_->SetVisibleChange(formId, true), SET_VISIBLE_CHANGE_FAILED); + GTEST_LOG_(INFO) << "FormRenderRecordTest_094 end"; +} + +/** +* @tc.name: FormRenderRecordTest_095 +* @tc.desc: Verify SetVisibleChange +* @tc.type: FUNC +*/ +HWTEST_F(FormRenderRecordTest, FormRenderRecordTest_095, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FormRenderRecordTest_095 start"; + + ASSERT_NE(formRenderRecordPtr_, nullptr); + int64_t formId = FORM_ID; + std::string bundleName = ""; + auto eventRunner = EventRunner::Create(bundleName); + formRenderRecordPtr_->eventHandler_ = std::make_shared(eventRunner); + EXPECT_EQ(formRenderRecordPtr_->SetVisibleChange(formId, true), ERR_OK); + formRenderRecordPtr_->eventHandler_ = nullptr; + GTEST_LOG_(INFO) << "FormRenderRecordTest_095 end"; +} + /** * @tc.name: FormRenderRecord_Release_0001 * @tc.desc: test FormRenderRecord::Release() diff --git a/test/unittest/frs_form_render_record_test/mock_form_renderer_group.cpp b/test/unittest/frs_form_render_record_test/mock_form_renderer_group.cpp index 9fcf2da24809d602aff74236aadc6a47eb32a162..8a64e4bd091053fbf147e13ea8853c18a443fba0 100644 --- a/test/unittest/frs_form_render_record_test/mock_form_renderer_group.cpp +++ b/test/unittest/frs_form_render_record_test/mock_form_renderer_group.cpp @@ -39,6 +39,11 @@ void FormRendererGroup::OnUnlock() return; } +void FormRendererGroup::SetVisibleChange(bool isVisible) +{ + return; +} + void FormRendererGroup::UpdateForm(const OHOS::AppExecFwk::FormJsInfo& formJsInfo) { return;