Remove reading "in-progress" when progressbar reach maximum value 50/257550/6
authorLukasz Oleksak <l.oleksak@samsung.com>
Tue, 27 Apr 2021 12:21:52 +0000 (14:21 +0200)
committerLukasz Oleksak <l.oleksak@samsung.com>
Fri, 7 May 2021 14:54:48 +0000 (14:54 +0000)
Change-Id: Idf3cb577e2425342e89fe91b47fbe16783a09efc

include/reading_composer.h
include/utils.h
src/app_tracker.c
src/reading_composer.c
src/utils.c

index 1446d4ac2e1911d5ef52ded8a90c7c72dba1851f..d69a453796898a04b2ffbdc971f80ac1fd06728d 100644 (file)
@@ -37,4 +37,10 @@ char* reading_composer_description_get(ReadingComposerData *data);
  */
 char* reading_composer_extended_description_get(ReadingComposerData *data);
 
+/**
+ * @brief This function provides textual representation of the value carried by UI element
+ *        which is expressed in percents.
+ */
+char* reading_composer_percent_value_description_get(ReadingComposerData *data);
+
 #endif
index b86d3646cdcdd16c8c52cfe19e6fb87de6018857..0eff4eef289ba69724e68818a62b9819c3e4b43f 100644 (file)
@@ -16,7 +16,7 @@
 
 #define SCREEN_READER_SAFE_FREE(_h, _fn) do { _fn((void*)_h); _h = NULL; } while (0)
 
-#define HOVERSEL_TRAIT_SIZE 200
+#define MAX_ACCURACY 3
 
 #ifndef TIZEN_GTEST
 #define TIZEN_PROD_STATIC static
@@ -121,7 +121,7 @@ Eina_Bool object_has_modal_role(AtspiRole role);
 Eina_Bool object_has_defunct_state(AtspiAccessible *obj);
 Eina_Bool object_has_highlighted_state(AtspiAccessible *obj);
 
-int get_accuracy(double val, int max_accuracy);
+int get_percent_value(double value, double lower, double upper);
 
 #endif /* UTILS_H_ */
 
index def8f6213b7040c0182a12a9627824c832bcb3e0..272baa791e986d74306bb0527025b308bfe22a5a 100644 (file)
@@ -136,32 +136,17 @@ static gboolean _on_timeout_rebuild_navigation_context(gpointer user_data)
        return FALSE;
 }
 
-static void _read_value(AtspiValue *value)
+static void _read_value(AtspiAccessible *obj)
 {
-       if (!value)
+       if (!obj)
                return;
-       int accuracy = get_accuracy(atspi_value_get_minimum_increment(value, NULL), 3);
-
-       double add_for_rounding = 0.5f;
-       int mul_for_rounding = 1;
-       int count = 0;
-       for (count = 0; count < accuracy; count++) {
-               add_for_rounding *= 0.1f;
-               mul_for_rounding *= 10;
-       }
-
-       int current_val = (int)((atspi_value_get_current_value(value, NULL) + add_for_rounding) * mul_for_rounding);
-       int max_val = (int)((atspi_value_get_maximum_value(value, NULL) + add_for_rounding) * mul_for_rounding);
-       int min_val = (int)((atspi_value_get_minimum_value(value, NULL) + add_for_rounding) * mul_for_rounding);
-
-       int percent = ((current_val - min_val) / (double)(abs(max_val - min_val))) * 100;
 
-       char buf[256] = "\0";
-       char buf_percent[64] = "\0";
-       g_snprintf(buf_percent, sizeof(buf_percent), "%d", percent);
-       SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf_percent));
-       DEBUG("has value %s", buf);
-       tw_speak(buf, EINA_TRUE);
+       char* text_to_speak = NULL;
+       ReadingComposerData *rcd = reading_composer_data_get(obj);
+       text_to_speak = reading_composer_percent_value_description_get(rcd);
+       reading_composer_data_free(rcd);
+       tw_speak(text_to_speak, EINA_TRUE);
+       free(text_to_speak);
 }
 
 static void timer_reschedule(App_Tracker_Data *atd)
