From 8cc02713ddc55ad6402e615165fd113e56c6126f Mon Sep 17 00:00:00 2001 From: huanghuahua Date: Fri, 1 Nov 2024 13:10:20 +0800 Subject: [PATCH 1/4] add SetVisibleChange from host to frs Signed-off-by: huanghuahua --- .../inner_api/include/form_render_interface.h | 3 + .../inner_api/include/form_render_proxy.h | 2 + .../inner_api/include/form_render_stub.h | 2 + .../inner_api/src/form_render_proxy.cpp | 39 +++++++ interfaces/inner_api/src/form_render_stub.cpp | 18 +++ .../include/form_render_impl.h | 2 + .../include/form_render_record.h | 4 + .../src/form_render_impl.cpp | 33 ++++++ .../src/form_render_record.cpp | 41 +++++++ services/include/form_render_mgr.h | 2 + services/include/form_render_mgr_inner.h | 2 + services/include/form_task_mgr.h | 4 + services/src/form_mgr_adapter.cpp | 7 ++ services/src/form_render_mgr.cpp | 14 +++ services/src/form_render_mgr_inner.cpp | 12 ++ services/src/form_task_mgr.cpp | 40 +++++++ .../formrendermgrinner_fuzzer.cpp | 1 + .../formrenderstub_fuzzer.cpp | 1 + .../fms_form_render_impl_test.cpp | 105 ++++++++++++++++++ .../fms_form_render_proxy_test.cpp | 15 +++ .../fms_form_render_stub_test.cpp | 43 +++++++ .../frs_form_render_record_test.cpp | 84 ++++++++++++++ .../mock_form_renderer_group.cpp | 5 + 23 files changed, 479 insertions(+) diff --git a/interfaces/inner_api/include/form_render_interface.h b/interfaces/inner_api/include/form_render_interface.h index 7c90d4a3a6..94ac6b5295 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 368923795d..23f62cd4ef 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 2b067431c4..f95fcb47a6 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 527e8d04ab..73a562c0b1 100644 --- a/interfaces/inner_api/src/form_render_proxy.cpp +++ b/interfaces/inner_api/src/form_render_proxy.cpp @@ -225,6 +225,45 @@ 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 7775a9d3e8..5a93c72a75 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 5f867cfcf1..e8a0284d53 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 f99dd94dcf..5ef7eba120 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 63e88c645a..12d9d272d0 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 8411ad25df..ccdd91b6da 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,46 @@ 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()); + auto task = [thisWeakPtr = weak_from_this(), formId, isVisible]() { + auto renderRecord = thisWeakPtr.lock(); + if (renderRecord == nullptr) { + HILOG_ERROR("null renderRecord"); + return; + } + + renderRecord->HandleSetVisibleChange(formId, isVisible); + }; + std::lock_guard lock(eventHandlerMutex_); + 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_render_mgr.h b/services/include/form_render_mgr.h index 0899d561fc..b8dedd5a92 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 370f69d577..e7b02c0b80 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 30010683c1..2859a7e798 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 8c804ffed1..672cc1345c 100644 --- a/services/src/form_mgr_adapter.cpp +++ b/services/src/form_mgr_adapter.cpp @@ -850,6 +850,13 @@ ErrCode FormMgrAdapter::NotifyWhetherVisibleForms(const std::vector &fo continue; } matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId); + if (formVisibleType == Constants::UNKNOWN) { + HILOG_WARN("visible unknow"); + } else { + HILOG_INFO("formId %{public}" PRId64 " formVisibleType %{public}d", formId, formVisibleType); + bool isVisible = (formVisibleType == Constants::FORM_VISIBLE) ? true:false; + FormRenderMgr::GetInstance().SetVisibleChange(matchedFormId, isVisible); + } FormRecord formRecord; if (!isFormShouldUpdateProviderInfoToHost(matchedFormId, userId, callerToken, formRecord)) { diff --git a/services/src/form_render_mgr.cpp b/services/src/form_render_mgr.cpp index 64bfeafbea..91292e15b1 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 77b60ce106..0c10fcc612 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 6db1ea6dac..6af640c294 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 afe3eaa14f..54f29bd1ce 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 7082919449..759e685abe 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 4483e990cd..860365c51a 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 2fa3ebc26a..badabfab9b 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 15038a4d43..99ea61f8cc 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 a9de1850bc..55ce977571 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 9fcf2da248..8a64e4bd09 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; -- Gitee From 8cbc696e9f380d60237d4922d2f89eb68edb9639 Mon Sep 17 00:00:00 2001 From: huanghuahua Date: Fri, 1 Nov 2024 15:01:08 +0800 Subject: [PATCH 2/4] modify for codecheck error Signed-off-by: huanghuahua --- .../inner_api/src/form_render_proxy.cpp | 5 +---- services/include/form_mgr_adapter.h | 2 ++ services/src/form_mgr_adapter.cpp | 21 ++++++++++++------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/interfaces/inner_api/src/form_render_proxy.cpp b/interfaces/inner_api/src/form_render_proxy.cpp index 73a562c0b1..95da24f783 100644 --- a/interfaces/inner_api/src/form_render_proxy.cpp +++ b/interfaces/inner_api/src/form_render_proxy.cpp @@ -252,10 +252,7 @@ int32_t FormRenderProxy::SetVisibleChange(const int64_t &formId, bool isVisible, } int32_t error = SendTransactCmd( - IFormRender::Message::FORM_SET_VISIBLE_CHANGE, - data, - reply, - option); + IFormRender::Message::FORM_SET_VISIBLE_CHANGE, data, reply, option); if (error != ERR_OK) { HILOG_ERROR("SendRequest:%{public}d failed", error); return error; diff --git a/services/include/form_mgr_adapter.h b/services/include/form_mgr_adapter.h index fd74edeab9..6cb508e725 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/src/form_mgr_adapter.cpp b/services/src/form_mgr_adapter.cpp index 672cc1345c..b3a18f87a8 100644 --- a/services/src/form_mgr_adapter.cpp +++ b/services/src/form_mgr_adapter.cpp @@ -823,6 +823,19 @@ 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; + } + + HILOG_INFO("formId %{public}" PRId64 " formVisibleType %{public}d", formId, formVisibleType); + 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) { @@ -850,13 +863,7 @@ ErrCode FormMgrAdapter::NotifyWhetherVisibleForms(const std::vector &fo continue; } matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId); - if (formVisibleType == Constants::UNKNOWN) { - HILOG_WARN("visible unknow"); - } else { - HILOG_INFO("formId %{public}" PRId64 " formVisibleType %{public}d", formId, formVisibleType); - bool isVisible = (formVisibleType == Constants::FORM_VISIBLE) ? true:false; - FormRenderMgr::GetInstance().SetVisibleChange(matchedFormId, isVisible); - } + SetVisibleChange(matchedFormId, formVisibleType); FormRecord formRecord; if (!isFormShouldUpdateProviderInfoToHost(matchedFormId, userId, callerToken, formRecord)) { -- Gitee From a6453b58898703080e5ee1dccaafb8f19a9e28c3 Mon Sep 17 00:00:00 2001 From: huanghuahua Date: Sat, 2 Nov 2024 11:26:07 +0800 Subject: [PATCH 3/4] modify for error Signed-off-by: huanghuahua --- services/src/form_mgr_adapter.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/src/form_mgr_adapter.cpp b/services/src/form_mgr_adapter.cpp index b3a18f87a8..0cd81caf52 100644 --- a/services/src/form_mgr_adapter.cpp +++ b/services/src/form_mgr_adapter.cpp @@ -826,12 +826,11 @@ int FormMgrAdapter::RequestForm(const int64_t formId, const sptr void FormMgrAdapter::SetVisibleChange(const int64_t formId, const int32_t formVisibleType) { if (formId <= 0 - || (formVisibleType != Constants::FORM_VISIBLE && formVisibleType > Constants::FORM_INVISIBLE)) { + || (formVisibleType != Constants::FORM_VISIBLE && formVisibleType != Constants::FORM_INVISIBLE)) { HILOG_WARN("param is not right"); return; } - HILOG_INFO("formId %{public}" PRId64 " formVisibleType %{public}d", formId, formVisibleType); bool isVisible = (formVisibleType == Constants::FORM_VISIBLE) ? true:false; FormRenderMgr::GetInstance().SetVisibleChange(formId, isVisible); } -- Gitee From fc8d17dee08a3cd4b4c95c6766f1f7c4fa39d8f8 Mon Sep 17 00:00:00 2001 From: huanghuahua Date: Sat, 2 Nov 2024 20:57:34 +0800 Subject: [PATCH 4/4] modify for review Signed-off-by: huanghuahua --- .../form_render_service/src/form_render_record.cpp | 13 +++++++++---- services/src/form_mgr_adapter.cpp | 5 ++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/services/form_render_service/src/form_render_record.cpp b/services/form_render_service/src/form_render_record.cpp index ccdd91b6da..977c598495 100644 --- a/services/form_render_service/src/form_render_record.cpp +++ b/services/form_render_service/src/form_render_record.cpp @@ -1292,6 +1292,11 @@ int32_t FormRenderRecord::HandleOnUnlock() 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) { @@ -1301,12 +1306,12 @@ int32_t FormRenderRecord::SetVisibleChange(const int64_t &formId, bool isVisible renderRecord->HandleSetVisibleChange(formId, isVisible); }; - std::lock_guard lock(eventHandlerMutex_); - if (eventHandler_ == nullptr) { - HILOG_ERROR("null eventHandler_"); + + if (eventHandler == nullptr) { + HILOG_ERROR("null eventHandler"); return SET_VISIBLE_CHANGE_FAILED; } - eventHandler_->PostSyncTask(task, "SetVisibleChange"); + eventHandler->PostSyncTask(task, "SetVisibleChange"); return ERR_OK; } diff --git a/services/src/form_mgr_adapter.cpp b/services/src/form_mgr_adapter.cpp index 0cd81caf52..3ad04e72c4 100644 --- a/services/src/form_mgr_adapter.cpp +++ b/services/src/form_mgr_adapter.cpp @@ -831,7 +831,7 @@ void FormMgrAdapter::SetVisibleChange(const int64_t formId, const int32_t formVi return; } - bool isVisible = (formVisibleType == Constants::FORM_VISIBLE) ? true:false; + bool isVisible = (formVisibleType == Constants::FORM_VISIBLE) ? true : false; FormRenderMgr::GetInstance().SetVisibleChange(formId, isVisible); } @@ -862,13 +862,12 @@ ErrCode FormMgrAdapter::NotifyWhetherVisibleForms(const std::vector &fo continue; } matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId); - SetVisibleChange(matchedFormId, formVisibleType); FormRecord formRecord; 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. -- Gitee