From: Sungbae Yoo Date: Fri, 10 Jun 2016 08:40:25 +0000 (+0900) Subject: Kaskit: Add removing app icons when package manager event is sent X-Git-Tag: accepted/tizen/common/20160615.193412~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ebdd6b98a3c38735ea510e0c7bac2c89fcf2f680;p=platform%2Fcore%2Fsecurity%2Fdevice-policy-manager.git Kaskit: Add removing app icons when package manager event is sent Change-Id: I43a30cb6b2f0ea16f7133e01840c9bfd772397c1 Signed-off-by: Sungbae Yoo --- diff --git a/zone/kaskit/include/kaskit.h b/zone/kaskit/include/kaskit.h index 85b3964..9311889 100644 --- a/zone/kaskit/include/kaskit.h +++ b/zone/kaskit/include/kaskit.h @@ -44,16 +44,16 @@ typedef struct { Evas_Object* conform; Evas_Object* layout; Evas_Object* panel; - Evas_Object* app_view; Evas_Object* scroller; - Evas_Object* box; + Evas_Object* app_view; + Eina_List* app_icon_list; char* edj_path; } uidata_s; void _create_kaskit_window(const char* krate_name); -void _create_app_icon(char* pkg_id, char* app_id, char* label, char* icon); -void _destroy_app_icon(char* pkg_id); +void _create_app_icon(const char* pkg_id, const char* app_id, const char* label, const char* icon); +void _destroy_app_icon(const char* pkg_id); -void _icon_clicked_cb(char *app_id); +void _icon_clicked_cb(const char *app_id); #endif /* __KASKIT_H__ */ diff --git a/zone/kaskit/src/main.c b/zone/kaskit/src/main.c index 1e675af..0c848d8 100644 --- a/zone/kaskit/src/main.c +++ b/zone/kaskit/src/main.c @@ -16,8 +16,6 @@ * limitations under the License. * */ -#include - #include #include #include @@ -29,53 +27,41 @@ static zone_package_proxy_h __zone_pkg; static zone_app_proxy_h __zone_app; static zone_manager_h __zone_mgr; -static bool __app_terminated = false; - static bool __get_app_info_cb(app_info_h app_h, void* user_data) { - char* app_label = NULL, *app_icon = NULL, *app_id, *pkg_id; + char* pkg_id, *app_id, *app_label = NULL, *app_icon = NULL; bool nodisplay = false; - if (__app_terminated) - return false; - app_info_is_nodisplay(app_h, &nodisplay); if (nodisplay) return true; - app_info_get_app_id(app_h, &app_id); - app_info_get_label(app_h, &app_label); - app_info_get_icon(app_h, &app_icon); app_info_get_package(app_h, &pkg_id); if (user_data == NULL || !strncmp(user_data, pkg_id, PATH_MAX)) { + app_info_get_app_id(app_h, &app_id); + app_info_get_label(app_h, &app_label); + app_info_get_icon(app_h, &app_icon); + _create_app_icon(pkg_id, app_id, app_label, app_icon); + free(app_id); + if (app_label != NULL) { + free(app_label); + } + if (app_icon != NULL) { + free(app_icon); + } } - - free(app_id); free(pkg_id); - if (app_label != NULL) { - free(app_label); - } - if (app_icon != NULL) { - free(app_icon); - } return true; } -void* create_app_thread(void* data) { +static void __create_icon(void *data) { zone_app_proxy_foreach_app_info(__zone_app, __get_app_info_cb, data); if (data != NULL) { free(data); } - return NULL; -} - -void* destroy_app_thread(void* data) { - _destroy_app_icon(data); - free(data); - return NULL; } static void __pkg_event_cb(const char* type, @@ -84,13 +70,11 @@ static void __pkg_event_cb(const char* type, package_manager_event_state_e event_state, int progress, package_manager_error_e error, void* user_data) { - pthread_t tid; - if (event_state == PACKAGE_MANAGER_EVENT_STATE_COMPLETED) { if (event_type == PACKAGE_MANAGER_EVENT_TYPE_INSTALL) { - pthread_create(&tid, NULL, create_app_thread, strdup(pkg_id)); + ecore_main_loop_thread_safe_call_async(__create_icon, strdup(pkg_id)); } else if (event_type == PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL) { - pthread_create(&tid, NULL, destroy_app_thread, strdup(pkg_id)); + _destroy_app_icon(pkg_id); } } } @@ -121,7 +105,7 @@ static void __toast_callback_cb(void *data, Evas_Object *obj) ui_app_exit(); } -void _icon_clicked_cb(char *app_id) +void _icon_clicked_cb(const char *app_id) { zone_app_proxy_launch(__zone_app, app_id); ui_app_exit(); @@ -132,7 +116,6 @@ static bool __app_create(void *data) zone_iterator_h it; const char* zone_name; char *current_zone_name; - pthread_t tid; current_zone_name = __get_current_zone_name(); zone_manager_create(&__zone_mgr); @@ -160,7 +143,7 @@ static bool __app_create(void *data) PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL); zone_package_proxy_set_event_cb(__zone_pkg, __pkg_event_cb, NULL); - pthread_create(&tid, NULL, create_app_thread, NULL); + ecore_main_loop_thread_safe_call_async(__create_icon, NULL); zone_iterator_destroy(it); free(current_zone_name); @@ -180,8 +163,6 @@ static void __app_resume(void *data) static void __app_terminate(void *data) { - __app_terminated = true; - zone_package_proxy_destroy(__zone_pkg); zone_app_proxy_destroy(__zone_app); zone_manager_destroy(__zone_mgr); diff --git a/zone/kaskit/src/ui.c b/zone/kaskit/src/ui.c index 4bfcbea..cb3c0bb 100644 --- a/zone/kaskit/src/ui.c +++ b/zone/kaskit/src/ui.c @@ -21,6 +21,7 @@ #include "conf.h" static uidata_s ud = {0, }; + static int __num_of_apps = 0; static void __block_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) @@ -28,25 +29,9 @@ static void __block_clicked_cb(void *data, Evas_Object *obj, const char *emissio ui_app_exit(); } -int __icon_down_x, __icon_down_y; -static void __app_icon_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { - Evas_Event_Mouse_Up* ev = event_info; - - __icon_down_x = ev->output.x; - __icon_down_y = ev->output.y; -} - -static void __app_icon_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void __app_view_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { - Evas_Event_Mouse_Up* ev = event_info; - int distance_x = (ev->output.x - __icon_down_x); - int distance_y = (ev->output.y - __icon_down_y); - int distance = distance_x * distance_x + distance_y * distance_y; - - if (distance <= ALLOWED_ICON_DRAG_DISTANCE) { - _icon_clicked_cb(data); - } - free(data); + eina_list_free(ud.app_icon_list); } static void __set_kaskit_layout(const char *name) @@ -65,6 +50,8 @@ static void __set_kaskit_layout(const char *name) elm_table_homogeneous_set(ud.app_view, EINA_TRUE); elm_object_content_set(ud.scroller, ud.app_view); + evas_object_event_callback_add(ud.app_view, EVAS_CALLBACK_DEL, __app_view_del_cb, NULL); + return; } @@ -101,9 +88,35 @@ void _create_kaskit_window(const char *krate_name) return; } -void _create_app_icon(char* pkg_id, char* app_id, char* label, char* icon) +int __icon_down_x, __icon_down_y; +static void __app_icon_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { + Evas_Event_Mouse_Up* ev = event_info; + + __icon_down_x = ev->output.x; + __icon_down_y = ev->output.y; +} + +static void __app_icon_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up* ev = event_info; + int distance_x = (ev->output.x - __icon_down_x); + int distance_y = (ev->output.y - __icon_down_y); + int distance = distance_x * distance_x + distance_y * distance_y; + + if (distance <= ALLOWED_ICON_DRAG_DISTANCE) { + _icon_clicked_cb(data); + } + free(data); +} + +static void __app_icon_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { - char string[1024] = {0, }; + free(evas_object_data_get(obj, "package")); +} + +void _create_app_icon(const char* pkg_id, const char* app_id, const char* label, const char* icon) +{ + char string[1024] = {0, }, *default_icon; Evas_Object *icon_layout; Evas_Object *icon_image; @@ -111,13 +124,14 @@ void _create_app_icon(char* pkg_id, char* app_id, char* label, char* icon) evas_object_size_hint_weight_set(icon_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(icon_layout, 0.0, 0.0); - if (!ecore_file_can_read(icon)) { - free(icon); - icon = __get_res_path("images/default_app_icon.png"); - } - icon_image = elm_image_add(icon_layout); - elm_image_file_set(icon_image, icon, NULL); + if (ecore_file_can_read(icon)) { + elm_image_file_set(icon_image, icon, NULL); + } else { + default_icon = __get_res_path("images/default_app_icon.png"); + elm_image_file_set(icon_image, default_icon, NULL); + free(default_icon); + } evas_object_size_hint_min_set(icon_image, ICON_IMG_SIZE, ICON_IMG_SIZE); evas_object_size_hint_max_set(icon_image, ICON_IMG_SIZE, ICON_IMG_SIZE); @@ -128,18 +142,44 @@ void _create_app_icon(char* pkg_id, char* app_id, char* label, char* icon) elm_object_part_content_set(icon_layout, "icon_content", icon_image); + evas_object_data_set(icon_layout, "package", strdup(pkg_id)); + + evas_object_event_callback_add(icon_layout, EVAS_CALLBACK_DEL, __app_icon_del_cb, NULL); evas_object_event_callback_add(icon_layout, EVAS_CALLBACK_MOUSE_DOWN, __app_icon_down_cb, NULL); evas_object_event_callback_add(icon_layout, EVAS_CALLBACK_MOUSE_UP, __app_icon_up_cb, strdup(app_id)); elm_table_pack(ud.app_view, icon_layout, __num_of_apps % 3, __num_of_apps / 3, 1, 1); evas_object_size_hint_min_set(ud.app_view, 0, (__num_of_apps / 3 + 1) * ICON_SIZE_H); + ud.app_icon_list = eina_list_append(ud.app_icon_list, icon_layout); + __num_of_apps++; evas_object_show(icon_image); evas_object_show(icon_layout); + } -void _destroy_app_icon(char* pkg_id) +void _destroy_app_icon(const char* pkg_id) { + int index = 0; + Eina_List* i, *i_next; + Evas_Object* app_icon; + char *app_pkg_id; + + EINA_LIST_FOREACH_SAFE(ud.app_icon_list, i, i_next, app_icon) { + app_pkg_id = evas_object_data_get(app_icon, "package"); + if (strncmp(app_pkg_id, pkg_id, PATH_MAX)) { + elm_table_pack(ud.app_view, app_icon, index % 3, index / 3, 1, 1); + evas_object_size_hint_min_set(ud.app_view, 0, (__num_of_apps / 3 + 1) * ICON_SIZE_H); + index++; + continue; + } + elm_table_unpack(ud.app_view, app_icon); + evas_object_del(app_icon); + evas_object_size_hint_min_set(ud.app_view, 0, (__num_of_apps / 3 + 1) * ICON_SIZE_H); + ud.app_icon_list = eina_list_remove_list(ud.app_icon_list, i); + } + __num_of_apps--; + evas_object_size_hint_min_set(ud.app_view, 0, (__num_of_apps / 3 + 1) * ICON_SIZE_H); }