[Accessibility]: 1. Remove bridge connect callbacks. 68/86668/4
authorShilpa Singh <shilpa.singh@samsung.com>
Fri, 2 Sep 2016 08:33:26 +0000 (14:03 +0530)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Thu, 8 Sep 2016 06:54:43 +0000 (23:54 -0700)
2. widget_atspi function added to genlist, gengrid. when item realized register object, on unrealize de-register object.

Change-Id: If691fb18c848fdba4f6e3482bf6a2ed25b3e53e9
Signed-off-by: Shilpa Singh <shilpa.singh@samsung.com>
src/lib/elc_naviframe.c
src/lib/elm_calendar.c
src/lib/elm_flipselector.c
src/lib/elm_gengrid.c
src/lib/elm_gengrid.eo
src/lib/elm_genlist.c
src/lib/elm_genlist.eo

index 4234a80..2aba4eb 100644 (file)
@@ -332,63 +332,24 @@ _item_signals_emit(Elm_Naviframe_Item_Data *it)
    _item_content_signals_emit(it);
 }
 
-
 //TIZEN ONLY(20151012): expose title as at-spi object
-static Eina_Bool
-_naviframe_atspi_bridge_on_connect_cb(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
+static void
+_atspi_expose_title(Elm_Naviframe_Item_Data *it, Eina_Bool is_atspi)
 {
-   Elm_Naviframe_Item_Data *it = (Elm_Naviframe_Item_Data*)data;
-   Evas_Object *part;
-   Evas_Object *access;
-
-   part = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(VIEW(it)), TITLE_ACCESS_PART);
-   if (part)
+   Evas_Object *part = NULL;
+   Evas_Object *access = NULL;
+   part = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(VIEW(it)),
+                                                    TITLE_ACCESS_PART);
+   if (!part) return;
+   if (is_atspi)
      {
         access = elm_access_object_register(part, VIEW(it));
         _elm_access_callback_set(_elm_access_info_get(access),
                                  ELM_ACCESS_INFO, _access_info_cb, it);
         elm_atspi_accessible_role_set(access, ELM_ATSPI_ROLE_HEADING);
      }
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_naviframe_atspi_bridge_on_disconnect_cb(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
-{
-   Elm_Naviframe_Item_Data *it = (Elm_Naviframe_Item_Data*)data;
-   Evas_Object *part;
-   part = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(VIEW(it)), TITLE_ACCESS_PART);
-   elm_access_object_unregister( part );
-   return EINA_TRUE;
-}
-
-static void
-_unregister_naviframe_atspi_bridge_callbacks(Elm_Naviframe_Item_Data *it)
-{
-   eo_do(_elm_atspi_bridge_get(),
-         eo_event_callback_del(ELM_ATSPI_BRIDGE_EVENT_CONNECTED, _naviframe_atspi_bridge_on_connect_cb, it));
-   eo_do(_elm_atspi_bridge_get(),
-         eo_event_callback_del(ELM_ATSPI_BRIDGE_EVENT_DISCONNECTED, _naviframe_atspi_bridge_on_disconnect_cb, it));
-}
-
-static void
-_atspi_expose_title(Elm_Naviframe_Item_Data *it, Eina_Bool is_atspi)
-{
-   Eina_Bool connected = EINA_FALSE;
-   _unregister_naviframe_atspi_bridge_callbacks(it);
-   if (!is_atspi) return;
-
-   // If bridge is connected expose it now
-   eo_do(_elm_atspi_bridge_get(), connected = elm_obj_atspi_bridge_connected_get());
-   if (connected)
-     _naviframe_atspi_bridge_on_connect_cb(it, NULL, NULL, NULL);
-
-   // Register for bridge connect/disconnect
-   _unregister_naviframe_atspi_bridge_callbacks(it);
-   eo_do(_elm_atspi_bridge_get(),
-        eo_event_callback_add(ELM_ATSPI_BRIDGE_EVENT_CONNECTED, _naviframe_atspi_bridge_on_connect_cb, it));
-   eo_do(_elm_atspi_bridge_get(),
-         eo_event_callback_add(ELM_ATSPI_BRIDGE_EVENT_DISCONNECTED, _naviframe_atspi_bridge_on_disconnect_cb, it));
+   else
+     elm_access_object_unregister(part);
 }
 //
 
