Fix for toast popup reading 58/284158/2 accepted/tizen/6.0/unified/20221116.000649 submit/tizen_6.0/20221114.092410
authorLukasz Oleksak <l.oleksak@samsung.com>
Thu, 10 Nov 2022 10:30:36 +0000 (11:30 +0100)
committerLukasz Oleksak <l.oleksak@samsung.com>
Thu, 10 Nov 2022 16:51:24 +0000 (16:51 +0000)
This patch allows a transient notification UI element (like toast popup)
to be read without inducing navigation context change. It requires,
the UI element to be given an ATSPI_ROLE_NOTIFICATION by application developer.
This is analogous case to the requirement of seting ATSPI_ROLE_TOGGLE_BUTTON role
for button using custom tizen theme style.

Change-Id: I373e6f700d28364967d256af280e33de34083b36

include/utils.h
include/window_tracker.h
src/app_tracker.c
src/navigator.c
src/utils.c
src/window_tracker.c
tests2/wrappers/mocked_app_tracker.cpp
tests2/wrappers/mocked_app_tracker.h
tests2/wrappers/mocked_window_tracker.cpp
tests2/wrappers/mocked_window_tracker.h

index 0eff4eef289ba69724e68818a62b9819c3e4b43f..99ee7ea4b8fcbeb5585d05f4eac17b841f65839d 100644 (file)
@@ -113,7 +113,7 @@ enum Reading_Info {
        ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION = 1 << 2,
        ACCESSIBLE_READING_INFO_TYPE_STATE = 1 << 3
 };
-unsigned short int get_objects_attributes(AtspiAccessible *obj);
+unsigned short int get_object_reading_info_type_attributes(AtspiAccessible *obj);
 void utils_a11y_bus_connection_set(Eldbus_Connection *conn);
 Eldbus_Connection *utils_a11y_bus_connection_get(void);
 
index 6ae9f965493a8a71ee456a5682aa7ca9c4cb7bc8..b7b3128bc0ef4b7e89bbb3cbd278bdc04c660ea0 100644 (file)
@@ -84,6 +84,4 @@ WindowActivateInfoType window_tracker_window_activate_info_type_get(WindowTracke
 
 WindowInfo* window_tracker_top_window_info_get(WindowTrackerData *wtd);
 
-AtspiAccessible* window_tracker_subroot_get(WindowTrackerData *wtd);
-
 #endif // WINDOW_TRACKER_H
index 13271201ae6ad667dd08dff78c200198e8abef92..2eeffb53535de9c9c9bc296d412ffd9e3c52eab5 100644 (file)
@@ -119,9 +119,6 @@ static gboolean _on_timeout_rebuild_navigation_context(gpointer user_data)
                        }
                }
 
-               if (default_label_enabled)
-                       tw_purge(EINA_TRUE);
-
                gchar *id = atspi_accessible_get_unique_id(dli->obj, NULL);
                DEBUG("Rebuilding navigation context - root: %s, role: %d, default_label_enabled : %s", id, dli->role, default_label_enabled ? "true" : "false");
                g_free(id);
@@ -330,28 +327,18 @@ static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
                                // refresh default label for newly showing page tab
                                DEBUG("Refreshing TAB");
                                timer_reschedule(atd);
