[AT-SPI] Implement accessibility for Popup
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / popup / popup-impl.cpp
index 42b1083..8e18342 100644 (file)
 #include <dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h>
 #include <dali-toolkit/public-api/controls/control-impl.h>
 #include <dali-toolkit/public-api/controls/image-view/image-view.h>
-#include <dali-toolkit/devel-api/accessibility-manager/accessibility-manager.h>
 #include <dali-toolkit/public-api/visuals/color-visual-properties.h>
 #include <dali-toolkit/public-api/visuals/visual-properties.h>
 #include <dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h>
+#include <dali-toolkit/internal/controls/control/control-data-impl.h>
 
 using namespace Dali;
 
@@ -338,6 +338,11 @@ void Popup::OnInitialize()
   SetAsKeyboardFocusGroup( true );
 
   SetupTouch();
+
+  DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor)
+  {
+    return std::unique_ptr<Dali::Accessibility::Accessible>(new AccessibleImpl(actor, Dali::Accessibility::Role::DIALOG, true));
+  });
 }
 
 Popup::~Popup()
@@ -563,8 +568,11 @@ void Popup::DisplayStateChangeComplete()
 
 bool Popup::OnAutoHideTimeReached()
 {
-  // Display timer has expired, auto hide the popup exactly as if the user had clicked outside.
-  SetDisplayState( Toolkit::Popup::HIDDEN );
+  if (!Dali::Accessibility::IsUp() || true) // TODO: remove 'true' in sync with EFL (UX change)
+  {
+    // Display timer has expired, auto hide the popup exactly as if the user had clicked outside.
+    SetDisplayState( Toolkit::Popup::HIDDEN );
+  }
 
   if( mAutoHideTimer )
   {
@@ -713,6 +721,18 @@ void Popup::SetDisplayState( Toolkit::Popup::DisplayState displayState )
     return;
   }
 
+  auto *accessible = Dali::Accessibility::Accessible::Get(Self());
+  if (display)
+  {
+    Dali::Accessibility::Bridge::GetCurrentBridge()->AddPopup(accessible);
+    accessible->EmitStateChanged(Dali::Accessibility::State::SHOWING, 1, 0);
+  }
+  else
+  {
+    accessible->EmitStateChanged(Dali::Accessibility::State::SHOWING, 0, 0);
+    Dali::Accessibility::Bridge::GetCurrentBridge()->RemovePopup(accessible);
+  }
+
   // Convert the bool state to the actual display state to use.
   mDisplayState = display ? Toolkit::Popup::SHOWING : Toolkit::Popup::HIDING;
 
@@ -1963,21 +1983,32 @@ void Popup::SetupTouch()
   if( ! mTouchTransparent )
   {
     // Connect all the signals and set us up to consume all touch events
-    mBacking.TouchSignal().Connect( this, &Popup::OnBackingTouched );
-    mPopupBackgroundImage.TouchSignal().Connect( this, &Popup::OnDialogTouched );
-    mPopupLayout.TouchSignal().Connect( this, &Popup::OnDialogTouched );
+    mBacking.TouchedSignal().Connect( this, &Popup::OnBackingTouched );
+    mPopupBackgroundImage.TouchedSignal().Connect( this, &Popup::OnDialogTouched );
+    mPopupLayout.TouchedSignal().Connect( this, &Popup::OnDialogTouched );
     mLayer.SetProperty( Layer::Property::CONSUMES_TOUCH, true );
   }
   else
   {
     // We are touch transparent so disconnect all signals and ensure our layer does not consumed all touch events
-    mBacking.TouchSignal().Disconnect( this, &Popup::OnBackingTouched );
-    mPopupBackgroundImage.TouchSignal().Disconnect( this, &Popup::OnDialogTouched );
-    mPopupLayout.TouchSignal().Disconnect( this, &Popup::OnDialogTouched );
+    mBacking.TouchedSignal().Disconnect( this, &Popup::OnBackingTouched );
+    mPopupBackgroundImage.TouchedSignal().Disconnect( this, &Popup::OnDialogTouched );
+    mPopupLayout.TouchedSignal().Disconnect( this, &Popup::OnDialogTouched );
     mLayer.SetProperty( Layer::Property::CONSUMES_TOUCH, false );
   }
 }
 
+Dali::Accessibility::States Popup::AccessibleImpl::CalculateStates()
+{
+  auto states = Control::Impl::AccessibleImpl::CalculateStates();
+  auto popup = Toolkit::Popup::DownCast(self);
+  auto displayState = popup.GetProperty<std::string>(Toolkit::Popup::Property::DISPLAY_STATE);
+
+  states[Dali::Accessibility::State::SHOWING] = (displayState == "SHOWN" || displayState == "SHOWING");
+
+  return states;
+}
+
 } // namespace Internal
 
 } // namespace Toolkit