@@ -424,9 +409,7 @@ static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
                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_DESCRIPTION)) {
-                       AtspiValue *value_interface = atspi_accessible_get_value_iface(event->source);
-                       _read_value(value_interface);
-                       g_object_unref(value_interface);
+                       _read_value(event->source);
                } else if (role == ATSPI_ROLE_FILLER) {
                        gchar *name = atspi_accessible_get_name(event->source, NULL);
                        if (!name) {
index 110d5022b7a44ab52b79eb6aed5a391586e01b8f..52ca38d4de8e007d44aa436271025cdd0b9a7d8b 100644 (file)
@@ -28,48 +28,37 @@ TIZEN_PROD_STATIC void display_info_about_object(AtspiAccessibleReadingMaterial
        DEBUG("END");
 }
 
-TIZEN_PROD_STATIC void add_slider_description(Eina_Strbuf *buf, AtspiAccessibleReadingMaterial *rm)
+TIZEN_PROD_STATIC int get_percent_value_from_rm(AtspiAccessibleReadingMaterial *rm)
 {
-       char trait[HOVERSEL_TRAIT_SIZE] = "";
-
-       int accuracy = get_accuracy(rm->increment, 3);
-
-       double add_for_rounding = 0.5f;
-       int mul_for_rounding = 1;
-       int count = 0;
-       for (count = 0; count < accuracy; count++) {
-               add_for_rounding *= 0.1f;
-               mul_for_rounding *= 10;
-       }
-
-       int val = (int)((rm->value + add_for_rounding) * mul_for_rounding);
-       int max_val = (int)((rm->upper + add_for_rounding) * mul_for_rounding);
-       int min_val = (int)((rm->lower + add_for_rounding) * mul_for_rounding);
-
-       int percent;
-       if (min_val >= max_val)
-               percent = 0;
-       else if (val <= min_val)
-               percent = 0;
-       else if (val >= max_val)
-               percent = 100;
-       else
-               percent = ((val - min_val) / (double)(abs(max_val - min_val))) * 100;
+       return get_percent_value(rm->value, rm->lower, rm->upper);
+}
 
+TIZEN_PROD_STATIC void add_percent_value_description(Eina_Strbuf *buf, int percent)
+{
        char buf_percent[64] = "\0";
 
        g_snprintf(buf_percent, sizeof(buf_percent), "%d", percent);
-       SUPPRESS_FORMAT_ERROR(g_snprintf(trait, sizeof(trait), _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf_percent));
+       SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf_percent));
+}
+
+TIZEN_PROD_STATIC void add_slider_description(Eina_Strbuf *buf, AtspiAccessibleReadingMaterial *rm)
+{
+       add_percent_value_description(buf, get_percent_value_from_rm(rm));
 
-       if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED))
-               g_snprintf(trait + strlen(trait), sizeof(trait) - strlen(trait), " , %s", _IGNORE_ON_TV("IDS_TPLATFORM_BODY_FLICK_UP_AND_DOWN_TO_ADJUST_THE_POSITION_T_TTS"));
-       ESAL(buf, trait);
+       if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED)) {
+               ESAL(buf, " , ");
+               ESAL(buf, _IGNORE_ON_TV("IDS_TPLATFORM_BODY_FLICK_UP_AND_DOWN_TO_ADJUST_THE_POSITION_T_TTS"));
+       }
 }
 
 TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
 {
        AtspiRole role = rm->role;
-       char ret[TTS_MAX_TEXT_SIZE] = { [TTS_MAX_TEXT_SIZE - 1] = 0 };
+       char *ret = NULL;
+       Eina_Strbuf *buf;
+
+       buf = eina_strbuf_new();
+
        switch (role) {
        case ATSPI_ROLE_ENTRY:
        case ATSPI_ROLE_PASSWORD_TEXT: {
@@ -79,27 +68,23 @@ TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
                        if (parent_role == ATSPI_ROLE_SPIN_BUTTON && STATE_SET_CONTAINS(rm->states, ATSPI_STATE_FOCUSED))
                                break;
                }
-               g_snprintf(ret, sizeof(ret), "%s", _("IDS_TPLATFORM_BODY_EDIT_FIELD_M_NOUN_T_TTS"));
+               ESAL(buf, _("IDS_TPLATFORM_BODY_EDIT_FIELD_M_NOUN_T_TTS"));
                break;
        }
        case ATSPI_ROLE_COMBO_BOX: {
                int children_count = rm->child_count;
-               char buf[TTS_MAX_TEXT_SIZE] = "";
-               g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
-               SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
-               g_strlcat(ret, " ", sizeof(ret) - strlen(ret) - 1);
-               g_strlcat(ret, buf, sizeof(ret) - strlen(ret) - 1);
+               ESAL(buf, _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
+               ESAL(buf, " ");
+               SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
                break;
        }
        case ATSPI_ROLE_GLASS_PANE: {
                AtspiAccessible *parent = rm->parent;
                if (parent) {
                        int children_count = rm->parent_child_count;
-                       char buf[TTS_MAX_TEXT_SIZE] = "";
-                       g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
-                       SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
-                       g_strlcat(ret, " ", sizeof(ret) - strlen(ret) - 1);
-                       g_strlcat(ret, buf, sizeof(ret) - strlen(ret) - 1);
+                       ESAL(buf, _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
+                       ESAL(buf, " ");
+                       SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
                }
                break;
        }
@@ -107,30 +92,28 @@ TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
                AtspiAccessible *parent = rm->parent;
                if (parent) {
                        if (STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_ANIMATED)) {
-                               g_strlcpy(ret, _("IDS_GALLERY_OPT_REORDER"), sizeof(ret) - 1);
-                               g_strlcat(ret, " , ", sizeof(ret) - strlen(ret) - 1);
-                               g_strlcat(ret, _("IDS_ACCS_BODY_BUTTON_TTS"), sizeof(ret) - strlen(ret) - 1);
+                               ESAL(buf, _("IDS_GALLERY_OPT_REORDER"));
+                               ESAL(buf, " , ");
+                               ESAL(buf, _("IDS_ACCS_BODY_BUTTON_TTS"));
                        }
                }
                break;
        }
        case ATSPI_ROLE_PUSH_BUTTON: {
-               g_strlcpy(ret, _("IDS_ACCS_BODY_BUTTON_TTS"), sizeof(ret) - 1);
+               ESAL(buf, _("IDS_ACCS_BODY_BUTTON_TTS"));
                break;
        }
        case ATSPI_ROLE_PROGRESS_BAR: {
                double val = rm->value;
                if (val > 0) {
-                       char buf[255];
-                       g_snprintf(buf, sizeof(buf), "%.0f", val * 100);
-                       SUPPRESS_FORMAT_ERROR(g_snprintf(ret, sizeof(ret), _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf));
+                       add_percent_value_description(buf, get_percent_value_from_rm(rm));
                }
                break;
        }
        case ATSPI_ROLE_SLIDER: {
                gchar *role_name = rm->localized_role_name;
                if (role_name)
-                       g_strlcat(ret, role_name, sizeof(ret) - strlen(ret) - 1);
+                       ESAL(buf, role_name);
                break;
        }
        case ATSPI_ROLE_SCROLL_BAR: {
@@ -138,7 +121,7 @@ TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
                if (hash_table) {
                        const char *style = g_hash_table_lookup(hash_table, "style");
                        if (!g_strcmp0(style, "default"))
-                               g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_TBOPT_ALPHABETICAL_INDEX_BAR"));
+                               ESAL(buf, _("IDS_ACCS_TBOPT_ALPHABETICAL_INDEX_BAR"));
                }
                break;
        }
@@ -160,11 +143,13 @@ TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
        default: {
                gchar *role_name = rm->localized_role_name;
                if (role_name)
-                       g_strlcpy(ret, role_name, sizeof(ret) - 1);
+                       ESAL(buf, role_name);
        }
        }