+                       } else if (role == ATSPI_ROLE_NOTIFICATION) {
+                               // Read notification without rebuilding context
+                               char *text_to_speak = NULL;
+                               ReadingComposerData *rc = reading_composer_data_get(event->source);
+                               text_to_speak = reading_composer_description_get(rc);
+                               reading_composer_data_free(rc);
+                               DEBUG("READING NOTIFICATION : %s", text_to_speak ? text_to_speak : "text_to_speak nil");
+                               tw_speak_customized(text_to_speak, EINA_TRUE, EINA_TRUE, event->source, 0);
+                               free(text_to_speak);
                        } else if (object_has_modal_role(role)) {
-                               // push modal to base_root stack
-                               DEBUG("Pushing modal: ROLE: %d", role);
-                               Service_Data *sd = get_pointer_to_service_data_struct();
-                               Eina_Bool is_text_selection_mode = navigator_get_is_text_selection_mode(sd->navigator_data);
-                               if (is_text_selection_mode) {
-                                       /*TODO: this ignores toast popup providing cut, copy information.
-                                       if other popup is showing then rebuild navigation context. */
-                                       goto end;
-                               }
-                               if (window_tracker_subroot_get(atd->window_tracker_data)) {
-                                       char *text_to_speak = NULL;
-                                       ReadingComposerData *rc = reading_composer_data_get(event->source);
-                                       text_to_speak = reading_composer_description_get(rc);
-                                       reading_composer_data_free(rc);
-                                       DEBUG("SPEAK : %s", text_to_speak ? text_to_speak : "text_to_speak nil");
-                                       tw_speak_customized(text_to_speak, EINA_TRUE, EINA_TRUE, event->source, 0);
-                                       free(text_to_speak);
-                               }
-                               else {
-                                       timer_reschedule(atd);
-                               }
+                               DEBUG("Rebuilding context on modal PUSH");
+                               timer_reschedule(atd);
                        }
                } else { /* Not Showing */
                        if (role == ATSPI_ROLE_WINDOW) {
@@ -361,9 +348,7 @@ static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
                                DEBUG("Remove Window");
                                window_tracker_window_remove(atd->window_tracker_data, event->source);
                        } else if (object_has_modal_role(role)) {
-                               //TODO: check if source is same with modals->data
-                               // pop modal
-                               DEBUG("Pop modal");
+                               DEBUG("Rebuilding context on modal POP");
                                timer_reschedule(atd);
                        } else if (flat_navi_context_current_get(navigator_get_flat_navi_context(atd->view_content_changed_ecd->user_data)) == event->source) {
                                DEBUG("Current highlighted object becomes not-showing");
@@ -407,7 +392,7 @@ static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
                        }
                }
        } else if (!g_strcmp0(event->type, "object:property-change:accessible-name") && object_has_highlighted_state(event->source)
-                        && (get_objects_attributes(event->source) & ACCESSIBLE_READING_INFO_TYPE_NAME)) {
+                        && (get_object_reading_info_type_attributes(event->source) & ACCESSIBLE_READING_INFO_TYPE_NAME)) {
                gchar *name = atspi_accessible_get_name(event->source, NULL);
                if (!name) {
                        ERROR("name is null");
@@ -418,7 +403,7 @@ static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
                g_free(name);
                goto end;
        } else if (!g_strcmp0(event->type, "object:property-change:accessible-value")) { // for reading slider and spinner value changes
-               if (role == ATSPI_ROLE_SLIDER && (get_objects_attributes(event->source) & ACCESSIBLE_READING_INFO_TYPE_STATE)) {
+               if (role == ATSPI_ROLE_SLIDER && (get_object_reading_info_type_attributes(event->source) & ACCESSIBLE_READING_INFO_TYPE_STATE)) {
                        _read_value(event->source);
                } else if (role == ATSPI_ROLE_FILLER) {
                        gchar *name = atspi_accessible_get_name(event->source, NULL);
@@ -430,7 +415,7 @@ static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
                        g_free(name);
                }
        } else if (!g_strcmp0(event->type, "object:state-changed:animated") && (role == ATSPI_ROLE_LIST_ITEM)
-                          && (get_objects_attributes(event->source) & ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION)) {
+                          && (get_object_reading_info_type_attributes(event->source) & ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION)) {
                GError *err = NULL;
                char buf[256] = "\0";
                gint idx = atspi_accessible_get_index_in_parent(event->source, &err);
@@ -441,7 +426,7 @@ static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
                tw_speak_customized(buf, EINA_TRUE, EINA_TRUE, event->source, 0);
                g_error_free(err);
        } else if (!g_strcmp0(event->type, "object:state-changed:checked")
-                        && (get_objects_attributes(event->source) & ACCESSIBLE_READING_INFO_TYPE_STATE)) {
+                        && (get_object_reading_info_type_attributes(event->source) & ACCESSIBLE_READING_INFO_TYPE_STATE)) {
                char buf[256] = "\0";
                if (event->detail1) {
                        if (role == ATSPI_ROLE_TOGGLE_BUTTON)
@@ -460,7 +445,7 @@ static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
                }
                tw_speak(buf, EINA_TRUE);
        } else if (!g_strcmp0(event->type, "object:state-changed:selected")
-                          && (get_objects_attributes(event->source) & ACCESSIBLE_READING_INFO_TYPE_STATE)) {
+                          && (get_object_reading_info_type_attributes(event->source) & ACCESSIBLE_READING_INFO_TYPE_STATE)) {
                char buf[256] = "\0";
                gchar *name = atspi_accessible_get_name(event->source, NULL);
                if (!name) {
index b14e9218a05fbd692bad6f9d2b5ba42d8984b196..798506f613d2d7b24003f9d3771ceef683b39f93 100644 (file)
@@ -2592,6 +2592,8 @@ TIZEN_PROD_STATIC void _view_content_changed(AtspiAccessible *root, AtspiRole ro
                return;
        }
 
+       tw_purge(EINA_TRUE);
+
        switch (role) {
        case ATSPI_ROLE_POPUP_MENU:
        case ATSPI_ROLE_PANEL:
@@ -2607,7 +2609,6 @@ TIZEN_PROD_STATIC void _view_content_changed(AtspiAccessible *root, AtspiRole ro
        }
 
        _check_app_gesture_support(nd, root);
-
        if (vc_get_sound_feedback())
                smart_notification(WINDOW_STATE_CHANGE_NOTIFICATION_EVENT, 0, 0);
        DEBUG("END");
index e7d973a03e203eed24a5530e99fcebc09be9c81e..f956144acaca32a9a0731690244e0992dbc37be5 100644 (file)
@@ -150,7 +150,7 @@ Eina_Bool cycle_detection_check_if_in_cycle(cycle_detection_data *data, const vo
        return EINA_FALSE;
 }
 
-unsigned short int get_objects_attributes(AtspiAccessible *obj)
+unsigned short int get_object_reading_info_type_attributes(AtspiAccessible *obj)
 {
        unsigned short int attribute = 0;
        gchar *reading_info = NULL;
index 9a86ec4fe61674cfb7040a3f680d1026ee59025c..5bf3f9d90785df73d94d3e27d5748fb9530c4eb9 100644 (file)
@@ -34,7 +34,6 @@ struct WindowTrackerDataImpl
        AtspiEventListener *listener;
        AtspiAccessible *last_active_win;
        AtspiAccessible *top_win;
-       AtspiAccessible *subroot;
        Eina_List *window_infos;
        AtspiAccessible *keyboard_window;
 };
@@ -178,17 +177,6 @@ static void _window_stack_print(WindowTrackerData *wtd)
        }
 }
 
-static Eina_Bool _is_window_in_stack(WindowTrackerData *wtd, AtspiAccessible *window)
-{
-       Eina_List *l;
-       WindowInfo *wi;
-
-       EINA_LIST_FOREACH(wtd->window_infos, l, wi)
-               if(wi && wi->window == window) return EINA_TRUE;
-
-       return EINA_FALSE;
-}
-
 static void _window_append(WindowTrackerData *wtd, AtspiAccessible *window, Eina_Bool view_change_need,
                                                   Eina_Bool keyboard_window_is, WindowActivateInfoType window_activate_info_type)
 {
@@ -284,11 +272,6 @@ static void _window_remove(WindowTrackerData *wtd, AtspiAccessible *window)
                removed_index++;
        }
 
-       if (wtd->subroot && window == wtd->subroot) {
-               DEBUG("Remove subroot: %p ", wtd->subroot);
-               wtd->subroot = NULL;
-       }
-
        if (!window_removed) {
                gchar *id = atspi_accessible_get_unique_id(window, NULL);
                DEBUG("END - try to remove not appended window: %s", id);
@@ -372,7 +355,6 @@ static void _on_atspi_window_cb(AtspiEvent *event, void *user_data)
                        goto end;
                }
                _window_append(wtd, event->source, EINA_TRUE, EINA_FALSE, window_activate_info_type);
-               wtd->subroot = NULL; //No need to keep subroot if any window gets activated
        } else if (!g_strcmp0(event->type, "window:deactivate")) {
                DEBUG("Remove Window");
                _window_remove(wtd, event->source);
@@ -402,19 +384,6 @@ static void _on_atspi_window_cb(AtspiEvent *event, void *user_data)
                        else
                                _window_remove(wtd, event->source);
                }
-
-               if (role == ATSPI_ROLE_WINDOW) {
-                       if (event->detail1) { /* Visible */
-                               if (!_is_window_in_stack(wtd, event->source)) {
-                                       DEBUG("Store subroot window: %p", event->source);
-                                       wtd->subroot = event->source;
-                               }
-                       }
-                       else {
-                               DEBUG("delete subroot window: %p", event->source);
-                               wtd->subroot = NULL;
-                       }
-               }
        }
 end:
        g_free(name);
@@ -447,7 +416,6 @@ WindowTrackerData *window_tracker_init(void)
 
        wtd->last_active_win = NULL;
        wtd->top_win = NULL;
-       wtd->subroot = NULL;
        wtd->window_infos = NULL;
        wtd->keyboard_window = NULL;
 
@@ -620,8 +588,4 @@ AtspiAccessible* window_tracker_top_win_get(WindowTrackerData *wtd)
        return wtd ? wtd->top_win : NULL;
 }
 
