[dali_2.3.42] Merge branch 'devel/master'
[platform/core/uifw/dali-adaptor.git] / dali / internal / accessibility / bridge / bridge-base.h
index 81a6dfb..8b6d95b 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_ACCESSIBILITY_BRIDGE_BASE_H
 
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -21,6 +21,7 @@
 // EXTERNAL INCLUDES
 #include <dali/public-api/actors/layer.h>
 #include <dali/public-api/dali-adaptor-version.h>
+#include <dali/public-api/object/weak-handle.h>
 #include <dali/public-api/signals/connection-tracker.h>
 #include <memory>
 #include <tuple>
@@ -49,6 +50,7 @@ public:
   std::string                                   mName;
   std::string                                   mToolkitName{"dali"};
   bool                                          mIsEmbedded{false};
+  bool                                          mShouldIncludeHidden{false};
 
   std::string GetName() const override
   {
@@ -57,7 +59,12 @@ public:
 
   std::string GetDescription() const override
   {
-    return "";
+    return {};
+  }
+
+  std::string GetValue() const override
+  {
+    return {};
   }
 
   Dali::Accessibility::Accessible* GetParent() override
@@ -159,7 +166,7 @@ public:
     return {};
   }
 
-  Dali::Actor GetInternalActor() override
+  Dali::Actor GetInternalActor() const override
   {
     return Dali::Actor{};
   }
@@ -181,6 +188,21 @@ public:
     return std::to_string(Dali::ADAPTOR_MAJOR_VERSION) + "." + std::to_string(Dali::ADAPTOR_MINOR_VERSION);
   }
 
+  bool GetIncludeHidden() const override
+  {
+    return mShouldIncludeHidden;
+  }
+
+  bool SetIncludeHidden(bool includeHidden) override
+  {
+    if(mShouldIncludeHidden != includeHidden)
+    {
+      mShouldIncludeHidden = includeHidden;
+      return true;
+    }
+    return false;
+  }
+
   // Socket
 
   Dali::Accessibility::Address Embed(Dali::Accessibility::Address plug) override
@@ -282,9 +304,13 @@ public:
  */
 enum class CoalescableMessages
 {
-  BOUNDS_CHANGED, ///< Bounds changed
-  SET_OFFSET, ///< Set offset
-  POST_RENDER, ///< Post render
+  BOUNDS_CHANGED,                                     ///< Bounds changed
+  SET_OFFSET,                                         ///< Set offset
+  POST_RENDER,                                        ///< Post render
+  STATE_CHANGED_BEGIN = 500,                          ///< State changed (begin of reserved range)
+  STATE_CHANGED_END   = STATE_CHANGED_BEGIN + 99,     ///< State changed (end of reserved range)
+  PROPERTY_CHANGED_BEGIN,                             ///< Property changed (begin of reserved range)
+  PROPERTY_CHANGED_END = PROPERTY_CHANGED_BEGIN + 99, ///< Property changed (end of reserved range)
 };
 
 // Custom specialization of std::hash
@@ -359,17 +385,17 @@ public:
   /**
    * @copydoc Dali::Accessibility::Bridge::RegisterDefaultLabel()
    */
-  void RegisterDefaultLabel(Dali::Accessibility::Accessible* object) override;
+  void RegisterDefaultLabel(std::shared_ptr<Dali::Accessibility::Accessible> object) override;
 
   /**
    * @copydoc Dali::Accessibility::Bridge::UnregisterDefaultLabel()
    */
-  void UnregisterDefaultLabel(Dali::Accessibility::Accessible* object) override;
+  void UnregisterDefaultLabel(std::shared_ptr<Dali::Accessibility::Accessible> object) override;
 
   /**
    * @copydoc Dali::Accessibility::Bridge::GetDefaultLabel()
    */
-  Dali::Accessibility::Accessible* GetDefaultLabel(Dali::Accessibility::Accessible* root) const override;
+  Dali::Accessibility::Accessible* GetDefaultLabel(Dali::Accessibility::Accessible* root) override;
 
   /**
    * @copydoc Dali::Accessibility::Bridge::GetApplication()
@@ -612,9 +638,13 @@ public:
   }
 
 protected:
-  mutable ApplicationAccessible                 mApplication;
-  std::vector<Dali::Accessibility::Accessible*> mDefaultLabels;
-  bool                                          mIsScreenReaderSuppressed = false;
+  // We use a weak handle in order not to keep a window alive forever if someone forgets to UnregisterDefaultLabel()
+  using DefaultLabelType  = std::pair<Dali::WeakHandle<Dali::Window>, std::weak_ptr<Dali::Accessibility::Accessible>>;
+  using DefaultLabelsType = std::list<DefaultLabelType>;
+
+  mutable ApplicationAccessible mApplication;
+  DefaultLabelsType             mDefaultLabels;
+  bool                          mIsScreenReaderSuppressed = false;
 
 private:
   /**
@@ -664,6 +694,19 @@ private:
    */
   CacheElementType CreateCacheElement(Dali::Accessibility::Accessible* item);
 
+  /**
+   * @brief Removes expired elements from the default label collection.
+   */
+  void CompressDefaultLabels();
+
+  /**
+   * @brief Gets the window to which this accessible belongs (or an empty handle).
+   *
+   * @param accessible The accessible
+   * @return The window
+   */
+  static Dali::WeakHandle<Dali::Window> GetWindow(Dali::Accessibility::Accessible* accessible);
+
 protected:
   BridgeBase();
   virtual ~BridgeBase();