summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Kurzberg <i.kurtsberg@samsung.com>2017-08-07 11:43:56 +0300
committerEugene Kurzberg <i.kurtsberg@samsung.com>2017-08-07 11:44:08 +0300
commit0ede350b6cd10b1c55a7705f016e52e833ea37c1 (patch)
treee892d3a2678a4e231e77c45fe4c085e205404fb5
parent3c62201e600b6d77f3f5ec81a017564ce2ee2357 (diff)
downloadalarm-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.cpp12
-rw-r--r--alarm-widget/inc/AlarmWidget.h4
-rw-r--r--alarm-widget/res/widget/edje/WidgetLayout.h3
-rw-r--r--alarm-widget/res/widget/edje/widget-layout.edc17
-rw-r--r--alarm-widget/src/AlarmWidget.cpp39
-rw-r--r--lib-apps-common/inc/Ui/Accessibility.h14
-rw-r--r--lib-common/inc/Common/Format.h8
-rw-r--r--lib-common/src/Common/Format.cpp14
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