[AT-SPI] Implement accessibility for Popup 28/244828/14
authorArtur Świgoń <a.swigon@samsung.com>
Thu, 24 Sep 2020 15:38:23 +0000 (17:38 +0200)
committerArtur Świgoń <a.swigon@samsung.com>
Fri, 23 Oct 2020 13:07:00 +0000 (15:07 +0200)
Change-Id: I9afe522913bfaacd5f6bf66e5abe0cd815d7c8af

dali-toolkit/internal/controls/popup/popup-impl.cpp
dali-toolkit/internal/controls/popup/popup-impl.h
dali-toolkit/internal/controls/tooltip/tooltip.cpp

index 94a0ead..8e18342 100644 (file)
@@ -339,16 +339,14 @@ void Popup::OnInitialize()
 
   SetupTouch();
 
-  DevelControl::SetAccessibilityConstructor( self, []( Dali::Actor actor ) {
-    return std::unique_ptr< Dali::Accessibility::Accessible >(
-      new Control::Impl::AccessibleImpl( actor, Dali::Accessibility::Role::DIALOG, true ) );
-  } );
+  DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor)
+  {
+    return std::unique_ptr<Dali::Accessibility::Accessible>(new AccessibleImpl(actor, Dali::Accessibility::Role::DIALOG, true));
+  });
 }
 
 Popup::~Popup()
 {
-  if( DevelControl::GetBoundAccessibilityObject( Self() ) )
-    Accessibility::Bridge::GetCurrentBridge()->RemovePopup( DevelControl::GetBoundAccessibilityObject( Self() ) );
   mEntryAnimationData.Clear();
   mExitAnimationData.Clear();
 }
@@ -570,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 )
   {
@@ -720,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;
 
@@ -1572,21 +1585,12 @@ bool Popup::OnDialogTouched( Actor actor, const TouchEvent& touch )
   return false;
 }
 
-void Popup::OnSceneDisconnection()
-{
-  auto p = Dali::Accessibility::Accessible::Get(Self());
-  Accessibility::Bridge::GetCurrentBridge()->RemovePopup( p );
-  Control::OnSceneDisconnection();
-}
-
 void Popup::OnSceneConnection( int depth )
 {
   mLayoutDirty = true;
   RelayoutRequest();
 
   Control::OnSceneConnection( depth );
-  auto p = Dali::Accessibility::Accessible::Get(Self());
-  Accessibility::Bridge::GetCurrentBridge()->AddPopup( p );
 }
 
 void Popup::OnChildAdd( Actor& child )
@@ -1994,6 +1998,17 @@ void Popup::SetupTouch()
   }
 }
 
+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
index 8c60d40..359570b 100644 (file)
@@ -28,6 +28,7 @@
 #include <dali-toolkit/public-api/controls/control-impl.h>
 #include <dali-toolkit/devel-api/controls/table-view/table-view.h>
 #include <dali-toolkit/devel-api/controls/popup/popup.h>
+#include <dali-toolkit/internal/controls/control/control-data-impl.h>
 
 namespace Dali
 {
@@ -244,6 +245,12 @@ public:
   static Property::Value GetProperty( BaseObject* object, Property::Index propertyIndex );
 
 protected:
+  struct AccessibleImpl : public Control::Impl::AccessibleImpl
+  {
+    using Control::Impl::AccessibleImpl::AccessibleImpl;
+
+    Dali::Accessibility::States CalculateStates() override;
+  };
 
   /**
    * Construct a new Popup.
@@ -438,7 +445,6 @@ private:
    * Called when the popup is directly or indirectly parented to the stage.
    */
   void OnSceneConnection( int depth ) override;
-  void OnSceneDisconnection() override;
 
   /**
    * From Control; called after a child has been added to the owning actor.
index e7f8b9f..3a2ccc0 100644 (file)
@@ -277,7 +277,7 @@ void Tooltip::SetContent( Toolkit::Control& control, const Property::Value& valu
     if( value.Get( text ) )
     {
       mContentTextVisual[ Toolkit::TextVisual::Property::TEXT ] = text;
-      mContentTextVisual[ Toolkit::Visual::Property::TYPE ] = Visual::TEXT;
+      mContentTextVisual[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::TEXT;
       mContentArray.Clear();
       connectSignals = true;
     }