@@ -1108,7 +1069,7 @@ _back_btn_new(Evas_Object *obj, const char *title_label)
      }
 
    if(_elm_config->atspi_mode)
-      eo_do(btn, elm_interface_atspi_accessible_name_set(N_("Navigate back")));
+     eo_do(btn, elm_interface_atspi_accessible_name_set(N_("Navigate back")));
 
    return btn;
 }
@@ -1590,10 +1551,6 @@ _elm_naviframe_evas_object_smart_del(Eo *obj, Elm_Naviframe_Data *sd)
 
    evas_object_del(sd->dummy_edje);
 
-   // TIZEN_ONLY(20151012): Unregister callbacks for ATSPI bridge enable/disable
-   _unregister_naviframe_atspi_bridge_callbacks(it);
-   //
-
    eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
 }
 
index 1d5947b..bbbb724 100644 (file)
@@ -631,104 +631,64 @@ _month_access_info_cb(void *data, Evas_Object *obj EINA_UNUSED)
 }
 //
 
-static Eina_Bool
-_calendar_atspi_bridge_on_connect_cb(void *data, Eo *_obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
+//TIZEN_ONLY(20160822): When atspi mode is dynamically switched on/off,
+//register/unregister access objects accordingly.
+static void
+_atspi_expose_objects(Evas_Object *obj, Eina_Bool is_atspi)
 {
-   Evas_Object *obj = (Evas_Object*)data;
    int day;
    int maxdays;
    char day_s[3];
    int ii;
    char pname[14];
    Evas_Object *ao, *ac;
-
+   Evas_Object *access;
    ELM_CALENDAR_DATA_GET(obj, sd);
-   //TIZEN_ONLY(20160720): Exposing calendar's month name in accessibility tree.
-   Evas_Object *part, *access;
-   part = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(obj), MONTH_ACCESS_PART);
-   elm_access_object_unregister(part);
-   if (part)
+   if (is_atspi)
      {
-        access = elm_access_object_register(part, obj);
-        _elm_access_callback_set(_elm_access_info_get(access),
-                                 ELM_ACCESS_INFO, _month_access_info_cb, obj);
-        elm_atspi_accessible_role_set(access, ELM_ATSPI_ROLE_HEADING);
+        //TIZEN_ONLY(20160720): Exposing calendar's month name in accessibility tree.
+        Evas_Object *part, *access;
+        part = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(obj), MONTH_ACCESS_PART);
+        elm_access_object_unregister(part);
+        if (part)
+          {
+             access = elm_access_object_register(part, obj);
+             _elm_access_callback_set(_elm_access_info_get(access),
+                                      ELM_ACCESS_INFO, _month_access_info_cb, obj);
+             elm_atspi_accessible_role_set(access, ELM_ATSPI_ROLE_HEADING);
+          }
+         //
+        day = 0;
+        maxdays = _maxdays_get(&sd->shown_time, 0);
+        for (ii = 0; ii < 42; ii++)
+          {
+             snprintf(pname, sizeof(pname), "cit_%i.access", ii);
+             ac = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(obj), pname);
+             elm_access_object_unregister(ac);
+             if ((!day) && (ii == sd->first_day_it)) day = 1;
+             if ((day) && (day <= maxdays))
+               {
+                  ao = elm_access_object_register(ac, obj);
+                  elm_atspi_accessible_role_set(ao, ELM_ATSPI_ROLE_TABLE_CELL);
+                  snprintf(day_s, sizeof(day_s), "%i", day++);
+                  elm_access_info_set(ao, ELM_ACCESS_INFO, (const char*)day_s);
+                  elm_access_info_cb_set(ao, ELM_ACCESS_CONTEXT_INFO, _localized_access_info_cb, "calendar item");
+               }
+           }
      }
