atspi : Fix reading text for Datetime 05/159105/11
authorJunsuChoi <jsuya.choi@samsung.com>
Tue, 7 Nov 2017 04:16:21 +0000 (13:16 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Wed, 15 Nov 2017 11:49:28 +0000 (20:49 +0900)
Change-Id: I4a4968adb11deb9cca534b235c6aae5bf6145fe2

src/wearable/circle/efl_extension_circle_object_datetime.c

index be8e595edf6225d3c7ae7f7de161ab8834f6f4c6..1bfb23e888af8862f3a65e0370a259da2454e60b 100644 (file)
@@ -72,6 +72,7 @@ static const int picker_mark_angle_day[4][31] =
 {0,12,24,36,47,59,70,82,93,105,116,128,139,151,163,175,186,198,209,221,232,244,255,267,278,290,302,314,325,337,349}};
 
 // for accessibility
+static Eina_Bool _accessibility_datetime_ampm_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj);
 static void _accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
 //
 
@@ -103,6 +104,13 @@ _eext_circle_object_datetime_picker_mark_angle_set(Eext_Circle_Object *obj, doub
                                               0.25, 0.46,
                                               0.45, 1.0);
      }
+   // for Accessibility
+   else if (elm_atspi_bridge_utils_is_screen_reader_enabled() && angle == -1.0f) // Do not display circle object(indicator bar in datetime)
+     {
+        _eext_circle_object_item_angle_offset_set(item, 0);
+        _eext_circle_object_item_angle_set(item, 0);
+     }
+   //
    else
      {
         _eext_circle_object_item_angle_offset_set(item, angle -(mark_radius / 2));
@@ -168,44 +176,45 @@ _eext_circle_object_datetime_current_type_update(Eext_Circle_Object *obj, Eina_B
    elm_datetime_value_get(datetime, &t);
 
    radio = _eext_circle_object_datetime_selected_field_object_get(datetime);
-   data->current_type = elm_radio_state_value_get(radio);
-   data->rotary_angle = eext_circle_object_angle_get(datetime);
-
-   switch (data->current_type)
+   if (radio)
      {
-      case ELM_DATETIME_YEAR:
-         obj->bg_image_index = 5;
-         picker_angle = (double)(picker_mark_angle_year[(int)((t.tm_year + 1900) % PICKER_MARK_PARTITION_COUNT_YEAR)]);
-         _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-         break;
-      case ELM_DATETIME_MONTH:
-         obj->bg_image_index = 4;
-         picker_angle = (double)((t.tm_mon) * PICKER_MARK_ANGLE_MONTH);
-         _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-         break;
-      case ELM_DATETIME_DATE:
-         max_day = _max_days_get(t.tm_year, t.tm_mon);
-         obj->bg_image_index = max_day % 28;
-         picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(t.tm_mday > max_day ? max_day:t.tm_mday) - 1]);
-         _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-         break;
-      case ELM_DATETIME_HOUR:
-         picker_angle = (double)((t.tm_hour) * PICKER_MARK_ANGLE_HOUR);
-         _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-         obj->bg_image_index = 6;
-         break;
-      case ELM_DATETIME_MINUTE:
-         picker_angle = (double)(t.tm_min * PICKER_MARK_ANGLE_MIN);
-         _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-         obj->bg_image_index = 6;
-         break;
-      case ELM_DATETIME_AMPM:
-      default:
-         break;
-     }
+        data->current_type = elm_radio_state_value_get(radio);
+        data->rotary_angle = eext_circle_object_angle_get(datetime);
 
