Kaskit: Add removing app icons when package manager event is sent 88/73988/1
authorSungbae Yoo <sungbae.yoo@samsung.com>
Fri, 10 Jun 2016 08:40:25 +0000 (17:40 +0900)
committerSungbae Yoo <sungbae.yoo@samsung.com>
Fri, 10 Jun 2016 08:41:35 +0000 (17:41 +0900)
Change-Id: I43a30cb6b2f0ea16f7133e01840c9bfd772397c1
Signed-off-by: Sungbae Yoo <sungbae.yoo@samsung.com>
zone/kaskit/include/kaskit.h
zone/kaskit/src/main.c
zone/kaskit/src/ui.c

index 85b3964..9311889 100644 (file)
@@ -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__ */
index 1e675af..0c848d8 100644 (file)
@@ -16,8 +16,6 @@
  * limitations under the License.
  *
  */
-#include <pthread.h>
-
 #include <zone/zone.h>
 #include <zone/app-proxy.h>
 #include <zone/package-proxy.h>
@@ -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);
index 4bfcbea..cb3c0bb 100644 (file)
@@ -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);
 }