diff options
author | Sergei Kobec <s.kobec@samsung.com> | 2017-03-14 14:01:34 +0200 |
---|---|---|
committer | Sergei Kobec <s.kobec@samsung.com> | 2017-03-15 15:11:10 +0200 |
commit | 9a9aed426790d5f72a4946a202a278faba2bfe6e (patch) | |
tree | af166bda1bf123f98236e5a94e510bc16f7f7e02 | |
parent | 6c802c11b2dd74f8d3a3d83f0b754112b3609437 (diff) | |
download | alarm-9a9aed426790d5f72a4946a202a278faba2bfe6e.tar.gz alarm-9a9aed426790d5f72a4946a202a278faba2bfe6e.tar.bz2 alarm-9a9aed426790d5f72a4946a202a278faba2bfe6e.zip |
TizenRefApp-8119 Implement Screen Reader functionality for the "Select Mode" View
Change-Id: I703fa36686cb18821d3cb193776271248f0a540d
Signed-off-by: Sergei Kobec <s.kobec@samsung.com>
-rw-r--r-- | alarm-app/src/List/AlarmsView.cpp | 5 | ||||
-rw-r--r-- | lib-apps-common/inc/Ui/Accessibility.h | 11 | ||||
-rw-r--r-- | lib-apps-common/inc/Ux/CircleSelector.h | 24 | ||||
-rw-r--r-- | lib-apps-common/src/Ui/Accessibility.cpp | 6 | ||||
-rw-r--r-- | lib-apps-common/src/Ux/CircleSelector.cpp | 45 |
5 files changed, 88 insertions, 3 deletions
diff --git a/alarm-app/src/List/AlarmsView.cpp b/alarm-app/src/List/AlarmsView.cpp index 45a6e8d..d492de7 100644 --- a/alarm-app/src/List/AlarmsView.cpp +++ b/alarm-app/src/List/AlarmsView.cpp @@ -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; diff --git a/lib-apps-common/inc/Ui/Accessibility.h b/lib-apps-common/inc/Ui/Accessibility.h index f37b567..af6e0c3 100644 --- a/lib-apps-common/inc/Ui/Accessibility.h +++ b/lib-apps-common/inc/Ui/Accessibility.h @@ -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 */ diff --git a/lib-apps-common/inc/Ux/CircleSelector.h b/lib-apps-common/inc/Ux/CircleSelector.h index 4b21c78..cd87d39 100644 --- a/lib-apps-common/inc/Ux/CircleSelector.h +++ b/lib-apps-common/inc/Ux/CircleSelector.h @@ -25,13 +25,37 @@ namespace Ux { 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; }; } diff --git a/lib-apps-common/src/Ui/Accessibility.cpp b/lib-apps-common/src/Ui/Accessibility.cpp index 2a1af87..59a0629 100644 --- a/lib-apps-common/src/Ui/Accessibility.cpp +++ b/lib-apps-common/src/Ui/Accessibility.cpp @@ -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)); +} diff --git a/lib-apps-common/src/Ux/CircleSelector.cpp b/lib-apps-common/src/Ux/CircleSelector.cpp index d3f9d29..c9380cc 100644 --- a/lib-apps-common/src/Ux/CircleSelector.cpp +++ b/lib-apps-common/src/Ux/CircleSelector.cpp @@ -15,13 +15,20 @@ */ #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); } |