diff --git a/hal/include/IHalCpp.h b/hal/include/IHalCpp.h index 7fb3665..d21a778 100644 --- a/hal/include/IHalCpp.h +++ b/hal/include/IHalCpp.h @@ -40,7 +40,6 @@ public: VKeyHal() = default; virtual ~VKeyHal() = default; virtual void CheckKeyStatus(void) {} - // virtual const std::string GetKeyName(void) { return "undefine"; } virtual void GetHoldPressingTimeMs(long int &holdTimeMs, VirtualKeyEvent &event) {} virtual void SetKeyMonitor(std::shared_ptr &monitor) {} }; diff --git a/test/hal/tool/include/HalTestTool.h b/test/hal/tool/include/HalTestTool.h index cde8a28..e1c5130 100644 --- a/test/hal/tool/include/HalTestTool.h +++ b/test/hal/tool/include/HalTestTool.h @@ -79,6 +79,13 @@ public: void KeyEventTrigger(const std::string &keyName, const KeyEvent &event, const unsigned int &timeMs) override; const std::string GetKeyName(void) override { return mKeyName; } +private: + virtual StatusCode KeyEventTriggerTrace(const std::string &keyName, const KeyEvent &event, + const unsigned int &timeMs) + { + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); + } + private: const std::string mKeyName; std::weak_ptr mMonitor; @@ -88,7 +95,13 @@ class KeyControlMock : public KeyControlTest public: KeyControlMock(const std::string &keyName); virtual ~KeyControlMock() = default; + // void KeyEventTrigger(const std::string &keyName, const KeyEvent &event, const unsigned int &timeMs) override; void SetKeyEvent(const KeyHalEvent &event); + bool SetKeyClick(const unsigned int &pressingTimeMs = 200); + MOCK_METHOD3(KeyEventTriggerTrace, StatusCode(const std::string &, const KeyEvent &, const unsigned int &)); + +private: + std::mutex mMutex; }; class HalTestTool { @@ -101,6 +114,9 @@ public: void SetKeyEvent(const std::string keyName, const KeyHalEvent &event); void SetKeyClick(const std::string &keyName, const unsigned int &pressingTimeMs = 200); +private: + void KeyEventHappendOnce(std::shared_ptr &mock, const unsigned int &pressingTimeMs); + private: void HalMockInit(std::shared_ptr &mock); void SetAllKeysResult(std::shared_ptr &mock, std::map> &allKeys); diff --git a/test/hal/tool/src/HalTestTool.cpp b/test/hal/tool/src/HalTestTool.cpp index 21afd14..0b69e98 100644 --- a/test/hal/tool/src/HalTestTool.cpp +++ b/test/hal/tool/src/HalTestTool.cpp @@ -61,6 +61,7 @@ void KeyControlTest::CheckKeyStatus(void) void KeyControlTest::KeyEventTrigger(const std::string &keyName, const KeyEvent &event, const unsigned int &timeMs) { LogInfo("KeyEventTrigger keyName = %s, event = %s, time = %u\n", keyName.c_str(), PrintKeyEvent(event), timeMs); + KeyEventTriggerTrace(keyName, event, timeMs); auto monitor = mMonitor.lock(); if (mMonitor.expired()) { LogError("monitor is nullptr.\n"); @@ -77,6 +78,24 @@ void KeyControlMock::SetKeyEvent(const KeyHalEvent &event) // KeyHalEventTrigger(event); } +bool KeyControlMock::SetKeyClick(const unsigned int &pressingTimeMs) +{ + if (mMutex.try_lock()) { + auto keyClickThread = [=](std::shared_ptr key) { + key->KeyHalEventTrigger(KeyHalEvent::PRESSING); + std::this_thread::sleep_for(std::chrono::milliseconds(pressingTimeMs)); + key->KeyHalEventTrigger(KeyHalEvent::NOT_PRESSING); + mMutex.unlock(); + }; + std::shared_ptr tmp = KeyControl::shared_from_this(); + std::shared_ptr key = std::dynamic_pointer_cast(tmp); + std::thread clickThread = std::thread(keyClickThread, key); + clickThread.detach(); + return true; + } + LogWarning("SetKeyClick failed, becase key was lock.\n"); + return false; +} void HalTestTool::Init(void) { mHalMock = std::make_shared(); @@ -109,13 +128,23 @@ void HalTestTool::SetKeyClick(const std::string &keyName, const unsigned int &pr LogError("Can't set key event, key not found.\n"); return; } - auto keyClickThread = [=](std::shared_ptr key) { - key->KeyHalEventTrigger(KeyHalEvent::PRESSING); - std::this_thread::sleep_for(std::chrono::milliseconds(pressingTimeMs)); - key->KeyHalEventTrigger(KeyHalEvent::NOT_PRESSING); - }; - std::thread clickThread = std::thread(keyClickThread, key); - clickThread.detach(); + if (key->SetKeyClick(pressingTimeMs)) { + KeyEventHappendOnce(key, pressingTimeMs); + } +} +void HalTestTool::KeyEventHappendOnce(std::shared_ptr &mock, const unsigned int &pressingTimeMs) +{ + constexpr int CLICK_EVENT_HAPPENED_ONLY_ONCE = 1; + if (KEY_ACTION_SHORT_CLICK <= pressingTimeMs && pressingTimeMs < KEY_ACTION_HOLD_DWON) { + EXPECT_CALL(*mock.get(), KeyEventTriggerTrace(mock->GetKeyName(), KeyEvent::SHORT_CLICK, _)) + .Times(CLICK_EVENT_HAPPENED_ONLY_ONCE) + .WillRepeatedly(DoAll(Return(CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION)))); + } + if (KEY_ACTION_HOLD_DWON <= pressingTimeMs) { + EXPECT_CALL(*mock.get(), KeyEventTriggerTrace(mock->GetKeyName(), KeyEvent::HOLD_DOWN, _)) + .Times(AtLeast(1)) + .WillRepeatedly(DoAll(Return(CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION)))); + } } void HalTestTool::SetAllKeysResult(std::shared_ptr &mock, std::map> &allKeys) diff --git a/utils/KeyControl/src/KeyControl.cpp b/utils/KeyControl/src/KeyControl.cpp index bd9c5af..93514af 100644 --- a/utils/KeyControl/src/KeyControl.cpp +++ b/utils/KeyControl/src/KeyControl.cpp @@ -60,8 +60,11 @@ long int KeyControl::GetHoldPressingTimeMs(void) } void KeyControl::KeyPressingTrigger(const std::string &key) { - if (mLongClickTime <= mPressingTime) // Do not support long click, it should be count in application code. - { + if (mLongClickTime <= mPressingTime) { + /** + * @brief Long press events are not currently supported here. Developers believe that it is better to handle + * long press events at the application level. + */ } if (mPressingTime != KEY_NOT_PRESSING && mPressingTime % KEY_ACTION_HOLD_DWON == 0) { KeyEventTrigger(key, KeyEvent::HOLD_DOWN, mPressingTime);