-   //
-   day = 0;
-   maxdays = _maxdays_get(&sd->shown_time, 0);
-   for (ii = 0; ii < 42; ii++)
-     {
-      snprintf(pname, sizeof(pname), "cit_%i.access", ii);
-      ac = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(obj), pname);
-      elm_access_object_unregister(ac);
-      if ((!day) && (ii == sd->first_day_it)) day = 1;
-      if ((day) && (day <= maxdays))
+   else
+   {
+      //TIZEN_ONLY(20160720): Exposing calendar's month name in accessibility tree.
+      access = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(obj), MONTH_ACCESS_PART);
+      elm_access_object_unregister(access);
+      //
+      for (ii = 0; ii < 42; ii++)
         {
-           ao = elm_access_object_register(ac, obj);
-           elm_atspi_accessible_role_set(ao, ELM_ATSPI_ROLE_TABLE_CELL);
-
-           snprintf(day_s, sizeof(day_s), "%i", day++);
-           elm_access_info_set(ao, ELM_ACCESS_INFO, (const char*)day_s);
-           elm_access_info_cb_set(ao, ELM_ACCESS_CONTEXT_INFO, _localized_access_info_cb, "calendar item");
+           snprintf(pname, sizeof(pname), "cit_%i.access", ii);
+           ac = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(obj), pname);
+           elm_access_object_unregister(ac);
         }
-     }
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_calendar_atspi_bridge_on_disconnect_cb(void *data, Eo *_obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
-{
-   Evas_Object *obj = (Evas_Object*)data;
-   int ii;
-   char pname[14];
-   Evas_Object *ac;
-
-   //TIZEN_ONLY(20160720): Exposing calendar's month name in accessibility tree.
-   Evas_Object *access;
-   access = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(obj), MONTH_ACCESS_PART);
-   elm_access_object_unregister(access);
-   //
-
-   for (ii = 0; ii < 42; ii++)
-     {
-        snprintf(pname, sizeof(pname), "cit_%i.access", ii);
-        ac = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(obj), pname);
-        elm_access_object_unregister(ac);
-     }
-   return EINA_TRUE;
-}
-
-static void
-_unregister_atspi_calendar_bridge_callbacks(Evas_Object *obj)
-{
-   if (!_elm_config->atspi_mode) return;
-
-   eo_do(_elm_atspi_bridge_get(),
-        eo_event_callback_del(ELM_ATSPI_BRIDGE_EVENT_CONNECTED, _calendar_atspi_bridge_on_connect_cb, obj));
-   eo_do(_elm_atspi_bridge_get(),
-        eo_event_callback_del(ELM_ATSPI_BRIDGE_EVENT_DISCONNECTED, _calendar_atspi_bridge_on_disconnect_cb, obj));
-}
-
-static void
-_atspi_expose_objects(Evas_Object *obj, Eina_Bool is_atspi)
-{
-   Eina_Bool connected = EINA_FALSE;
-   // Register bridge connect/disconnect
-   _unregister_atspi_calendar_bridge_callbacks(obj);
-   if (is_atspi)
-     {
-        // If already connected register callendar buttons callbacks
-        eo_do(_elm_atspi_bridge_get(), connected = elm_obj_atspi_bridge_connected_get());
-        if (connected)
-          _calendar_atspi_bridge_on_connect_cb(obj, NULL, NULL, NULL);
-        eo_do(_elm_atspi_bridge_get(),
-              eo_event_callback_add(ELM_ATSPI_BRIDGE_EVENT_CONNECTED,
-                                    _calendar_atspi_bridge_on_connect_cb, obj));
-        eo_do(_elm_atspi_bridge_get(),
-             eo_event_callback_add(ELM_ATSPI_BRIDGE_EVENT_DISCONNECTED,
-                                   _calendar_atspi_bridge_on_disconnect_cb, obj));
-     }
+   }
 }
 //
 
