diff options
author | Eugene Kurzberg <i.kurtsberg@samsung.com> | 2017-08-07 11:43:56 +0300 |
---|---|---|
committer | Eugene Kurzberg <i.kurtsberg@samsung.com> | 2017-08-07 11:44:08 +0300 |
commit | 0ede350b6cd10b1c55a7705f016e52e833ea37c1 (patch) | |
tree | e892d3a2678a4e231e77c45fe4c085e205404fb5 | |
parent | 3c62201e600b6d77f3f5ec81a017564ce2ee2357 (diff) | |
download | alarm-0ede350b6cd10b1c55a7705f016e52e833ea37c1.tar.gz alarm-0ede350b6cd10b1c55a7705f016e52e833ea37c1.tar.bz2 alarm-0ede350b6cd10b1c55a7705f016e52e833ea37c1.zip |
TizenRefApp-8117 Implement Screen Reader functionality in the Widget
Change-Id: Ic3573e6cfdc00c20ad53f98c0f89b345d2bf3efd
-rw-r--r-- | alarm-app/src/List/AlarmItem.cpp | 12 | ||||
-rw-r--r-- | alarm-widget/inc/AlarmWidget.h | 4 | ||||
-rw-r--r-- | alarm-widget/res/widget/edje/WidgetLayout.h | 3 | ||||
-rw-r--r-- | alarm-widget/res/widget/edje/widget-layout.edc | 17 | ||||
-rw-r--r-- | alarm-widget/src/AlarmWidget.cpp | 39 | ||||
-rw-r--r-- | lib-apps-common/inc/Ui/Accessibility.h | 14 | ||||
-rw-r--r-- | lib-common/inc/Common/Format.h | 8 | ||||
-rw-r--r-- | lib-common/src/Common/Format.cpp | 14 |
8 files changed, 87 insertions, 24 deletions
diff --git a/alarm-app/src/List/AlarmItem.cpp b/alarm-app/src/List/AlarmItem.cpp index 6573d36..5028c4b 100644 --- a/alarm-app/src/List/AlarmItem.cpp +++ b/alarm-app/src/List/AlarmItem.cpp @@ -94,17 +94,7 @@ Evas_Object *AlarmItem::getContent(Evas_Object *parent, const char *part) char *AlarmItem::getAccessibleName(Evas_Object *obj) { auto &alarm = getDataItem<Alarm>(); - - std::string name; - name.append(Common::formatTime(alarm.getDate())); - name.append(", "); - - if (alarm.getRepeat()) { - name.append(Common::formatVerbalRepeat(alarm.getRepeat())); - } else { - name.append(Common::formatVerbalDate(alarm.getDate())); - } - return strdup(name.c_str()); + return strdup(Common::formatVerbalDescription(alarm.getDate(), alarm.getRepeat()).c_str()); } void AlarmItem::onInserted() diff --git a/alarm-widget/inc/AlarmWidget.h b/alarm-widget/inc/AlarmWidget.h index 56feea8..c33dc48 100644 --- a/alarm-widget/inc/AlarmWidget.h +++ b/alarm-widget/inc/AlarmWidget.h @@ -49,8 +49,8 @@ private: void updateContentLayout(int changes); void updateEmptyState(); void onCheckedPressed(Evas_Object *obj, void *eventInfo); - void onCreatePressed(Evas_Object *obj, void *eventInfo); - void onContentPressed(Evas_Object *obj, void *eventInfo); + void onCreatePressed(); + void onContentPressed(); void onPickReply(app_control_h request, app_control_h reply, app_control_result_e result); void onCreateReply(app_control_h request, app_control_h reply, app_control_result_e result); diff --git a/alarm-widget/res/widget/edje/WidgetLayout.h b/alarm-widget/res/widget/edje/WidgetLayout.h index 76ca983..2acdc71 100644 --- a/alarm-widget/res/widget/edje/WidgetLayout.h +++ b/alarm-widget/res/widget/edje/WidgetLayout.h @@ -26,6 +26,9 @@ #define PART_TIME "text.time" #define PART_REPEAT "text.repeat" #define PART_ON_OFF "swallow.on_off" +#define PART_EVENT "rect.event" +#define PART_ACCESS "rect.access" + #define SIGNAL_ALARM_ENABLE "state,alarm,enabled" #define SIGNAL_ALARM_DISABLE "state,alarm,disabled" diff --git a/alarm-widget/res/widget/edje/widget-layout.edc b/alarm-widget/res/widget/edje/widget-layout.edc index 6341cd5..9a4ce63 100644 --- a/alarm-widget/res/widget/edje/widget-layout.edc +++ b/alarm-widget/res/widget/edje/widget-layout.edc @@ -217,6 +217,18 @@ collections { text.style: "time_disabled_style"; } } + rect { PART_ACCESS; + desc { "default"; + rel1.to: PART_REPEAT; + rel2.to: "spacer.on_off.top"; + color: 0 0 0 0; + } + } + rect { PART_EVENT; + desc { "default"; + color: 0 0 0 0; + } + } spacer { "spacer.on_off.top"; scale; desc { "default"; fixed: 0 1; @@ -225,11 +237,6 @@ collections { rel2.relative: 1.0 0.0; } } - rect { "rect.event"; - desc { "default"; - color: 0 0 0 0; - } - } swallow { PART_ON_OFF; scale; desc { "default"; fixed: 1 1; diff --git a/alarm-widget/src/AlarmWidget.cpp b/alarm-widget/src/AlarmWidget.cpp index 2473960..662ebc0 100644 --- a/alarm-widget/src/AlarmWidget.cpp +++ b/alarm-widget/src/AlarmWidget.cpp @@ -15,12 +15,14 @@ */ #include "AlarmWidget.h" -#include "App/AppControl.h" -#include "App/AppControlUtils.h" -#include "App/Path.h" #include "Common/Format.h" #include "Common/Model/Alarm.h" #include "Common/Model/AlarmConsumer.h" + +#include "App/AppControl.h" +#include "App/AppControlUtils.h" +#include "App/Path.h" +#include "Ui/Accessibility.h" #include "Ui/Window.h" #include "Utils/Bundle.h" #include "Utils/Callback.h" @@ -68,15 +70,32 @@ Evas_Object *AlarmWidget::createContentLayout(Evas_Object *parent) { Evas_Object *layout = elm_layout_add(parent); elm_layout_file_set(layout, App::getResourcePath(PATH_WIDGET_LAYOUT).c_str(), LAYOUT_ALARM); - elm_layout_signal_callback_add(layout, "mouse,clicked,*", "rect.event", + elm_layout_signal_callback_add(layout, "mouse,clicked,*", PART_EVENT, (Edje_Signal_Cb) makeCallback(&AlarmWidget::onContentPressed), this); + Evas_Object *accessObject = Ui::createPartAccessObject(layout, PART_ACCESS); + elm_atspi_accessible_reading_info_type_set(accessObject, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME); + elm_atspi_accessible_name_cb_set(accessObject, + [](void *data, Evas_Object *) { + auto alarm = (Alarm *) data; + return strdup(formatVerbalDescription(alarm->getDate(), alarm->getRepeat()).c_str()); + }, m_Alarm); + elm_atspi_accessible_gesture_cb_set(accessObject, + ACCESS_CALLBACK(ELM_ATSPI_GESTURE_ONE_FINGER_DOUBLE_TAP, + auto widget = (AlarmWidget *) data; + widget->onContentPressed(); + ), this); + Evas_Object *check = elm_check_add(layout); evas_object_propagate_events_set(check, EINA_FALSE); elm_object_style_set(check, STYLE_CHECK_ALARM_ON_OFF); elm_object_part_content_set(layout, PART_ON_OFF, check); evas_object_smart_callback_add(check, "changed", makeCallback(&AlarmWidget::onCheckedPressed), this); + elm_atspi_accessible_role_set(check, ELM_ATSPI_ROLE_TOGGLE_BUTTON); + elm_atspi_accessible_translation_domain_set(check, TEXT_DOMAIN); + elm_atspi_accessible_name_set(check, "WDS_ALM_TBOPT_SWITCH"); + return layout; } @@ -88,6 +107,14 @@ Evas_Object *AlarmWidget::createEmptyLayout(Evas_Object *parent) (Edje_Signal_Cb) makeCallback(&AlarmWidget::onCreatePressed), this); elm_object_translatable_part_text_set(layout, PART_NO_ALARM_TEXT, "WDS_ALM_OPT_ADD_ALARM_ABB"); + elm_atspi_accessible_role_set(layout, ELM_ATSPI_ROLE_PUSH_BUTTON); + elm_atspi_accessible_translation_domain_set(layout, TEXT_DOMAIN); + elm_atspi_accessible_name_set(layout, "WDS_ALM_OPT_ADD_ALARM_ABB"); + elm_atspi_accessible_gesture_cb_set(layout, + ACCESS_CALLBACK(ELM_ATSPI_GESTURE_ONE_FINGER_DOUBLE_TAP, + auto widget = (AlarmWidget *) data; + widget->onCreatePressed(); + ), this); return layout; } @@ -133,7 +160,7 @@ void AlarmWidget::onCheckedPressed(Evas_Object *obj, void *eventInfo) elm_layout_signal_emit(m_Layout, m_Alarm->isEnabled() ? SIGNAL_ALARM_ENABLE : SIGNAL_ALARM_DISABLE, ""); } -void AlarmWidget::onCreatePressed(Evas_Object *obj, void *eventInfo) +void AlarmWidget::onCreatePressed() { AlarmConsumer::getInstance().getDataItems([this](AlarmConsumer::DataList dataList) { if (dataList.empty()) { @@ -152,7 +179,7 @@ void AlarmWidget::onCreatePressed(Evas_Object *obj, void *eventInfo) }); } -void AlarmWidget::onContentPressed(Evas_Object *obj, void *eventInfo) +void AlarmWidget::onContentPressed() { App::AppControl request(APP_CONTROL_OPERATION_EDIT, APP_CONTROL_MIME_ALARM); request.addExtra(APP_CONTROL_DATA_ID, std::to_string(m_Alarm->getId()).c_str()); diff --git a/lib-apps-common/inc/Ui/Accessibility.h b/lib-apps-common/inc/Ui/Accessibility.h index 01b85bb..6e23399 100644 --- a/lib-apps-common/inc/Ui/Accessibility.h +++ b/lib-apps-common/inc/Ui/Accessibility.h @@ -20,6 +20,20 @@ #include <Elementary.h> #include <tizen.h> +/** + * @brief Define accessibility callback for a certain gesture type. + * @param[in] gestureType Gesture to define callback for + * @param[in] body Callback body + */ +#define ACCESS_CALLBACK(gestureType, body) \ + [](void *data, Elm_Atspi_Gesture_Info gesture, Evas_Object *obj) { \ + if (gesture.type == gestureType) { \ + body \ + return EINA_TRUE; \ + } \ + return EINA_FALSE; \ + } + namespace Ui { /** diff --git a/lib-common/inc/Common/Format.h b/lib-common/inc/Common/Format.h index dc80557..0f1fa7a 100644 --- a/lib-common/inc/Common/Format.h +++ b/lib-common/inc/Common/Format.h @@ -84,6 +84,14 @@ namespace Common EXPORT_API const char *formatVerbalRepeat(int repeat); /** + * @brief Create verbal description of the alarm for Screen Reader. + * @param[in] date Alarm's date + * @param[in] repeat Alarm's repeat mask + * @return Formatted time and repeat/date verbal description. + */ + EXPORT_API std::string formatVerbalDescription(const tm &date, int repeat); + + /** * @brief Create "Alarm set for ... from now" message. * @param[in] date Alarm date * @return Formatted localized message. diff --git a/lib-common/src/Common/Format.cpp b/lib-common/src/Common/Format.cpp index b56ca2b..cb09d0f 100644 --- a/lib-common/src/Common/Format.cpp +++ b/lib-common/src/Common/Format.cpp @@ -167,6 +167,20 @@ const char *Common::formatVerbalRepeat(int repeat) return buffer.c_str(); } +std::string Common::formatVerbalDescription(const tm &date, int repeat) +{ + std::string desc; + desc.append(Common::formatTime(date)); + desc.append(", "); + + if (repeat) { + desc.append(Common::formatVerbalRepeat(repeat)); + } else { + desc.append(Common::formatVerbalDate(date)); + } + return desc; +} + /* * The function selects a translatable string such as: * WDS_ALM_TPOP_ALARM_SET_FOR_1_HR_PD_MINS_FROM_NOW_ABB |