[AT-SPI] Fix not working screen reader when rerunning it 95/271295/1
authorSeoyeon Kim <seoyeon2.kim@samsung.com>
Mon, 29 Nov 2021 08:02:20 +0000 (17:02 +0900)
committerShinwoo Kim <cinoo.kim@samsung.com>
Fri, 18 Feb 2022 02:31:20 +0000 (11:31 +0900)
[Reproduce Steps]
 1. Screen Reader ON
 2. Run any application
 3. Turn Screen Reader OFF
 4. Turn Screen Reader ON

- It is caused by NULL windowAccessible which is returned
 by following function used by EmitActivate()
 Dali::Accessibility::Accessible* GetWindowAccessible(Dali::Window window)

- Connected Enabled / Disabled signals to Window
 so that Window can add and remove itself from bridge
 when the state of bridge changes.

Change-Id: I3bdebedd7bf4f9017d24b72999412a0f70cfd24b
Signed-off-by: Seoyeon Kim <seoyeon2.kim@samsung.com>
dali/internal/accessibility/bridge/bridge-impl.cpp
dali/internal/window-system/common/window-impl.cpp
dali/internal/window-system/common/window-impl.h

index 5962576..8f72698 100644 (file)
@@ -319,6 +319,8 @@ public:
 
     mApplication.mParent.SetAddress(std::move(std::get<0>(res)));
 
+    mEnabledSignal.Emit();
+
     if(mIsShown)
     {
       auto rootLayer = Dali::Stage::GetCurrent().GetRootLayer();
@@ -326,8 +328,6 @@ public:
       EmitActivate(window); // Currently, sends a signal that the default window is activated here.
     }
 
-    mEnabledSignal.Emit();
-
     return ForceUpResult::JUST_STARTED;
   }
 
index f682484..f6c4c62 100644 (file)
@@ -101,7 +101,7 @@ Window::~Window()
 {
   auto bridge     = Accessibility::Bridge::GetCurrentBridge();
   auto rootLayer  = mScene.GetRootLayer();
-  auto accessible = Accessibility::Accessible::Get(rootLayer);
+  auto accessible = Accessibility::Accessible::Get(rootLayer, true);
   bridge->RemoveTopLevelWindow(accessible);
 
   if(mAdaptor)
@@ -179,6 +179,9 @@ void Window::OnAdaptorSet(Dali::Adaptor& adaptor)
   auto accessible = Accessibility::Accessible::Get(rootLayer, true);
   bridge->AddTopLevelWindow(accessible);
 
+  bridge->EnabledSignal().Connect(this, &Window::OnAccessibilityEnabled);
+  bridge->DisabledSignal().Connect(this, &Window::OnAccessibilityDisabled);
+
   // If you call the 'Show' before creating the adaptor, the application cannot know the app resource id.
   // The show must be called after the adaptor is initialized.
   Show();
@@ -865,6 +868,22 @@ void Window::OnAuxiliaryMessage(const std::string& key, const std::string& value
   mAuxiliaryMessageSignal.Emit(key, value, options);
 }
 
+void Window::OnAccessibilityEnabled()
+{
+  auto bridge     = Accessibility::Bridge::GetCurrentBridge();
+  auto rootLayer  = mScene.GetRootLayer();
+  auto accessible = Accessibility::Accessible::Get(rootLayer, true);
+  bridge->AddTopLevelWindow(accessible);
+}
+
+void Window::OnAccessibilityDisabled()
+{
+  auto bridge     = Accessibility::Bridge::GetCurrentBridge();
+  auto rootLayer  = mScene.GetRootLayer();
+  auto accessible = Accessibility::Accessible::Get(rootLayer, true);
+  bridge->RemoveTopLevelWindow(accessible);
+}
+
 void Window::RecalculateTouchPosition(Integration::Point& point)
 {
   Vector2 position = point.GetScreenPosition();
index af5263c..3ea83ab 100644 (file)
@@ -503,6 +503,20 @@ private:
   void OnAuxiliaryMessage(const std::string& key, const std::string& value, const Property::Array& options);
 
   /**
+   * @brief Called when Accessibility is enabled.
+   *
+   * This method is to register the window to accessibility bridge.
+   */
+  void OnAccessibilityEnabled();
+
+  /**
+   * @brief Called when Accessibility is disabled.
+   *
+   * This method is to remove the window from accessibility bridge.
+   */
+  void OnAccessibilityDisabled();
+
+  /**
    * @brief Set available orientation to window base.
    */
   void SetAvailableAnlges(const std::vector<int>& angles);