From 2d73beeae2801bbe7a5eedf540929f2193e33684 Mon Sep 17 00:00:00 2001 From: Eunyoung Lee Date: Thu, 13 Apr 2017 21:19:28 +0900 Subject: [PATCH] Add group_feature_scroll_page_after_adding_widget Change-Id: I5a16bf8ce870528f34b8de8577d61a0ba717ccbe --- inc/add_widget_viewer/add_widget_data.h | 1 + src/add_widget_viewer/add_widget_data.c | 45 +++-- src/add_widget_viewer/add_widget_viewer.c | 29 ++- src/apps_view.c | 2 +- src/cluster_data.c | 22 +-- src/cluster_view.c | 47 ++++- test/feature_test/feature_test.c | 4 +- test/feature_test/feature_test.h | 1 + test/feature_test/group_feature_all_page_back.c | 2 +- ...group_feature_scroll_page_after_adding_widget.c | 209 +++++++++++++++++++++ 10 files changed, 313 insertions(+), 49 deletions(-) create mode 100644 test/feature_test/group_feature_scroll_page_after_adding_widget.c diff --git a/inc/add_widget_viewer/add_widget_data.h b/inc/add_widget_viewer/add_widget_data.h index 71cd47c..0426c78 100755 --- a/inc/add_widget_viewer/add_widget_data.h +++ b/inc/add_widget_viewer/add_widget_data.h @@ -37,6 +37,7 @@ typedef struct { bool add_widget_data_init(void); void add_widget_data_fini(void); +char *add_widget_data_get_widget_label(const char *widget_id); Eina_List *add_widget_data_get_widget_list(void); Eina_List *add_widget_data_get_widget_preview_list(add_widget_data_t *widget); diff --git a/src/add_widget_viewer/add_widget_data.c b/src/add_widget_viewer/add_widget_data.c index 8405216..f9c470c 100755 --- a/src/add_widget_viewer/add_widget_data.c +++ b/src/add_widget_viewer/add_widget_data.c @@ -60,6 +60,32 @@ Eina_List *add_widget_data_get_widget_preview_list(add_widget_data_t *widget) return widget->preview_list; } +char *add_widget_data_get_widget_label(const char *widget_id) +{ + char *lang = NULL; + int ret = SYSTEM_SETTINGS_ERROR_NONE; + + ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &lang); + if (ret != SYSTEM_SETTINGS_ERROR_NONE) { + LOGE("Failed to get value of SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE"); + lang = NULL; + } + eina_str_tolower(&lang); + + Eina_Strbuf *lang_buf = eina_strbuf_new(); + eina_strbuf_append_printf(lang_buf, "%s", lang); + eina_strbuf_replace_all(lang_buf, "_", "-"); + + char *label = widget_service_get_name(widget_id, eina_strbuf_string_get(lang_buf)); + if (!label || strlen(label) == 0) + label = strdup(widget_id); + + if (lang) free(lang); + if (lang_buf) eina_strbuf_free(lang_buf); + + return label; +} + static int __add_widget_data_widget_list_cb(const char *app_id, const char *widget_id, int is_prime, void *data) { LOGD("App id: %s", app_id); @@ -110,24 +136,7 @@ static int __add_widget_data_widget_list_cb(const char *app_id, const char *widg widget->size_types_count = types_count; widget->app_id = strdup(app_id); widget->widget_id = strdup(widget_id); - - ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &lang); - if (ret != SYSTEM_SETTINGS_ERROR_NONE) { - LOGE("SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE : fail"); - lang = NULL; - } - eina_str_tolower(&lang); - - Eina_Strbuf *lang_buf = eina_strbuf_new(); - eina_strbuf_append_printf(lang_buf, "%s", lang); - eina_strbuf_replace_all(lang_buf, "_", "-"); - - widget->label = widget_service_get_name(widget->widget_id, eina_strbuf_string_get(lang_buf)); - if (!widget->label || strlen(widget->label) == 0) - widget->label = strdup(widget_id); - - if (lang) free(lang); - if (lang_buf) eina_strbuf_free(lang_buf); + widget->label = strdup(add_widget_data_get_widget_label(widget->widget_id)); add_widget_data_s.data_list = eina_list_sorted_insert(add_widget_data_s.data_list, __add_widget_data_widget_compare_cb, widget); diff --git a/src/add_widget_viewer/add_widget_viewer.c b/src/add_widget_viewer/add_widget_viewer.c index 8f6da96..ae0d4ba 100755 --- a/src/add_widget_viewer/add_widget_viewer.c +++ b/src/add_widget_viewer/add_widget_viewer.c @@ -683,6 +683,18 @@ static Evas_Object *__add_widget_viewer_list_widget_preview_box_create(Evas_Obje return preview_layout; } +static void __add_widget_viewer_insert_widget(const char *id, const char *label, const char *content_info, int type) +{ + char *widget_id = strdup(id); + char *widget_label = strdup(label); + + cluster_view_set_state(VIEW_STATE_NORMAL); + cluster_data_insert_widget(widget_id, widget_label, content_info, type); + + free(widget_id); + free(widget_label); +} + static void __add_widget_viewer_preview_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) { LOGD("Preview clicked"); @@ -705,14 +717,7 @@ static void __add_widget_viewer_preview_clicked_cb(void *data, Evas_Object *obj, int type = *size; free(size); - char *widget_id = strdup(widget->widget_id); - char *widget_label = strdup(widget->label); - - cluster_view_set_state(VIEW_STATE_NORMAL); - - cluster_data_insert_widget(widget_id, widget_label, NULL, type); - free(widget_id); - free(widget_label); + __add_widget_viewer_insert_widget(widget->widget_id, widget->label, NULL, type); } static void __add_widget_get_size_by_type(int type, int *w, int *h) @@ -759,3 +764,11 @@ static void __add_widget_get_size_by_type(int type, int *w, int *h) break; } } + +#include "test.h" +#if TEST_MODE +void __t__add_widget_viewer_insert_widget(const char *id, const char *label, const char *content_info, int type) +{ + __add_widget_viewer_insert_widget(id, label, content_info, type); +} +#endif diff --git a/src/apps_view.c b/src/apps_view.c index 456ab80..6ac6b64 100755 --- a/src/apps_view.c +++ b/src/apps_view.c @@ -1487,7 +1487,7 @@ static void __apps_view_badge_update_count(app_data_t *item) static void __apps_view_badge_lang_changed(void) { - LOGD("%s language changed"); + LOGD("language changed"); Eina_List *data_list = apps_data_get_list(); Eina_List *find_list = NULL; diff --git a/src/cluster_data.c b/src/cluster_data.c index 1c80116..4440d81 100755 --- a/src/cluster_data.c +++ b/src/cluster_data.c @@ -14,11 +14,11 @@ * limitations under the License. */ #include -#include #include "cluster_data.h" #include "cluster_db.h" #include "cluster_view.h" +#include "add_widget_viewer/add_widget_data.h" #include "util.h" #include "conf.h" @@ -64,7 +64,7 @@ void cluster_data_set_page_count(int count) } } -void cluster_data_insert_widget(const char* pkg_name, const char *label, const char* content_info, int type) +void cluster_data_insert_widget(const char* pkg_name, const char *label, const char *content_info, int type) { widget_data_t *new_item = (widget_data_t *)malloc(sizeof(widget_data_t)); memset(new_item, 0, sizeof(widget_data_t)); @@ -115,29 +115,13 @@ static void __cluster_data_insert_default_data(void) * org.tizen.music-player.widget * org.tizen.contacts-widget */ - char *lang = NULL; - int ret = SYSTEM_SETTINGS_ERROR_NONE; widget_data_t *new_item = (widget_data_t *)malloc(sizeof(widget_data_t)); memset(new_item, 0, sizeof(widget_data_t)); new_item->page_idx = 0; new_item->pos_y = 0; new_item->pos_x = 0; new_item->pkg_name = strdup("org.tizen.calendar.widget"); - - ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &lang); - if (ret != SYSTEM_SETTINGS_ERROR_NONE) { - LOGE("SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE : fail"); - lang = NULL; - } - eina_str_tolower(&lang); - - Eina_Strbuf *lang_buf = eina_strbuf_new(); - eina_strbuf_append_printf(lang_buf, "%s", lang); - eina_strbuf_replace_all(lang_buf, "_", "-"); - - new_item->widget_label = widget_service_get_name(new_item->pkg_name, eina_strbuf_string_get(lang_buf)); - if (!new_item->widget_label || strlen(new_item->widget_label) == 0) - new_item->widget_label = strdup("calendar"); + new_item->widget_label = strdup(add_widget_data_get_widget_label(new_item->pkg_name)); new_item->content_info = NULL; new_item->type = WIDGET_SIZE_TYPE_4x4; diff --git a/src/cluster_view.c b/src/cluster_view.c index 04f270f..b26cb2e 100755 --- a/src/cluster_view.c +++ b/src/cluster_view.c @@ -570,6 +570,16 @@ bool cluster_view_set_state(view_state_t state) return true; } +#ifdef SCROLL_TIMING_ISSUE +static Eina_Bool __cluster_view_add_widget_scroll_timer_cb(void *data) +{ + __cluster_view_scroll_to_page(cluster_view_s.current_page, true); + + __scroll_timing_timer = NULL; + return ECORE_CALLBACK_CANCEL; +} +#endif + bool cluster_view_add_widget(widget_data_t *item, bool scroll) { bool set_on = false; @@ -634,7 +644,15 @@ bool cluster_view_add_widget(widget_data_t *item, bool scroll) if (scroll) { cluster_view_s.current_page = item->page_idx; +#ifdef SCROLL_TIMING_ISSUE + if (__scroll_timing_timer) { + ecore_timer_del(__scroll_timing_timer); + __scroll_timing_timer = NULL; + } + __scroll_timing_timer = ecore_timer_add(SCROLL_TIMING_INTERVAL, __cluster_view_add_widget_scroll_timer_cb, NULL); +#else __cluster_view_scroll_to_page(cluster_view_s.current_page, true); +#endif } return true; @@ -766,7 +784,13 @@ static void __cluster_view_scroll_to_home(void) static void __cluster_view_scroll_to_page(int page_idx, bool animation) { - if (page_idx == cluster_view_s.current_page) return; + int current_page = -1; + elm_scroller_current_page_get(cluster_view_s.scroller, ¤t_page, NULL); + + if (page_idx == current_page) { + LOGD("Do not need to scroll. Requested page is same as current page"); + return; + } __cluster_view_scroll_start(); @@ -1810,6 +1834,27 @@ void __t__cluster_view_page_delete(int page_idx) cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, page_idx); __cluster_view_page_delete(page); } +void __t__cluster_view_page_widget_delete(int page_idx) +{ + cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, page_idx); + + Eina_List *find_list = NULL; + widget_data_t *widget = NULL; + EINA_LIST_FOREACH(page->widget_list, find_list, widget) { + cluster_data_delete(widget); + } +} +Eina_Bool __t__cluster_view_page_has_widget(int page_idx) +{ + cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, page_idx); + + Eina_List *find_list = NULL; + widget_data_t *widget = NULL; + EINA_LIST_FOREACH(page->widget_list, find_list, widget) { + if (widget) return EINA_TRUE; + } + return EINA_FALSE; +} int __t__cluster_view_get_page_count(void) { return cluster_view_s.page_count; diff --git a/test/feature_test/feature_test.c b/test/feature_test/feature_test.c index a8ff64e..c15ebea 100644 --- a/test/feature_test/feature_test.c +++ b/test/feature_test/feature_test.c @@ -5,7 +5,7 @@ #include -static const int TEST_GROUP_COUNT = 2; +static const int TEST_GROUP_COUNT = 3; static void __complete_group_cb(void); static void __run_next_group(void); @@ -19,11 +19,13 @@ static struct { .group_name = { "group_feature_scroll_to_page", "group_feature_all_page_back", + "group_feature_scroll_page_after_adding_widget", "" }, .group_starter_pool = { group_feature_scroll_to_page, group_feature_all_page_back, + group_feature_scroll_page_after_adding_widget, NULL, }, }; diff --git a/test/feature_test/feature_test.h b/test/feature_test/feature_test.h index 410375d..4a6e9fd 100644 --- a/test/feature_test/feature_test.h +++ b/test/feature_test/feature_test.h @@ -9,6 +9,7 @@ void feature_test(void); void group_feature_all_page_back(unit_group_t * group); void group_feature_scroll_to_page(unit_group_t * group); +void group_feature_scroll_page_after_adding_widget(unit_group_t * group); #endif diff --git a/test/feature_test/group_feature_all_page_back.c b/test/feature_test/group_feature_all_page_back.c index 4c77c1e..c9e3965 100644 --- a/test/feature_test/group_feature_all_page_back.c +++ b/test/feature_test/group_feature_all_page_back.c @@ -160,7 +160,7 @@ void group_feature_all_page_back(unit_group_t * group) s_info.current_case = 0; s_info.group = group; - s_info.group_timer = ecore_timer_add(0.5, __group_timer_callback, NULL); + s_info.group_timer = ecore_timer_add(1.0, __group_timer_callback, NULL); } static Eina_Bool __group_timer_callback(void * data) diff --git a/test/feature_test/group_feature_scroll_page_after_adding_widget.c b/test/feature_test/group_feature_scroll_page_after_adding_widget.c new file mode 100644 index 0000000..cf14d85 --- /dev/null +++ b/test/feature_test/group_feature_scroll_page_after_adding_widget.c @@ -0,0 +1,209 @@ +#include "test.h" +#if TEST_MODE + +#include "feature_test.h" +#include "cluster_view.h" +#include "add_widget_viewer/add_widget_data.h" + +#include + +extern void __t__cluster_view_page_new(void); +extern void __t__cluster_view_scroll_to_page(int page_idx, bool animation); +extern bool __t__cluster_view_get_is_scrolling(void); +extern int __t__cluster_view_get_current_page(); +extern int __t__cluster_view_get_page_count(void); +extern void __t__cluster_view_page_widget_delete(int page_idx); +extern void __t__cluster_view_page_delete(int page_idx); +extern void __t__add_widget_viewer_insert_widget(const char *id, const char *label, const char *content_info, int type); +extern Eina_Bool __t__cluster_view_page_has_widget(int page_idx); + + +static const int CASE_COUNT = 19; +static void __case_check_default_pages_are_empty(bool *is_passed); +static void __case_show_add_widget_page(bool *is_passed); +static void __case_add_calendar_widget(bool *is_passed); +static void __case_add_gallery_widget(bool *is_passed); +static void __case_check_0_page_has_widget(bool *is_passed); +static void __case_check_1_page_has_widget(bool *is_passed); +static void __case_check_last_page_has_widget(bool *is_passed); + +static struct { + Ecore_Timer * group_timer; + unit_group_t * group; + int current_case; + void(*case_pool[CASE_COUNT + 1])(bool * is_passed); +} s_info = { + .group_timer = NULL, + .group = NULL, + .current_case = 0, + .case_pool = { + __case_check_default_pages_are_empty, + __case_show_add_widget_page, + __case_add_calendar_widget, + __case_check_0_page_has_widget, + __case_show_add_widget_page, + __case_add_gallery_widget, + __case_check_1_page_has_widget, + __case_show_add_widget_page, + __case_add_calendar_widget, + __case_check_last_page_has_widget, + __case_show_add_widget_page, + __case_add_gallery_widget, + __case_check_last_page_has_widget, + __case_show_add_widget_page, + __case_add_calendar_widget, + __case_check_last_page_has_widget, + __case_show_add_widget_page, + __case_add_gallery_widget, + __case_check_last_page_has_widget, + NULL, + }, +}; + +static Eina_Bool __group_timer_callback(void * data); + +static void __set_up(void) { unit_clear_log(); } +static void __tear_down(void) { unit_clear_log(); } + + +static void __case_check_default_pages_are_empty(bool *is_passed) +{ + TEST_ASSERT_EQUAL_INT(0, __t__cluster_view_get_current_page()); + TEST_ASSERT_EQUAL_INT(VIEW_STATE_NORMAL, cluster_view_get_state()); + TEST_ASSERT_TRUE(__t__cluster_view_get_is_scrolling() == false); + TEST_ASSERT_TRUE(__t__cluster_view_page_has_widget(0) == EINA_FALSE); + TEST_ASSERT_TRUE(__t__cluster_view_page_has_widget(1) == EINA_FALSE); + + *is_passed = true; +} + +static void __case_show_add_widget_page(bool *is_passed) +{ + TEST_ASSERT_TRUE(__t__cluster_view_get_is_scrolling() == false); + TEST_ASSERT_EQUAL_INT(VIEW_STATE_NORMAL, cluster_view_get_state()); + + cluster_view_set_state(VIEW_STATE_ADD_VIEWER); + + TEST_ASSERT_EQUAL_INT(VIEW_STATE_ADD_VIEWER, cluster_view_get_state()); + + *is_passed = true; +} + +extern Evas_Object * __t__cluster_view_get_scroller(void); +static void __case_add_calendar_widget(bool *is_passed) +{ + char *widget_id = "org.tizen.calendar.widget"; + char *widget_label = add_widget_data_get_widget_label(widget_id); + + __t__add_widget_viewer_insert_widget(widget_id, widget_label, NULL, WIDGET_SIZE_TYPE_4x4); + + TEST_ASSERT_EQUAL_INT(VIEW_STATE_NORMAL, cluster_view_get_state()); + + *is_passed = true; +} + +static void __case_add_gallery_widget(bool *is_passed) +{ + char *widget_id = "org.tizen.gallery.widget"; + char *widget_label = add_widget_data_get_widget_label(widget_id); + + __t__add_widget_viewer_insert_widget(widget_id, widget_label, NULL, WIDGET_SIZE_TYPE_4x4); + + TEST_ASSERT_EQUAL_INT(VIEW_STATE_NORMAL, cluster_view_get_state()); + + *is_passed = true; +} + +static int __get_current_page_from_scroller(void) +{ + int cur_p = -1; + Evas_Object *sc = __t__cluster_view_get_scroller(); + elm_scroller_current_page_get(sc, &cur_p, NULL); + return cur_p; +} + +static void __case_check_0_page_has_widget(bool *is_passed) +{ + TEST_ASSERT_EQUAL_INT(0, __t__cluster_view_get_current_page()); + TEST_ASSERT_EQUAL_INT(0, __get_current_page_from_scroller()); + + TEST_ASSERT_EQUAL_INT(VIEW_STATE_NORMAL, cluster_view_get_state()); + TEST_ASSERT_TRUE(__t__cluster_view_get_is_scrolling() == false); + TEST_ASSERT_TRUE(__t__cluster_view_page_has_widget(0) == EINA_TRUE); + TEST_ASSERT_TRUE(__t__cluster_view_page_has_widget(1) == EINA_FALSE); + + *is_passed = true; +} + +static void __case_check_1_page_has_widget(bool *is_passed) +{ + TEST_ASSERT_EQUAL_INT(1, __t__cluster_view_get_current_page()); + TEST_ASSERT_EQUAL_INT(1, __get_current_page_from_scroller()); + + TEST_ASSERT_EQUAL_INT(VIEW_STATE_NORMAL, cluster_view_get_state()); + TEST_ASSERT_TRUE(__t__cluster_view_get_is_scrolling() == false); + TEST_ASSERT_TRUE(__t__cluster_view_page_has_widget(0) == EINA_TRUE); + TEST_ASSERT_TRUE(__t__cluster_view_page_has_widget(1) == EINA_TRUE); + + *is_passed = true; +} + +static void __case_check_last_page_has_widget(bool *is_passed) +{ + int page_count = __t__cluster_view_get_page_count(); + + TEST_ASSERT_EQUAL_INT(page_count - 1, __t__cluster_view_get_current_page()); + TEST_ASSERT_EQUAL_INT(page_count - 1, __get_current_page_from_scroller()); + + TEST_ASSERT_EQUAL_INT(VIEW_STATE_NORMAL, cluster_view_get_state()); + TEST_ASSERT_TRUE(__t__cluster_view_get_is_scrolling() == false); + TEST_ASSERT_TRUE(__t__cluster_view_page_has_widget(0) == EINA_TRUE); + TEST_ASSERT_TRUE(__t__cluster_view_page_has_widget(1) == EINA_TRUE); + TEST_ASSERT_TRUE(__t__cluster_view_page_has_widget(page_count - 1) == EINA_TRUE); + + *is_passed = true; +} + +void group_feature_scroll_page_after_adding_widget(unit_group_t * group) +{ + int page_count = __t__cluster_view_get_page_count(); + + if (page_count == 1) { + __t__cluster_view_page_new(); + page_count++; + } else if (page_count > 2) { + while(page_count > 2) { + __t__cluster_view_page_delete(page_count - 1); + page_count--; + } + } + __t__cluster_view_page_widget_delete(0); + __t__cluster_view_page_widget_delete(1); + + if (s_info.group_timer) { + ecore_timer_del(s_info.group_timer); + s_info.group_timer = NULL; + } + + s_info.current_case = 0; + s_info.group = group; + s_info.group_timer = ecore_timer_add(1.0, __group_timer_callback, NULL); +} + +static Eina_Bool __group_timer_callback(void * data) +{ + if (s_info.case_pool[s_info.current_case] == NULL) { + s_info.group->finish(s_info.group); + + s_info.group_timer = NULL; + return ECORE_CALLBACK_CANCEL; + } + + TEST_CASE(s_info.group, s_info.case_pool[s_info.current_case]); + s_info.current_case += 1; + + return ECORE_CALLBACK_RENEW; +} + +#endif + -- 2.7.4