diff --git a/interfaces/inner_api/auto_fill_manager/include/auto_fill_error.h b/interfaces/inner_api/auto_fill_manager/include/auto_fill_error.h index 7cc4d9a31bf219cd420f54d037e9a2c0d4fb40cf..f1fee3328155145131688cc989bced1b2a18bc05 100644 --- a/interfaces/inner_api/auto_fill_manager/include/auto_fill_error.h +++ b/interfaces/inner_api/auto_fill_manager/include/auto_fill_error.h @@ -29,7 +29,8 @@ enum { AUTO_FILL_OBJECT_IS_NULL, AUTO_FILL_CREATE_MODULE_UI_EXTENSION_FAILED, AUTO_FILL_REQUEST_TIME_OUT, - AUTO_FILL_TYPE_INVALID + AUTO_FILL_TYPE_INVALID, + AUTO_FILL_PREVIOUS_REQUEST_NOT_FINISHED }; } // namespace AutoFill } // namespace AbilityRuntime 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 b6c9f7ea971a1fe833421792112be759aabfa31f..3c849a601aa08b218d182817327b083c95441385 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 @@ -47,6 +47,7 @@ public: void SetSessionId(int32_t sessionId); void SetUIContent(Ace::UIContent *uiContent); + Ace::UIContent *GetUIContent(); void SetEventId(uint32_t eventId); void SetWindowType(const AutoFill::AutoFillWindowType &autoFillWindowType); void SetExtensionType(bool isSmartAutoFill); 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 7547a53759da92d358e1334a1301860a109d17d1..134bf2089d27d39664f886acdc4895b6f1a65852 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 @@ -106,6 +106,7 @@ private: void SetTimeOutEvent(uint32_t eventId); AutoFill::AutoFillWindowType ConvertAutoFillWindowType(const AutoFill::AutoFillRequest &request, bool &isSmartAutoFill); + bool IsPreviousRequestFinished(Ace::UIContent *uiContent); std::mutex extensionCallbacksMutex_; std::mutex modalProxyMapMutex_; 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 b2b8820b409b22745fbc66db2c19d04283da3e7d..eedcc1a0db1633092fc59f1d89131f0aaa829673 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 @@ -198,6 +198,11 @@ void AutoFillExtensionCallback::SetUIContent(Ace::UIContent *uiContent) uiContent_ = uiContent; } +Ace::UIContent *AutoFillExtensionCallback::GetUIContent() +{ + return uiContent_; +} + void AutoFillExtensionCallback::SetEventId(uint32_t eventId) { eventId_ = eventId; 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 e3be0d5374dc36213a33e93ee43a9f8a24f7bbff..0d9f9100f75bb8fb7f18b680236f55fcbdaf9991 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 @@ -96,6 +96,10 @@ int32_t AutoFillManager::HandleRequestExecuteInner( TAG_LOGE(AAFwkTag::AUTOFILLMGR, "UIContent or fillCallback&saveCallback is nullptr."); return AutoFill::AUTO_FILL_OBJECT_IS_NULL; } + if (!IsPreviousRequestFinished(uiContent)) { + TAG_LOGE(AAFwkTag::AUTOFILLMGR, "Previous request is not finished."); + return AutoFill::AUTO_FILL_PREVIOUS_REQUEST_NOT_FINISHED; + } { std::lock_guard lock(extensionCallbacksMutex_); SetTimeOutEvent(++eventId_); @@ -371,5 +375,20 @@ void AutoFillManager::HandleTimeOut(uint32_t eventId) extensionCallback->HandleTimeOut(); extensionCallbacks_.erase(ret); } + +bool AutoFillManager::IsPreviousRequestFinished(Ace::UIContent *uiContent) +{ + std::lock_guard lock(extensionCallbacksMutex_); + for (auto& item: extensionCallbacks_) { + auto extensionCallback = item.second.lock(); + if (extensionCallback == nullptr) { + continue; + } + if (extensionCallback->GetUIContent() == uiContent) { + return false; + } + } + return true; +} } // namespace AbilityRuntime } // namespace OHOS