-AtspiAccessible* window_tracker_subroot_get(WindowTrackerData *wtd)
-{
-       return wtd ? wtd->subroot : NULL;
-}
 
index 869d19dcdd80d0b2b0ebfe7768e37d5a3200d445..b02f6adf396ae1759e32c19a7ad1f4bbb5fa8d2d 100644 (file)
@@ -91,7 +91,6 @@ IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_keyboard_window_append, window_trac
 IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_keyboard_window_remove, window_tracker_keyboard_window_remove, void(WindowTrackerData *));
 IMPLEMENT_FUNCTION_MOCK3(mock_window_tracker_register, window_tracker_register, void(WindowTrackerData *, WindowTrackerCb, void *));
 IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_shutdown, window_tracker_shutdown, void(WindowTrackerData *));
-IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_subroot_get, window_tracker_subroot_get, AtspiAccessible *(WindowTrackerData *));
 IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_top_win_get, window_tracker_top_win_get, AtspiAccessible *(WindowTrackerData *));
 IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_top_window_get, window_tracker_top_window_get, AtspiAccessible *(WindowTrackerData *));
 IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_top_window_info_get, window_tracker_top_window_info_get, WindowInfo *(WindowTrackerData *));
index 884f97ef523c768afbcaf0c891ba70196bdf8c36..0b84f753d2c6e324837e01aebd921fac71af8690 100644 (file)
@@ -105,7 +105,6 @@ DECLARE_FUNCTION_MOCK1(mock_window_tracker_keyboard_window_append, window_tracke
 DECLARE_FUNCTION_MOCK1(mock_window_tracker_keyboard_window_remove, window_tracker_keyboard_window_remove, void(WindowTrackerData *));
 DECLARE_FUNCTION_MOCK3(mock_window_tracker_register, window_tracker_register, void(WindowTrackerData *, WindowTrackerCb, void *));
 DECLARE_FUNCTION_MOCK1(mock_window_tracker_shutdown, window_tracker_shutdown, void(WindowTrackerData *));
-DECLARE_FUNCTION_MOCK1(mock_window_tracker_subroot_get, window_tracker_subroot_get, AtspiAccessible *(WindowTrackerData *));
 DECLARE_FUNCTION_MOCK1(mock_window_tracker_top_win_get, window_tracker_top_win_get, AtspiAccessible *(WindowTrackerData *));
 DECLARE_FUNCTION_MOCK1(mock_window_tracker_top_window_get, window_tracker_top_window_get, AtspiAccessible *(WindowTrackerData *));
 DECLARE_FUNCTION_MOCK1(mock_window_tracker_top_window_info_get, window_tracker_top_window_info_get, WindowInfo *(WindowTrackerData *));
index 7f07fd6f94a28430753bd9f96728e77b3a55886d..dff50c24d414e1d399735a27d919295afff3b8ee 100644 (file)
@@ -53,7 +53,6 @@ IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_keyboard_window_append, window_trac
 IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_keyboard_window_remove, window_tracker_keyboard_window_remove, void(WindowTrackerData *));
 IMPLEMENT_FUNCTION_MOCK3(mock_window_tracker_register, window_tracker_register, void(WindowTrackerData *, WindowTrackerCb, void *));
 IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_shutdown, window_tracker_shutdown, void(WindowTrackerData *));
-IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_subroot_get, window_tracker_subroot_get, AtspiAccessible *(WindowTrackerData *));
 IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_top_win_get, window_tracker_top_win_get, AtspiAccessible *(WindowTrackerData *));
 IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_top_window_get, window_tracker_top_window_get, AtspiAccessible *(WindowTrackerData *));
 IMPLEMENT_FUNCTION_MOCK1(mock_window_tracker_top_window_info_get, window_tracker_top_window_info_get, WindowInfo *(WindowTrackerData *));
index 15db091dc89a9cada1ee822656b5c05f49294114..fe0ef2bd1512a5c198b92d46c4316e14203ff20f 100644 (file)
@@ -62,7 +62,6 @@ DECLARE_FUNCTION_MOCK1(mock_window_tracker_keyboard_window_append, window_tracke
 DECLARE_FUNCTION_MOCK1(mock_window_tracker_keyboard_window_remove, window_tracker_keyboard_window_remove, void(WindowTrackerData *));
 DECLARE_FUNCTION_MOCK3(mock_window_tracker_register, window_tracker_register, void(WindowTrackerData *, WindowTrackerCb, void *));
 DECLARE_FUNCTION_MOCK1(mock_window_tracker_shutdown, window_tracker_shutdown, void(WindowTrackerData *));
-DECLARE_FUNCTION_MOCK1(mock_window_tracker_subroot_get, window_tracker_subroot_get, AtspiAccessible *(WindowTrackerData *));
 DECLARE_FUNCTION_MOCK1(mock_window_tracker_top_win_get, window_tracker_top_win_get, AtspiAccessible *(WindowTrackerData *));
 DECLARE_FUNCTION_MOCK1(mock_window_tracker_top_window_get, window_tracker_top_window_get, AtspiAccessible *(WindowTrackerData *));
 DECLARE_FUNCTION_MOCK1(mock_window_tracker_top_window_info_get, window_tracker_top_window_info_get, WindowInfo *(WindowTrackerData *));