Storage 11/110311/2
authorRadek Kintop <r.kintop@samsung.com>
Fri, 13 Jan 2017 18:03:11 +0000 (19:03 +0100)
committerRadek Kintop <r.kintop@samsung.com>
Fri, 13 Jan 2017 18:05:14 +0000 (10:05 -0800)
- Fix app crash issue when going back from Apps to Main

Change-Id: I0f6027ef2cd2e5b22a99ebb61a887603bfb90bbd
Signed-off-by: Radek Kintop <r.kintop@samsung.com>
setting-storage/include/setting-storage.h
setting-storage/src/setting-storage-applications-utils.c
setting-storage/src/setting-storage-applications.c
setting-storage/src/setting-storage-main.c

index 0a3ec72b595a83854171d8d131f086b1845cde09..c15a7f059c2b62a3732b48766ad6589b3d3e324f 100755 (executable)
@@ -166,7 +166,7 @@ typedef struct {
        bool is_removable;
        Setting_GenGroupItem_Data *data;
        SettingStorage *ad;
-       Ecore_Idler *size_idler;
+       Ecore_Timer *size_timer;
 } Node_Info;
 
 typedef enum {
index 843c891c1b5488c55c70c46101644e7b2a342427..b8baf37a84185288073bc4d7ebc29c7d480b7bba 100644 (file)
@@ -124,8 +124,8 @@ Eina_Bool __get_size_on_time(void *data)
        SETTING_TRACE_BEGIN;
 
        Node_Info *info = data;
-       info->size_idler = NULL;
-       package_manager_get_package_size_info(info->id, node_get_size_cb, info);
+       info->size_timer = NULL;
+       package_manager_get_package_size_info(info->id, node_get_size_cb, info->ad);
 
        return EINA_FALSE;
 }
@@ -189,6 +189,7 @@ bool storage_get_pkg_list_iter(package_info_h handle, void *data)
 
        info->ad = ad;
        storage_apps_get_node_info(handle, info);
+       info->size_timer = ecore_timer_add(2.0, __get_size_on_time, info);
 
        /* Add to list */
        ad->data_list = eina_list_append(ad->data_list, info);
@@ -239,24 +240,35 @@ void storage_apps_get_node_info(package_info_h handle, Node_Info *info)
 void node_get_size_cb(const char *package_id, const package_size_info_h size_info,
                void *data)
 {
+       SETTING_TRACE_BEGIN;
        retm_if(data == NULL, "data == NULL");
        char desc[64] = { 0 };
-       Node_Info *info = data;
+       Node_Info *info = NULL;
+       SettingStorage *ad = data;
+       Eina_List *cur = NULL;
        long long size = 0;
 
-       package_size_info_get_data_size(size_info, &size);
-       info->total_size = (int)size;
-
-       package_size_info_get_app_size(size_info, &size);
-       info->total_size += (int)size;
-       SETTING_TRACE(">>Size [%d]", info->total_size);
-
-       size_to_str(info->total_size, desc, sizeof(desc));
-       info->size_str = strdup(desc);
-
-       free(info->data->sub_desc);
-       info->data->sub_desc = strdup(info->size_str);
-       elm_genlist_item_update(info->data->item);
+       /* This callback is asynchronous and can happen even after Apps
+        * view had been destroyed. Checking ad->data_list != NULL will
+        * help prevent a crash. */
+       EINA_LIST_FOREACH(ad->data_list, cur, info) {
+               if (info->id && !strcmp(package_id, info->id)) {
+                       package_size_info_get_data_size(size_info, &size);
+                       info->total_size = (int)size;
+
+                       package_size_info_get_app_size(size_info, &size);
+                       info->total_size += (int)size;
+                       SETTING_TRACE(">>Size [%d]", info->total_size);
+
+                       size_to_str(info->total_size, desc, sizeof(desc));
+                       info->size_str = strdup(desc);
+
+                       free(info->data->sub_desc);
+                       info->data->sub_desc = strdup(info->size_str);
+                       elm_genlist_item_update(info->data->item);
+                       return;
+               }
+       }
 }
 
 char *appmgr_check_icon(const char *icon_path)
