From 7ef0632e4e6d78fc4f97b597836a5468b860480a Mon Sep 17 00:00:00 2001 From: hhh2 Date: Sat, 20 Aug 2022 16:05:28 +0800 Subject: [PATCH] fix bugs: ANR & Duplicate key subscription Signed-off-by: hhh2 Change-Id: I62836aa4c5920d6ed446552e07bf6c5f0334dbfa Signed-off-by: hhh2 --- .../key_event_input_subscribe_manager.h | 12 ++-- .../src/key_event_input_subscribe_manager.cpp | 60 +++++++++++++++---- .../proxy/module_loader/src/mmi_client.cpp | 2 +- 3 files changed, 58 insertions(+), 16 deletions(-) diff --git a/frameworks/proxy/event_handler/include/key_event_input_subscribe_manager.h b/frameworks/proxy/event_handler/include/key_event_input_subscribe_manager.h index dca5cc581..7e4c503f1 100644 --- a/frameworks/proxy/event_handler/include/key_event_input_subscribe_manager.h +++ b/frameworks/proxy/event_handler/include/key_event_input_subscribe_manager.h @@ -17,11 +17,11 @@ #define KEY_EVENT_INPUT_SUBSCRIBE_MANAGER_H #include -#include #include +#include -#include "nocopyable.h" -#include "singleton.h" +#include +#include #include "key_event.h" #include "key_option.h" @@ -29,6 +29,8 @@ namespace OHOS { namespace MMI { +bool operator<(const KeyOption &first, const KeyOption &second); + class KeyEventInputSubscribeManager : public Singleton { public: class SubscribeKeyEventInfo { @@ -58,6 +60,8 @@ public: return callback_; } + bool operator<(const SubscribeKeyEventInfo &other) const; + private: int32_t subscribeId_ { -1 }; std::shared_ptr keyOption_ { nullptr }; @@ -84,7 +88,7 @@ private: std::shared_ptr event, int32_t subscribeId); private: - std::list subscribeInfos_; + std::set subscribeInfos_; static int32_t subscribeIdManager_; std::mutex mtx_; }; diff --git a/frameworks/proxy/event_handler/src/key_event_input_subscribe_manager.cpp b/frameworks/proxy/event_handler/src/key_event_input_subscribe_manager.cpp index 70f31c662..6c83d1ca7 100644 --- a/frameworks/proxy/event_handler/src/key_event_input_subscribe_manager.cpp +++ b/frameworks/proxy/event_handler/src/key_event_input_subscribe_manager.cpp @@ -50,6 +50,39 @@ KeyEventInputSubscribeManager::SubscribeKeyEventInfo::SubscribeKeyEventInfo( ++KeyEventInputSubscribeManager::subscribeIdManager_; } +bool operator<(const KeyOption &first, const KeyOption &second) +{ + if (first.GetFinalKey() != second.GetFinalKey()) { + return (first.GetFinalKey() < second.GetFinalKey()); + } + const std::set sPrekeys { first.GetPreKeys() }; + const std::set tPrekeys { second.GetPreKeys() }; + std::set::const_iterator sIter = sPrekeys.cbegin(); + std::set::const_iterator tIter = tPrekeys.cbegin(); + for (; sIter != sPrekeys.cend() && tIter != tPrekeys.cend(); ++sIter, ++tIter) { + if (*sIter != *tIter) { + return (*sIter < *tIter); + } + } + if (sIter != sPrekeys.cend() || tIter != tPrekeys.cend()) { + return (tIter != tPrekeys.cend()); + } + if (first.IsFinalKeyDown() ^ second.IsFinalKeyDown()) { + return second.IsFinalKeyDown(); + } + return (first.GetFinalKeyDownDuration() < second.GetFinalKeyDownDuration()); +} + +bool KeyEventInputSubscribeManager::SubscribeKeyEventInfo::operator<(const SubscribeKeyEventInfo &other) const +{ + if (keyOption_ == nullptr) { + return (other.keyOption_ != nullptr); + } else if (other.keyOption_ == nullptr) { + return false; + } + return (*keyOption_ < *other.keyOption_); +} + int32_t KeyEventInputSubscribeManager::SubscribeKeyEvent(std::shared_ptr keyOption, std::function)> callback) { @@ -67,22 +100,27 @@ int32_t KeyEventInputSubscribeManager::SubscribeKeyEvent(std::shared_ptrGetCurrentEventHandler(); CHKPR(eventHandler, INVALID_SUBSCRIBE_ID); - SubscribeKeyEventInfo subscribeInfo(keyOption, callback, eventHandler); + auto [tIter, isOk] = subscribeInfos_.emplace(keyOption, callback, eventHandler); + if (!isOk) { + MMI_HILOGW("Subscription is duplicated"); + return tIter->GetSubscribeId(); + } + if (EventManager.SubscribeKeyEvent(*tIter) != RET_OK) { + MMI_HILOGE("Subscribing key event failed"); + } + MMI_HILOGD("subscribeId:%{public}d,keyOption->finalKey:%{public}d," "keyOption->isFinalKeyDown:%{public}s,keyOption->finalKeyDownDuration:%{public}d", - subscribeInfo.GetSubscribeId(), keyOption->GetFinalKey(), keyOption->IsFinalKeyDown() ? "true" : "false", + tIter->GetSubscribeId(), keyOption->GetFinalKey(), + keyOption->IsFinalKeyDown() ? "true" : "false", keyOption->GetFinalKeyDownDuration()); - subscribeInfos_.push_back(subscribeInfo); - if (EventManager.SubscribeKeyEvent(subscribeInfo) != RET_OK) { - MMI_HILOGE("Leave, subscribe key event failed"); - return INVALID_SUBSCRIBE_ID; + for (const auto &preKey : preKeys) { + MMI_HILOGD("prekey:%{public}d", preKey); } - return subscribeInfo.GetSubscribeId(); + return tIter->GetSubscribeId(); } int32_t KeyEventInputSubscribeManager::UnsubscribeKeyEvent(int32_t subscribeId) @@ -162,7 +200,7 @@ void KeyEventInputSubscribeManager::OnConnected() { CALL_DEBUG_ENTER; if (subscribeInfos_.empty()) { - MMI_HILOGE("Leave, subscribeInfos_ is empty"); + MMI_HILOGD("Leave, subscribeInfos_ is empty"); return; } for (const auto& subscriberInfo : subscribeInfos_) { diff --git a/frameworks/proxy/module_loader/src/mmi_client.cpp b/frameworks/proxy/module_loader/src/mmi_client.cpp index 070120e22..37c47aa9f 100644 --- a/frameworks/proxy/module_loader/src/mmi_client.cpp +++ b/frameworks/proxy/module_loader/src/mmi_client.cpp @@ -71,7 +71,6 @@ bool MMIClient::Start() Stop(); return false; } - msgHandler_.InitProcessedCallback(); if (!StartEventRunner()) { MMI_HILOGE("Start runner failed"); Stop(); @@ -228,6 +227,7 @@ void MMIClient::OnConnected() CALL_DEBUG_ENTER; MMI_HILOGI("Connection to server succeeded, fd:%{public}d", GetFd()); isConnected_ = true; + msgHandler_.InitProcessedCallback(); if (funConnected_) { funConnected_(*this); } -- Gitee