summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Kobec <s.kobec@samsung.com>2017-03-14 14:01:34 +0200
committerSergei Kobec <s.kobec@samsung.com>2017-03-15 15:11:10 +0200
commit9a9aed426790d5f72a4946a202a278faba2bfe6e (patch)
treeaf166bda1bf123f98236e5a94e510bc16f7f7e02
parent6c802c11b2dd74f8d3a3d83f0b754112b3609437 (diff)
downloadalarm-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.cpp5
-rw-r--r--lib-apps-common/inc/Ui/Accessibility.h11
-rw-r--r--lib-apps-common/inc/Ux/CircleSelector.h24
-rw-r--r--lib-apps-common/src/Ui/Accessibility.cpp6
-rw-r--r--lib-apps-common/src/Ux/CircleSelector.cpp45
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);
}