From 3f168715bdd8b254a83268daa8a090160a729a6e Mon Sep 17 00:00:00 2001 From: jsjzju Date: Mon, 24 Jun 2024 00:26:11 +0800 Subject: [PATCH] =?UTF-8?q?autofill=E4=BB=A3=E7=A0=81=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: jsjzju Change-Id: I1898b23f75aa20787c1a305f7c738117a61f486c --- .../js_auto_fill_manager.cpp | 3 +- .../include/auto_fill_extension_callback.h | 31 +- .../include/auto_fill_manager.h | 69 ++--- .../src/auto_fill_extension_callback.cpp | 282 ++++++++++++------ .../src/auto_fill_manager.cpp | 217 ++++---------- .../auto_fill_manager_test.cpp | 122 +------- 6 files changed, 303 insertions(+), 421 deletions(-) diff --git a/frameworks/js/napi/auto_fill_manager/js_auto_fill_manager.cpp b/frameworks/js/napi/auto_fill_manager/js_auto_fill_manager.cpp index 8e3e1092024..bbd3ede5dbc 100644 --- a/frameworks/js/napi/auto_fill_manager/js_auto_fill_manager.cpp +++ b/frameworks/js/napi/auto_fill_manager/js_auto_fill_manager.cpp @@ -107,7 +107,8 @@ void JsAutoFillManager::OnRequestAutoSaveInner(napi_env env, int32_t instanceId, AutoFill::AutoFillRequest request; uiContent->DumpViewData(request.viewData, request.autoFillType); request.autoFillCommand = AutoFill::AutoFillCommand::SAVE; - auto ret = AutoFillManager::GetInstance().RequestAutoSave(uiContent, request, saveRequestCallback); + AbilityRuntime::AutoFill::AutoFillResult result; + auto ret = AutoFillManager::GetInstance().RequestAutoSave(uiContent, request, saveRequestCallback, result); if (ret != ERR_OK) { TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Request auto save error[%{public}d].", ret); ThrowError(env, GetJsErrorCodeByNativeError(ret)); diff --git a/interfaces/inner_api/auto_fill_manager/include/auto_fill_extension_callback.h b/interfaces/inner_api/auto_fill_manager/include/auto_fill_extension_callback.h index 84b10282146..6a228a8f86c 100644 --- a/interfaces/inner_api/auto_fill_manager/include/auto_fill_extension_callback.h +++ b/interfaces/inner_api/auto_fill_manager/include/auto_fill_extension_callback.h @@ -32,50 +32,54 @@ enum AutoFillWindowType { POPUP_WINDOW }; } +#ifdef SUPPORT_GRAPHICS class AutoFillExtensionCallback : public std::enable_shared_from_this { public: - AutoFillExtensionCallback() = default; + AutoFillExtensionCallback(); ~AutoFillExtensionCallback() = default; void OnResult(int32_t errCode, const AAFwk::Want &want); void OnRelease(int32_t errCode); void OnError(int32_t errCode, const std::string &name, const std::string &message); void OnReceive(const AAFwk::WantParams &wantParams); -#ifdef SUPPORT_GRAPHICS void onRemoteReady(const std::shared_ptr &modalUIExtensionProxy); -#endif // SUPPORT_GRAPHICS void onDestroy(); void SetFillRequestCallback(const std::shared_ptr &callback); void SetSaveRequestCallback(const std::shared_ptr &callback); void SetSessionId(int32_t sessionId); -#ifdef SUPPORT_GRAPHICS void SetInstanceId(int32_t instanceId); int32_t GetInstanceId(); -#endif // SUPPORT_GRAPHICS - void SetEventId(uint32_t eventId); void SetWindowType(const AutoFill::AutoFillWindowType &autoFillWindowType); + AutoFill::AutoFillWindowType GetWindowType() const; void SetExtensionType(bool isSmartAutoFill); void SetAutoFillType(const AbilityBase::AutoFillType &autoFillType); void SetViewData(const AbilityBase::ViewData &viewData); void SetAutoFillRequestConfig(const AutoFill::AutoFillCustomConfig &config); - AbilityBase::ViewData GetViewData(); + uint32_t GetCallbackId() const; void HandleTimeOut(); + void UpdateCustomPopupUIExtension(const AbilityBase::ViewData &viewData); private: - void SendAutoFillSucess(const AAFwk::Want &want); + void SendAutoFillSuccess(const AAFwk::Want &want); void SendAutoFillFailed(int32_t errCode, const AAFwk::Want &want = AAFwk::Want()); - void CloseModalUIExtension(); + void CloseUIExtension(); void HandleReloadInModal(const AAFwk::WantParams &wantParams); + int32_t ReloadInModal(const AAFwk::WantParams &wantParams); + void UpdateCustomPopupConfig(const AAFwk::WantParams &wantParams); + void SetModalUIExtensionProxy(const std::shared_ptr& proxy); + std::shared_ptr GetModalUIExtensionProxy(); + std::shared_ptr GetFillRequestCallback(); + std::shared_ptr GetSaveRequestCallback(); + uint32_t GenerateCallbackId(); + std::mutex requestCallbackMutex_; std::shared_ptr fillCallback_; std::shared_ptr saveCallback_; int32_t sessionId_; -#ifdef SUPPORT_GRAPHICS int32_t instanceId_ = -1; -#endif // SUPPORT_GRAPHICS - uint32_t eventId_ = 0; + uint32_t callbackId_ = 0; AutoFill::AutoFillWindowType autoFillWindowType_ = AutoFill::AutoFillWindowType::MODAL_WINDOW; AbilityBase::ViewData viewData_; AutoFill::AutoFillCustomConfig autoFillCustomConfig_; @@ -85,7 +89,10 @@ private: AAFwk::Want want_; int32_t errCode_ = 0; AbilityBase::AutoFillType autoFillType_ = AbilityBase::AutoFillType::UNSPECIFIED; + std::mutex proxyMutex_; + std::shared_ptr modalUIExtensionProxy_; }; +#endif // SUPPORT_GRAPHICS } // AbilityRuntime } // OHOS #endif // OHOS_ABILITY_RUNTIME_AUTO_FILL_EXTENSION_CALLBACK_H diff --git a/interfaces/inner_api/auto_fill_manager/include/auto_fill_manager.h b/interfaces/inner_api/auto_fill_manager/include/auto_fill_manager.h index e6eab205706..c486882d4c2 100644 --- a/interfaces/inner_api/auto_fill_manager/include/auto_fill_manager.h +++ b/interfaces/inner_api/auto_fill_manager/include/auto_fill_manager.h @@ -22,6 +22,7 @@ #include "auto_fill_event_handler.h" #include "auto_fill_extension_callback.h" #include "fill_request_callback_interface.h" +#include "nocopyable.h" #include "save_request_callback_interface.h" #include "task_handler_wrap.h" #ifdef SUPPORT_GRAPHICS @@ -53,77 +54,59 @@ struct AutoFillRequest { AutoFillCustomConfig config; }; -/** - * @struct ReloadInModalRequest - * ReloadInModalRequest is used to define the reload in modal request parameter structure. - */ -#ifdef SUPPORT_GRAPHICS -struct ReloadInModalRequest { - int32_t instanceId = -1; - bool isSmartAutoFill = false; - int32_t nodeId; - std::string customData; - AutoFillWindowType autoFillWindowType; - AbilityBase::AutoFillType autoFillType = AbilityBase::AutoFillType::UNSPECIFIED; - std::shared_ptr extensionCallback; +struct AutoFillResult { + bool isPopup = false; + uint32_t autoFillSessionId = 0; }; - } +#ifdef SUPPORT_GRAPHICS class AutoFillManager { public: - AutoFillManager() = default; - ~AutoFillManager(); - static AutoFillManager &GetInstance(); - int32_t RequestAutoFill( - Ace::UIContent *uiContent, - const AutoFill::AutoFillRequest &request, - const std::shared_ptr &fillCallback, bool &isPopup); + int32_t RequestAutoFill(Ace::UIContent *uiContent, const AutoFill::AutoFillRequest &request, + const std::shared_ptr &fillCallback, AutoFill::AutoFillResult &result); - int32_t RequestAutoSave( - Ace::UIContent *uiContent, - const AutoFill::AutoFillRequest &request, - const std::shared_ptr &saveCallback); - void UpdateCustomPopupUIExtension(Ace::UIContent *uiContent, const AbilityBase::ViewData &viewData); - int32_t UpdateCustomPopupConfig(int32_t instanceId, const Ace::CustomPopupUIExtensionConfig &popupConfig); - void SetAutoFillExtensionProxy(int32_t instanceId, - const std::shared_ptr &modalUIExtensionProxy); - void RemoveAutoFillExtensionProxy(int32_t instanceId); - int32_t ReloadInModal(const AutoFill::ReloadInModalRequest &request); + int32_t RequestAutoSave(Ace::UIContent *uiContent, const AutoFill::AutoFillRequest &request, + const std::shared_ptr &saveCallback, AutoFill::AutoFillResult &result); + + void UpdateCustomPopupUIExtension(uint32_t autoFillSessionId, const AbilityBase::ViewData &viewData); void HandleTimeOut(uint32_t eventId); + void SetTimeOutEvent(uint32_t eventId); void RemoveEvent(uint32_t eventId); + + void BindModalUIExtensionCallback(const std::shared_ptr &extensionCallback, + Ace::ModalUIExtensionCallbacks &callback); + void RemoveAutoFillExtensionCallback(uint32_t callbackId); private: + AutoFillManager(); + ~AutoFillManager(); + DISALLOW_COPY_AND_MOVE(AutoFillManager); - int32_t HandleRequestExecuteInner( - Ace::UIContent *uiContent, - const AutoFill::AutoFillRequest &request, + int32_t HandleRequestExecuteInner(Ace::UIContent *uiContent, const AutoFill::AutoFillRequest &request, const std::shared_ptr &fillCallback, - const std::shared_ptr &saveCallback, bool &isPopup); + const std::shared_ptr &saveCallback, + AutoFill::AutoFillResult &result); + int32_t CreateAutoFillExtension(Ace::UIContent *uiContent, const AutoFill::AutoFillRequest &request, const Ace::ModalUIExtensionCallbacks &callback, const AutoFill::AutoFillWindowType &autoFillWindowType, bool isSmartAutoFill); - void BindModalUIExtensionCallback( - const std::shared_ptr &extensionCallback, Ace::ModalUIExtensionCallbacks &callback); - void SetTimeOutEvent(uint32_t eventId); bool ConvertAutoFillWindowType(const AutoFill::AutoFillRequest &request, bool &isSmartAutoFill, AutoFill::AutoFillWindowType &autoFillWindowType); + std::shared_ptr GetAutoFillExtensionCallback(uint32_t callbackId); bool IsPreviousRequestFinished(Ace::UIContent *uiContent); bool IsNeed2SaveRequest(const AbilityBase::ViewData &viewData, bool &isSmartAutoFill); std::mutex extensionCallbacksMutex_; - std::mutex modalProxyMapMutex_; - std::map> extensionCallbacks_; + std::map> extensionCallbacks_; - std::map> modalUIExtensionProxyMap_; - uint32_t eventId_ = 0; std::shared_ptr eventHandler_; -#endif // SUPPORT_GRAPHICS }; +#endif // SUPPORT_GRAPHICS } // AbilityRuntime } // OHOS #endif // OHOS_ABILITY_RUNTIME_AUTO_FILL_MANAGER_H \ No newline at end of file diff --git a/interfaces/inner_api/auto_fill_manager/src/auto_fill_extension_callback.cpp b/interfaces/inner_api/auto_fill_manager/src/auto_fill_extension_callback.cpp index c1eaf020657..6f8f7e1736f 100644 --- a/interfaces/inner_api/auto_fill_manager/src/auto_fill_extension_callback.cpp +++ b/interfaces/inner_api/auto_fill_manager/src/auto_fill_extension_callback.cpp @@ -14,34 +14,48 @@ */ #include "auto_fill_extension_callback.h" +#include + #include "auto_fill_error.h" #include "auto_fill_manager.h" #include "auto_fill_manager_util.h" #include "hilog_tag_wrapper.h" #include "hilog_wrapper.h" +#include "int_wrapper.h" +#include "string_wrapper.h" #include "view_data.h" namespace OHOS { namespace AbilityRuntime { namespace { -constexpr static char WANT_PARAMS_VIEW_DATA_KEY[] = "ohos.ability.params.viewData"; #ifdef SUPPORT_GRAPHICS -constexpr static char WANT_PARAMS_CUSTOM_DATA_KEY[] = "ohos.ability.params.customData"; -constexpr static char WANT_PARAMS_AUTO_FILL_EVENT_KEY[] = "ability.want.params.AutoFillEvent"; -constexpr static char WANT_PARAMS_AUTO_FILL_CMD_KEY[] = "ohos.ability.params.autoFillCmd"; -constexpr static char WANT_PARAMS_UPDATE_POPUP_WIDTH[] = "ohos.ability.params.popupWidth"; -constexpr static char WANT_PARAMS_UPDATE_POPUP_HEIGHT[] = "ohos.ability.params.popupHeight"; -constexpr static char WANT_PARAMS_UPDATE_POPUP_PLACEMENT[] = "ohos.ability.params.popupPlacement"; +constexpr const char* WANT_PARAMS_VIEW_DATA_KEY = "ohos.ability.params.viewData"; +constexpr const char* WANT_PARAMS_AUTO_FILL_CMD_KEY = "ohos.ability.params.autoFillCmd"; +constexpr const char* WANT_PARAMS_FILL_CONTENT = "ohos.ability.params.fillContent"; +constexpr const char* WANT_PARAMS_CUSTOM_DATA_KEY = "ohos.ability.params.customData"; +constexpr const char* WANT_PARAMS_AUTO_FILL_EVENT_KEY = "ability.want.params.AutoFillEvent"; +constexpr const char* WANT_PARAMS_UPDATE_POPUP_WIDTH = "ohos.ability.params.popupWidth"; +constexpr const char* WANT_PARAMS_UPDATE_POPUP_HEIGHT = "ohos.ability.params.popupHeight"; +constexpr const char* WANT_PARAMS_UPDATE_POPUP_PLACEMENT = "ohos.ability.params.popupPlacement"; +constexpr const char* WANT_PARAMS_EXTENSION_TYPE_KEY = "ability.want.params.uiExtensionType"; +constexpr const char* WANT_PARAMS_EXTENSION_TYPE = "autoFill/password"; +constexpr const char* WANT_PARAMS_SMART_EXTENSION_TYPE = "autoFill/smart"; +constexpr const char* WANT_PARAMS_AUTO_FILL_TYPE_KEY = "ability.want.params.AutoFillType"; +constexpr const char* WANT_PARAMS_AUTO_FILL_POPUP_WINDOW_KEY = "ohos.ability.params.popupWindow"; #endif // SUPPORT_GRAPHICS -constexpr static char WANT_PARAMS_FILL_CONTENT[] = "ohos.ability.params.fillContent"; } // namespace + +#ifdef SUPPORT_GRAPHICS +AutoFillExtensionCallback::AutoFillExtensionCallback() +{ + callbackId_ = GenerateCallbackId(); +} + void AutoFillExtensionCallback::OnResult(int32_t errCode, const AAFwk::Want &want) { TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called, result code is %{public}d.", errCode); -#ifdef SUPPORT_GRAPHICS - AutoFillManager::GetInstance().RemoveEvent(eventId_); - CloseModalUIExtension(); -#endif // SUPPORT_GRAPHICS + AutoFillManager::GetInstance().RemoveEvent(callbackId_); + CloseUIExtension(); if (autoFillWindowType_ == AutoFill::AutoFillWindowType::POPUP_WINDOW) { isOnResult_ = true; want_ = want; @@ -50,7 +64,7 @@ void AutoFillExtensionCallback::OnResult(int32_t errCode, const AAFwk::Want &wan } if (errCode == AutoFill::AUTO_FILL_SUCCESS) { - SendAutoFillSucess(want); + SendAutoFillSuccess(want); } else { auto resultCode = (errCode == AutoFill::AUTO_FILL_CANCEL) ? AutoFill::AUTO_FILL_CANCEL : AutoFill::AUTO_FILL_FAILED; @@ -61,10 +75,8 @@ void AutoFillExtensionCallback::OnResult(int32_t errCode, const AAFwk::Want &wan void AutoFillExtensionCallback::OnRelease(int32_t errCode) { TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called, result code is %{public}d.", errCode); -#ifdef SUPPORT_GRAPHICS - AutoFillManager::GetInstance().RemoveEvent(eventId_); - CloseModalUIExtension(); -#endif // SUPPORT_GRAPHICS + AutoFillManager::GetInstance().RemoveEvent(callbackId_); + CloseUIExtension(); if (errCode != 0) { SendAutoFillFailed(AutoFill::AUTO_FILL_RELEASE_FAILED); } @@ -74,31 +86,22 @@ void AutoFillExtensionCallback::OnError(int32_t errCode, const std::string &name { TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called, errcode is %{public}d, name is %{public}s, message is %{public}s", errCode, name.c_str(), message.c_str()); -#ifdef SUPPORT_GRAPHICS - AutoFillManager::GetInstance().RemoveEvent(eventId_); - CloseModalUIExtension(); -#endif // SUPPORT_GRAPHICS + AutoFillManager::GetInstance().RemoveEvent(callbackId_); + CloseUIExtension(); if (errCode != 0) { SendAutoFillFailed(AutoFill::AUTO_FILL_ON_ERROR); } } -#ifdef SUPPORT_GRAPHICS + void AutoFillExtensionCallback::HandleReloadInModal(const AAFwk::WantParams &wantParams) { TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); isReloadInModal_ = true; - AutoFillManager::GetInstance().RemoveAutoFillExtensionProxy(instanceId_); - auto customDataString(wantParams.GetStringParam(WANT_PARAMS_CUSTOM_DATA_KEY)); - AutoFill::ReloadInModalRequest request = { - .instanceId = instanceId_, - .isSmartAutoFill = isSmartAutoFill_, - .nodeId = sessionId_, - .customData = customDataString, - .autoFillWindowType = autoFillWindowType_, - .autoFillType = autoFillType_, - .extensionCallback = shared_from_this(), - }; - int32_t resultCode = AutoFillManager::GetInstance().ReloadInModal(request); + SetModalUIExtensionProxy(nullptr); + + auto oldWindowType = autoFillWindowType_; + auto oldSessionId = sessionId_; + int32_t resultCode = ReloadInModal(wantParams); if (resultCode != AutoFill::AUTO_FILL_SUCCESS) { SendAutoFillFailed(resultCode); } @@ -109,13 +112,47 @@ void AutoFillExtensionCallback::HandleReloadInModal(const AAFwk::WantParams &wan return; } - if (request.autoFillWindowType == AutoFill::AutoFillWindowType::POPUP_WINDOW) { - uiContent->DestroyCustomPopupUIExtension(request.nodeId); + if (oldWindowType == AutoFill::AutoFillWindowType::POPUP_WINDOW) { + uiContent->DestroyCustomPopupUIExtension(oldSessionId); } else { TAG_LOGW(AAFwkTag::AUTOFILLMGR, "Window type is not popup, the window can not be destroyed."); } } +int32_t AutoFillExtensionCallback::ReloadInModal(const AAFwk::WantParams &wantParams) +{ + TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); + auto uiContent = Ace::UIContent::GetUIContent(instanceId_); + if (uiContent == nullptr) { + TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Content is nullptr."); + return AutoFill::AUTO_FILL_OBJECT_IS_NULL; + } + + AutoFillManager::GetInstance().SetTimeOutEvent(callbackId_); + AAFwk::Want want; + want.SetParam(WANT_PARAMS_AUTO_FILL_CMD_KEY, static_cast(AutoFill::AutoFillCommand::RELOAD_IN_MODAL)); + want.SetParam(WANT_PARAMS_CUSTOM_DATA_KEY, wantParams.GetStringParam(WANT_PARAMS_CUSTOM_DATA_KEY)); + isSmartAutoFill_ ? want.SetParam(WANT_PARAMS_EXTENSION_TYPE_KEY, std::string(WANT_PARAMS_SMART_EXTENSION_TYPE)) : + want.SetParam(WANT_PARAMS_EXTENSION_TYPE_KEY, std::string(WANT_PARAMS_EXTENSION_TYPE)); + want.SetParam(WANT_PARAMS_AUTO_FILL_TYPE_KEY, static_cast(autoFillType_)); + want.SetParam(WANT_PARAMS_VIEW_DATA_KEY, viewData_.ToJsonString()); + want.SetParam(WANT_PARAMS_AUTO_FILL_POPUP_WINDOW_KEY, false); + Ace::ModalUIExtensionCallbacks callback; + AutoFillManager::GetInstance().BindModalUIExtensionCallback(shared_from_this(), callback); + Ace::ModalUIExtensionConfig config; + config.isAsyncModalBinding = true; + int32_t sessionId = 0; + sessionId = uiContent->CreateModalUIExtension(want, callback, config); + if (sessionId == 0) { + TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Create ui extension is failed."); + AutoFillManager::GetInstance().RemoveEvent(callbackId_); + return AutoFill::AUTO_FILL_CREATE_MODULE_UI_EXTENSION_FAILED; + } + SetSessionId(sessionId); + SetWindowType(AutoFill::AutoFillWindowType::MODAL_WINDOW); + return AutoFill::AUTO_FILL_SUCCESS; +} + void AutoFillExtensionCallback::OnReceive(const AAFwk::WantParams &wantParams) { TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); @@ -124,34 +161,42 @@ void AutoFillExtensionCallback::OnReceive(const AAFwk::WantParams &wantParams) HandleReloadInModal(wantParams); return; } else if (cmdValue == static_cast(AutoFill::AutoFillCommand::RESIZE)) { - Ace::CustomPopupUIExtensionConfig popupConfig; - if (wantParams.HasParam(WANT_PARAMS_UPDATE_POPUP_WIDTH) && - wantParams.HasParam(WANT_PARAMS_UPDATE_POPUP_HEIGHT)) { - Ace::PopupSize popupSize; - popupSize.width = wantParams.GetIntParam(WANT_PARAMS_UPDATE_POPUP_WIDTH, 0); - popupSize.height = wantParams.GetIntParam(WANT_PARAMS_UPDATE_POPUP_HEIGHT, 0); - popupConfig.targetSize = popupSize; - } - if (wantParams.HasParam(WANT_PARAMS_UPDATE_POPUP_PLACEMENT)) { - popupConfig.placement = - static_cast(wantParams.GetIntParam(WANT_PARAMS_UPDATE_POPUP_PLACEMENT, 0)); - } - Ace::CustomPopupUIExtensionConfig popupConfigToConvert; - AutoFillManagerUtil::ConvertToPopupUIExtensionConfig(autoFillCustomConfig_, popupConfigToConvert); - popupConfig.nodeId = sessionId_; - popupConfig.isFocusable = popupConfigToConvert.isFocusable; - popupConfig.isShowInSubWindow = popupConfigToConvert.isShowInSubWindow; - popupConfig.isEnableArrow = popupConfigToConvert.isEnableArrow; - auto updateResult = AutoFillManager::GetInstance().UpdateCustomPopupConfig(instanceId_, popupConfig); - if (updateResult != AutoFill::AUTO_FILL_SUCCESS) { - TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Update custom popup config failed."); - } + UpdateCustomPopupConfig(wantParams); } if (wantParams.GetIntParam(WANT_PARAMS_AUTO_FILL_EVENT_KEY, 0) == AutoFill::AUTO_FILL_CANCEL_TIME_OUT) { - AutoFillManager::GetInstance().RemoveEvent(eventId_); + AutoFillManager::GetInstance().RemoveEvent(callbackId_); } } +void AutoFillExtensionCallback::UpdateCustomPopupConfig(const AAFwk::WantParams &wantParams) +{ + TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); + Ace::CustomPopupUIExtensionConfig popupConfig; + if (wantParams.HasParam(WANT_PARAMS_UPDATE_POPUP_WIDTH) && + wantParams.HasParam(WANT_PARAMS_UPDATE_POPUP_HEIGHT)) { + Ace::PopupSize popupSize; + popupSize.width = wantParams.GetIntParam(WANT_PARAMS_UPDATE_POPUP_WIDTH, 0); + popupSize.height = wantParams.GetIntParam(WANT_PARAMS_UPDATE_POPUP_HEIGHT, 0); + popupConfig.targetSize = popupSize; + } + if (wantParams.HasParam(WANT_PARAMS_UPDATE_POPUP_PLACEMENT)) { + popupConfig.placement = + static_cast(wantParams.GetIntParam(WANT_PARAMS_UPDATE_POPUP_PLACEMENT, 0)); + } + Ace::CustomPopupUIExtensionConfig popupConfigToConvert; + AutoFillManagerUtil::ConvertToPopupUIExtensionConfig(autoFillCustomConfig_, popupConfigToConvert); + popupConfig.nodeId = sessionId_; + popupConfig.isFocusable = popupConfigToConvert.isFocusable; + popupConfig.isShowInSubWindow = popupConfigToConvert.isShowInSubWindow; + popupConfig.isEnableArrow = popupConfigToConvert.isEnableArrow; + auto uiContent = Ace::UIContent::GetUIContent(instanceId_); + if (uiContent == nullptr) { + TAG_LOGE(AAFwkTag::AUTOFILLMGR, "UIContent is nullptr."); + return; + } + uiContent->UpdateCustomPopupUIExtension(popupConfig); +} + void AutoFillExtensionCallback::onRemoteReady(const std::shared_ptr &modalUIExtensionProxy) { TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); @@ -159,9 +204,9 @@ void AutoFillExtensionCallback::onRemoteReady(const std::shared_ptr &callback) { + std::lock_guard lock(requestCallbackMutex_); fillCallback_ = callback; } +std::shared_ptr AutoFillExtensionCallback::GetFillRequestCallback() +{ + std::lock_guard lock(requestCallbackMutex_); + return fillCallback_; +} + void AutoFillExtensionCallback::SetSaveRequestCallback(const std::shared_ptr &callback) { + std::lock_guard lock(requestCallbackMutex_); saveCallback_ = callback; } +std::shared_ptr AutoFillExtensionCallback::GetSaveRequestCallback() +{ + std::lock_guard lock(requestCallbackMutex_); + return saveCallback_; +} + void AutoFillExtensionCallback::SetSessionId(int32_t sessionId) { sessionId_= sessionId; } -#ifdef SUPPORT_GRAPHICS + void AutoFillExtensionCallback::SetInstanceId(int32_t instanceId) { instanceId_ = instanceId; @@ -210,17 +267,17 @@ int32_t AutoFillExtensionCallback::GetInstanceId() { return instanceId_; } -#endif // SUPPORT_GRAPHICS -void AutoFillExtensionCallback::SetEventId(uint32_t eventId) -{ - eventId_ = eventId; -} void AutoFillExtensionCallback::SetWindowType(const AutoFill::AutoFillWindowType &autoFillWindowType) { autoFillWindowType_ = autoFillWindowType; } +AutoFill::AutoFillWindowType AutoFillExtensionCallback::GetWindowType() const +{ + return autoFillWindowType_; +} + void AutoFillExtensionCallback::SetViewData(const AbilityBase::ViewData &viewData) { viewData_ = viewData; @@ -241,53 +298,90 @@ void AutoFillExtensionCallback::SetAutoFillType(const AbilityBase::AutoFillType autoFillType_ = autoFillType; } -AbilityBase::ViewData AutoFillExtensionCallback::GetViewData() +void AutoFillExtensionCallback::HandleTimeOut() { - return viewData_; + CloseUIExtension(); + SendAutoFillFailed(AutoFill::AUTO_FILL_REQUEST_TIME_OUT); } -void AutoFillExtensionCallback::HandleTimeOut() +uint32_t AutoFillExtensionCallback::GenerateCallbackId() { -#ifdef SUPPORT_GRAPHICS - CloseModalUIExtension(); -#endif - SendAutoFillFailed(AutoFill::AUTO_FILL_REQUEST_TIME_OUT); + static std::atomic callbackId(0); + ++callbackId; + return callbackId.load(); +} + +uint32_t AutoFillExtensionCallback::GetCallbackId() const +{ + return callbackId_; } -void AutoFillExtensionCallback::SendAutoFillSucess(const AAFwk::Want &want) +void AutoFillExtensionCallback::SetModalUIExtensionProxy(const std::shared_ptr& proxy) +{ + std::lock_guard lock(proxyMutex_); + modalUIExtensionProxy_ = proxy; +} + +std::shared_ptr AutoFillExtensionCallback::GetModalUIExtensionProxy() +{ + std::lock_guard lock(proxyMutex_); + return modalUIExtensionProxy_; +} + +void AutoFillExtensionCallback::UpdateCustomPopupUIExtension(const AbilityBase::ViewData &viewData) +{ + auto modalUIExtensionProxy = GetModalUIExtensionProxy(); + if (modalUIExtensionProxy == nullptr) { + TAG_LOGE(AAFwkTag::AUTOFILLMGR, "UIExtensionProxy is nullptr."); + return; + } + AAFwk::WantParams wantParams; + wantParams.SetParam(WANT_PARAMS_AUTO_FILL_CMD_KEY, + AAFwk::Integer::Box(static_cast(AutoFill::AutoFillCommand::UPDATE))); + wantParams.SetParam(WANT_PARAMS_VIEW_DATA_KEY, AAFwk::String::Box(viewData.ToJsonString())); + modalUIExtensionProxy->SendData(wantParams); +} + +void AutoFillExtensionCallback::SendAutoFillSuccess(const AAFwk::Want &want) { TAG_LOGI(AAFwkTag::AUTOFILLMGR, "Called."); - if (fillCallback_ != nullptr) { + auto fillCallback = GetFillRequestCallback(); + if (fillCallback != nullptr) { std::string dataStr = want.GetStringParam(WANT_PARAMS_VIEW_DATA_KEY); AbilityBase::ViewData viewData; viewData.FromJsonString(dataStr.c_str()); - fillCallback_->OnFillRequestSuccess(viewData); - fillCallback_ = nullptr; + fillCallback->OnFillRequestSuccess(viewData); + SetFillRequestCallback(nullptr); } - if (saveCallback_ != nullptr) { - saveCallback_->OnSaveRequestSuccess(); - saveCallback_ = nullptr; + auto saveCallback = GetSaveRequestCallback(); + if (saveCallback != nullptr) { + saveCallback->OnSaveRequestSuccess(); + SetSaveRequestCallback(nullptr); } + AutoFillManager::GetInstance().RemoveAutoFillExtensionCallback(callbackId_); } void AutoFillExtensionCallback::SendAutoFillFailed(int32_t errCode, const AAFwk::Want &want) { TAG_LOGI(AAFwkTag::AUTOFILLMGR, "Called."); - if (fillCallback_ != nullptr) { + auto fillCallback = GetFillRequestCallback(); + if (fillCallback != nullptr) { std::string fillContent = want.GetStringParam(WANT_PARAMS_FILL_CONTENT); bool isPopup = (autoFillWindowType_ == AutoFill::AutoFillWindowType::POPUP_WINDOW); - fillCallback_->OnFillRequestFailed(errCode, fillContent, isPopup); - fillCallback_ = nullptr; + fillCallback->OnFillRequestFailed(errCode, fillContent, isPopup); + SetFillRequestCallback(nullptr); } - if (saveCallback_ != nullptr) { - saveCallback_->OnSaveRequestFailed(); - saveCallback_ = nullptr; + auto saveCallback = GetSaveRequestCallback(); + if (saveCallback != nullptr) { + saveCallback->OnSaveRequestFailed(); + SetSaveRequestCallback(nullptr); } + AutoFillManager::GetInstance().RemoveAutoFillExtensionCallback(callbackId_); } -#ifdef SUPPORT_GRAPHICS -void AutoFillExtensionCallback::CloseModalUIExtension() + +void AutoFillExtensionCallback::CloseUIExtension() { auto uiContent = Ace::UIContent::GetUIContent(instanceId_); if (uiContent == nullptr) { @@ -300,7 +394,7 @@ void AutoFillExtensionCallback::CloseModalUIExtension() } else if (autoFillWindowType_ == AutoFill::AutoFillWindowType::MODAL_WINDOW) { uiContent->CloseModalUIExtension(sessionId_); } - AutoFillManager::GetInstance().RemoveAutoFillExtensionProxy(instanceId_); + SetModalUIExtensionProxy(nullptr); instanceId_ = -1; } #endif // SUPPORT_GRAPHICS diff --git a/interfaces/inner_api/auto_fill_manager/src/auto_fill_manager.cpp b/interfaces/inner_api/auto_fill_manager/src/auto_fill_manager.cpp index 3f468888699..c025441179c 100644 --- a/interfaces/inner_api/auto_fill_manager/src/auto_fill_manager.cpp +++ b/interfaces/inner_api/auto_fill_manager/src/auto_fill_manager.cpp @@ -20,19 +20,16 @@ #include "extension_ability_info.h" #include "hilog_tag_wrapper.h" #include "hilog_wrapper.h" -#include "int_wrapper.h" #include "parameters.h" -#include "string_wrapper.h" namespace OHOS { namespace AbilityRuntime { namespace { +#ifdef SUPPORT_GRAPHICS const std::string WANT_PARAMS_EXTENSION_TYPE = "autoFill/password"; const std::string WANT_PARAMS_SMART_EXTENSION_TYPE = "autoFill/smart"; const std::string AUTO_FILL_START_POPUP_WINDOW = "persist.sys.abilityms.autofill.is_passwd_popup_window"; -#ifdef SUPPORT_GRAPHICS constexpr static char WANT_PARAMS_VIEW_DATA_KEY[] = "ohos.ability.params.viewData"; -constexpr static char WANT_PARAMS_CUSTOM_DATA_KEY[] = "ohos.ability.params.customData"; constexpr static char WANT_PARAMS_AUTO_FILL_CMD_KEY[] = "ohos.ability.params.autoFillCmd"; constexpr static char WANT_PARAMS_AUTO_FILL_POPUP_WINDOW_KEY[] = "ohos.ability.params.popupWindow"; constexpr static char WANT_PARAMS_EXTENSION_TYPE_KEY[] = "ability.want.params.uiExtensionType"; @@ -49,18 +46,19 @@ AutoFillManager &AutoFillManager::GetInstance() return instance; } +AutoFillManager::AutoFillManager() +{ + auto runner = AppExecFwk::EventRunner::Create(AUTO_FILL_MANAGER_THREAD); + eventHandler_ = std::make_shared(runner); +} + AutoFillManager::~AutoFillManager() { TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); - if (eventHandler_ != nullptr) { - eventHandler_.reset(); - } } -int32_t AutoFillManager::RequestAutoFill( - Ace::UIContent *uiContent, - const AutoFill::AutoFillRequest &request, - const std::shared_ptr &fillCallback, bool &isPopup) +int32_t AutoFillManager::RequestAutoFill(Ace::UIContent *uiContent, const AutoFill::AutoFillRequest &request, + const std::shared_ptr &fillCallback, AutoFill::AutoFillResult &result) { TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); if (uiContent == nullptr || fillCallback == nullptr) { @@ -72,28 +70,24 @@ int32_t AutoFillManager::RequestAutoFill( TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Auto fill type is invalid."); return AutoFill::AUTO_FILL_TYPE_INVALID; } - return HandleRequestExecuteInner(uiContent, request, fillCallback, nullptr, isPopup); + return HandleRequestExecuteInner(uiContent, request, fillCallback, nullptr, result); } -int32_t AutoFillManager::RequestAutoSave( - Ace::UIContent *uiContent, - const AutoFill::AutoFillRequest &request, - const std::shared_ptr &saveCallback) +int32_t AutoFillManager::RequestAutoSave(Ace::UIContent *uiContent, const AutoFill::AutoFillRequest &request, + const std::shared_ptr &saveCallback, AutoFill::AutoFillResult &result) { TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); if (uiContent == nullptr || saveCallback == nullptr) { TAG_LOGE(AAFwkTag::AUTOFILLMGR, "UIContent or save callback is nullptr."); return AutoFill::AUTO_FILL_OBJECT_IS_NULL; } - bool isPopup = false; - return HandleRequestExecuteInner(uiContent, request, nullptr, saveCallback, isPopup); + return HandleRequestExecuteInner(uiContent, request, nullptr, saveCallback, result); } -int32_t AutoFillManager::HandleRequestExecuteInner( - Ace::UIContent *uiContent, - const AutoFill::AutoFillRequest &request, +int32_t AutoFillManager::HandleRequestExecuteInner(Ace::UIContent *uiContent, const AutoFill::AutoFillRequest &request, const std::shared_ptr &fillCallback, - const std::shared_ptr &saveCallback, bool &isPopup) + const std::shared_ptr &saveCallback, + AutoFill::AutoFillResult &result) { if (uiContent == nullptr || (fillCallback == nullptr && saveCallback == nullptr)) { TAG_LOGE(AAFwkTag::AUTOFILLMGR, "UIContent or fillCallback&saveCallback is nullptr."); @@ -103,10 +97,6 @@ int32_t AutoFillManager::HandleRequestExecuteInner( TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Previous request is not finished."); return AutoFill::AUTO_FILL_PREVIOUS_REQUEST_NOT_FINISHED; } - { - std::lock_guard lock(extensionCallbacksMutex_); - SetTimeOutEvent(++eventId_); - } auto extensionCallback = std::make_shared(); if (fillCallback != nullptr) { @@ -121,96 +111,41 @@ int32_t AutoFillManager::HandleRequestExecuteInner( AutoFill::AutoFillWindowType autoFillWindowType = AutoFill::AutoFillWindowType::MODAL_WINDOW; if (!ConvertAutoFillWindowType(request, isSmartAutoFill, autoFillWindowType)) { TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Convert auto fill type failed."); - RemoveEvent(eventId_); return AutoFill::AUTO_FILL_CREATE_MODULE_UI_EXTENSION_FAILED; } - isPopup = autoFillWindowType == AutoFill::AutoFillWindowType::POPUP_WINDOW ? true : false; + auto callbackId = extensionCallback->GetCallbackId(); + SetTimeOutEvent(callbackId); + result.isPopup = autoFillWindowType == AutoFill::AutoFillWindowType::POPUP_WINDOW ? true : false; auto sessionId = CreateAutoFillExtension(uiContent, request, callback, autoFillWindowType, isSmartAutoFill); if (sessionId == AUTO_FILL_UI_EXTENSION_SESSION_ID_INVALID) { TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Create ui extension is failed."); - RemoveEvent(eventId_); + RemoveEvent(callbackId); return AutoFill::AUTO_FILL_CREATE_MODULE_UI_EXTENSION_FAILED; } + result.autoFillSessionId = callbackId; extensionCallback->SetInstanceId(uiContent->GetInstanceId()); extensionCallback->SetSessionId(sessionId); - extensionCallback->SetEventId(eventId_); extensionCallback->SetViewData(request.viewData); extensionCallback->SetWindowType(autoFillWindowType); extensionCallback->SetExtensionType(isSmartAutoFill); extensionCallback->SetAutoFillType(request.autoFillType); extensionCallback->SetAutoFillRequestConfig(request.config); + TAG_LOGI(AAFwkTag::AUTOFILLMGR, "callbackId: %{public}u.", callbackId); std::lock_guard lock(extensionCallbacksMutex_); - extensionCallbacks_.emplace(eventId_, extensionCallback); + extensionCallbacks_.emplace(callbackId, extensionCallback); return AutoFill::AUTO_FILL_SUCCESS; } -void AutoFillManager::UpdateCustomPopupUIExtension(Ace::UIContent *uiContent, const AbilityBase::ViewData &viewData) -{ - TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); - if (uiContent == nullptr) { - TAG_LOGE(AAFwkTag::AUTOFILLMGR, "UIContent is nullptr."); - return; - } - - std::shared_ptr modalUIExtensionProxy; - { - std::lock_guard lock(modalProxyMapMutex_); - auto it = modalUIExtensionProxyMap_.find(uiContent->GetInstanceId()); - if (it == modalUIExtensionProxyMap_.end()) { - TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Content is not in map."); - return; - } - modalUIExtensionProxy = it->second; - } - - if (modalUIExtensionProxy != nullptr) { - AAFwk::WantParams wantParams; - wantParams.SetParam(WANT_PARAMS_AUTO_FILL_CMD_KEY, - AAFwk::Integer::Box(static_cast(AutoFill::AutoFillCommand::UPDATE))); - wantParams.SetParam(WANT_PARAMS_VIEW_DATA_KEY, AAFwk::String::Box(viewData.ToJsonString())); - modalUIExtensionProxy->SendData(wantParams); - } -} - -int32_t AutoFillManager::UpdateCustomPopupConfig(int32_t instanceId, - const Ace::CustomPopupUIExtensionConfig &popupConfig) +void AutoFillManager::UpdateCustomPopupUIExtension(uint32_t autoFillSessionId, const AbilityBase::ViewData &viewData) { TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); - auto uiContent = Ace::UIContent::GetUIContent(instanceId); - if (uiContent == nullptr) { - TAG_LOGE(AAFwkTag::AUTOFILLMGR, "UIContent is nullptr."); - return AutoFill::AUTO_FILL_OBJECT_IS_NULL; - } - uiContent->UpdateCustomPopupUIExtension(popupConfig); - return AutoFill::AUTO_FILL_SUCCESS; -} - -void AutoFillManager::SetAutoFillExtensionProxy(int32_t instanceId, - const std::shared_ptr &modalUIExtensionProxy) -{ - TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); - if (modalUIExtensionProxy == nullptr) { - TAG_LOGE(AAFwkTag::AUTOFILLMGR, "proxy is nullptr."); + auto extensionCallback = GetAutoFillExtensionCallback(autoFillSessionId); + if (extensionCallback == nullptr) { + TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Extension callback is nullptr."); return; } - - std::lock_guard lock(modalProxyMapMutex_); - auto it = modalUIExtensionProxyMap_.find(instanceId); - if (it != modalUIExtensionProxyMap_.end()) { - modalUIExtensionProxyMap_.erase(it); - } - modalUIExtensionProxyMap_.emplace(instanceId, modalUIExtensionProxy); -} - -void AutoFillManager::RemoveAutoFillExtensionProxy(int32_t instanceId) -{ - TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); - std::lock_guard lock(modalProxyMapMutex_); - auto it = modalUIExtensionProxyMap_.find(instanceId); - if (it != modalUIExtensionProxyMap_.end()) { - modalUIExtensionProxyMap_.erase(it); - } + extensionCallback->UpdateCustomPopupUIExtension(viewData); } void AutoFillManager::BindModalUIExtensionCallback( @@ -229,57 +164,6 @@ void AutoFillManager::BindModalUIExtensionCallback( callback.onDestroy = std::bind(&AutoFillExtensionCallback::onDestroy, extensionCallback); } -int32_t AutoFillManager::ReloadInModal(const AutoFill::ReloadInModalRequest &request) -{ - TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); - auto uiContent = Ace::UIContent::GetUIContent(request.instanceId); - if (uiContent == nullptr) { - TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Content is nullptr."); - return AutoFill::AUTO_FILL_OBJECT_IS_NULL; - } - - if (request.extensionCallback == nullptr) { - TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Extension callback is nullptr."); - return AutoFill::AUTO_FILL_OBJECT_IS_NULL; - } - - if (request.autoFillType == AbilityBase::AutoFillType::UNSPECIFIED) { - TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Auto fill type is invalid."); - return AutoFill::AUTO_FILL_TYPE_INVALID; - } - - { - std::lock_guard lock(extensionCallbacksMutex_); - SetTimeOutEvent(++eventId_); - } - - AAFwk::Want want; - want.SetParam(WANT_PARAMS_AUTO_FILL_CMD_KEY, static_cast(AutoFill::AutoFillCommand::RELOAD_IN_MODAL)); - want.SetParam(WANT_PARAMS_CUSTOM_DATA_KEY, request.customData); - request.isSmartAutoFill ? want.SetParam(WANT_PARAMS_EXTENSION_TYPE_KEY, WANT_PARAMS_SMART_EXTENSION_TYPE) : - want.SetParam(WANT_PARAMS_EXTENSION_TYPE_KEY, WANT_PARAMS_EXTENSION_TYPE); - want.SetParam(WANT_PARAMS_AUTO_FILL_TYPE_KEY, static_cast(request.autoFillType)); - want.SetParam(WANT_PARAMS_VIEW_DATA_KEY, request.extensionCallback->GetViewData().ToJsonString()); - want.SetParam(WANT_PARAMS_AUTO_FILL_POPUP_WINDOW_KEY, false); - Ace::ModalUIExtensionCallbacks callback; - BindModalUIExtensionCallback(request.extensionCallback, callback); - Ace::ModalUIExtensionConfig config; - config.isAsyncModalBinding = true; - int32_t sessionId = AUTO_FILL_UI_EXTENSION_SESSION_ID_INVALID; - sessionId = uiContent->CreateModalUIExtension(want, callback, config); - if (sessionId == AUTO_FILL_UI_EXTENSION_SESSION_ID_INVALID) { - TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Create ui extension is failed."); - RemoveEvent(eventId_); - return AutoFill::AUTO_FILL_CREATE_MODULE_UI_EXTENSION_FAILED; - } - request.extensionCallback->SetSessionId(sessionId); - request.extensionCallback->SetEventId(eventId_); - request.extensionCallback->SetWindowType(AutoFill::AutoFillWindowType::MODAL_WINDOW); - std::lock_guard lock(extensionCallbacksMutex_); - extensionCallbacks_.emplace(eventId_, request.extensionCallback); - return AutoFill::AUTO_FILL_SUCCESS; -} - int32_t AutoFillManager::CreateAutoFillExtension(Ace::UIContent *uiContent, const AutoFill::AutoFillRequest &request, const Ace::ModalUIExtensionCallbacks &callback, @@ -365,10 +249,9 @@ bool AutoFillManager::ConvertAutoFillWindowType(const AutoFill::AutoFillRequest void AutoFillManager::SetTimeOutEvent(uint32_t eventId) { TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Called."); - auto runner = AppExecFwk::EventRunner::Create(AUTO_FILL_MANAGER_THREAD); if (eventHandler_ == nullptr) { - TAG_LOGD(AAFwkTag::AUTOFILLMGR, "Eventhandler is nullptr."); - eventHandler_ = std::make_shared(runner); + TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Eventhandler is nullptr."); + return; } eventHandler_->SendEvent(eventId, AUTO_FILL_REQUEST_TIME_OUT_VALUE); } @@ -381,30 +264,35 @@ void AutoFillManager::RemoveEvent(uint32_t eventId) return; } eventHandler_->RemoveEvent(eventId); - - std::lock_guard lock(extensionCallbacksMutex_); - auto ret = extensionCallbacks_.find(eventId); - if (ret != extensionCallbacks_.end()) { - extensionCallbacks_.erase(ret); - } } void AutoFillManager::HandleTimeOut(uint32_t eventId) { TAG_LOGI(AAFwkTag::AUTOFILLMGR, "Called."); - std::lock_guard lock(extensionCallbacksMutex_); - auto ret = extensionCallbacks_.find(eventId); - if (ret == extensionCallbacks_.end()) { - TAG_LOGW(AAFwkTag::AUTOFILLMGR, "Event id is not find."); - return; - } - auto extensionCallback = ret->second.lock(); + auto extensionCallback = GetAutoFillExtensionCallback(eventId); if (extensionCallback == nullptr) { TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Extension callback is nullptr."); return; } extensionCallback->HandleTimeOut(); - extensionCallbacks_.erase(ret); +} + +std::shared_ptr AutoFillManager::GetAutoFillExtensionCallback(uint32_t callbackId) +{ + std::lock_guard lock(extensionCallbacksMutex_); + auto iter = extensionCallbacks_.find(callbackId); + if (iter == extensionCallbacks_.end()) { + TAG_LOGE(AAFwkTag::AUTOFILLMGR, "callback is not find. callbackId: %{public}u", callbackId); + return nullptr; + } + return iter->second; +} + +void AutoFillManager::RemoveAutoFillExtensionCallback(uint32_t callbackId) +{ + TAG_LOGI(AAFwkTag::AUTOFILLMGR, "callbackId: %{public}u", callbackId); + std::lock_guard lock(extensionCallbacksMutex_); + extensionCallbacks_.erase(callbackId); } bool AutoFillManager::IsPreviousRequestFinished(Ace::UIContent *uiContent) @@ -413,12 +301,13 @@ bool AutoFillManager::IsPreviousRequestFinished(Ace::UIContent *uiContent) return false; } std::lock_guard lock(extensionCallbacksMutex_); - for (auto& item: extensionCallbacks_) { - auto extensionCallback = item.second.lock(); + for (const auto& item: extensionCallbacks_) { + auto extensionCallback = item.second; if (extensionCallback == nullptr) { continue; } - if (extensionCallback->GetInstanceId() == uiContent->GetInstanceId()) { + if (extensionCallback->GetWindowType() == AutoFill::AutoFillWindowType::MODAL_WINDOW && + extensionCallback->GetInstanceId() == uiContent->GetInstanceId()) { return false; } } diff --git a/test/unittest/auto_fill_manager_test/auto_fill_manager_test.cpp b/test/unittest/auto_fill_manager_test/auto_fill_manager_test.cpp index 026ea6ead2b..9d3503a881e 100644 --- a/test/unittest/auto_fill_manager_test/auto_fill_manager_test.cpp +++ b/test/unittest/auto_fill_manager_test/auto_fill_manager_test.cpp @@ -42,9 +42,6 @@ public: { return nullptr; } - - std::shared_ptr autoFillManager_ = - std::make_shared(); }; class MockModalUIExtensionProxy : public Ace::ModalUIExtensionProxy { @@ -64,19 +61,6 @@ void AutoFillManagerTest::SetUp() void AutoFillManagerTest::TearDown() {} -/** - * @tc.name: ReloadInModal_0100 - * @tc.desc: Js auto fill extension ReloadInModal. - * @tc.type: FUNC - */ -HWTEST_F(AutoFillManagerTest, ReloadInModal_0100, TestSize.Level1) -{ - AbilityRuntime::AutoFill::ReloadInModalRequest request; - ASSERT_NE(autoFillManager_, nullptr); - auto ret = autoFillManager_->ReloadInModal(request); - EXPECT_EQ(ret, AbilityRuntime::AutoFill::AUTO_FILL_OBJECT_IS_NULL); -} - /* * Feature: AutoFillManager * Function: RequestAutoFill @@ -91,9 +75,9 @@ HWTEST_F(AutoFillManagerTest, RequestAutoFill_0100, TestSize.Level1) auto &manager = AbilityRuntime::AutoFillManager::GetInstance(); const AbilityRuntime::AutoFill::AutoFillRequest autoFillRequest; const std::shared_ptr fillCallback = nullptr; - bool isPopup = false; - int32_t result = manager.RequestAutoFill(GetUIContent(), autoFillRequest, fillCallback, isPopup); - EXPECT_EQ(result, AbilityRuntime::AutoFill::AUTO_FILL_OBJECT_IS_NULL); + AbilityRuntime::AutoFill::AutoFillResult result; + int32_t ret = manager.RequestAutoFill(GetUIContent(), autoFillRequest, fillCallback, result); + EXPECT_EQ(ret, AbilityRuntime::AutoFill::AUTO_FILL_OBJECT_IS_NULL); } /* @@ -110,8 +94,9 @@ HWTEST_F(AutoFillManagerTest, RequestAutoSave_0100, TestSize.Level1) auto &manager = AbilityRuntime::AutoFillManager::GetInstance(); const AbilityRuntime::AutoFill::AutoFillRequest autoFillRequest; const std::shared_ptr saveCallback = nullptr; - int32_t result = manager.RequestAutoSave(GetUIContent(), autoFillRequest, saveCallback); - EXPECT_EQ(result, AbilityRuntime::AutoFill::AUTO_FILL_OBJECT_IS_NULL); + AbilityRuntime::AutoFill::AutoFillResult result; + int32_t ret = manager.RequestAutoSave(GetUIContent(), autoFillRequest, saveCallback, result); + EXPECT_EQ(ret, AbilityRuntime::AutoFill::AUTO_FILL_OBJECT_IS_NULL); } /* @@ -130,10 +115,10 @@ HWTEST_F(AutoFillManagerTest, HandleRequestExecuteInner_0100, TestSize.Level1) const AbilityRuntime::AutoFill::AutoFillRequest autoFillRequest; const std::shared_ptr fillCallback = nullptr; const std::shared_ptr saveCallback = nullptr; - bool isPopup = false; - int32_t result = - manager.HandleRequestExecuteInner(GetUIContent(), autoFillRequest, fillCallback, saveCallback, isPopup); - EXPECT_EQ(result, AbilityRuntime::AutoFill::AUTO_FILL_OBJECT_IS_NULL); + AbilityRuntime::AutoFill::AutoFillResult result; + int32_t ret = + manager.HandleRequestExecuteInner(GetUIContent(), autoFillRequest, fillCallback, saveCallback, result); + EXPECT_EQ(ret, AbilityRuntime::AutoFill::AUTO_FILL_OBJECT_IS_NULL); } /* @@ -148,12 +133,8 @@ HWTEST_F(AutoFillManagerTest, SetTimeOutEvent_0100, TestSize.Level1) { GTEST_LOG_(INFO) << "AutoFillManagerTest, SetTimeOutEvent_0100, TestSize.Level1"; auto &manager = AbilityRuntime::AutoFillManager::GetInstance(); - EXPECT_EQ(manager.eventHandler_, nullptr); manager.SetTimeOutEvent(EVENT_ID); EXPECT_NE(manager.eventHandler_, nullptr); - if (manager.eventHandler_ != nullptr) { - manager.eventHandler_.reset(); - } } /* @@ -168,14 +149,10 @@ HWTEST_F(AutoFillManagerTest, RemoveEvent_0100, TestSize.Level1) { GTEST_LOG_(INFO) << "AutoFillManagerTest, SetTimeOutEvent_0100, TestSize.Level1"; auto &manager = AbilityRuntime::AutoFillManager::GetInstance(); - EXPECT_EQ(manager.eventHandler_, nullptr); manager.SetTimeOutEvent(EVENT_ID); EXPECT_NE(manager.eventHandler_, nullptr); manager.RemoveEvent(EVENT_ID); EXPECT_NE(manager.eventHandler_, nullptr); - if (manager.eventHandler_ != nullptr) { - manager.eventHandler_.reset(); - } } /* @@ -190,9 +167,8 @@ HWTEST_F(AutoFillManagerTest, RemoveEvent_0200, TestSize.Level1) { GTEST_LOG_(INFO) << "AutoFillManagerTest, RemoveEvent_0200, TestSize.Level1"; auto &manager = AbilityRuntime::AutoFillManager::GetInstance(); - EXPECT_EQ(manager.eventHandler_, nullptr); manager.RemoveEvent(EVENT_ID); - EXPECT_EQ(manager.eventHandler_, nullptr); + EXPECT_NE(manager.eventHandler_, nullptr); } /* @@ -207,76 +183,9 @@ HWTEST_F(AutoFillManagerTest, UpdateCustomPopupUIExtension_0100, TestSize.Level1 { GTEST_LOG_(INFO) << "AutoFillManagerTest, UpdateCustomPopupUIExtension_0100, TestSize.Level1"; auto &manager = AbilityRuntime::AutoFillManager::GetInstance(); - EXPECT_EQ(manager.modalUIExtensionProxyMap_.size(), 0); - auto modalUIExtensionProxy = std::make_shared(); - auto uiContent = Ace::UIContent::Create(nullptr, nullptr); - manager.modalUIExtensionProxyMap_.emplace(uiContent->GetInstanceId(), modalUIExtensionProxy); + EXPECT_EQ(manager.extensionCallbacks_.size(), 0); const AbilityBase::ViewData viewdata; - EXPECT_CALL(*modalUIExtensionProxy, SendData(_)).Times(1); - manager.UpdateCustomPopupUIExtension(uiContent.get(), viewdata); - manager.modalUIExtensionProxyMap_.clear(); -} - -/* - * Feature: AutoFillManager - * Function: UpdateCustomPopupConfig - * SubFunction: NA - * FunctionPoints: NA - * EnvConditions: NA - * CaseDescription: Verify if the UpdateCustomPopupConfig is valid. - */ -HWTEST_F(AutoFillManagerTest, UpdateCustomPopupConfig_0100, TestSize.Level1) -{ - GTEST_LOG_(INFO) << "AutoFillManagerTest, UpdateCustomPopupConfig_0100, TestSize.Level1"; - auto &manager = AbilityRuntime::AutoFillManager::GetInstance(); - Ace::CustomPopupUIExtensionConfig customPopupUIExtensionConfig; - int32_t result = manager.UpdateCustomPopupConfig(-1, customPopupUIExtensionConfig); - EXPECT_EQ(result, AbilityRuntime::AutoFill::AUTO_FILL_OBJECT_IS_NULL); - - auto uiContent = Ace::UIContent::Create(nullptr, nullptr); - result = manager.UpdateCustomPopupConfig(uiContent->GetInstanceId(), customPopupUIExtensionConfig); - EXPECT_EQ(result, AbilityRuntime::AutoFill::AUTO_FILL_SUCCESS); -} - -/* - * Feature: AutoFillManager - * Function: SetAutoFillExtensionProxy - * SubFunction: NA - * FunctionPoints: NA - * EnvConditions: NA - * CaseDescription: Verify if the SetAutoFillExtensionProxy is valid. - */ -HWTEST_F(AutoFillManagerTest, SetAutoFillExtensionProxy_0100, TestSize.Level1) -{ - GTEST_LOG_(INFO) << "AutoFillManagerTest, SetAutoFillExtensionProxy_0100, TestSize.Level1"; - auto &manager = AbilityRuntime::AutoFillManager::GetInstance(); - EXPECT_EQ(manager.modalUIExtensionProxyMap_.size(), 0); - auto modalUIExtensionProxy = std::make_shared(); - auto uiContent = Ace::UIContent::Create(nullptr, nullptr); - manager.SetAutoFillExtensionProxy(uiContent->GetInstanceId(), modalUIExtensionProxy); - EXPECT_EQ(manager.modalUIExtensionProxyMap_.size(), 1); - manager.modalUIExtensionProxyMap_.clear(); -} - -/* - * Feature: AutoFillManager - * Function: RemoveAutoFillExtensionProxy - * SubFunction: NA - * FunctionPoints: NA - * EnvConditions: NA - * CaseDescription: Verify if the RemoveAutoFillExtensionProxy is valid. - */ -HWTEST_F(AutoFillManagerTest, RemoveAutoFillExtensionProxy_0100, TestSize.Level1) -{ - GTEST_LOG_(INFO) << "AutoFillManagerTest, RemoveAutoFillExtensionProxy_0100, TestSize.Level1"; - auto &manager = AbilityRuntime::AutoFillManager::GetInstance(); - EXPECT_EQ(manager.modalUIExtensionProxyMap_.size(), 0); - auto modalUIExtensionProxy = std::make_shared(); - auto uiContent = Ace::UIContent::Create(nullptr, nullptr); - manager.modalUIExtensionProxyMap_.emplace(uiContent->GetInstanceId(), modalUIExtensionProxy); - manager.RemoveAutoFillExtensionProxy(uiContent->GetInstanceId()); - EXPECT_EQ(manager.modalUIExtensionProxyMap_.size(), 0); - manager.modalUIExtensionProxyMap_.clear(); + manager.UpdateCustomPopupUIExtension(1, viewdata); } /* @@ -293,9 +202,8 @@ HWTEST_F(AutoFillManagerTest, HandleTimeOut_0100, TestSize.Level1) auto &manager = AbilityRuntime::AutoFillManager::GetInstance(); EXPECT_EQ(manager.extensionCallbacks_.size(), 0); auto extensionCallback = std::make_shared(); - uint32_t eventId = 0; - manager.extensionCallbacks_.emplace(eventId, extensionCallback); - manager.HandleTimeOut(eventId); + manager.extensionCallbacks_.emplace(extensionCallback->GetCallbackId(), extensionCallback); + manager.HandleTimeOut(extensionCallback->GetCallbackId()); EXPECT_EQ(manager.extensionCallbacks_.size(), 0); manager.extensionCallbacks_.clear(); } -- Gitee