[ATSPI] Add ScrollStarted/ScrollFinished interface
[platform/core/uifw/dali-adaptor.git] / dali / internal / accessibility / bridge / accessible.cpp
index f23e33f..d0e2700 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  *
  */
 
- // CLASS HEADER
+// CLASS HEADER
 
- //INTERNAL INCLUDES
+//INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/accessibility-bridge.h>
+#include <dali/devel-api/atspi-interfaces/accessible.h>
+#include <dali/devel-api/atspi-interfaces/socket.h>
 #include <dali/internal/accessibility/bridge/accessibility-common.h>
-#include <third-party/libunibreak/wordbreak.h>
-#include <third-party/libunibreak/linebreak.h>
 
 using namespace Dali::Accessibility;
 
-std::vector< std::string > Accessible::GetInterfaces()
-{
-    std::vector< std::string > tmp;
-    tmp.push_back(AtspiDbusInterfaceAccessible);
-    if (dynamic_cast<Collection*>(this))
-    {
-        tmp.push_back(AtspiDbusInterfaceCollection);
-    }
-    if (dynamic_cast<Text*>(this))
-    {
-        tmp.push_back(AtspiDbusInterfaceText);
-    }
-    if (dynamic_cast<EditableText*>(this))
-    {
-        tmp.push_back(AtspiDbusInterfaceEditableText);
-    }
-    if (dynamic_cast<Value*>(this))
-    {
-        tmp.push_back(AtspiDbusInterfaceValue);
-    }
-    if (dynamic_cast<Component*>(this))
-    {
-        tmp.push_back(AtspiDbusInterfaceComponent);
-    }
-    if (auto d = dynamic_cast<Action*>(this))
-    {
-        if (d->GetActionCount() > 0)
-        {
-            tmp.push_back(AtspiDbusInterfaceAction);
-        }
-    }
-    return tmp;
-}
-
 Accessible::Accessible()
 {
 }
 
-Accessible::~Accessible()
+Accessible::~Accessible() noexcept
 {
-    auto b = bridgeData.lock();
-    if (b)
-        b->knownObjects.erase(this);
+  auto handle = mBridgeData.lock();
+  if(handle)
+  {
+    handle->mKnownObjects.erase(this);
+  }
 }
 
-void Accessible::EmitActiveDescendantChanged(Accessible* obj, Accessible* child)
+void Accessible::EmitActiveDescendantChanged(Accessible* child)
 {
-    if (auto b = GetBridgeData())
-    {
-        b->bridge->EmitActiveDescendantChanged(obj, child);
-    }
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitActiveDescendantChanged(this, child);
+  }
 }
 
-void Accessible::EmitStateChanged(State state, int newValue1, int newValue2)
+void Accessible::EmitStateChanged(State state, int newValue, int reserved)
 {
-    if (auto b = GetBridgeData())
-    {
-        b->bridge->EmitStateChanged(this, state, newValue1, newValue2);
-    }
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitStateChanged(this, state, newValue, reserved);
+  }
 }
 
-void Accessible::EmitShowing(bool showing)
+void Accessible::EmitShowing(bool isShowing)
 {
-    if (auto b = GetBridgeData())
-    {
-        b->bridge->EmitStateChanged(this, State::SHOWING, showing ? 1 : 0, 0);
-    }
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitStateChanged(this, State::SHOWING, isShowing ? 1 : 0, 0);
+  }
 }
 
-void Accessible::EmitVisible(bool visible)
+void Accessible::EmitVisible(bool isVisible)
 {
-    if (auto b = GetBridgeData())
-    {
-        b->bridge->EmitStateChanged(this, State::VISIBLE, visible ? 1 : 0, 0);
-    }
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitStateChanged(this, State::VISIBLE, isVisible ? 1 : 0, 0);
+  }
 }
 
-void Accessible::EmitHighlighted(bool set)
+void Accessible::EmitHighlighted(bool isHighlighted)
 {
-    if (auto b = GetBridgeData())
-    {
-        b->bridge->EmitStateChanged(this, State::HIGHLIGHTED, set ? 1 : 0, 0);
-    }
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitStateChanged(this, State::HIGHLIGHTED, isHighlighted ? 1 : 0, 0);
+  }
 }
 
-void Accessible::EmitFocused(bool set)
+void Accessible::EmitFocused(bool isFocused)
 {
-    if (auto b = GetBridgeData()) {
-        b->bridge->EmitStateChanged(this, State::FOCUSED, set ? 1 : 0, 0);
-    }
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitStateChanged(this, State::FOCUSED, isFocused ? 1 : 0, 0);
+  }
 }
 void Accessible::EmitTextInserted(unsigned int position, unsigned int length, const std::string& content)
 {
-    if (auto b = GetBridgeData()) {
-        b->bridge->EmitTextChanged(this, TextChangedState::INSERTED, position, length, content);
-    }
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitTextChanged(this, TextChangedState::INSERTED, position, length, content);
+  }
 }
 void Accessible::EmitTextDeleted(unsigned int position, unsigned int length, const std::string& content)
 {
-    if (auto b = GetBridgeData()) {
-        b->bridge->EmitTextChanged(this, TextChangedState::DELETED, position, length, content);
-    }
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitTextChanged(this, TextChangedState::DELETED, position, length, content);
+  }
 }
-void Accessible::EmitTextCaretMoved(unsigned int cursorPosition)
+void Accessible::EmitTextCursorMoved(unsigned int cursorPosition)
 {
-    if (auto b = GetBridgeData()) {
-        b->bridge->EmitCaretMoved(this, cursorPosition);
-    }
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitCursorMoved(this, cursorPosition);
+  }
 }