-   _eext_circle_object_changed(obj);
+        switch (data->current_type)
+          {
+           case ELM_DATETIME_YEAR:
+              obj->bg_image_index = 5;
+              picker_angle = (double)(picker_mark_angle_year[(int)((t.tm_year + 1900) % PICKER_MARK_PARTITION_COUNT_YEAR)]);
+              _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
+              break;
+           case ELM_DATETIME_MONTH:
+              obj->bg_image_index = 4;
+              picker_angle = (double)((t.tm_mon) * PICKER_MARK_ANGLE_MONTH);
+              _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
+              break;
+           case ELM_DATETIME_DATE:
+              max_day = _max_days_get(t.tm_year, t.tm_mon);
+              obj->bg_image_index = max_day % 28;
+              picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(t.tm_mday > max_day ? max_day:t.tm_mday) - 1]);
+              _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
+              break;
+           case ELM_DATETIME_HOUR:
+              picker_angle = (double)((t.tm_hour) * PICKER_MARK_ANGLE_HOUR);
+              _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
+              obj->bg_image_index = 6;
+              break;
+           case ELM_DATETIME_MINUTE:
+              picker_angle = (double)(t.tm_min * PICKER_MARK_ANGLE_MIN);
+              _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
+              obj->bg_image_index = 6;
+              break;
+           default:
+              break;
+          }
 
