TizenRefApp-8119 Implement Screen Reader functionality for the "Select Mode" View 13/117813/9
authorSergei Kobec <s.kobec@samsung.com>
Tue, 14 Mar 2017 12:01:34 +0000 (14:01 +0200)
committerSergei Kobec <s.kobec@samsung.com>
Wed, 15 Mar 2017 13:11:10 +0000 (15:11 +0200)
Change-Id: I703fa36686cb18821d3cb193776271248f0a540d
Signed-off-by: Sergei Kobec <s.kobec@samsung.com>
alarm-app/src/List/AlarmsView.cpp
lib-apps-common/inc/Ui/Accessibility.h
lib-apps-common/inc/Ux/CircleSelector.h
lib-apps-common/src/Ui/Accessibility.cpp
lib-apps-common/src/Ux/CircleSelector.cpp

index 45a6e8d05a64dc3713a26b8a8b0a0d3319d4c8dd..d492de7a53d6fed153478056a161521abb522125 100644 (file)
@@ -137,6 +137,11 @@ Ux::MultiSelector *AlarmsView::createMultiSelector()
 {
        auto multiSelector = new Ux::CircleSelector();
        multiSelector->create(m_ContentLayout);
+       multiSelector->setAccessibilityStrings({
+                       "WDS_TTS_TBOPT_SELECT_MODE_POP_UP",
+                       "WDS_TTS_TBBODY_DOUBLE_TAP_TO_CLOSE_THE_POP_UP",
+                       "WDS_TTS_TBBODY_DOUBLE_TAP_TO_SELECT_ALL",
+                       "WDS_TTS_TBBODY_DOUBLE_TAP_TO_DESELECT_ALL" });
        elm_object_part_content_set(m_ContentLayout, "elm.swallow.icon", multiSelector->getEvasObject());
 
        return multiSelector;
index f37b567aae5b4b39dfdc75e364acad0808fa79d7..af6e0c3f248d07dc762920e881d77b3dede8c2df 100644 (file)
@@ -59,6 +59,17 @@ namespace Ui
         * @return Accessible object.
         */
        EXPORT_API Evas_Object *createTextAccessObject(Evas_Object *layout, const char *part);
+
+       /**
+        * @brief ATSPI reading information callback @ref Elm_Atspi_Reading_Info_Cb.
+        * @remark Depend on user pass translatable string in elm_atspi_accessible_*_cb_set functions as user data.
+        * @param[in]   text    Translatable string
+        * @param[in]   obj     Evas object, which was set this callback
+        * @return Newly constructed string.
+        * @see elm_atspi_accessible_name_cb_set().
+        * @see elm_atspi_accessible_description_cb_set().
+        */
+       EXPORT_API char *getTranslatableAccessText(void *text, Evas_Object *obj);
 }
 
 #endif /* UI_ACCESSIBILITY_H */
index 4b21c782ca884b370d0ee2cc7b2733db24d19edd..cd87d3963071be8dfe530c3db80260802573adb1 100644 (file)
@@ -24,14 +24,38 @@ namespace Ux
        class EXPORT_API CircleSelector : public Ux::MultiSelector
        {
        public:
+               /**
+                * @brief Structure with information, that should be pronounced by accessibility engine.
+                */
+               struct AccessibilityStrings
+               {
+                       const char *name;                   /**< Selector name. */
+                       const char *description;            /**< Selector description. */
+                       const char *selectAllDescription;   /**< Description for "Select all" item. */
+                       const char *deselectAllDescription; /**< Description for "Deselect all" item. */
+               };
+
+               CircleSelector();
+
                /**
                 * @brief Set count of selected items.
                 */
                void setCount(size_t count);
 
+               /**
+                * @brief Set accessibility strings.
+                * @param[in]   strings Accessibility strings.
+                * @see AccessibilityStrings.
+                */
+               void setAccessibilityStrings(const AccessibilityStrings &strings);
+
        private:
                virtual Evas_Object *onCreate(Evas_Object *parent) override;
                void onButtonClicked(Evas_Object *button, void *eventInfo);
+               void makeAccessible(Evas_Object *menu);
+               void makeAccessible(Elm_Object_Item *item, const char *description);
+
+               AccessibilityStrings m_AccessibilityStrings;
        };
 }
 