-void Accessible::Emit(WindowEvent we, unsigned int detail1)
+
+void Accessible::EmitMovedOutOfScreen(ScreenRelativeMoveType type)
 {
-    if (auto b = GetBridgeData())
-    {
-        b->bridge->Emit(this, we, detail1);
-    }
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitMovedOutOfScreen(this, type);
+  }
 }
-void Accessible::Emit(ObjectPropertyChangeEvent ev)
+
+void Accessible::EmitSocketAvailable()
 {
-    if (auto b = GetBridgeData())
-    {
-        b->bridge->Emit(this, ev);
-    }
+  DALI_ASSERT_DEBUG(Socket::DownCast(this));
+
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitSocketAvailable(this);
+  }
 }
 
-void Accessible::EmitBoundsChanged(Rect<> rect)
+void Accessible::EmitScrollStarted()
 {
-    if (auto b = GetBridgeData())
-    {
-        b->bridge->EmitBoundsChanged(this, rect);
-    }
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitScrollStarted(this);
+  }
 }
 
-std::vector< Accessible* > Accessible::GetChildren()
+void Accessible::EmitScrollFinished()
 {
-    std::vector< Accessible* > tmp(GetChildCount());
-    for (auto i = 0u; i < tmp.size(); ++i)
-    {
-        tmp[i] = GetChildAtIndex(i);
-    }
-    return tmp;
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitScrollFinished(this);
+  }
 }
 
-std::shared_ptr< Bridge::Data > Accessible::GetBridgeData()
+void Accessible::Emit(WindowEvent event, unsigned int detail)
 {
-    auto b = bridgeData.lock();
-    if (!b)
-    {
-        auto p = Bridge::GetCurrentBridge();
-        b = p->data;
-    }
-    return b;
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->Emit(this, event, detail);
+  }
+}
+void Accessible::Emit(ObjectPropertyChangeEvent event)
+{
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->Emit(this, event);
+  }
 }
 
-Address Accessible::GetAddress()
+void Accessible::EmitBoundsChanged(Rect<> rect)
 {
-    auto b = bridgeData.lock();
-    if (!b)
-    {
-        b = GetBridgeData();
-        if (b)
-            b->bridge->RegisterOnBridge(this);
-    }
-    std::ostringstream tmp;
-    tmp << this;
-    return { b ? b->busName : "", tmp.str() };
+  if(auto bridgeData = GetBridgeData())
+  {
+    bridgeData->mBridge->EmitBoundsChanged(this, rect);
+  }
 }
 
-void Bridge::RegisterOnBridge(Accessible* obj)
+std::shared_ptr<Bridge::Data> Accessible::GetBridgeData() const
 {
-    assert(!obj->bridgeData.lock() || obj->bridgeData.lock() == data);
-    if (!obj->bridgeData.lock())
-    {
-        assert(data);
-        data->knownObjects.insert(obj);
-        obj->bridgeData = data;
-    }
+  auto handle = mBridgeData.lock();
+  if(!handle)
+  {
+    auto bridge = Bridge::GetCurrentBridge();
+    handle      = bridge->mData;
+  }
+  return handle;
 }
 
-bool Accessible::IsProxy()
+Address Accessible::GetAddress() const
 {
-    return false;
+  auto handle = mBridgeData.lock();
+  if(!handle)
+  {
+    handle = GetBridgeData();
+    if(handle)
+    {
+      handle->mBridge->RegisterOnBridge(this);
+    }
+  }
+  std::ostringstream tmp;
+  tmp << this;
+  return {handle ? handle->mBusName : "", tmp.str()};
 }
 
-Accessible* Accessible::GetDefaultLabel()
+void Bridge::RegisterOnBridge(const Accessible* object)
 {
-    return this;
+  assert(!object->mBridgeData.lock() || object->mBridgeData.lock() == mData);
+  if(!object->mBridgeData.lock())
+  {
+    assert(mData);
+    mData->mKnownObjects.insert(object);
+    object->mBridgeData = mData;
+  }
 }
 
-void Accessible::NotifyAccessibilityStateChange(Dali::Accessibility::States states, bool doRecursive)
+bool Accessible::IsHidden() const
 {
-    if (auto b = GetBridgeData())
-    {
-        auto s = GetStates() & states;
-        for (auto i = 0u; i < s.size(); i++)
-        {
-            auto index = static_cast<Dali::Accessibility::State>(i);
-            if (s[index])
-                b->bridge->EmitStateChanged(this, index, 1, 0);
-        }
-        if (doRecursive)
-        {
-            auto children = GetChildren();
-            for (auto c : children)
-                c->NotifyAccessibilityStateChange(states, doRecursive);
-        }
-    }
+  return false;
 }
 
-void Accessible::FindWordSeparationsUtf8(const utf8_t* s, size_t length, const char* language, char* breaks)
+bool Accessible::IsProxy() const
 {
-    set_wordbreaks_utf8(s, length, language, breaks);
+  return false;
 }
 
-void Accessible::FindLineSeparationsUtf8(const utf8_t* s, size_t length, const char* language, char* breaks)
+void Accessible::NotifyAccessibilityStateChange(Dali::Accessibility::States states, bool isRecursive)
 {
-    set_linebreaks_utf8(s, length, language, breaks);
+  if(auto data = GetBridgeData())
+  {
+    for(auto i = 0u; i < static_cast<unsigned int>(Dali::Accessibility::State::MAX_COUNT); i++)
+    {
+      auto index = static_cast<Dali::Accessibility::State>(i);
+      if(states[index])
+      {
+        data->mBridge->EmitStateChanged(this, index, GetStates()[index], 0);
+      }
+    }
+
+    if(isRecursive)
+    {
+      auto children = GetChildren();
+      for(auto iter : children)
+      {
+        iter->NotifyAccessibilityStateChange(states, isRecursive);
+      }
+    }
+  }
 }