+        _eext_circle_object_changed(obj);
+     }
 }
 
 /**
@@ -280,7 +289,6 @@ _eext_circle_object_datetime_changed_cb(void *data, Evas_Object *obj, void *even
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
    Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
-
    _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE);
 /**
  * FIXME(171030): Comment this function out because eext_circle_object_value_set is not applied to angle.
@@ -407,6 +415,13 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info* info)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
    Evas_Object *selected_radio;
+   Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
+   //for accessibility
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled() && widget_data->current_type == ELM_DATETIME_AMPM)
+     {
+        return EINA_TRUE;
+     }
+   //
 
    if (circle_obj->is_propagated)
      {
@@ -427,78 +442,80 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info* info)
      _date_update(circle_obj, EINA_FALSE);
 
    //for accessibility
-   Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
-   Evas_Object *datetime = circle_obj->widget_object;
-   struct tm t;
-   char buf_read_text[255];
-   char buf_month[255];
-   char buf_ampm[3];
-
-   elm_datetime_value_get(datetime, &t);
-
-   bindtextdomain (PACKAGE, LOCALE_DIR);
-   elm_atspi_accessible_translation_domain_set(obj, PACKAGE);
-
-   switch(widget_data->current_type)
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
      {
-        case ELM_DATETIME_DATE:
-           snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f",(double)t.tm_mday);
-           break;
-        case ELM_DATETIME_MONTH:
-           if(t.tm_mon == 0)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JANUARY"));
-           else if(t.tm_mon == 1)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_FEBRUARY"));
-           else if(t.tm_mon == 2)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MARCH"));
-           else if(t.tm_mon == 3)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_APRIL"));
-           else if(t.tm_mon == 4)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MAY"));
-           else if(t.tm_mon == 5)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JUNE"));
-           else if(t.tm_mon == 6)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JULY"));
-           else if(t.tm_mon == 7)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_AUGUST"));
-           else if(t.tm_mon == 8)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_SEPTEMBER"));
-           else if(t.tm_mon == 9)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_OCTOBER"));
-           else if(t.tm_mon == 10)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_NOVEMBER"));
-           else if(t.tm_mon == 11)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_DECEMBER"));
-           snprintf(buf_read_text, sizeof(buf_read_text), "%s",buf_month);
-           break;
-        case ELM_DATETIME_YEAR:
-           snprintf(buf_read_text, sizeof(buf_read_text), "%4.0f",(double)t.tm_year + (double)1900.0f);
-           break;
-        case ELM_DATETIME_HOUR:
-           if ((info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE && t.tm_hour == 12) ||
-               (info->direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE && t.tm_hour == 23))
-              snprintf(buf_ampm, sizeof(buf_ampm), _("IDS_COM_BODY_PM"));
-           else if ((info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE && t.tm_hour == 0) ||
-                    (info->direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE && t.tm_hour == 11))
-              snprintf(buf_ampm, sizeof(buf_ampm), _("IDS_COM_BODY_AM"));
-           else
-              buf_ampm[0] = '\0';
+        Evas_Object *datetime = circle_obj->widget_object;
+        struct tm t;
+        char buf_read_text[255];
+        char buf_month[255];
+        char buf_ampm[3];
 
-           if (t.tm_hour > 12)
-              snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour - 12.0f, buf_ampm);
-           else if (t.tm_hour == 0)
-              snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour + 12.0f, buf_ampm);
-           else
-              snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour, buf_ampm);
+        elm_datetime_value_get(datetime, &t);
 
-           break;
-        case ELM_DATETIME_MINUTE:
-           snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f",(double)t.tm_min);
-           break;
-        default:
-           break;
+        bindtextdomain (PACKAGE, LOCALE_DIR);
+        elm_atspi_accessible_translation_domain_set(obj, PACKAGE);
+
+        switch (widget_data->current_type)
+          {
+             case ELM_DATETIME_DATE:
+                snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f",(double)t.tm_mday);
+                break;
+             case ELM_DATETIME_MONTH:
+                if (t.tm_mon == 0)
+                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JANUARY"));
+                else if (t.tm_mon == 1)
+                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_FEBRUARY"));
+                else if (t.tm_mon == 2)
+                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MARCH"));
+                else if (t.tm_mon == 3)
+                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_APRIL"));
+                else if (t.tm_mon == 4)
+                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MAY"));
+                else if (t.tm_mon == 5)
+                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JUNE"));
+                else if (t.tm_mon == 6)
+                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JULY"));
+                else if (t.tm_mon == 7)
+                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_AUGUST"));
+                else if (t.tm_mon == 8)
+                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_SEPTEMBER"));
+                else if (t.tm_mon == 9)
+                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_OCTOBER"));
+                else if (t.tm_mon == 10)
+                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_NOVEMBER"));
+                else if (t.tm_mon == 11)
+                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_DECEMBER"));
+                snprintf(buf_read_text, sizeof(buf_read_text), "%s",buf_month);
+                break;
+             case ELM_DATETIME_YEAR:
+                snprintf(buf_read_text, sizeof(buf_read_text), "%4.0f",(double)t.tm_year + (double)1900.0f);
+                break;
+             case ELM_DATETIME_HOUR:
+                if ((info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE && t.tm_hour == 12) ||
+                    (info->direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE && t.tm_hour == 23))
+                   snprintf(buf_ampm, sizeof(buf_ampm), _("IDS_COM_BODY_PM"));
+                else if ((info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE && t.tm_hour == 0) ||
+                         (info->direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE && t.tm_hour == 11))
+                   snprintf(buf_ampm, sizeof(buf_ampm), _("IDS_COM_BODY_AM"));
+                else
+                   buf_ampm[0] = '\0';
+
+                if (t.tm_hour > 12)
+                   snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour - 12.0f, buf_ampm);
+                else if (t.tm_hour == 0)
+                   snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour + 12.0f, buf_ampm);
+                else
+                   snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour, buf_ampm);
+
+                break;
+             case ELM_DATETIME_MINUTE:
+                snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f",(double)t.tm_min);
+                break;
+             default:
+                break;
+          }
+        elm_atspi_bridge_utils_say(buf_read_text, EINA_TRUE, NULL, NULL);
      }
-   elm_atspi_bridge_utils_say(buf_read_text, EINA_TRUE, NULL, NULL);
    //
 
    if (widget_data->rotary_timer)
@@ -520,18 +537,14 @@ _eext_circle_object_datetime_del_cb(Eext_Circle_Object *obj)
    //for accessibility
    char buf[DATETIME_FIELD_NAME_BUF_MAX];
    int idx = 0;
-   evas_object_smart_callback_del(elm_object_part_content_get(obj->widget_object, "field0"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb);
-   evas_object_smart_callback_del(elm_object_part_content_get(obj->widget_object, "field1"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb);
-   evas_object_smart_callback_del(elm_object_part_content_get(obj->widget_object, "field2"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb);
-
-   for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
+   for (idx = ELM_DATETIME_AMPM; idx >= ELM_DATETIME_YEAR; idx--)
      {
         snprintf(buf, sizeof(buf), "field%d", idx);
         Evas_Object *field_obj = elm_object_part_content_get(obj->widget_object, buf);
+        if (idx == ELM_DATETIME_AMPM && field_obj)
+          elm_atspi_accessible_gesture_cb_set(field_obj, NULL, NULL);
         if (field_obj)
-          {
-             evas_object_smart_callback_del(field_obj, "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb);
-          }
+          evas_object_smart_callback_del(field_obj, "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb);
      }
    //
 
@@ -592,7 +605,7 @@ _accessibility_item_make_trait(char *trait, char *unit, int trait_size)
 
 //for accessibility
 static char *
-_accessibility_item_name_set_cb(void *data, Evas_Object *obj)
+_accessibility_item_name_cb(void *data, Evas_Object *obj)
 {
    char buf[255] = "";
    char buf_month[255];
@@ -602,152 +615,131 @@ _accessibility_item_name_set_cb(void *data, Evas_Object *obj)
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
    Evas_Object *datetime = circle_obj->widget_object;
    int idx = 0;
-   int selected = -1;
    struct tm t;
 
-   if(obj == elm_object_part_content_get(datetime, "field0"))
-     {
-        selected = ELM_DATETIME_DATE;
-     }
-   else if(obj == elm_object_part_content_get(datetime, "field1"))
-     {
-        selected = ELM_DATETIME_MONTH;
-     }
-   else if(obj == elm_object_part_content_get(datetime, "field2"))
-     {
-        selected = ELM_DATETIME_YEAR;
-     }
-   for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
-     {
-        snprintf(buf, sizeof(buf), "field%d", idx);
-        Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
-        if (field_obj)
-          {
-              if(obj == field_obj)
-                {
-                   selected = idx;
-                }
-          }
-     }
+   Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(obj, "_field_type");
 
    elm_datetime_value_get(datetime, &t);
 
    bindtextdomain (PACKAGE, LOCALE_DIR);
 
-   switch(selected)
+   switch (field_type)
      {
         case ELM_DATETIME_DATE:
-           snprintf(buf_unit, sizeof(buf_unit),  _("IDS_COM_BODY_DAY"));
+           snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_DAY"));
            _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
-           snprintf(buf, sizeof(buf),  "%2.0f %s %s",(double)t.tm_mday, buf_unit, buf_trait);
+           snprintf(buf, sizeof(buf), "%2.0f %s %s",(double)t.tm_mday, buf_unit, buf_trait);
            break;
         case ELM_DATETIME_MONTH:
-           if(t.tm_mon == 0)
-              snprintf(buf_month, sizeof(buf_month),  _("IDS_COM_BODY_JANUARY"));
-           else if(t.tm_mon == 1)
-              snprintf(buf_month, sizeof(buf_month),  _("IDS_COM_BODY_FEBRUARY"));
-           else if(t.tm_mon == 2)
-              snprintf(buf_month, sizeof(buf_month),  _("IDS_COM_BODY_MARCH"));
-           else if(t.tm_mon == 3)
-              snprintf(buf_month, sizeof(buf_month),  _("IDS_COM_BODY_APRIL"));
-           else if(t.tm_mon == 4)
-              snprintf(buf_month, sizeof(buf_month),  _("IDS_COM_BODY_MAY"));
-           else if(t.tm_mon == 5)
-              snprintf(buf_month, sizeof(buf_month),  _("IDS_COM_BODY_JUNE"));
-           else if(t.tm_mon == 6)
-              snprintf(buf_month, sizeof(buf_month),  _("IDS_COM_BODY_JULY"));
-           else if(t.tm_mon == 7)
-              snprintf(buf_month, sizeof(buf_month),  _("IDS_COM_BODY_AUGUST"));
-           else if(t.tm_mon == 8)
-              snprintf(buf_month, sizeof(buf_month),  _("IDS_COM_BODY_SEPTEMBER"));
-           else if(t.tm_mon == 9)
-              snprintf(buf_month, sizeof(buf_month),  _("IDS_COM_BODY_OCTOBER"));
-           else if(t.tm_mon == 10)
-              snprintf(buf_month, sizeof(buf_month),  _("IDS_COM_BODY_NOVEMBER"));
-           else if(t.tm_mon == 11)
-              snprintf(buf_month, sizeof(buf_month),  _("IDS_COM_BODY_DECEMBER"));
-           snprintf(buf_unit, sizeof(buf_unit),  _("IDS_COM_BODY_MONTH"));
+           if (t.tm_mon == 0)
+              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JANUARY"));
+           else if (t.tm_mon == 1)
+              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_FEBRUARY"));
+           else if (t.tm_mon == 2)
+              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MARCH"));
+           else if (t.tm_mon == 3)
+              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_APRIL"));
+           else if (t.tm_mon == 4)
+              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MAY"));
+           else if (t.tm_mon == 5)
+              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JUNE"));
+           else if (t.tm_mon == 6)
+              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JULY"));
+           else if (t.tm_mon == 7)
+              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_AUGUST"));
+           else if (t.tm_mon == 8)
+              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_SEPTEMBER"));
+           else if (t.tm_mon == 9)
+              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_OCTOBER"));
+           else if (t.tm_mon == 10)
+              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_NOVEMBER"));
+           else if (t.tm_mon == 11)
+              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_DECEMBER"));
+           snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_MONTH"));
            _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
-           snprintf(buf, sizeof(buf),  "%s %s %s",buf_month, buf_unit, buf_trait);
+           snprintf(buf, sizeof(buf), "%s %s %s",buf_month, buf_unit, buf_trait);
            break;
         case ELM_DATETIME_YEAR:
-           snprintf(buf_unit, sizeof(buf_unit),  _("IDS_COM_BODY_YEAR"));
+           snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_YEAR"));
            _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
-           snprintf(buf, sizeof(buf),  "%4.0f %s %s",(double)t.tm_year + (double)1900.0f, buf_unit, buf_trait);
+           snprintf(buf, sizeof(buf), "%4.0f %s %s",(double)t.tm_year + (double)1900.0f, buf_unit, buf_trait);
            break;
         case ELM_DATETIME_AMPM:
            snprintf(buf_trait, sizeof(buf_trait), _("WDS_TTS_TBBODY_DOUBLE_TAP_TO_CHANGE"));
-           if((double)t.tm_hour <= 12.0f)
-              snprintf(buf_unit, sizeof(buf_unit),  _("IDS_COM_BODY_AM"));
+           if ((double)t.tm_hour < 12.0f)
+              snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_AM"));
            else
-              snprintf(buf_unit, sizeof(buf_unit),  _("IDS_COM_BODY_PM"));
-           _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
-           snprintf(buf, sizeof(buf),  "%s %s",buf_unit, buf_trait);
+              snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_PM"));
+           snprintf(buf, sizeof(buf), "%s %s",buf_unit, buf_trait);
            break;
         case ELM_DATETIME_HOUR:
-           snprintf(buf_unit, sizeof(buf_unit),  _("IDS_COM_BODY_HOUR"));
-           if((double)t.tm_hour <= 12.0f)
-             {
-                snprintf(buf_ampm, sizeof(buf_ampm), _("IDS_COM_BODY_AM"));
-                _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
-                snprintf(buf, sizeof(buf),  "%2.0f %s %s %s",(double)t.tm_hour, buf_ampm, buf_unit, buf_trait);
-             }
-           else
-             {
-                snprintf(buf_ampm, sizeof(buf_ampm), _("IDS_COM_BODY_PM"));
-                _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
-                snprintf(buf, sizeof(buf),  "%2.0f %s %s %s",(double)t.tm_hour - (double)12.0f, buf_ampm, buf_unit, buf_trait);
-             }
+           snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_HOUR"));
+           _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
+           snprintf(buf, sizeof(buf), "%2.0f %s %s",(double)t.tm_hour, buf_unit, buf_trait);
            break;
         case ELM_DATETIME_MINUTE:
-           snprintf(buf_unit, sizeof(buf_unit),  _("IDS_COM_BODY_MINUTE"));
+           snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_MINUTE"));
            _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
-           snprintf(buf, sizeof(buf),  "%2.0f %s %s",(double)t.tm_min, buf_unit, buf_trait);
+           snprintf(buf, sizeof(buf), "%2.0f %s %s",(double)t.tm_min, buf_unit, buf_trait);
            break;
      }
 
    return strdup(buf);
 
 }
+
+static Eina_Bool
+_accessibility_datetime_ampm_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Evas_Object *datetime = circle_obj->widget_object;
+   char buf_unit[255];
+   struct tm t;
+
+   switch (gesture_info.type)
+     {
+        case ELM_ATSPI_GESTURE_ONE_FINGER_DOUBLE_TAP:
+           elm_datetime_value_get(datetime, &t);
+
+           if ((double)t.tm_hour < 12.0f)
+              snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_PM"));
+           else
+              snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_AM"));
+
+           elm_atspi_bridge_utils_say(buf_unit, EINA_TRUE, NULL, NULL);
+        break;
+     }
+
+   return EINA_FALSE;
+}
+
 static void
 _accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
 {
    char buf[255] = "";
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
    Evas_Object *datetime = circle_obj->widget_object;
-   int idx = 0;
-   int selected = -1;
-   Evas_Object *radio;
-
-   if(obj == elm_object_part_content_get(datetime, "field0"))
-     selected = ELM_DATETIME_DATE;
-   else if(obj == elm_object_part_content_get(datetime, "field1"))
-     selected = ELM_DATETIME_MONTH;
-   else if(obj == elm_object_part_content_get(datetime, "field2"))
-     selected = ELM_DATETIME_YEAR;
+   Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(obj, "_field_type");
 
-   for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
+   if (field_type == ELM_DATETIME_AMPM)
      {
-        snprintf(buf, sizeof(buf), "field%d", idx);
-        Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
-        if (field_obj)
-          {
-              if(obj == field_obj)
-                {
-                   selected = idx;
-                }
-          }
+        Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
+        widget_data->current_type = field_type;
+        snprintf(buf, sizeof(buf), "field%d", ELM_DATETIME_HOUR);
+        Evas_Object *radio_obj = elm_object_part_content_get(datetime, buf);
+        elm_radio_value_set(radio_obj, -1);
+        _eext_circle_object_datetime_picker_mark_angle_set(circle_obj, -1, EINA_FALSE);
+        circle_obj->bg_image_index = 6;
+
+        _eext_circle_object_changed(circle_obj);
      }
-
-   radio = _eext_circle_object_datetime_selected_field_object_get(datetime);
-   if(selected == ELM_DATETIME_AMPM)
-      elm_radio_value_set(radio, ELM_DATETIME_HOUR);
    else
-      elm_radio_value_set(radio, selected);
-
-   _eext_circle_object_datetime_current_type_update(circle_obj, EINA_FALSE);
+     {
+        elm_radio_value_set(obj, field_type);
+        _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE);
+     }
 
-   elm_atspi_accessible_name_cb_set(obj, _accessibility_item_name_set_cb, (Eext_Circle_Object*)circle_obj);
+   elm_atspi_accessible_name_cb_set(obj, _accessibility_item_name_cb, (Eext_Circle_Object*)circle_obj);
    elm_atspi_accessible_reading_info_type_set(obj, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
 }
 //
@@ -785,11 +777,6 @@ _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime
                                   _eext_circle_object_datetime_radio_changed_cb, obj);
    evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field2"), "changed",
                                   _eext_circle_object_datetime_radio_changed_cb, obj);
-   //for accessibility
-   evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field0"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
-   evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field1"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
-   evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field2"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
-   //
 
    for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
      {
@@ -802,12 +789,22 @@ _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime
              if (field_type != ELM_DATETIME_AMPM)
                evas_object_smart_callback_add(field_obj, "changed",
                         _eext_circle_object_datetime_radio_changed_cb, obj);
-             //for accessibility
-             evas_object_smart_callback_add(field_obj, "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
-             //
           }
      }
 
+   //for accessibility
+   for (idx = ELM_DATETIME_YEAR; idx <= ELM_DATETIME_AMPM; idx++)
+     {
+        snprintf(buf, sizeof(buf), "field%d", idx);
+
+        Evas_Object *field_obj = elm_object_part_content_get(obj->widget_object, buf);
+        if (field_obj)
+          evas_object_smart_callback_add(field_obj, "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
+        if (idx == ELM_DATETIME_AMPM && field_obj)
+          elm_atspi_accessible_gesture_cb_set(field_obj, _accessibility_datetime_ampm_gesutre_cb, obj);
+     }
+   //
+
    evas_object_smart_callback_add(datetime, "changed",
             _eext_circle_object_datetime_changed_cb, obj);