From: Jing Yigang Date: Fri, 19 Oct 2012 01:16:27 +0000 (+0800) Subject: [Bug] Fix N_SE-11764 : get size of all music files from db using APIs of capi-content... X-Git-Tag: accepted/tizen_2.1/20130425.022820~31^2~183^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1b6cd1243e1711bd888e7af58a396ff274f12ed1;p=apps%2Fcore%2Fpreloaded%2Fsettings.git [Bug] Fix N_SE-11764 : get size of all music files from db using APIs of capi-content-media-content . Change-Id: I15ae2c2472ee9d010de6d031a8f6b8742a0ef55c --- diff --git a/packaging/org.tizen.setting.spec b/packaging/org.tizen.setting.spec index 30f7393..dbcd483 100755 --- a/packaging/org.tizen.setting.spec +++ b/packaging/org.tizen.setting.spec @@ -53,6 +53,7 @@ BuildRequires: pkgconfig(pango) BuildRequires: pkgconfig(capi-system-runtime-info) BuildRequires: pkgconfig(capi-media-player) BuildRequires: pkgconfig(capi-media-sound-manager) +BuildRequires: pkgconfig(capi-content-media-content) BuildRequires: pkgconfig(capi-system-device) BuildRequires: pkgconfig(capi-appfw-application) BuildRequires: pkgconfig(capi-appfw-app-manager) @@ -61,6 +62,7 @@ BuildRequires: pkgconfig(capi-system-haptic) BuildRequires: pkgconfig(capi-system-info) BuildRequires: pkgconfig(capi-system-system-settings) BuildRequires: pkgconfig(capi-network-bluetooth) +BuildRequires: pkgconfig(pkgmgr) BuildRequires: sysman-internal-devel BuildRequires: cmake BuildRequires: edje-tools diff --git a/setting-storage/CMakeLists.txt b/setting-storage/CMakeLists.txt index 9806960..893afac 100755 --- a/setting-storage/CMakeLists.txt +++ b/setting-storage/CMakeLists.txt @@ -3,7 +3,8 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/${SETTING_COMMON}/include) INCLUDE(FindPkgConfig) -pkg_check_modules(pkgs_storage REQUIRED ecore ecore-file evas elementary appcore-common appcore-efl ui-gadget-1 capi-appfw-application sysman fontconfig libxml-2.0) +pkg_check_modules(pkgs_storage REQUIRED ecore ecore-file evas elementary appcore-common appcore-efl ui-gadget-1 capi-appfw-application sysman fontconfig +libxml-2.0 ail pkgmgr capi-content-media-content) FOREACH(flag ${pkgs_storage_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") diff --git a/setting-storage/include/setting-storage-main.h b/setting-storage/include/setting-storage-main.h index 18d385a..facd275 100755 --- a/setting-storage/include/setting-storage-main.h +++ b/setting-storage/include/setting-storage-main.h @@ -23,6 +23,9 @@ #include - +#define WRT_PREFIX "wgt" +#define TPK_PREFIX "tpk" +#define RPM_PREFIX "rpm" +#define STR_INSTALLED_SIZE "installed_size" #endif /* __SETTING_STORAGE_MAIN_H__ */ diff --git a/setting-storage/include/setting-storage.h b/setting-storage/include/setting-storage.h index b5b07a6..383451e 100755 --- a/setting-storage/include/setting-storage.h +++ b/setting-storage/include/setting-storage.h @@ -29,6 +29,14 @@ #include #include +#include +#include +#include +#include +#include +#include +#include + #define SETTING_STORAGE_PROGRESSBAR_TIMEOUT 10 #define SETTING_STORAGE_POPUP_TIMER 2 @@ -99,6 +107,12 @@ struct _Node_Info { unsigned int size; }; +typedef struct _app_info_t { + char *pkg_name; + char *pkg_type; + int total_size; +} App_Info; + typedef struct _SettingStorageUG SettingStorageUG; /** @@ -162,11 +176,18 @@ struct _SettingStorageUG { Setting_GenGroupItem_Data *data_rdo; Setting_GenGroupItem_Data *data_dvb_h; - Setting_Done_List_Data *miscellaneous_list; /* miscellaneous files list */ + Setting_Done_List_Data miscellaneous_list; /* miscellaneous files list */ + + Eina_List *apps_list; + Ecore_Timer *timer; + Evas_Object *pop_progress; }; extern setting_view setting_view_storage_main; extern setting_view setting_view_storage_default_storage; extern setting_view setting_view_storage_miscellaneous_files; +int setting_storage_file_list_get(char *path, Eina_List **dir_list, Eina_List **file_list); +int setting_storage_list_len_get(const Eina_List *list); +int setting_storage_file_stat_get(const char *filename, Node_Info **node); #endif /* __SETTING_STORAGE_H__ */ diff --git a/setting-storage/src/setting-storage-main.c b/setting-storage/src/setting-storage-main.c index c216fe8..5ea4394 100755 --- a/setting-storage/src/setting-storage-main.c +++ b/setting-storage/src/setting-storage-main.c @@ -20,13 +20,9 @@ */ #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include static int setting_storage_main_create(void *cb); static int setting_storage_main_destroy(void *cb); @@ -228,89 +224,6 @@ static int __setting_storage_main_fs_stat(double *total, double *avail, const ch return SETTING_RETURN_SUCCESS; } -static int __setting_storage_main_file_stat_get(const char *filename, Node_Info **node) -{ - setting_retvm_if(!filename || !node, SETTING_RETURN_FAIL, "NULL input parameters"); - struct stat statbuf; - if (stat(filename, &statbuf) == -1) { - SETTING_TRACE_ERROR("failed to call stat"); - return SETTING_RETURN_FAIL; - } - - if (*node == NULL) { - SETTING_TRACE_ERROR("node is NULL"); - return SETTING_RETURN_FAIL; - } - - (*node)->size = statbuf.st_size; - - return SETTING_RETURN_SUCCESS; -} - -static int __setting_storage_main_file_list_get(char *path, Eina_List **dir_list, Eina_List **file_list) -{ - SETTING_TRACE_BEGIN; - setting_retvm_if(NULL == path, SETTING_RETURN_FAIL, "path is NULL"); - - DIR *pDir = NULL; - struct dirent *ent = NULL; - char childpath[SETTING_STORAGE_CHILDPATH_LEN] = {0,}; - - pDir = opendir(path); - setting_retvm_if(NULL == pDir, SETTING_RETURN_FAIL, "pDir is NULL"); - - while ((ent = readdir(pDir)) != NULL) { - if (safeStrCmp(ent->d_name, ".") == 0 || safeStrCmp(ent->d_name, "..") == 0) { - continue; - } - /*only deal with dirs and regular files*/ - if ((ent->d_type & DT_DIR) == 0 && (ent->d_type & DT_REG) == 0) { - continue; - } - - Node_Info *pNode = (Node_Info *)malloc(sizeof(Node_Info)); - - if (pNode == NULL) { - continue; - } - - memset(pNode, 0, sizeof(Node_Info)); - /*get path*/ - g_strlcpy(pNode->path, path, (gsize) sizeof(pNode->path)); - - /*get name*/ - g_strlcpy(pNode->name, ent->d_name, (gsize) sizeof(pNode->name)); - - /*get size*/ - int copiednum = g_sprintf(childpath, "%s/%s", path, ent->d_name); - if (copiednum < 0) { - FREE(pNode); - continue; - } - if (__setting_storage_main_file_stat_get(childpath, &pNode) == SETTING_RETURN_FAIL) { - FREE(pNode); - continue; - } - - if (ent->d_type & DT_DIR) { - *dir_list = eina_list_append(*dir_list, pNode); - } else { - *file_list = eina_list_append(*file_list, pNode); - } - } - closedir(pDir); - - return SETTING_RETURN_SUCCESS; -} - -static int __setting_storage_main_list_len_get(const Eina_List *list) -{ - if (list == NULL) - return 0; - - return eina_list_count(list); -} - static long __setting_storage_main_folder_size_get(char *path) { SETTING_TRACE_BEGIN; @@ -322,12 +235,12 @@ static long __setting_storage_main_folder_size_get(char *path) if (ecore_file_is_dir(path)) { int ret = SETTING_RETURN_FAIL; - ret = __setting_storage_main_file_list_get(path, &dir_list, &file_list); + ret = setting_storage_file_list_get(path, &dir_list, &file_list); if (ret == SETTING_RETURN_SUCCESS) { int i = 0; - int dir_list_len = __setting_storage_main_list_len_get(dir_list); - int file_list_len = __setting_storage_main_list_len_get(file_list); + int dir_list_len = setting_storage_list_len_get(dir_list); + int file_list_len = setting_storage_list_len_get(file_list); SETTING_TRACE("dir_list_len is [%d] file_list_len is [%d]", dir_list_len, file_list_len); for (i = 0; i < file_list_len; i++) { Node_Info *pNode = NULL; @@ -407,6 +320,7 @@ static void __setting_storage_main_internal_storage_status_get(void *data) dAvail = 0.0; ret = __setting_storage_main_fs_stat(&dTotal, &dAvail, SETTING_STORAGE_MEDIA_PATH); setting_retm_if(ret == SETTING_RETURN_FAIL, "get media status failed"); + internal_status.dTotal += dTotal; internal_status.dAvail += dAvail; @@ -458,23 +372,346 @@ static void __setting_storage_main_downloads_status_get(void *data) ad->downloads_status = downloads_status; } +static bool __setting_storage_main_media_item_cb(media_info_h media, void *data) +{ + SETTING_TRACE_BEGIN; + setting_retvm_if(media == NULL, true, "media is NULL"); + setting_retvm_if(data == NULL, true, "Data parameter is NULL"); + SettingStorageUG *ad = (SettingStorageUG *) data; + + media_content_type_e media_type = 0; + unsigned long long size = 0; + + media_info_get_media_type(media, &media_type); + //SETTING_TRACE("media_type : [%d]", media_type); + + if(media_type == MEDIA_CONTENT_TYPE_MUSIC) { + SETTING_TRACE("MEDIA_CONTENT_TYPE_MUSIC"); + + media_info_get_size(media, &size); + //SETTING_TRACE("size : [%lld]", size); + ad->audio_status.dTotal += size; + } else { + SETTING_TRACE("Other Content"); + } + + return true; +} + static void __setting_storage_main_audio_status_get(void *data) { SETTING_TRACE_BEGIN; setting_retm_if(data == NULL, "Data parameter is NULL"); SettingStorageUG *ad = (SettingStorageUG *) data; - double dTotal = 0.0; - int ret = SETTING_RETURN_SUCCESS; - Setting_Storage_Status audio_status; + ad->audio_status.dTotal = 0; - dTotal = __setting_storage_main_folder_size_get(SETTING_STORAGE_AUDIO_PATH); - setting_retm_if(ret == SETTING_RETURN_FAIL, "get audio status failed"); - audio_status.dTotal = dTotal; + int ret = MEDIA_CONTENT_ERROR_NONE; + filter_h filter = NULL; - //SETTING_TRACE("audio_status = %f", dTotal); + /*Set Filter*/ + char *condition = "MEDIA_TYPE=3"; /*0-image, 1-video, 2-sound, 3-music, 4-other*/ - ad->audio_status = audio_status; + ret = media_filter_create(&filter); + if(ret != MEDIA_CONTENT_ERROR_NONE) { + SETTING_TRACE("Fail to create filter"); + return; + } + + ret = media_filter_set_condition(filter, condition, MEDIA_CONTENT_COLLATE_DEFAULT); + if(ret != MEDIA_CONTENT_ERROR_NONE) { + media_filter_destroy(filter); + SETTING_TRACE("Fail to set condition"); + return; + } + + ret = media_filter_set_order(filter, MEDIA_CONTENT_ORDER_ASC, MEDIA_TITLE, MEDIA_CONTENT_COLLATE_NOCASE); + if(ret != MEDIA_CONTENT_ERROR_NONE) { + media_filter_destroy(filter); + SETTING_TRACE("Fail to set order"); + return; + } + + ret = media_info_foreach_media_from_db(filter, __setting_storage_main_media_item_cb, ad); + if(ret != MEDIA_CONTENT_ERROR_NONE) { + media_filter_destroy(filter); + SETTING_TRACE("Fail to get media"); + return; + } +} + +static int __setting_storage_main_miscellaneous_list_get(char *path, Eina_List **dir_list, Eina_List **file_list) +{ + SETTING_TRACE_BEGIN; + setting_retvm_if(NULL == path, SETTING_RETURN_FAIL, "path is NULL"); + + DIR *pDir = NULL; + struct dirent *ent = NULL; + char childpath[SETTING_STORAGE_CHILDPATH_LEN] = {0,}; + + pDir = opendir(path); + setting_retvm_if(NULL == pDir, SETTING_RETURN_FAIL, "pDir is NULL"); + + while ((ent = readdir(pDir)) != NULL) { + if (safeStrCmp(ent->d_name, ".") == 0 + || safeStrCmp(ent->d_name, "..") == 0 + || safeStrCmp(ent->d_name, ".tmp_download") == 0 + || safeStrCmp(ent->d_name, ".video-hub") == 0 + || safeStrCmp(ent->d_name, "Camera") == 0 + || safeStrCmp(ent->d_name, "Downloads") == 0 + || safeStrCmp(ent->d_name, "Images") == 0 + || safeStrCmp(ent->d_name, "Others") == 0 + || safeStrCmp(ent->d_name, "Sounds") == 0 + || safeStrCmp(ent->d_name, "Videos") == 0 + || safeStrCmp(ent->d_name, "lost+found") == 0) { + continue; + } + /*only deal with dirs and regular files*/ + if ((ent->d_type & DT_DIR) == 0 && (ent->d_type & DT_REG) == 0) { + continue; + } + + Node_Info *pNode = (Node_Info *)malloc(sizeof(Node_Info)); + + if (pNode == NULL) { + continue; + } + + memset(pNode, 0, sizeof(Node_Info)); + /*get path*/ + g_strlcpy(pNode->path, path, (gsize) sizeof(pNode->path)); + + /*get name*/ + g_strlcpy(pNode->name, ent->d_name, (gsize) sizeof(pNode->name)); + + /*get size*/ + int copiednum = g_sprintf(childpath, "%s/%s", path, ent->d_name); + if (copiednum < 0) { + FREE(pNode); + continue; + } + if (setting_storage_file_stat_get(childpath, &pNode) == SETTING_RETURN_FAIL) { + FREE(pNode); + continue; + } + + if (ent->d_type & DT_DIR) { + *dir_list = eina_list_append(*dir_list, pNode); + } else { + *file_list = eina_list_append(*file_list, pNode); + } + } + closedir(pDir); + + return SETTING_RETURN_SUCCESS; +} + +/** + * Miscellaneous files is all directories files under /opt/media/ except below default directories: + * ++++++++++++++++++++++++++++++++++++++++++++++++ + * -sh-4.1# ls -all + * total 56 + * drwxrwxrwx 11 app app 4096 Jan 4 12:42 . + * drwxr-xr-x 20 root root 4096 Jan 7 10:09 .. + * drwxr-xr-x 2 root root 4096 Jan 4 08:46 .tmp_download + * drwxr-xr-x 2 app app 4096 Jan 4 08:47 .video-hub + * drwxrwxrwx 2 app app 4096 Oct 5 2012 Camera + * drwxrwxrwx 3 app app 4096 Jan 4 08:46 Downloads + * drwxrwxrwx 2 app app 4096 Oct 5 2012 Images + * drwxrwxrwx 2 app app 4096 Oct 5 2012 Others + * drwxrwxrwx 3 app app 4096 Oct 5 2012 Sounds + * drwxrwxrwx 2 app app 4096 Oct 5 2012 Videos + * drwxrwxrwx 2 app app 16384 Oct 5 2012 lost+found + * ++++++++++++++++++++++++++++++++++++++++++++++++ + */ +static void __setting_storage_main_miscellaneous_size_get(void *data) +{ + SETTING_TRACE_BEGIN; + setting_retm_if(data == NULL, "Data parameter is NULL"); + SettingStorageUG *ad = (SettingStorageUG *) data; + + unsigned long size = 0; + Eina_List *file_list = NULL; + Eina_List *dir_list = NULL; + + char *path = SETTING_STORAGE_MEDIA_PATH; + + if (ecore_file_is_dir(path)) { + int ret = SETTING_RETURN_FAIL; + ret = __setting_storage_main_miscellaneous_list_get(path, &dir_list, &file_list); + + if (ret == SETTING_RETURN_SUCCESS) { + int i = 0; + int dir_list_len = setting_storage_list_len_get(dir_list); + int file_list_len = setting_storage_list_len_get(file_list); + SETTING_TRACE("dir_list_len is [%d] file_list_len is [%d]", dir_list_len, file_list_len); + for (i = 0; i < file_list_len; i++) { + Node_Info *pNode = NULL; + pNode = (Node_Info *)eina_list_nth(file_list, i); + if (pNode == NULL) + continue; + size += pNode->size; + SETTING_TRACE("path is [%s], name is [%s]", pNode->path, pNode->name); + } + for (i = 0; i < dir_list_len; i++) { + Node_Info *pNode = NULL; + char *full_path = NULL; + pNode = (Node_Info *)eina_list_nth(dir_list, i); + if (pNode == NULL) + continue; + full_path = g_strconcat(pNode->path, "/", pNode->name, NULL); + SETTING_TRACE("full_path is [%s]", full_path); + size += (__setting_storage_main_folder_size_get(full_path)); + FREE(full_path); + } + } + } + + if (file_list) { + eina_list_free(file_list); + file_list = NULL; + } + + if (dir_list) { + eina_list_free(dir_list); + dir_list = NULL; + } + + ad->others_status.dTotal = size; +} + +static void __setting_storage_main_apps_list_free(void *data) +{ + setting_retm_if(data == NULL, "Data parameter is NULL"); + SettingStorageUG *ad = (SettingStorageUG *) data; + + Eina_List *l = NULL; + App_Info *app_info; + EINA_LIST_FOREACH (ad->apps_list, l, app_info) + { + G_FREE(app_info->pkg_name); + G_FREE(app_info->pkg_type); + FREE(app_info); + } + eina_list_free(ad->apps_list); + ad->apps_list = NULL; +} + +static ail_cb_ret_e __setting_storage_main_appinfo_func_cb(const ail_appinfo_h ail_info, void *data) +{ + setting_retvm_if(data == NULL, AIL_CB_RET_CONTINUE, "Data parameter is NULL"); + SettingStorageUG *ad = (SettingStorageUG *) data; + + char *pkg_name = NULL; + char *pkg_type = NULL; + + ail_appinfo_get_str(ail_info, AIL_PROP_PACKAGE_STR, &pkg_name); + setting_retvm_if(pkg_name == NULL, AIL_CB_RET_CONTINUE, "get pkg_name failed"); + + ail_appinfo_get_str(ail_info, AIL_PROP_X_SLP_PACKAGETYPE_STR, &pkg_type); + setting_retvm_if(pkg_type == NULL, AIL_CB_RET_CONTINUE, "get pkg_type failed"); + + App_Info *app_info = (App_Info*)calloc(1, sizeof(App_Info)); + setting_retvm_if(app_info == NULL, AIL_CB_RET_CONTINUE, "failed to calloc"); + + app_info->pkg_name = (char *)g_strdup(pkg_name); + app_info->pkg_type = (char *)g_strdup(pkg_type); + ad->apps_list = eina_list_append(ad->apps_list, app_info); + return AIL_CB_RET_CONTINUE; +} + +static void __setting_storage_main_applications_list_get(void *data) +{ + SETTING_TRACE_BEGIN; + setting_retm_if(data == NULL, "Data parameter is NULL"); + SettingStorageUG *ad = (SettingStorageUG *) data; + + __setting_storage_main_apps_list_free(ad); + + /* get app_info from AIL */ + ail_filter_h filter_rpm = NULL; + ail_filter_h filter_wrt = NULL; + ail_filter_h filter_tpk = NULL; + + ail_filter_new(&filter_rpm); + ail_filter_new(&filter_wrt); + ail_filter_new(&filter_tpk); + + ail_filter_add_str(filter_rpm, AIL_PROP_X_SLP_PACKAGETYPE_STR, RPM_PREFIX); + ail_filter_add_str(filter_wrt, AIL_PROP_X_SLP_PACKAGETYPE_STR, WRT_PREFIX); + ail_filter_add_str(filter_tpk, AIL_PROP_X_SLP_PACKAGETYPE_STR, TPK_PREFIX); + + ail_filter_list_appinfo_foreach(filter_rpm, __setting_storage_main_appinfo_func_cb, (void*)ad); + ail_filter_list_appinfo_foreach(filter_wrt, __setting_storage_main_appinfo_func_cb, (void*)ad); + ail_filter_list_appinfo_foreach(filter_tpk, __setting_storage_main_appinfo_func_cb, (void*)ad); + + ail_filter_destroy(filter_rpm); + ail_filter_destroy(filter_wrt); + ail_filter_destroy(filter_tpk); +} + +static void __setting_storage_main_applications_status_get(void *data) +{ + SETTING_TRACE_BEGIN; + setting_retm_if(data == NULL, "Data parameter is NULL"); + SettingStorageUG *ad = (SettingStorageUG *) data; + + __setting_storage_main_applications_list_get(ad); + + ad->apps_status.dTotal = 0; + + Eina_List *l = NULL; + App_Info *app_info; + EINA_LIST_FOREACH (ad->apps_list, l, app_info) + { + //SETTING_TRACE("pkg_name: %s ", app_info->pkg_name); + //SETTING_TRACE("pkg_type: %s", app_info->pkg_type); + pkgmgr_info *pkg_info = pkgmgr_info_new(app_info->pkg_type, app_info->pkg_name); + if (!pkg_info) { + SETTING_TRACE("pkg_info is null, couldn't get the sizes"); + app_info->total_size = 0; + } else { + char *buf = NULL; + buf = pkgmgr_info_get_string(pkg_info, STR_INSTALLED_SIZE); + if (buf) { + //SETTING_TRACE("size : %s", buf); + app_info->total_size = atoi(buf); + G_FREE(buf); + } else { + app_info->total_size = 0; + } + pkgmgr_info_free(pkg_info); + } + + ad->apps_status.dTotal += app_info->total_size; + } + + char apps_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,}; + int ret = __setting_storage_status_size_transition(ad->apps_status.dTotal, apps_desc); + setting_retm_if(ret == SETTING_RETURN_FAIL, "failed to transform"); + + G_FREE(ad->apps->sub_desc); + ad->apps->sub_desc = (char *)g_strdup(apps_desc); + elm_object_item_data_set(ad->apps->item, ad->apps); + elm_genlist_item_update(ad->apps->item); + + elm_object_item_data_set(ad->internal->item, ad->internal); + elm_genlist_item_update(ad->internal->item); + + if (ad->pop_progress) { + evas_object_del(ad->pop_progress); + ad->pop_progress = NULL; + } +} + +static Eina_Bool __setting_storage_main_timer_cb(void *data) +{ + SETTING_TRACE_BEGIN; + setting_retvm_if(data == NULL, ECORE_CALLBACK_CANCEL, "data is NULL"); + SettingStorageUG *ad = (SettingStorageUG *)data; + + __setting_storage_main_applications_status_get(ad); + return ECORE_CALLBACK_CANCEL; } static void __setting_storage_main_launch_ug_destroy_cb(ui_gadget_h ug, void *priv) @@ -493,6 +730,20 @@ static void __setting_storage_main_launch_ug_destroy_cb(ui_gadget_h ug, void *pr if (back_btn != NULL) { elm_object_style_set(back_btn, NAVI_BACK_BUTTON_STYLE); /* take into effect */ } + + if (ad->pop_progress) { + evas_object_del(ad->pop_progress); + ad->pop_progress = NULL; + } + ad->pop_progress = setting_create_popup_with_progressbar(ad, ad->win_get, + "pending_list", + NULL, NULL, NULL, 0, TRUE, TRUE); + + if(ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } + ad->timer = ecore_timer_add(2, (Ecore_Task_Cb)__setting_storage_main_timer_cb, ad); } static void __setting_storage_main_launch_ug_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv) @@ -557,17 +808,7 @@ static void __setting_storage_main_app_launch(char *app_name) SETTING_TRACE_BEGIN; setting_retm_if(app_name == NULL, "app_name is NULL"); - #if 0 - if(aul_app_is_running((const char *)app_name)) { - SETTING_TRACE_DEBUG("%s is already launched.", app_name); - aul_open_app((const char *)app_name); - } else { - SETTING_TRACE_DEBUG("%s will be launched. ", app_name); - aul_launch_app((const char *)app_name, NULL); - } - #else - app_launcher(app_name); - #endif + app_launcher(app_name); } static void __setting_storage_main_Gendial_mouse_up_cb(void *data, Evas_Object *obj, void *event_info) @@ -1119,11 +1360,19 @@ static int setting_storage_main_create(void *cb) SettingStorageUG *ad = (SettingStorageUG *) cb; + int ret = SETTING_RETURN_SUCCESS; + + ret = media_content_connect(); + if(ret == MEDIA_CONTENT_ERROR_NONE) { + SETTING_TRACE("media_content_connect is success"); + } else { + SETTING_TRACE_ERROR("media_content_connect is failed"); + return SETTING_RETURN_FAIL; + } + retvm_if(ad->win_main_layout == NULL, SETTING_DRAW_ERR_FAIL_LOAD_EDJ, "win_main_layout is NULL"); - int ret = SETTING_RETURN_SUCCESS; - ad->ly_main = setting_create_layout_navi_bar_genlist(ad->win_main_layout, ad->win_get, @@ -1148,6 +1397,8 @@ static int setting_storage_main_create(void *cb) __setting_storage_main_audio_status_get(ad); + __setting_storage_main_miscellaneous_size_get(ad); + Elm_Object_Item *item = NULL; bool is_emulator = isEmulBin(); @@ -1190,7 +1441,7 @@ static int setting_storage_main_create(void *cb) } /* Applications */ - ad->apps_status.dTotal = 230.45 * 1024 * 1024; /* for test*/ + ad->apps_status.dTotal = 0; /* initial value */ char apps_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,}; ret = __setting_storage_status_size_transition(ad->apps_status.dTotal, apps_desc); setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform") @@ -1271,15 +1522,11 @@ static int setting_storage_main_create(void *cb) } /* Miscellaneous files */ - ad->others_status.dTotal = ad->internal_status.dTotal - ad->internal_status.dAvail - - ad->apps_status.dTotal - ad->pics_videos_status.dTotal - - ad->downloads_status.dTotal - ad->audio_status.dTotal; - ad->others_status.dAvail = 0.0; char others_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,}; ret = __setting_storage_status_size_transition(ad->others_status.dTotal, others_desc); setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform") - ad->others = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3), + ad->others = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3), __setting_storage_main_Gendial_mouse_up_cb, ad, SWALLOW_Type_INVALID, SETTING_STORAGE_MISCES_ICON_PATH, NULL, 0, SETTING_STORAGE_MISCES_STR, @@ -1309,6 +1556,7 @@ static int setting_storage_main_create(void *cb) } if (!is_emulator) { +#if DISABLED_CODE /* Format USB storage */ setting_create_Gendial_field_def(ad->genlist, &(ad->itc_1text), NULL, ad, SWALLOW_Type_INVALID, NULL, @@ -1320,6 +1568,7 @@ static int setting_storage_main_create(void *cb) ad, SWALLOW_Type_LAYOUT_SPECIALIZTION_X, NULL, NULL, 0, SETTING_STORAGE_FORMAT_DESC_STR, NULL, NULL); +#endif /* SD card info */ setting_create_Gendial_field_titleItem(ad->genlist, &(ad->itc_group_item), @@ -1337,6 +1586,12 @@ static int setting_storage_main_create(void *cb) elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); } + if(ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } + ad->timer = ecore_timer_add(2, (Ecore_Task_Cb)__setting_storage_main_timer_cb, ad); + setting_view_storage_main.is_create = 1; return SETTING_RETURN_SUCCESS; } @@ -1348,8 +1603,27 @@ static int setting_storage_main_destroy(void *cb) SettingStorageUG *ad = (SettingStorageUG *) cb; + int ret = media_content_disconnect(); + if (ret == MEDIA_CONTENT_ERROR_NONE) { + SETTING_TRACE("media_content_disconnect is success"); + } else { + SETTING_TRACE_ERROR("media_content_disconnect is failed"); + } + + if (ad->pop_progress) { + evas_object_del(ad->pop_progress); + ad->pop_progress = NULL; + } + + if(ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } + + __setting_storage_main_apps_list_free(ad); + if (!isEmulBin()) { - int ret = vconf_ignore_key_changed(VCONFKEY_SYSMAN_MMC_STATUS, + ret = vconf_ignore_key_changed(VCONFKEY_SYSMAN_MMC_STATUS, __setting_storage_vconf_change_cb); if (ret != 0) { SETTING_TRACE_ERROR("call vconf_ignore_key_changed failed"); @@ -1377,6 +1651,17 @@ static int setting_storage_main_update(void *cb) SettingStorageUG *ad = (SettingStorageUG *) cb; + __setting_storage_main_miscellaneous_size_get(ad); + + char others_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,}; + int ret = __setting_storage_status_size_transition(ad->others_status.dTotal, others_desc); + setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform") + + G_FREE(ad->others->sub_desc); + ad->others->sub_desc = (char *)g_strdup(others_desc); + elm_object_item_data_set(ad->others->item, ad->others); + elm_genlist_item_update(ad->others->item); + if (ad->ly_main != NULL) { evas_object_show(ad->ly_main); } diff --git a/setting-storage/src/setting-storage-miscellaneous-files.c b/setting-storage/src/setting-storage-miscellaneous-files.c index c818c38..e776d3c 100755 --- a/setting-storage/src/setting-storage-miscellaneous-files.c +++ b/setting-storage/src/setting-storage-miscellaneous-files.c @@ -32,6 +32,69 @@ setting_view setting_view_storage_miscellaneous_files = { .cleanup = setting_storage_miscellaneous_files_cleanup, }; +static int __setting_storage_miscellaneous_files_list_get(char *path, Eina_List **list) +{ + SETTING_TRACE_BEGIN; + setting_retvm_if(NULL == path, SETTING_RETURN_FAIL, "path is NULL"); + + DIR *pDir = NULL; + struct dirent *ent = NULL; + char childpath[SETTING_STORAGE_CHILDPATH_LEN] = {0,}; + + pDir = opendir(path); + setting_retvm_if(NULL == pDir, SETTING_RETURN_FAIL, "pDir is NULL"); + + while ((ent = readdir(pDir)) != NULL) { + if (safeStrCmp(ent->d_name, ".") == 0 + || safeStrCmp(ent->d_name, "..") == 0 + || safeStrCmp(ent->d_name, ".tmp_download") == 0 + || safeStrCmp(ent->d_name, ".video-hub") == 0 + || safeStrCmp(ent->d_name, "Camera") == 0 + || safeStrCmp(ent->d_name, "Downloads") == 0 + || safeStrCmp(ent->d_name, "Images") == 0 + || safeStrCmp(ent->d_name, "Others") == 0 + || safeStrCmp(ent->d_name, "Sounds") == 0 + || safeStrCmp(ent->d_name, "Videos") == 0 + || safeStrCmp(ent->d_name, "lost+found") == 0) { + continue; + } + /*only deal with dirs and regular files*/ + if ((ent->d_type & DT_DIR) == 0 && (ent->d_type & DT_REG) == 0) { + continue; + } + + Node_Info *pNode = (Node_Info *)malloc(sizeof(Node_Info)); + + if (pNode == NULL) { + continue; + } + + memset(pNode, 0, sizeof(Node_Info)); + /*get path*/ + g_strlcpy(pNode->path, path, (gsize) sizeof(pNode->path)); + + /*get name*/ + g_strlcpy(pNode->name, ent->d_name, (gsize) sizeof(pNode->name)); + + /*get size*/ + int copiednum = g_sprintf(childpath, "%s/%s", path, ent->d_name); + if (copiednum < 0) { + FREE(pNode); + continue; + } + if (setting_storage_file_stat_get(childpath, &pNode) == SETTING_RETURN_FAIL) { + FREE(pNode); + continue; + } + + *list = eina_list_append(*list, pNode); + } + closedir(pDir); + + return SETTING_RETURN_SUCCESS; +} + + static int setting_storage_miscellaneous_files_create(void *cb) { SETTING_TRACE_BEGIN; @@ -55,19 +118,25 @@ static int setting_storage_miscellaneous_files_create(void *cb) NULL, ad, view_layout, ad->navibar, &controllbar); - Setting_Done_List_Data *list_data = (Setting_Done_List_Data *)calloc(1, sizeof(Setting_Done_List_Data)); - setting_retvm_if(list_data == NULL, SETTING_RETURN_FAIL, "failed to calloc"); + Setting_Done_List_Data *list_data = &(ad->miscellaneous_list); - ad->miscellaneous_list = list_data; list_data->win_main = ad->win_main_layout; list_data->UG_data = ad; list_data->ly_parent = view_layout; list_data->controllbar = controllbar; list_data->select_all_checked = EINA_FALSE; + Eina_List *list = NULL; + __setting_storage_miscellaneous_files_list_get(SETTING_STORAGE_MEDIA_PATH, &list); + + int count = eina_list_count(list); int i = 0; - for (; i < 2; i++) { - list_data->chk_items[i].item_name = "file"; + for (; i < count; i++) { + Node_Info *pNode = NULL; + pNode = (Node_Info *)eina_list_nth(list, i); + if (pNode == NULL) + continue; + list_data->chk_items[i].item_name = pNode->name; } list_data->cur_item_num = i; @@ -75,6 +144,17 @@ static int setting_storage_miscellaneous_files_create(void *cb) scroller = setting_create_done_list(list_data); elm_object_part_content_set(view_layout, "elm.swallow.contents", scroller); + if (list) { + eina_list_free(list); + list = NULL; + } + + if(i == 0) { + /* disable "Delete" button */ + Elm_Object_Item *delete_button = elm_toolbar_first_item_get(controllbar); + elm_object_item_disabled_set(delete_button, EINA_TRUE); + } + setting_view_storage_miscellaneous_files.is_create = 1; return SETTING_RETURN_SUCCESS; } @@ -85,9 +165,14 @@ static int setting_storage_miscellaneous_files_destroy(void *cb) retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER); SettingStorageUG *ad = (SettingStorageUG *)cb; - if (ad->miscellaneous_list->selInfoPop) { - evas_object_del(ad->miscellaneous_list->selInfoPop); - ad->miscellaneous_list->selInfoPop = NULL; + if (ad->miscellaneous_list.selInfoPop) { + evas_object_del(ad->miscellaneous_list.selInfoPop); + ad->miscellaneous_list.selInfoPop = NULL; + } + + if (ad->popup) { + evas_object_del(ad->popup); + ad->popup = NULL; } elm_naviframe_item_pop(ad->navibar); @@ -120,10 +205,163 @@ static void __setting_storage_miscellaneous_files_cancel_cb(void *data, setting_view_change(&setting_view_storage_miscellaneous_files, &setting_view_storage_main, ad); } +static int __setting_storage_file_remove(char *path) +{ + SETTING_TRACE_BEGIN; + setting_retvm_if(NULL == path, SETTING_RETURN_FAIL, "path is NULL"); + + int ret = SETTING_RETURN_FAIL; + + Eina_List *file_list = NULL; + Eina_List *dir_list = NULL; + + if (ecore_file_is_dir(path)) { + ret = setting_storage_file_list_get(path, &dir_list, &file_list); + + if (ret == SETTING_RETURN_SUCCESS) { + int i = 0; + int dir_list_len = setting_storage_list_len_get(dir_list); + int file_list_len = setting_storage_list_len_get(file_list); + SETTING_TRACE("dir_list_len is [%d] file_list_len is [%d]", dir_list_len, file_list_len); + for (i = 0; i < file_list_len; i++) { + Node_Info *pNode = NULL; + char *full_path = NULL; + pNode = (Node_Info *)eina_list_nth(file_list, i); + if (pNode == NULL) + continue; + full_path = g_strconcat(pNode->path, "/", pNode->name, NULL); + SETTING_TRACE("full_path is [%s]", full_path); + ret = ecore_file_remove(full_path); + } + for (i = 0; i < dir_list_len; i++) { + Node_Info *pNode = NULL; + char *full_path = NULL; + pNode = (Node_Info *)eina_list_nth(dir_list, i); + if (pNode == NULL) + continue; + full_path = g_strconcat(pNode->path, "/", pNode->name, NULL); + SETTING_TRACE("full_path is [%s]", full_path); + ret = (__setting_storage_file_remove(full_path)); + ret = ecore_file_remove(full_path); + FREE(full_path); + } + SETTING_TRACE("full_path is [%s]", path); + ret = ecore_file_remove(path); + } + } else { + SETTING_TRACE("path is [%s]", path); + ret = ecore_file_remove(path); + } + + if (file_list) { + eina_list_free(file_list); + file_list = NULL; + } + + if (dir_list) { + eina_list_free(dir_list); + dir_list = NULL; + } + + return ret; +} + +static void __setting_storage_miscellaneous_files_genlist_update(void *data) +{ + SETTING_TRACE_BEGIN; + setting_retm_if(data == NULL, "Data parameter is NULL"); + SettingStorageUG *ad = (SettingStorageUG *) data; + + Evas_Object *view_layout = ad->miscellaneous_list.ly_parent; + + Evas_Object *scroller = NULL; + scroller = elm_object_part_content_get(view_layout, "elm.swallow.contents"); + setting_retm_if(NULL == scroller, "scroller is NULL"); + elm_genlist_clear(scroller); + + elm_object_part_content_unset(view_layout, "elm.swallow.contents"); + evas_object_del(scroller); + scroller = NULL; + + Eina_List *list = NULL; + __setting_storage_miscellaneous_files_list_get(SETTING_STORAGE_MEDIA_PATH, &list); + + int count = eina_list_count(list); + int i = 0; + for (; i < count; i++) { + Node_Info *pNode = NULL; + pNode = (Node_Info *)eina_list_nth(list, i); + if (pNode == NULL) + continue; + ad->miscellaneous_list.chk_items[i].item_name = pNode->name; + } + + ad->miscellaneous_list.cur_item_num = i; + SETTING_TRACE("list_data->cur_item_num:%d", ad->miscellaneous_list.cur_item_num); + scroller = setting_create_done_list(&ad->miscellaneous_list); + elm_object_part_content_set(view_layout, "elm.swallow.contents", scroller); + + if (list) { + eina_list_free(list); + list = NULL; + } + + if(i == 0) { + /* disable "Delete" button */ + Elm_Object_Item *delete_button = elm_toolbar_first_item_get(ad->miscellaneous_list.controllbar); + elm_object_item_disabled_set(delete_button, EINA_TRUE); + } +} + static void __setting_storage_miscellaneous_files_delete_cb(void *data, Evas_Object *obj, void *event_info) { SETTING_TRACE_BEGIN; retm_if(data == NULL, "Data parameter is NULL"); - //SettingStorageUG *ad = (SettingStorageUG *) data; + SettingStorageUG *ad = (SettingStorageUG *) data; + + if (ad->miscellaneous_list.selInfoPop) { + evas_object_del(ad->miscellaneous_list.selInfoPop); + ad->miscellaneous_list.selInfoPop = NULL; + } + + if (!setting_done_list_is_some_item_selected(&ad->miscellaneous_list)) { + setting_create_simple_popup(NULL, ad->win_get, NULL, "No item selected"); + } else { + int i = 0; + for (; i < ad->miscellaneous_list.cur_item_num; i++) { + if (!ad->miscellaneous_list.chk_items[i].data_GenItem->chk_status) { + continue; + } + + char path[SETTING_STORAGE_CHILDPATH_LEN] = {0,}; + snprintf(path, SETTING_STORAGE_CHILDPATH_LEN, "%s/%s", SETTING_STORAGE_MEDIA_PATH, + ad->miscellaneous_list.chk_items[i].item_name); + SETTING_TRACE("path = %s", path); + /*unselect item*/ + elm_check_state_set(ad->miscellaneous_list.chk_items[i].data_GenItem->eo_check, 0); + ad->miscellaneous_list.chk_items[i].data_GenItem->chk_status = 0; + + int ret = __setting_storage_file_remove(path); + if (!ret) { + SETTING_TRACE_ERROR("failed to __setting_storage_file_remove"); + if (ad->popup) { + evas_object_del(ad->popup); + ad->popup = NULL; + } + ad->popup = setting_create_popup_without_btn(ad, ad->win_get, + _("IDS_COM_POP_FAILED"), + NULL, NULL, POPUP_INTERVAL, FALSE, FALSE); + return; + } + + } + + /* update genlist */ + __setting_storage_miscellaneous_files_genlist_update(ad); + + /* reset sel_all item */ + elm_check_state_set(ad->miscellaneous_list.select_all_checkbox, 0); + ad->miscellaneous_list.select_all_checked = EINA_FALSE; + } } diff --git a/setting-storage/src/setting-storage.c b/setting-storage/src/setting-storage.c index 045dd0f..bf963f2 100755 --- a/setting-storage/src/setting-storage.c +++ b/setting-storage/src/setting-storage.c @@ -23,6 +23,89 @@ #define UG_MODULE_API __attribute__ ((visibility("default"))) #endif +int setting_storage_file_list_get(char *path, Eina_List **dir_list, Eina_List **file_list) +{ + SETTING_TRACE_BEGIN; + setting_retvm_if(NULL == path, SETTING_RETURN_FAIL, "path is NULL"); + + DIR *pDir = NULL; + struct dirent *ent = NULL; + char childpath[SETTING_STORAGE_CHILDPATH_LEN] = {0,}; + + pDir = opendir(path); + setting_retvm_if(NULL == pDir, SETTING_RETURN_FAIL, "pDir is NULL"); + + while ((ent = readdir(pDir)) != NULL) { + if (safeStrCmp(ent->d_name, ".") == 0 || safeStrCmp(ent->d_name, "..") == 0) { + continue; + } + /*only deal with dirs and regular files*/ + if ((ent->d_type & DT_DIR) == 0 && (ent->d_type & DT_REG) == 0) { + continue; + } + + Node_Info *pNode = (Node_Info *)malloc(sizeof(Node_Info)); + + if (pNode == NULL) { + continue; + } + + memset(pNode, 0, sizeof(Node_Info)); + /*get path*/ + g_strlcpy(pNode->path, path, (gsize) sizeof(pNode->path)); + + /*get name*/ + g_strlcpy(pNode->name, ent->d_name, (gsize) sizeof(pNode->name)); + + /*get size*/ + int copiednum = g_sprintf(childpath, "%s/%s", path, ent->d_name); + if (copiednum < 0) { + FREE(pNode); + continue; + } + if (setting_storage_file_stat_get(childpath, &pNode) == SETTING_RETURN_FAIL) { + FREE(pNode); + continue; + } + + if (ent->d_type & DT_DIR) { + *dir_list = eina_list_append(*dir_list, pNode); + } else { + *file_list = eina_list_append(*file_list, pNode); + } + } + closedir(pDir); + + return SETTING_RETURN_SUCCESS; +} + +int setting_storage_list_len_get(const Eina_List *list) +{ + if (list == NULL) + return 0; + + return eina_list_count(list); +} + +int setting_storage_file_stat_get(const char *filename, Node_Info **node) +{ + setting_retvm_if(!filename || !node, SETTING_RETURN_FAIL, "NULL input parameters"); + struct stat statbuf; + if (stat(filename, &statbuf) == -1) { + SETTING_TRACE_ERROR("failed to call stat"); + return SETTING_RETURN_FAIL; + } + + if (*node == NULL) { + SETTING_TRACE_ERROR("node is NULL"); + return SETTING_RETURN_FAIL; + } + + (*node)->size = statbuf.st_size; + + return SETTING_RETURN_SUCCESS; +} + static void setting_storage_ug_cb_resize(void *data, Evas *e, Evas_Object *obj, void *event_info) { @@ -44,6 +127,8 @@ static void *setting_storage_ug_on_create(ui_gadget_h ug, enum ug_mode mode, setting_retvm_if(storageUG->win_main_layout == NULL, NULL, "cannot get main window "); + setting_set_i18n(SETTING_PACKAGE, SETTING_LOCALEDIR); + /* register view node table */ setting_view_node_table_intialize(); setting_view_node_table_register(&setting_view_storage_main, NULL);