@@ -1723,10 +1683,6 @@ _elm_calendar_evas_object_smart_del(Eo *obj, Elm_Calendar_Data *sd)
    for (i = 0; i < ELM_DAY_LAST; i++)
      eina_stringshare_del(sd->weekdays[i]);
 
-   // TIZEN_ONLY(20151012): Unregister callbacks for ATSPI bridge enable/disable
-   _unregister_atspi_calendar_bridge_callbacks(sd->obj);
-   //
-
    eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
 }
 
index 17d2f44..1bd6da8 100644 (file)
@@ -52,9 +52,6 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
    {NULL, NULL}
 };
 
-// TIZEN_ONLY(20151012): Unregister callbacks for ATSPI bridge enable/disable
-static void _unregister_flipselector_atspi_bridge_callbacks(Elm_Flipselector_Data *sd);
-//
 static Eina_Bool _key_action_flip(Evas_Object *obj, const char *params);
 
 static const Elm_Action key_actions[] = {
@@ -585,10 +582,6 @@ _elm_flipselector_evas_object_smart_del(Eo *obj, Elm_Flipselector_Data *sd)
 
    ecore_timer_del(sd->spin);
 
-   // TIZEN_ONLY(20151012): Unregister callbacks for ATSPI bridge enable/disable
-   _unregister_flipselector_atspi_bridge_callbacks(sd);
-   //
-
    eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
 }
 
@@ -619,73 +612,36 @@ static Eina_Bool _activate_bottom_cb(void *data, Evas_Object *obj EINA_UNUSED, E
    return EINA_TRUE;
 }
 