index 2a1af87a654c96c3a7254bd861a152fe2a093adb..59a06297665adb1c06418449bfb3b0746a762a5c 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include "Ui/Accessibility.h"
+#include <app_i18n.h>
 
 using namespace Ui;
 
@@ -51,3 +52,8 @@ Evas_Object *Ui::createTextAccessObject(Evas_Object *layout, const char *part)
        elm_atspi_accessible_reading_info_type_set(obj, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
        return obj;
 }
+
+char *Ui::getTranslatableAccessText(void *text, Evas_Object *obj)
+{
+       return strdup(_((const char *)text));
+}
index d3f9d299c06d48232aa7f3e95ba361ba9a1bc64e..c9380cc78e4565a81d49859bb696a11e5078b927 100644 (file)
  */
 
 #include "Ux/CircleSelector.h"
+#include "Ui/Accessibility.h"
 #include "Ui/CircleMenu.h"
 #include "Utils/Callback.h"
 
 #define BUF_SIZE 8
 
+using namespace Ui;
 using namespace Ux;
 
+CircleSelector::CircleSelector()
+       : m_AccessibilityStrings{ nullptr }
+{
+}
+
 void CircleSelector::setCount(size_t count)
 {
        char buf[BUF_SIZE];
@@ -29,6 +36,11 @@ void CircleSelector::setCount(size_t count)
        elm_object_text_set(getEvasObject(), buf);
 }
 
+void CircleSelector::setAccessibilityStrings(const AccessibilityStrings &strings)
+{
+       m_AccessibilityStrings = strings;
+}
+
 Evas_Object *CircleSelector::onCreate(Evas_Object *parent)
 {
        auto button = elm_button_add(parent);
@@ -42,18 +54,45 @@ Evas_Object *CircleSelector::onCreate(Evas_Object *parent)
 
 void CircleSelector::onButtonClicked(Evas_Object *button, void *eventInfo)
 {
-       auto menu = new Ui::CircleMenu();
+       auto menu = new CircleMenu();
        menu->create(button);
 
        if (getState() != SelectedAll) {
-               menu->addItem(getStrings().selectAll, [this] {
+               auto item = menu->addItem(getStrings().selectAll, [this] {
                        notifyChanged(SelectedAll);
                });
+               makeAccessible(item, m_AccessibilityStrings.selectAllDescription);
        }
        if (getState() != SelectedNone) {
-               menu->addItem(getStrings().deselectAll, [this] {
+               auto item = menu->addItem(getStrings().deselectAll, [this] {
                        notifyChanged(SelectedNone);
                });
+               makeAccessible(item, m_AccessibilityStrings.deselectAllDescription);
        }
        menu->show();
+
+       makeAccessible(menu->getEvasObject());
+}
+
+void CircleSelector::makeAccessible(Evas_Object *menu)
+{
+       elm_atspi_accessible_reading_info_type_set(menu, Elm_Accessible_Reading_Info_Type(
+                       ELM_ACCESSIBLE_READING_INFO_TYPE_NAME |
+                       ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION));
+       //FIXME Use default role when menu odd information pronunciation will be fixed
+       elm_atspi_accessible_role_set(menu, ELM_ATSPI_ROLE_PUSH_BUTTON);
+       elm_atspi_accessible_name_cb_set(menu, getTranslatableAccessText, m_AccessibilityStrings.name);
+       elm_atspi_accessible_description_cb_set(menu, getTranslatableAccessText, m_AccessibilityStrings.description);
+
+       elm_access_action_cb_set(menu, ELM_ACCESS_ACTION_ACTIVATE,
+               [](void *, Evas_Object *obj, Elm_Access_Action_Info *) {
+                       elm_ctxpopup_dismiss(obj);
+                       return EINA_TRUE;
+               }, nullptr);
+}
+
+void CircleSelector::makeAccessible(Elm_Object_Item *item, const char *description)
+{
+       elm_atspi_accessible_reading_info_type_set(item, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+       elm_atspi_accessible_description_cb_set(item, getTranslatableAccessText, description);
 }