+       ret = eina_strbuf_string_steal(buf);
+       eina_strbuf_free(buf);
 
-       return g_strdup(ret);
+       return ret;
 }
 
 TIZEN_PROD_STATIC char *generate_state_trait(AtspiAccessibleReadingMaterial *rm)
@@ -338,7 +323,10 @@ TIZEN_PROD_STATIC char *generate_description_trait(AtspiAccessibleReadingMateria
                break;
        }
        case ATSPI_ROLE_PROGRESS_BAR: {
-               ESAL(buf, _("IDS_ACCS_TBBODY_IN_PROGRESS"));
+               int percent = get_percent_value_from_rm(rm);
+               if (percent < 100) {
+                       ESAL(buf, _("IDS_ACCS_TBBODY_IN_PROGRESS"));
+               }
                break;
        }
        case ATSPI_ROLE_SLIDER: {
@@ -682,6 +670,28 @@ char* reading_composer_extended_description_get(ReadingComposerData *data)
        return ext_desc;
 }
 
+char* reading_composer_percent_value_description_get(ReadingComposerData *data) {
+       Eina_Strbuf *buf = NULL;
+       AtspiAccessibleReadingMaterial *rm;
+
+       if (!data)
+               return NULL;
+
+       rm = data;
+
+       buf = eina_strbuf_new();
+       if (!buf) {
+               ERROR("CRITICAL: Memory allocation failed!");
+               return NULL;
+       }
+
+       add_percent_value_description(buf, get_percent_value_from_rm(rm));
+
+       char *percent_value_description = eina_strbuf_string_steal(buf);
+       eina_strbuf_free(buf);
+       return percent_value_description;
+}
+
 ReadingComposerData* reading_composer_data_get(AtspiAccessible *obj)
 {
        return obj ? atspi_accessible_get_reading_material(obj, NULL) : NULL;
index ba90f6996cd845719efd69b4e9f3a0e60e0bcf2a..06878a893f629855e87180055df245912b9e0af6 100644 (file)
@@ -17,6 +17,7 @@
 #include <atspi/atspi.h>
 #include <glib.h>
 #include <string.h>
+#include <math.h>
 
 #include <logger.h>
 #include <utils.h>
@@ -232,18 +233,29 @@ Eina_Bool object_has_highlighted_state(AtspiAccessible *obj)
        return ret;
 }
 