@@ -274,6 +286,8 @@ void storage_apps_clear_list(Eina_List *list)
 
        EINA_LIST_FOREACH(list, l, node)
        {
+               if (node->size_timer)
+                       ecore_timer_del(node->size_timer);
                free(node->id);
                free(node->size_str);
                free(node->name);
index c285cb3d75b9fb8bac6928c5d0eb4c8a455d8c76..d6663a2546480648846785193e6045b5666bdfe2 100755 (executable)
@@ -267,6 +267,7 @@ static void _sort_by_check_change_cb(void *data, Evas_Object *obj,
 
 static Eina_Bool _apps_view_pop_cb(void *data, Elm_Object_Item *it)
 {
+       SETTING_TRACE_BEGIN;
        SettingStorage *ad = data;
        retv_if(data == NULL, EINA_FALSE);
 
@@ -298,37 +299,6 @@ static Eina_Bool _apps_view_pop_cb(void *data, Elm_Object_Item *it)
        return EINA_TRUE;
 }
 
-#if 0
-static bool storage_misces_media_item_cb(media_info_h media, void *data)
-{
-       Node_Info *node = NULL;
-       SettingStorage *ad = data;
-       char *file_path = NULL;
-
-       retv_if((!media || !data), true);
-
-       media_info_get_file_path(media, &file_path);
-       if (!ecore_file_exists(file_path)) {
-               free(file_path);
-               return true;
-       }
-
-       node = calloc(1, sizeof(Node_Info));
-       if (node) {
-               media_info_get_media_id(media, &node->id);
-               node->size_str = strdup(file_path);
-               media_info_get_display_name(media, &node->name);
-               media_info_get_size(media, &node->size);
-               media_info_get_added_time(media, &node->added_time);
-               ad->data_list = eina_list_append(ad->data_list, node);
-       }
-
-       free(file_path);
-
-       return true;
-}
-#endif
-
 static void storage_misces_handle_selecting(SettingStorage *ad)
 {
        Evas_Object *gl = NULL;
@@ -498,9 +468,6 @@ static void storage_apps_gl_append_items(SettingStorage *ad)
                        node->data = item_data;
                        node->ad = ad;
                        item_data->isItemHideFlag = TRUE;
-                       if (node->size_idler)
-                               ecore_timer_del(node->size_idler);
-                       node->size_idler = ecore_timer_add(2.0, __get_size_on_time, node);
                } else {
                        SETTING_TRACE_ERROR("item_data is NULL");
                }
@@ -508,44 +475,6 @@ static void storage_apps_gl_append_items(SettingStorage *ad)
        storage_misces_handle_selecting(ad);
 }
 
-#if 0
-static void _clear_model_and_ui_lists(SettingStorage *ad)
-{
-       SETTING_TRACE("Entering _clear_model_and_ui_lists");
-       Elm_Object_Item *it = NULL;
-       Node_Info *node = NULL;
-       Setting_GenGroupItem_Data *item_data = NULL;
-       ret_if(NULL == ad);
-
-       ad->misces_checked = 0;
-       ad->count_sz_all = 0;
-
-       /* Get second, because first is 'Check all' */
-       it = elm_genlist_nth_item_get(ad->misces_genlist, 1);
-
-       while (it) {
-               item_data = elm_object_item_data_get(it);
-               if (!item_data)
-                       continue;
-               node = item_data->userdata;
-               if (!node)
-                       continue;
-               /* delete data form model: */
-               ad->data_list = eina_list_remove(
-                               ad->data_list, node);
-               free(node->id);
-               free(node->size_str);
-               free(node->name);
-               free(node);
-               it = elm_genlist_item_next_get(it);
-       }
-       ad->data_list = eina_list_free(ad->data_list);
-
-       /* delete UI elements: */
-       elm_genlist_clear(ad->misces_genlist);
-}
-#endif
-
 static void _update_ui_list(SettingStorage *ad)
 {
        Evas_Object *toolbar = NULL;
@@ -557,17 +486,7 @@ static void _update_ui_list(SettingStorage *ad)
        ad->misces_checked = 0;
        ad->misces_is_select_all = EINA_FALSE;
 
-       if (ad->misces_genlist) {
-               elm_genlist_clear(ad->misces_genlist);
-       } else {
-               ad->misces_genlist = elm_genlist_add(ad->md.naviframe);
-               if (!ad->misces_genlist)
-                       SETTING_TRACE_ERROR("elm_genlist_add() Fail");
-
-               elm_genlist_mode_set(ad->misces_genlist, ELM_LIST_COMPRESS);
-               elm_genlist_homogeneous_set(ad->misces_genlist, EINA_TRUE);
-               elm_genlist_block_count_set(ad->misces_genlist, 2);
-       }
+       elm_genlist_clear(ad->misces_genlist);
        /* Add items to genlist */
        storage_apps_gl_append_items(ad);
 
@@ -753,8 +672,9 @@ static int storage_apps_create(void *data)
        SettingStorage *ad = data;
        retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
 
-       /* This will create UI list: */
-       _update_ui_list(ad);
+       ad->misces_genlist = elm_genlist_add(ad->md.naviframe);
+       elm_genlist_mode_set(ad->misces_genlist, ELM_LIST_COMPRESS);
+       elm_genlist_homogeneous_set(ad->misces_genlist, EINA_TRUE);
 
        ad->no_content_layout = setting_add_empty_page(ad->md.naviframe,
                        "No apps", NULL);
@@ -798,21 +718,17 @@ static int storage_apps_destroy(void *data)
        evas_object_del(ad->popup);
        ad->popup = NULL;
 
-       if (ad->del_worker) {
-               storage_stop_async_worker(ad->del_worker);
-               ad->del_worker = NULL;
-       }
+       storage_stop_async_worker(ad->del_worker);
+       ad->del_worker = NULL;
 
        storage_apps_clear_list(ad->data_list);
        ad->data_list = NULL;
 
-
        ad->misces_navi_it = NULL;
        ad->misces_genlist = NULL;
        ad->misces_checked = 0;
 
        setting_view_storage_apps.is_create = 0;
-       elm_naviframe_item_pop(ad->md.naviframe);
 
        return SETTING_RETURN_SUCCESS;
 }
index 2c4c5afa51689870fdb89c23066f98710e026af8..8811423aa40c40df7e15a3718dc267b6a1930ab0 100644 (file)
@@ -642,11 +642,6 @@ static int _view_update(void *data)
        storage_main_update_media_data(ad);
        storage_update_apps_cache_info(ad);
 
-       if (!ad->data_list)
-               evas_object_show(ad->md.naviframe);
-       /* else
-               setting_view_update(ad->misces_view, ad); */
-
        return SETTING_RETURN_SUCCESS;
 }