-//TIZEN ONLY(20151012): register callbacks for ATSPI bridge enable/disable
-static Eina_Bool
-_flipselector_atspi_bridge_on_connect_cb(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
+//TIZEN_ONLY(20160822): When atspi mode is dynamically switched on/off,
+//register/unregister access objects accordingly.
+static void
+_atspi_expose_flipselector_top_bottom(Elm_Flipselector_Data *sd, Eina_Bool is_atspi)
 {
-   Elm_Flipselector_Data *sd = (Elm_Flipselector_Data*)data;
    Evas_Object *btn1;
    Evas_Object *btn2;
-   btn1 = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(sd->obj), "top_clipper");
-   btn2 = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(sd->obj), "bottom_clipper");
-   if (btn1 && btn2)
+
+   if (is_atspi)
      {
-        sd->access_top_button = elm_access_object_register(btn1, sd->obj);
-        sd->access_bottom_button = elm_access_object_register(btn2, sd->obj);
+        btn1 = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(sd->obj), "top_clipper");
+        btn2 = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(sd->obj), "bottom_clipper");
+        if (btn1 && btn2)
+          {
+             sd->access_top_button = elm_access_object_register(btn1, sd->obj);
+             sd->access_bottom_button = elm_access_object_register(btn2, sd->obj);
 
-        elm_atspi_accessible_role_set(sd->access_top_button, ELM_ATSPI_ROLE_PUSH_BUTTON);
-        elm_atspi_accessible_role_set(sd->access_bottom_button, ELM_ATSPI_ROLE_PUSH_BUTTON);
+             elm_atspi_accessible_role_set(sd->access_top_button, ELM_ATSPI_ROLE_PUSH_BUTTON);
+             elm_atspi_accessible_role_set(sd->access_bottom_button, ELM_ATSPI_ROLE_PUSH_BUTTON);
 
-        elm_access_action_cb_set(sd->access_top_button, ELM_ACCESS_ACTION_ACTIVATE, _activate_top_cb, sd);
-        elm_access_action_cb_set(sd->access_bottom_button, ELM_ACCESS_ACTION_ACTIVATE, _activate_bottom_cb, sd);
+             elm_access_action_cb_set(sd->access_top_button, ELM_ACCESS_ACTION_ACTIVATE, _activate_top_cb, sd);
+             elm_access_action_cb_set(sd->access_bottom_button, ELM_ACCESS_ACTION_ACTIVATE, _activate_bottom_cb, sd);
+          }
      }
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_flipselector_atspi_bridge_on_disconnect_cb(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
-{
-   Elm_Flipselector_Data *sd = (Elm_Flipselector_Data*)data;
-   elm_access_object_unregister(sd->access_top_button);
-   elm_access_object_unregister(sd->access_bottom_button);
-   return EINA_TRUE;
-}
-
-static void
-_unregister_flipselector_atspi_bridge_callbacks(Elm_Flipselector_Data *sd)
-{
-   if (!_elm_config->atspi_mode) return;
-
-   eo_do(_elm_atspi_bridge_get(),
-        eo_event_callback_del(ELM_ATSPI_BRIDGE_EVENT_CONNECTED, _flipselector_atspi_bridge_on_connect_cb, sd));
-   eo_do(_elm_atspi_bridge_get(),
-        eo_event_callback_del(ELM_ATSPI_BRIDGE_EVENT_DISCONNECTED, _flipselector_atspi_bridge_on_disconnect_cb, sd));
-}
-
-static void
-_atspi_expose_flipselector_top_bottom(Elm_Flipselector_Data *sd, Eina_Bool is_atspi)
-{
-   Eina_Bool connected = EINA_FALSE;
-
-   sd->access_top_button = NULL;
-   sd->access_bottom_button = NULL;
-
-   // UnRegister for ATSPI bridge enable/disable
-   _unregister_flipselector_atspi_bridge_callbacks(sd);
-
-   if (is_atspi)
+   else
      {
-        // Expose flipselector buttons
-        eo_do(_elm_atspi_bridge_get(), connected = elm_obj_atspi_bridge_connected_get());
-        if (connected)
-          _flipselector_atspi_bridge_on_connect_cb(sd, NULL, NULL, NULL);
-
-        eo_do(_elm_atspi_bridge_get(),
-             eo_event_callback_add(ELM_ATSPI_BRIDGE_EVENT_CONNECTED,
-                                   _flipselector_atspi_bridge_on_connect_cb, sd));
-        eo_do(_elm_atspi_bridge_get(),
-             eo_event_callback_add(ELM_ATSPI_BRIDGE_EVENT_DISCONNECTED,
-                                   _flipselector_atspi_bridge_on_disconnect_cb, sd));
+        elm_access_object_unregister(sd->access_top_button);
+        elm_access_object_unregister(sd->access_bottom_button);
+        sd->access_top_button = NULL;
+        sd->access_bottom_button = NULL;
      }
 }
 //
index e643eb7..d265fef 100644 (file)
@@ -1085,6 +1085,12 @@ _elm_gengrid_item_unrealize(Elm_Gen_Item *it,
 
    evas_event_thaw(evas_object_evas_get(WIDGET(it)));
    evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
+
+   if (_elm_config->atspi_mode)
+     {
+        elm_interface_atspi_accessible_removed(EO_OBJ(it));
+        elm_interface_atspi_accessible_children_changed_del_signal_emit(WIDGET(it), EO_OBJ(it));
+     }
 }
 
 static void
@@ -1411,6 +1417,12 @@ _item_realize(Elm_Gen_Item *it)
    /* access */
    if (_elm_config->access_mode) _access_widget_item_register(it);
 
+   if (_elm_config->atspi_mode)
+     {
+        elm_interface_atspi_accessible_added(EO_OBJ(it));
+        elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
+     }
+
    /* infate texts, contents and states of view object */
    _view_inflate(VIEW(it), it, &it->texts, &it->contents);
 
@@ -4426,6 +4438,38 @@ _elm_gengrid_elm_widget_access(Eo *obj EINA_UNUSED, Elm_Gengrid_Data *sd, Eina_B
    _access_obj_process(sd, _elm_gengrid_smart_focus_next_enable);
 }
 
+//TIZEN_ONLY(20160822): When atspi mode is dynamically switched on/off,
+//register/unregister access objects accordingly.
+EOLIAN static void
+_elm_gengrid_elm_widget_atspi(Eo *obj EINA_UNUSED, Elm_Gengrid_Data *sd, Eina_Bool is_atspi)
+{
+   Elm_Gen_Item *it;
+   Evas_Object *content = NULL;
+   Eina_List *l;
+
+   EINA_INLIST_FOREACH(sd->items, it)
+     {
+        if (!it->realized) continue;
+        if (is_atspi)
+          {
+             elm_interface_atspi_accessible_added(EO_OBJ(it));
+             elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
+             elm_interface_atspi_accessible_name_changed_signal_emit(EO_OBJ(it));
+             EINA_LIST_FOREACH(it->contents, l, content)
+               {
+                  if (eo_isa(content, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
+                    eo_do(content, elm_interface_atspi_accessible_parent_set(EO_OBJ(it)));
+               }
+          }
+        else
+          {
+             elm_interface_atspi_accessible_removed(EO_OBJ(it));
+             elm_interface_atspi_accessible_children_changed_del_signal_emit(sd->obj, EO_OBJ(it));
+          }
+     }
+}
+//
+
 EAPI Evas_Object *
 elm_gengrid_add(Evas_Object *parent)
 {
@@ -4542,12 +4586,6 @@ _elm_gengrid_item_append(Eo *obj EINA_UNUSED, Elm_Gengrid_Data *sd, const Elm_Ge
    //ecore_job_del(sd->calc_job);
    //sd->calc_job = ecore_job_add(_calc_job, obj);
 
-   if (_elm_config->atspi_mode)
-     {
-        elm_interface_atspi_accessible_added(EO_OBJ(it));
-        elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
-     }
-
    return EO_OBJ(it);
 }
 
@@ -4572,12 +4610,6 @@ _elm_gengrid_item_prepend(Eo *obj EINA_UNUSED, Elm_Gengrid_Data *sd, const Elm_G
    //sd->calc_job = ecore_job_add(_calc_job, obj);
    //
 
-   if (_elm_config->atspi_mode)
-     {
-        elm_interface_atspi_accessible_added(EO_OBJ(it));
-        elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
-     }
-
    return EO_OBJ(it);
 }
 
index cc8e7bb..1faf586 100644 (file)
@@ -546,6 +546,10 @@ class Elm.Gengrid (Elm.Layout, Elm_Interface_Scrollable,
       Elm.Widget.focus_next_manager_is;
       Elm.Widget.focus_direction_manager_is;
       Elm.Widget.access;
+      //TIZEN_ONLY(20160822): When atspi mode is dynamically switched on/off,
+      //register/unregister access objects accordingly.
+      Elm.Widget.atspi;
+      //
       Elm.Widget.focus_next;
       Elm.Widget.focus_direction;
       Elm.Widget.on_focus;
index 94d0bfa..ebbfd85 100644 (file)
@@ -407,8 +407,7 @@ _item_content_realize(Elm_Gen_Item *it,
                }
 
              *contents = eina_list_append(*contents, content);
-             if (_elm_config->atspi_mode && eo_isa(content, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
-               eo_do(content, elm_interface_atspi_accessible_parent_set(EO_OBJ(it)));
+
              if (!edje_object_part_swallow(target, key, content))
                {
                   ERR("%s (%p) can not be swallowed into %s",
@@ -1803,7 +1802,10 @@ _item_realize(Elm_Gen_Item *it,
 
    //TIZEN_ONLY(20150709) Do not register children of MANAGES_DESCENDATS objects
    if (_elm_config->atspi_mode)
-     elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
+     {
+        elm_interface_atspi_accessible_added(EO_OBJ(it));
+        elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
+     }
    //
 
    /* access */
@@ -4712,11 +4714,6 @@ _item_queue(Elm_Genlist_Data *sd,
    evas_object_geometry_get(sd->obj, NULL, NULL, &w, NULL);
    if (w > 0) _requeue_idle_enterer(sd);
 
-   if (_elm_config->atspi_mode)
-     {
-        elm_interface_atspi_accessible_added(EO_OBJ(it));
-        elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
-     }
 }
 
 /* If the application wants to know the relative item, use
@@ -5108,6 +5105,14 @@ _item_unrealize(Elm_Gen_Item *it)
    if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
      _elm_access_widget_item_unregister(it->base);
 
+   //TIZEN_ONLY(20150709) Do not register children of MANAGES_DESCENDATS objects
+   if (_elm_config->atspi_mode)
+     {
+        elm_interface_atspi_accessible_removed(EO_OBJ(it));
+        elm_interface_atspi_accessible_children_changed_del_signal_emit(sd->obj, EO_OBJ(it));
+     }
+   //
+
    // unswallow VIEW(it) first then manipulate VIEW(it)
    _decorate_item_unrealize(it);
    if (GL_IT(it)->wsd->decorate_all_mode) _decorate_all_item_unrealize(it);
@@ -5689,6 +5694,53 @@ _elm_genlist_elm_widget_access(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, Eina_B
    _access_obj_process(sd, _elm_genlist_smart_focus_next_enable);
 }
 
+//TIZEN_ONLY(20160822): When atspi mode is dynamically switched on/off,
+//register/unregister access objects accordingly.
+EOLIAN static void
+_elm_genlist_elm_widget_atspi(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, Eina_Bool is_atspi)
+{
+   Item_Block *itb;
+   Eina_Bool done = EINA_FALSE;
+   Evas_Object *content = NULL;
+   Eina_List *l;
+
+   EINA_INLIST_FOREACH(sd->blocks, itb)
+     {
+        if (itb->realized)
+          {
+             Eina_List *l;
+             Elm_Gen_Item *it;
+
+             done = EINA_TRUE;
+             EINA_LIST_FOREACH(itb->items, l, it)
+               {
+                  if (!it->realized || it->hide) continue;
+                  if (is_atspi)
+                    {
+                       elm_interface_atspi_accessible_added(EO_OBJ(it));
+                       elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
+                       EINA_LIST_FOREACH(it->contents, l, content)
+                         {
+                            if (eo_isa(content, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
+                              {
+                                 eo_do(content, elm_interface_atspi_accessible_parent_set(EO_OBJ(it)));
+                                 elm_interface_atspi_accessible_children_changed_added_signal_emit(EO_OBJ(it), content);
+                              }
+                         }
+                       elm_interface_atspi_accessible_name_changed_signal_emit(EO_OBJ(it));
+                    }
+                  else
+                    {
+                       elm_interface_atspi_accessible_removed(EO_OBJ(it));
+                       elm_interface_atspi_accessible_children_changed_del_signal_emit(sd->obj, EO_OBJ(it));
+                    }
+               }
+          }
+        else if (done) break;
+     }
+}
+//
+
 EAPI Evas_Object *
 elm_genlist_add(Evas_Object *parent)
 {
index b13f503..79a04f3 100644 (file)
@@ -516,6 +516,10 @@ class Elm.Genlist (Elm.Layout, Elm_Interface_Scrollable, Evas.Clickable_Interfac
       Elm.Widget.focus_next_manager_is;
       Elm.Widget.sub_object_add;
       Elm.Widget.access;
+      //TIZEN_ONLY(20160822): When atspi mode is dynamically switched on/off,
+      //register/unregister access objects accordingly.
+      Elm.Widget.atspi;
+      //
       Elm.Widget.focus_highlight_geometry_get;
       Elm.Widget.focus_next;
       Elm.Widget.on_focus;