-int get_accuracy(double val, int max_accuracy)
+int get_percent_value(double value, double lower, double upper)
 {
-       char val_str[HOVERSEL_TRAIT_SIZE] = "";
-       int position;
-       int accuracy;
-
-       g_snprintf(val_str, HOVERSEL_TRAIT_SIZE, "%.*f", max_accuracy, val);
-       accuracy = max_accuracy;
-       position = strlen(val_str) - 1;
-       while (position > 0 && val_str[position] == '0') {
-               --position;
-               --accuracy;
+       double add_for_rounding = 0.5f;
+       int mul_for_rounding = 1;
+       int count = 0;
+       for (count = 0; count < MAX_ACCURACY; count++) {
+               add_for_rounding *= 0.1f;
+               mul_for_rounding *= 10;
        }
-       return accuracy;
+
+       int val = (int)((value + copysign(add_for_rounding, value)) * mul_for_rounding);
+       int max_val = (int)((upper + copysign(add_for_rounding, upper)) * mul_for_rounding);
+       int min_val = (int)((lower + copysign(add_for_rounding, lower)) * mul_for_rounding);
+
+       int percent;
+       if (min_val >= max_val)
+               percent = 0;
+       else if (val <= min_val)
+               percent = 0;
+       else if (val >= max_val)
+               percent = 100;
+       else
+               percent = ((val - min_val) / (double)(abs(max_val - min_val))) * 100;
+
+       return percent;
 }