From c2e4bd1ce674b1e56c09e45d456a579ce4fbc1e6 Mon Sep 17 00:00:00 2001 From: Hua123 Date: Thu, 14 Mar 2024 11:43:22 +0800 Subject: [PATCH] RM014 Issue: https://gitee.com/openharmony/ability_form_fwk/issues/I960HS Signed-off-by: Hua123 --- .../js/napi/formUtil/napi_form_util.cpp | 2 + frameworks/js/napi/form_host/js_form_host.cpp | 45 +++++++++++++++++++ frameworks/js/napi/form_info/js_form_info.cpp | 29 ++++++++++++ interfaces/inner_api/include/form_constants.h | 13 ++++++ .../inner_api/include/form_mgr_interface.h | 12 +++++ interfaces/inner_api/include/form_mgr_proxy.h | 8 ++++ interfaces/inner_api/include/form_mgr_stub.h | 8 ++++ .../inner_api/include/running_form_info.h | 2 + interfaces/inner_api/src/form_mgr_proxy.cpp | 27 +++++++++++ interfaces/inner_api/src/form_mgr_stub.cpp | 16 +++++++ .../inner_api/src/running_form_info.cpp | 5 +++ interfaces/kits/native/include/form_mgr.h | 8 ++++ interfaces/kits/native/src/form_mgr.cpp | 19 ++++++++ services/include/form_data_mgr.h | 8 ++++ services/include/form_db_cache.h | 8 ++++ services/include/form_db_info.h | 11 ++++- services/include/form_dump_mgr.h | 3 +- services/include/form_item_info.h | 15 ++++++- services/include/form_mgr_adapter.h | 8 ++++ services/include/form_mgr_service.h | 8 ++++ services/include/form_record.h | 1 + services/src/form_data_mgr.cpp | 18 ++++++++ services/src/form_db_cache.cpp | 17 +++++++ services/src/form_db_info.cpp | 5 +++ services/src/form_dump_mgr.cpp | 38 ++++++++++++++++ services/src/form_item_info.cpp | 10 +++++ services/src/form_mgr_adapter.cpp | 37 ++++++++++++++- services/src/form_mgr_service.cpp | 12 +++++ 28 files changed, 389 insertions(+), 4 deletions(-) diff --git a/frameworks/js/napi/formUtil/napi_form_util.cpp b/frameworks/js/napi/formUtil/napi_form_util.cpp index e2b848d5da..cd5e3b36ba 100644 --- a/frameworks/js/napi/formUtil/napi_form_util.cpp +++ b/frameworks/js/napi/formUtil/napi_form_util.cpp @@ -571,6 +571,7 @@ void ParseRunningFormInfoIntoNapi(napi_env env, const RunningFormInfo &runningFo FormUsageState formUsageState = runningFormInfo.formUsageState; SetFormInfoPropertyInt32(env, (int32_t)formUsageState, result, "formUsageState"); SetFormInfoPropertyString(env, runningFormInfo.description.c_str(), result, "formDescription"); + SetFormInfoPropertyInt32(env, (int32_t)runningFormInfo.formLocation, result, "formLocation"); } inline FormType GetFormType(const FormInfo &formInfo) @@ -655,6 +656,7 @@ napi_value CreateRunningFormInfo(napi_env env, const RunningFormInfo &runningFor napi_set_named_property(env, objContext, "dimension", CreateJsValue(env, runningFormInfo.dimension)); napi_set_named_property(env, objContext, "formUsageState", CreateJsValue(env, runningFormInfo.formUsageState)); napi_set_named_property(env, objContext, "formDescription", CreateJsValue(env, runningFormInfo.description)); + napi_set_named_property(env, objContext, "formLocation", CreateJsValue(env, (int32_t)runningFormInfo.formLocation)); return objContext; } diff --git a/frameworks/js/napi/form_host/js_form_host.cpp b/frameworks/js/napi/form_host/js_form_host.cpp index 5a04afb16d..0710cc6fd9 100644 --- a/frameworks/js/napi/form_host/js_form_host.cpp +++ b/frameworks/js/napi/form_host/js_form_host.cpp @@ -49,6 +49,7 @@ namespace { constexpr int64_t NANOSECONDS = 1000000000; // MICROSECONDS mean 10^6 millias second constexpr int64_t MICROSECONDS = 1000000; + constexpr int32_t INVALID_FORM_LOCATION = -2; } int64_t SystemTimeMillis() noexcept @@ -404,6 +405,11 @@ public: { GET_CB_INFO_AND_CALL(env, info, JsFormHost, OnRecycleForms); } + + static napi_value UpdateFormLocation(napi_env env, napi_callback_info info) + { + GET_CB_INFO_AND_CALL(env, info, JsFormHost, OnUpdateFormLocation); + } private: bool CheckCallerIsSystemApp() { @@ -1788,6 +1794,44 @@ private: env, CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result)); return result; } + + napi_value OnUpdateFormLocation(napi_env env, size_t argc, napi_value *argv) + { + HILOG_DEBUG("UpdateFormLocation called."); + if (argc != ARGS_TWO) { + HILOG_ERROR("Wrong number of arguments."); + NapiFormUtil::ThrowParamNumError(env, std::to_string(argc), "argc != 2"); + return CreateJsUndefined(env); + } + + int64_t formId = -1; + if (!ConvertFromId(env, argv[PARAM0], formId)) { + HILOG_ERROR("Convert strFormIdList failed."); + NapiFormUtil::ThrowParamTypeError(env, "formId", "string"); + return CreateJsUndefined(env); + } + HILOG_INFO("UpdateFormLocation formId value=%{public}s", std::to_string(formId).c_str()); + int32_t formLocation = INVALID_FORM_LOCATION; + if (napi_get_value_int32(env, argv[PARAM1], &formLocation) == napi_ok) { + if (formLocation < static_cast(Constants::FormLocation::OTHER) || + formLocation > static_cast(Constants::FormLocation::AI_SUGGESTION)) { + HILOG_ERROR("formLocation is not FormLocation enum."); + NapiFormUtil::ThrowParamTypeError(env, "formLocation", "FormLocation enum"); + return CreateJsUndefined(env); + } + } else { + HILOG_ERROR("formLocation is not number."); + NapiFormUtil::ThrowParamTypeError(env, "formLocation", "number"); + return CreateJsUndefined(env); + } + HILOG_INFO("UpdateFormLocation formLocation value=%{public}s", std::to_string(formLocation).c_str()); + auto ret = FormMgr::GetInstance().UpdateFormLocation(formId, formLocation); + if (ret == ERR_OK) { + return CreateJsUndefined(env); + } + NapiFormUtil::ThrowByInternalErrorCode(env, ret); + return CreateJsUndefined(env); + } }; napi_value JsFormHostInit(napi_env env, napi_value exportObj) @@ -1828,6 +1872,7 @@ napi_value JsFormHostInit(napi_env env, napi_value exportObj) BindNativeFunction(env, exportObj, "setFormsRecyclable", moduleName, JsFormHost::SetFormsRecyclable); BindNativeFunction(env, exportObj, "recoverForms", moduleName, JsFormHost::RecoverForms); BindNativeFunction(env, exportObj, "recycleForms", moduleName, JsFormHost::RecycleForms); + BindNativeFunction(env, exportObj, "updateFormLocation", moduleName, JsFormHost::UpdateFormLocation); return CreateJsUndefined(env); } diff --git a/frameworks/js/napi/form_info/js_form_info.cpp b/frameworks/js/napi/form_info/js_form_info.cpp index 421b46fbea..b95d828ec2 100644 --- a/frameworks/js/napi/form_info/js_form_info.cpp +++ b/frameworks/js/napi/form_info/js_form_info.cpp @@ -145,6 +145,34 @@ napi_value CreateJsFormUsageState(napi_env engine) return objValue; } +napi_value CreateJsFormLocation(napi_env engine) +{ + napi_value objValue = nullptr; + napi_create_object(engine, &objValue); + napi_set_named_property( + engine, objValue, "DESKTOP", CreateJsValue(engine, AppExecFwk::Constants::FormLocation::DESKTOP)); + napi_set_named_property( + engine, objValue, "FORM_CENTER", CreateJsValue(engine, AppExecFwk::Constants::FormLocation::FORM_CENTER)); + napi_set_named_property( + engine, objValue, "FORM_MANAGER", CreateJsValue(engine, AppExecFwk::Constants::FormLocation::FORM_MANAGER)); + napi_set_named_property( + engine, objValue, "NEGATIVE_SCREEN", CreateJsValue(engine, + AppExecFwk::Constants::FormLocation::NEGATIVE_SCREEN)); + napi_set_named_property( + engine, objValue, "FORM_CENTER_NEGATIVE_SCREEN", CreateJsValue(engine, + AppExecFwk::Constants::FormLocation::FORM_CENTER_NEGATIVE_SCREEN)); + napi_set_named_property( + engine, objValue, "FORM_MANAGER_NEGATIVE_SCREEN", CreateJsValue(engine, + AppExecFwk::Constants::FormLocation::FORM_MANAGER_NEGATIVE_SCREEN)); + napi_set_named_property( + engine, objValue, "SCREEN_LOCK", CreateJsValue(engine, AppExecFwk::Constants::FormLocation::SCREEN_LOCK)); + napi_set_named_property( + engine, objValue, "AI_SUGGESTION", CreateJsValue(engine, AppExecFwk::Constants::FormLocation::AI_SUGGESTION)); + napi_set_named_property( + engine, objValue, "OTHER", CreateJsValue(engine, AppExecFwk::Constants::FormLocation::OTHER)); + return objValue; +} + napi_value FormInfoInit(napi_env engine, napi_value exportObj) { HILOG_INFO("%{public}s called.", __func__); @@ -157,6 +185,7 @@ napi_value FormInfoInit(napi_env engine, napi_value exportObj) napi_set_named_property(engine, exportObj, "VisibilityType", CreateJsFormVisibilityType(engine)); napi_set_named_property(engine, exportObj, "LaunchReason", CreateJsFormLaunchReason(engine)); napi_set_named_property(engine, exportObj, "FormUsageState", CreateJsFormUsageState(engine)); + napi_set_named_property(engine, exportObj, "FormLocation", CreateJsFormLocation(engine)); HILOG_INFO("%{public}s called end.", __func__); return exportObj; } diff --git a/interfaces/inner_api/include/form_constants.h b/interfaces/inner_api/include/form_constants.h index 2140615735..d4f07e7620 100644 --- a/interfaces/inner_api/include/form_constants.h +++ b/interfaces/inner_api/include/form_constants.h @@ -72,6 +72,7 @@ namespace Constants { constexpr const char* PARAM_FORM_ID = "formID"; constexpr const char* IS_FORM_AGENT = "isFormAgent"; constexpr const char* PARAM_FORM_BORDER_WIDTH_KEY = "ohos.extra.param.key.form_border_width"; + constexpr const char* FORM_LOCATION_KEY = "ohos.extra.param.key.form_location"; constexpr int32_t TYPE_RESET_LIMIT = 1; constexpr int32_t TYPE_STATIC_UPDATE = 2; constexpr int32_t TYPE_DYNAMIC_UPDATE = 3; @@ -209,6 +210,18 @@ namespace Constants { SINGLE_COLOR }; + enum class FormLocation : int8_t { + OTHER = -1, + DESKTOP = 0, + FORM_CENTER = 1, + FORM_MANAGER = 2, + NEGATIVE_SCREEN = 3, + FORM_CENTER_NEGATIVE_SCREEN = 4, + FORM_MANAGER_NEGATIVE_SCREEN = 5, + SCREEN_LOCK = 6, + AI_SUGGESTION = 7, + }; + // rdb constexpr const char* FORM_RDB_NAME = "/formdb.db"; constexpr const char* FORM_RDB_TABLE_NAME = "form_table"; diff --git a/interfaces/inner_api/include/form_mgr_interface.h b/interfaces/inner_api/include/form_mgr_interface.h index d3ee150018..b2bdfa5f4a 100644 --- a/interfaces/inner_api/include/form_mgr_interface.h +++ b/interfaces/inner_api/include/form_mgr_interface.h @@ -578,6 +578,17 @@ public: return 0; } + /** + * @brief Update formLocation with formId. + * @param formId The Id of the form to update. + * @param formLocation The FormLocation. + * @return Returns ERR_OK on success, others on failure. + */ + virtual ErrCode UpdateFormLocation(const int64_t &formId, const int32_t &formLocation) + { + return ERR_OK; + } + enum class Message { // ipc id 1-1000 for kit // ipc id 1001-2000 for DMS @@ -650,6 +661,7 @@ public: FORM_MGR_RECYCLE_FORMS, FORM_MGR_RECOVER_FORMS, FORM_MGR_HAS_FORM_VISIBLE_WITH_TOKENID, + FORM_MGR_UPDATE_FORM_LOCATION, FORM_MGR_GET_FORMS_INFO_BY_FILTER, }; }; diff --git a/interfaces/inner_api/include/form_mgr_proxy.h b/interfaces/inner_api/include/form_mgr_proxy.h index c8387cf5ca..0c66410bdc 100644 --- a/interfaces/inner_api/include/form_mgr_proxy.h +++ b/interfaces/inner_api/include/form_mgr_proxy.h @@ -544,6 +544,14 @@ public: * @return Returns ERR_OK on success, others on failure. */ int32_t RecoverForms(const std::vector &formIds, const Want &want) override; + + /** + * @brief Update formLocation with formId. + * @param formId The Id of the form to update. + * @param formLocation The FormLocation. + * @return Returns ERR_OK on success, others on failure. + */ + ErrCode UpdateFormLocation(const int64_t &formId, const int32_t &formLocation) override; private: template int GetParcelableInfos(MessageParcel &reply, std::vector &parcelableInfos); diff --git a/interfaces/inner_api/include/form_mgr_stub.h b/interfaces/inner_api/include/form_mgr_stub.h index 1fe9b7bc42..9b4d90c9a6 100644 --- a/interfaces/inner_api/include/form_mgr_stub.h +++ b/interfaces/inner_api/include/form_mgr_stub.h @@ -482,6 +482,14 @@ private: * @return Returns ERR_OK on success, others on failure. */ int32_t HandleRecoverForms(MessageParcel &data, MessageParcel &reply); + + /** + * @brief Handle UpdateFormLocation. + * @param data input param. + * @param reply output param. + * @return Returns ERR_OK on success, others on failure. + */ + ErrCode HandleUpdateFormLocation(MessageParcel &data, MessageParcel &reply); private: using FormMgrFunc = int32_t (FormMgrStub::*)(MessageParcel &data, MessageParcel &reply); std::map memberFuncMap_; diff --git a/interfaces/inner_api/include/running_form_info.h b/interfaces/inner_api/include/running_form_info.h index 0700931a5f..9d210a0e30 100644 --- a/interfaces/inner_api/include/running_form_info.h +++ b/interfaces/inner_api/include/running_form_info.h @@ -21,6 +21,7 @@ #include "form_instance.h" #include "parcel.h" +#include "form_constants.h" namespace OHOS { namespace AppExecFwk { @@ -37,6 +38,7 @@ struct RunningFormInfo : public Parcelable { std::string description; int32_t dimension; std::string hostBundleName; + Constants::FormLocation formLocation; FormVisibilityType formVisiblity = FormVisibilityType::UNKNOWN; FormUsageState formUsageState = FormUsageState::USED; diff --git a/interfaces/inner_api/src/form_mgr_proxy.cpp b/interfaces/inner_api/src/form_mgr_proxy.cpp index d3822a3847..1b205f05be 100644 --- a/interfaces/inner_api/src/form_mgr_proxy.cpp +++ b/interfaces/inner_api/src/form_mgr_proxy.cpp @@ -2124,5 +2124,32 @@ int32_t FormMgrProxy::RecoverForms(const std::vector &formIds, const Wa } return reply.ReadInt32(); } + +ErrCode FormMgrProxy::UpdateFormLocation(const int64_t &formId, const int32_t &formLocation) +{ + HILOG_DEBUG("start."); + MessageParcel data; + if (!WriteInterfaceToken(data)) { + HILOG_ERROR("failed to write interface token"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (!data.WriteInt64(formId)) { + HILOG_ERROR("%{public}s, failed to write formId", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (!data.WriteInt32(formLocation)) { + HILOG_ERROR("failed to write formLocation"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + MessageParcel reply; + MessageOption option(MessageOption::TF_SYNC); + int32_t error = SendTransactCmd(IFormMgr::Message::FORM_MGR_UPDATE_FORM_LOCATION, data, reply, option); + if (error != ERR_OK) { + HILOG_ERROR("failed to SendTransactCmd: %{public}d.", error); + return error; + } + return reply.ReadInt32(); +} + } // namespace AppExecFwk } // namespace OHOS diff --git a/interfaces/inner_api/src/form_mgr_stub.cpp b/interfaces/inner_api/src/form_mgr_stub.cpp index 5a5364e15d..57bd1a79d1 100644 --- a/interfaces/inner_api/src/form_mgr_stub.cpp +++ b/interfaces/inner_api/src/form_mgr_stub.cpp @@ -158,6 +158,8 @@ FormMgrStub::FormMgrStub() &FormMgrStub::HandleRecoverForms; memberFuncMap_[static_cast(IFormMgr::Message::FORM_MGR_HAS_FORM_VISIBLE_WITH_TOKENID)] = &FormMgrStub::HandleHasFormVisible; + memberFuncMap_[static_cast(IFormMgr::Message::FORM_MGR_UPDATE_FORM_LOCATION)] = + &FormMgrStub::HandleUpdateFormLocation; } FormMgrStub::~FormMgrStub() @@ -1398,5 +1400,19 @@ int32_t FormMgrStub::HandleRecoverForms(MessageParcel &data, MessageParcel &repl } return result; } + +ErrCode FormMgrStub::HandleUpdateFormLocation(MessageParcel &data, MessageParcel &reply) +{ + HILOG_DEBUG("Called."); + int64_t formId = data.ReadInt64(); + int32_t formLocation = data.ReadInt32(); + ErrCode result = UpdateFormLocation(formId, formLocation); + if (!reply.WriteInt32(result)) { + HILOG_ERROR("failed to write result"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + return result; +} + } // namespace AppExecFwk } // namespace OHOS diff --git a/interfaces/inner_api/src/running_form_info.cpp b/interfaces/inner_api/src/running_form_info.cpp index dd9e87e8e9..2d41842098 100644 --- a/interfaces/inner_api/src/running_form_info.cpp +++ b/interfaces/inner_api/src/running_form_info.cpp @@ -33,6 +33,7 @@ bool RunningFormInfo::ReadFromParcel(Parcel &parcel) int32_t formVisiblityInt = parcel.ReadInt32(); formVisiblity = (FormVisibilityType)formVisiblityInt; formUsageState = static_cast(parcel.ReadInt32()); + formLocation = static_cast(parcel.ReadInt32()); return true; } @@ -88,6 +89,10 @@ bool RunningFormInfo::Marshalling(Parcel &parcel) const return false; } + // write formLocation + if (!parcel.WriteInt32(static_cast(formLocation))) { + return false; + } return true; } diff --git a/interfaces/kits/native/include/form_mgr.h b/interfaces/kits/native/include/form_mgr.h index 91e490061e..48518479dc 100644 --- a/interfaces/kits/native/include/form_mgr.h +++ b/interfaces/kits/native/include/form_mgr.h @@ -604,6 +604,14 @@ public: */ int32_t RecoverForms(const std::vector &formIds, const Want &want); + /** + * @brief Update formLocation with formId. + * @param formId The Id of the form to update. + * @param formLocation The FormLocation. + * @return Returns ERR_OK on success, others on failure. + */ + ErrCode UpdateFormLocation(const int64_t &formId, const int32_t &formLocation); + private: /** * @brief Connect form manager service. diff --git a/interfaces/kits/native/src/form_mgr.cpp b/interfaces/kits/native/src/form_mgr.cpp index 9f5222f58f..d5789dc08d 100644 --- a/interfaces/kits/native/src/form_mgr.cpp +++ b/interfaces/kits/native/src/form_mgr.cpp @@ -1399,5 +1399,24 @@ int32_t FormMgr::RecoverForms(const std::vector &formIds, const Want &w } return remoteProxy_->RecoverForms(formIds, want); } + +ErrCode FormMgr::UpdateFormLocation(const int64_t &formId, const int32_t &formLocation) +{ + if (FormMgr::GetRecoverStatus() == Constants::IN_RECOVERING) { + HILOG_ERROR("form is in recover status, can't do action on form."); + return ERR_APPEXECFWK_FORM_SERVER_STATUS_ERR; + } + + ErrCode errCode = Connect(); + if (errCode != ERR_OK) { + return errCode; + } + ErrCode resultCode = remoteProxy_->UpdateFormLocation(formId, formLocation); + if (resultCode != ERR_OK) { + HILOG_ERROR("failed to UpdateFormLocation, error code is %{public}d.", resultCode); + } + return resultCode; +} + } // namespace AppExecFwk } // namespace OHOS diff --git a/services/include/form_data_mgr.h b/services/include/form_data_mgr.h index f26c43a7f0..3896952ead 100644 --- a/services/include/form_data_mgr.h +++ b/services/include/form_data_mgr.h @@ -698,6 +698,14 @@ public: */ bool HasFormCloudUpdateDuration(const std::string &bundleName) const; + /** + * @brief Update form location. + * @param formId The Id of the form. + * @param formLocation The form location. + * @param hostBundleName the bundle name of form host. + * @return Returns ERR_OK on success, others on failure. + */ + ErrCode UpdateFormLocation(const int64_t &formId, const int32_t &formLocation); private: /** * @brief Create form record. diff --git a/services/include/form_db_cache.h b/services/include/form_db_cache.h index c745619d1a..1a076a0487 100644 --- a/services/include/form_db_cache.h +++ b/services/include/form_db_cache.h @@ -148,6 +148,14 @@ public: std::map &removedFormsMap); bool IsHostOwner(int64_t formId, int32_t hostUid); + + /** + * @brief Update form location. + * @param formId The Id of the form. + * @param formLocation The form location. + * @return Returns ERR_OK on success, others on failure. + */ + ErrCode UpdateFormLocation(const int64_t formId, const int32_t formLocation); private: /** * @brief Save or update form data to DbCache and DB. diff --git a/services/include/form_db_info.h b/services/include/form_db_info.h index afa9a37970..95c07d83b9 100644 --- a/services/include/form_db_info.h +++ b/services/include/form_db_info.h @@ -20,6 +20,7 @@ #include "form_record.h" #include "nlohmann/json.hpp" +#include "form_constants.h" namespace OHOS { namespace AppExecFwk { @@ -32,7 +33,7 @@ struct FormDBInfo { std::string moduleName; std::string abilityName; std::vector formUserUids; - + Constants::FormLocation formLocation; /** * @brief Constructors * @@ -53,6 +54,7 @@ struct FormDBInfo { moduleName = formRecord.moduleName; abilityName = formRecord.abilityName; formUserUids = formRecord.formUserUids; + formLocation = formRecord.formLocation; } bool Contains(const int uId) const { @@ -103,6 +105,9 @@ struct FormDBInfo { if (formUserUids != formDBInfo.formUserUids) { return false; } + if (formLocation != formDBInfo.formLocation) { + return false; + } return true; } @@ -131,6 +136,7 @@ public: formDBInfo_.moduleName = formDBInfo.moduleName; formDBInfo_.abilityName = formDBInfo.abilityName; formDBInfo_.formUserUids = formDBInfo.formUserUids; + formDBInfo_.formLocation = formDBInfo.formLocation; } /** * @brief Constructors @@ -146,6 +152,7 @@ public: formDBInfo_.moduleName = innerFormInfo.formDBInfo_.moduleName; formDBInfo_.abilityName = innerFormInfo.formDBInfo_.abilityName; formDBInfo_.formUserUids = innerFormInfo.formDBInfo_.formUserUids; + formDBInfo_.formLocation = innerFormInfo.formDBInfo_.formLocation; } /** * @brief Constructors @@ -161,6 +168,7 @@ public: formDBInfo_.moduleName = formRecord.moduleName; formDBInfo_.abilityName = formRecord.abilityName; formDBInfo_.formUserUids = formRecord.formUserUids; + formDBInfo_.formLocation = formRecord.formLocation; } std::string ToString() const { @@ -173,6 +181,7 @@ public: obj["moduleName"] = formDBInfo_.moduleName; obj["abilityName"] = formDBInfo_.abilityName; obj["formUserUids"] = formDBInfo_.formUserUids; + obj["formLocation"] = formDBInfo_.formLocation; return obj.dump(); } /** diff --git a/services/include/form_dump_mgr.h b/services/include/form_dump_mgr.h index 8b717f9ece..e049ceaebe 100644 --- a/services/include/form_dump_mgr.h +++ b/services/include/form_dump_mgr.h @@ -23,7 +23,7 @@ #include "form_host_record.h" #include "form_info_mgr.h" #include "running_form_info.h" - +#include "form_constants.h" namespace OHOS { namespace AppExecFwk { /** @@ -111,6 +111,7 @@ private: void AppendRunningFormInfors(const std::string &formHostBundleName, const std::vector &runningFormInfos, std::string &infosResult) const; + void AppendFormLocation(std::string &infosResult, Constants::FormLocation formLocation) const; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/include/form_item_info.h b/services/include/form_item_info.h index 0418b76579..6fe70e2ddd 100644 --- a/services/include/form_item_info.h +++ b/services/include/form_item_info.h @@ -19,7 +19,7 @@ #include #include #include - +#include "form_constants.h" #include "form_record.h" namespace OHOS { @@ -371,6 +371,18 @@ public: */ std::string GetDescription() const; + /** + * @brief Get the formLocation of formInfo. + * @return formLocation. + */ + Constants::FormLocation GetFormLocation() const; + + /** + * @brief set the formLocation. + * @param formLocation The FormLocation. + */ + void SetFormLocation(Constants::FormLocation formLocation); + private: /** * @brief Equal or not. @@ -414,6 +426,7 @@ private: bool isSystemApp_ = false; int32_t uid_ = -1; std::string description_ = ""; + Constants::FormLocation formLocation_; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/include/form_mgr_adapter.h b/services/include/form_mgr_adapter.h index 0b8e17fe6f..1f9c0bcaee 100644 --- a/services/include/form_mgr_adapter.h +++ b/services/include/form_mgr_adapter.h @@ -582,6 +582,14 @@ public: */ void UpdateFormCloudUpdateDuration(const std::string &bundleName); + /** + * @brief Update formLocation with formId. + * @param formId The Id of the form to update. + * @param formLocation formLocation. + * @return Returns ERR_OK on success, others on failure. + */ + ErrCode UpdateFormLocation(const int64_t &formId, const int32_t &formLocation); + private: /** * @brief Get form configure info. diff --git a/services/include/form_mgr_service.h b/services/include/form_mgr_service.h index d5c322ff81..e2a760fe0d 100644 --- a/services/include/form_mgr_service.h +++ b/services/include/form_mgr_service.h @@ -586,6 +586,14 @@ public: * @return Returns ERR_OK on success, others on failure. */ int32_t RecoverForms(const std::vector &formIds, const Want &want) override; + + /** + * @brief Update formLocation with formId. + * @param formId The Id of the form to update. + * @param formLocation The FormLocation. + * @return Returns ERR_OK on success, others on failure. + */ + ErrCode UpdateFormLocation(const int64_t &formId, const int32_t &formLocation) override; private: /** * OnAddSystemAbility, OnAddSystemAbility will be called when the listening SA starts. diff --git a/services/include/form_record.h b/services/include/form_record.h index ac6970b927..23c2d55de7 100644 --- a/services/include/form_record.h +++ b/services/include/form_record.h @@ -77,6 +77,7 @@ public: int32_t privacyLevel = 0; bool isNeedNotify = true; RecycleStatus recycleStatus = RecycleStatus::NON_RECYCLABLE; + Constants::FormLocation formLocation; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/src/form_data_mgr.cpp b/services/src/form_data_mgr.cpp index ea3a554d6a..ed604c58d2 100644 --- a/services/src/form_data_mgr.cpp +++ b/services/src/form_data_mgr.cpp @@ -186,6 +186,7 @@ FormRecord FormDataMgr::CreateFormRecord(const FormItemInfo &formInfo, const int newRecord.privacyLevel = formInfo.GetPrivacyLevel(); newRecord.isSystemApp = formInfo.GetSystemAppFlag(); newRecord.description = formInfo.GetDescription(); + newRecord.formLocation = formInfo.GetFormLocation(); if (newRecord.isEnableUpdate) { ParseUpdateConfig(newRecord, formInfo); } @@ -1954,6 +1955,7 @@ void FormDataMgr::FillBasicRunningFormInfoByFormRecord(const FormRecord &formRec runningFormInfo.moduleName = formRecord.moduleName; runningFormInfo.abilityName = formRecord.abilityName; runningFormInfo.description = formRecord.description; + runningFormInfo.formLocation = formRecord.formLocation; runningFormInfo.formVisiblity = static_cast(formRecord.formVisibleNotifyState); } @@ -2440,5 +2442,21 @@ bool FormDataMgr::HasFormCloudUpdateDuration(const std::string &bundleName) cons HILOG_INFO("Not has cloud update duration, bundleName: %{public}s", bundleName.c_str()); return false; } + +ErrCode FormDataMgr::UpdateFormLocation(const int64_t &formId, const int32_t &formLocation) +{ + std::lock_guard lock(formRecordMutex_); + auto info = formRecords_.find(formId); + if (info == formRecords_.end()) { + HILOG_INFO("form info not find, formId = %{public}" PRId64 " formLocation = %{public}d", + formId, formLocation); + return ERR_APPEXECFWK_FORM_INVALID_FORM_ID; + } + info->second.formLocation = (Constants::FormLocation)formLocation; + HILOG_INFO("update form location successfully, formId = %{public}" PRId64 " formLocation = %{public}d", + formId, formLocation); + return ERR_OK; +} + } // namespace AppExecFwk } // namespace OHOS diff --git a/services/src/form_db_cache.cpp b/services/src/form_db_cache.cpp index 9f40ab6771..462ac95068 100644 --- a/services/src/form_db_cache.cpp +++ b/services/src/form_db_cache.cpp @@ -191,6 +191,7 @@ ErrCode FormDbCache::GetDBRecord(const int64_t formId, FormRecord &record) const record.moduleName = dbInfo.moduleName; record.abilityName = dbInfo.abilityName; record.formUserUids = dbInfo.formUserUids; + record.formLocation = dbInfo.formLocation; return ERR_OK; } } @@ -438,5 +439,21 @@ bool FormDbCache::IsHostOwner(int64_t formId, int32_t hostUid) return false; } + +ErrCode FormDbCache::UpdateFormLocation(const int64_t formId, const int32_t formLocation) +{ + std::lock_guard lock(formDBInfosMutex_); + std::vector::iterator itRecord; + for (itRecord = formDBInfos_.begin(); itRecord != formDBInfos_.end();) { + if (itRecord->formId == formId) { + itRecord->formLocation = (Constants::FormLocation)formLocation; + InnerFormInfo innerFormInfo(*itRecord); + return FormInfoRdbStorageMgr::GetInstance().ModifyStorageFormData(innerFormInfo); + } + ++itRecord; + } + return ERR_APPEXECFWK_FORM_INVALID_FORM_ID; +} + } // namespace AppExecFwk } // namespace OHOS diff --git a/services/src/form_db_info.cpp b/services/src/form_db_info.cpp index 6753d6ca1f..b4c70a0dc3 100644 --- a/services/src/form_db_info.cpp +++ b/services/src/form_db_info.cpp @@ -28,6 +28,7 @@ const std::string INNER_FORM_INFO_BUNDLE_NAME = "bundleName"; const std::string INNER_FORM_INFO_MODULE_NAME = "moduleName"; const std::string INNER_FORM_INFO_ABILITY_NAME = "abilityName"; const std::string INNER_FORM_INFO_FORM_USER_UIDS = "formUserUids"; +const std::string INNER_FORM_INFO_FORM_LOCATION = "formLocation"; } // namespace /** @@ -44,6 +45,7 @@ void InnerFormInfo::ToJson(nlohmann::json &jsonObject) const jsonObject[INNER_FORM_INFO_MODULE_NAME] = formDBInfo_.moduleName; jsonObject[INNER_FORM_INFO_ABILITY_NAME] = formDBInfo_.abilityName; jsonObject[INNER_FORM_INFO_FORM_USER_UIDS] = formDBInfo_.formUserUids; + jsonObject[INNER_FORM_INFO_FORM_LOCATION] = (int)formDBInfo_.formLocation; } /** @@ -79,6 +81,9 @@ bool InnerFormInfo::FromJson(const nlohmann::json &jsonObject) GetValueIfFindKey>(jsonObject, jsonObjectEnd, INNER_FORM_INFO_FORM_USER_UIDS, formDBInfo_.formUserUids, JsonType::ARRAY, false, parseResult, ArrayType::NUMBER); + GetValueIfFindKey(jsonObject, jsonObjectEnd, INNER_FORM_INFO_FORM_LOCATION, + formDBInfo_.formLocation, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); + return parseResult == ERR_OK; } diff --git a/services/src/form_dump_mgr.cpp b/services/src/form_dump_mgr.cpp index ea25432814..3aac12bab7 100644 --- a/services/src/form_dump_mgr.cpp +++ b/services/src/form_dump_mgr.cpp @@ -297,11 +297,49 @@ void FormDumpMgr::AppendRunningFormInfors(const std::string &formHostBundleName, break; } + AppendFormLocation(infosResult, info.formLocation); + infosResult += " \n"; } } } +void FormDumpMgr::AppendFormLocation(std::string &infosResult, Constants::FormLocation formLocation) const +{ + switch (formLocation) { + case Constants::FormLocation::OTHER: + infosResult += " formLocation [ OTHER ] \n"; + break; + case Constants::FormLocation::DESKTOP: + infosResult += " formLocation [ DESKTOP ] \n"; + break; + case Constants::FormLocation::FORM_CENTER: + infosResult += " formLocation [ FORM_CENTER ] \n"; + break; + case Constants::FormLocation::FORM_MANAGER: + infosResult += " formLocation [ FORM_MANAGER ] \n"; + break; + case Constants::FormLocation::NEGATIVE_SCREEN: + infosResult += " formLocation [ NEGATIVE_SCREEN ] \n"; + break; + case Constants::FormLocation::FORM_CENTER_NEGATIVE_SCREEN: + infosResult += " formLocation [ FORM_CENTER_NEGATIVE_SCREEN ] \n"; + break; + case Constants::FormLocation::FORM_MANAGER_NEGATIVE_SCREEN: + infosResult += " formLocation [ FORM_MANAGER_NEGATIVE_SCREEN ] \n"; + break; + case Constants::FormLocation::SCREEN_LOCK: + infosResult += " formLocation [ SCREEN_LOCK ] \n"; + break; + case Constants::FormLocation::AI_SUGGESTION: + infosResult += " formLocation [ AI_SUGGESTION ] \n"; + break; + default: + infosResult += " formLocation [ UNKNOWN_TYPE ] \n"; + break; + } +} + /** * @brief Dump Running form info. * @param runningFormInfos Form Running Form infos. diff --git a/services/src/form_item_info.cpp b/services/src/form_item_info.cpp index 8d78ce20e2..5302afc671 100644 --- a/services/src/form_item_info.cpp +++ b/services/src/form_item_info.cpp @@ -562,5 +562,15 @@ std::string FormItemInfo::GetDescription() const { return description_; } + +Constants::FormLocation FormItemInfo::GetFormLocation() const +{ + return formLocation_; +} + +void FormItemInfo::SetFormLocation(Constants::FormLocation formLocation) +{ + formLocation_ = formLocation; +} } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file diff --git a/services/src/form_mgr_adapter.cpp b/services/src/form_mgr_adapter.cpp index fed48423ca..fbbf4d2b59 100644 --- a/services/src/form_mgr_adapter.cpp +++ b/services/src/form_mgr_adapter.cpp @@ -1306,7 +1306,15 @@ ErrCode FormMgrAdapter::GetFormConfigInfo(const Want &want, FormItemInfo &formCo return ERR_APPEXECFWK_FORM_GET_INFO_FAILED; } - HILOG_DEBUG("GetFormConfigInfo end."); + int formLocation = want.GetParams().GetIntParam(Constants::FORM_LOCATION_KEY, + static_cast(Constants::FormLocation::OTHER)); + if (formLocation < static_cast(Constants::FormLocation::OTHER) || + formLocation > static_cast(Constants::FormLocation::AI_SUGGESTION)) { + HILOG_ERROR("formLocation is not FormLocation enum, formLocation = %{public}d", formLocation); + return ERR_APPEXECFWK_FORM_INVALID_PARAM; + } + formConfigInfo.SetFormLocation((Constants::FormLocation)formLocation); + HILOG_DEBUG("GetFormConfigInfo end, formLocation = %{public}d", formLocation); return ERR_OK; } /** @@ -1324,6 +1332,7 @@ ErrCode FormMgrAdapter::AllotFormById(const FormItemInfo &info, int64_t formId = FormDataMgr::GetInstance().PaddingUdidHash(info.GetFormId()); FormRecord record; bool hasRecord = FormDataMgr::GetInstance().GetFormRecord(formId, record); + record.formLocation = info.GetFormLocation(); if (hasRecord && record.recycleStatus != RecycleStatus::NON_RECYCLABLE) { record.recycleStatus = RecycleStatus::NON_RECYCLABLE; FormDataMgr::GetInstance().UpdateFormRecord(formId, record); @@ -3752,5 +3761,31 @@ int32_t FormMgrAdapter::RecoverForms(const std::vector &formIds, const FormRenderMgr::GetInstance().RecoverForms(validFormIds, bundleName, want.GetParams()); return ERR_OK; } + +ErrCode FormMgrAdapter::UpdateFormLocation(const int64_t &formId, const int32_t &formLocation) +{ + // find matched formId + int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId); + + // check exist and get the formRecord + FormRecord formRecord; + if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) { + HILOG_ERROR("error, not exist such form, formId = %{public}" PRId64 " formLocation = %{public}d", + formId, formLocation); + return ERR_APPEXECFWK_FORM_NOT_EXIST_ID; + } + if ((int32_t)formRecord.formLocation != formLocation) { + FormDataMgr::GetInstance().UpdateFormLocation(matchedFormId, formLocation); + if (!formRecord.formTempFlag) { + auto ret = HandleFormAddObserver(matchedFormId); + if (ret != ERR_OK) { + return ret; + } + return FormDbCache::GetInstance().UpdateFormLocation(matchedFormId, formLocation); + } + } + return ERR_OK; +} + } // namespace AppExecFwk } // namespace OHOS diff --git a/services/src/form_mgr_service.cpp b/services/src/form_mgr_service.cpp index 090282e114..9b1ed289a3 100644 --- a/services/src/form_mgr_service.cpp +++ b/services/src/form_mgr_service.cpp @@ -1578,5 +1578,17 @@ int32_t FormMgrService::RecoverForms(const std::vector &formIds, const } return FormMgrAdapter::GetInstance().RecoverForms(formIds, want); } + +ErrCode FormMgrService::UpdateFormLocation(const int64_t &formId, const int32_t &formLocation) +{ + HILOG_DEBUG("called."); + ErrCode ret = CheckFormPermission(); + if (ret != ERR_OK) { + HILOG_ERROR("fail, update formLocation form infos permission denied"); + return ret; + } + return FormMgrAdapter::GetInstance().UpdateFormLocation(formId, formLocation); +} + } // namespace AppExecFwk } // namespace OHOS -- Gitee