Emit StateChanged event only when the value is updated 07/316707/2
authorYoungsun Suh <youngsun.suh@samsung.com>
Tue, 27 Aug 2024 06:31:36 +0000 (15:31 +0900)
committerYoungsun Suh <youngsun.suh@samsung.com>
Wed, 28 Aug 2024 01:51:08 +0000 (10:51 +0900)
Change-Id: I3d386365f3cfccfd1d7cdcb7c4e6724ad6ccd3dd

dali/devel-api/atspi-interfaces/accessible.h
dali/internal/accessibility/bridge/accessible.cpp

index 5398994d9f6865a791d6eb32c9096ecbfec55843..b163ea25b32e71df9df0f37a1466fe16ffd52ab4 100644 (file)
@@ -22,6 +22,7 @@
 #include <dali/public-api/math/rect.h>
 #include <dali/public-api/object/object-registry.h>
 #include <cstdint>
+#include <map>
 #include <string>
 #include <vector>
 
@@ -521,6 +522,7 @@ private:
   mutable AtspiInterfaces             mInterfaces;
   AtspiEvents                         mSuppressedEvents;
   bool                                mIsOnRootLevel = false;
+  std::map<State, int>                mLastEmittedState;
 
 }; // Accessible class
 
index f7a6ef827e1326532a5afa33d196ec887159bf59..be138b06fba069fd72075761d60c3c63a307f270 100644 (file)
 
 using namespace Dali::Accessibility;
 
+namespace
+{
+bool UpdateLastEmitted(std::map<State, int>& lastEmitted, State state, int newValue)
+{
+  bool updated                = false;
+  const auto [iter, inserted] = lastEmitted.emplace(state, newValue);
+  if(!inserted && iter->second != newValue)
+  {
+    iter->second = newValue;
+    updated      = true;
+  }
+
+  return inserted || updated;
+}
+
+} // namespace
+
 Accessible::Accessible()
 {
 }
@@ -50,41 +67,33 @@ void Accessible::EmitStateChanged(State state, int newValue, int reserved)
 {
   if(auto bridgeData = GetBridgeData())
   {
-    bridgeData->mBridge->EmitStateChanged(shared_from_this(), state, newValue, reserved);
+    if(UpdateLastEmitted(mLastEmittedState, state, newValue))
+    {
+      bridgeData->mBridge->EmitStateChanged(shared_from_this(), state, newValue, reserved);
+    }
   }
 }
 
 void Accessible::EmitShowing(bool isShowing)
 {
-  if(auto bridgeData = GetBridgeData())
-  {
-    bridgeData->mBridge->EmitStateChanged(shared_from_this(), State::SHOWING, isShowing ? 1 : 0, 0);
-  }
+  EmitStateChanged(State::SHOWING, isShowing ? 1 : 0);
 }
 
 void Accessible::EmitVisible(bool isVisible)
 {
-  if(auto bridgeData = GetBridgeData())
-  {
-    bridgeData->mBridge->EmitStateChanged(shared_from_this(), State::VISIBLE, isVisible ? 1 : 0, 0);
-  }
+  EmitStateChanged(State::VISIBLE, isVisible ? 1 : 0);
 }
 
 void Accessible::EmitHighlighted(bool isHighlighted)
 {
-  if(auto bridgeData = GetBridgeData())
-  {
-    bridgeData->mBridge->EmitStateChanged(shared_from_this(), State::HIGHLIGHTED, isHighlighted ? 1 : 0, 0);
-  }
+  EmitStateChanged(State::HIGHLIGHTED, isHighlighted ? 1 : 0);
 }
 
 void Accessible::EmitFocused(bool isFocused)
 {
-  if(auto bridgeData = GetBridgeData())
-  {
-    bridgeData->mBridge->EmitStateChanged(shared_from_this(), State::FOCUSED, isFocused ? 1 : 0, 0);
-  }
+  EmitStateChanged(State::FOCUSED, isFocused ? 1 : 0);
 }
+
 void Accessible::EmitTextInserted(unsigned int position, unsigned int length, const std::string& content)
 {
   if(auto bridgeData = GetBridgeData())
@@ -218,14 +227,15 @@ bool Accessible::IsProxy() const
 
 void Accessible::NotifyAccessibilityStateChange(Dali::Accessibility::States states, bool isRecursive)
 {
-  if(auto data = GetBridgeData())
+  if(Accessibility::IsUp())
   {
+    const auto newStates = GetStates();
     for(auto i = 0u; i < static_cast<unsigned int>(Dali::Accessibility::State::MAX_COUNT); i++)
     {
-      auto index = static_cast<Dali::Accessibility::State>(i);
+      const auto index = static_cast<Dali::Accessibility::State>(i);
       if(states[index])
       {
-        data->mBridge->EmitStateChanged(shared_from_this(), index, GetStates()[index], 0);
+        EmitStateChanged(index, newStates[index]);
       }
     }