4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
6 * Contact: MyoungJune Park <mj2004.park@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
21 #include <setting-storage-main.h>
23 #include <package-manager.h>
26 static int setting_storage_main_create(void *cb);
27 static int setting_storage_main_destroy(void *cb);
28 static int setting_storage_main_update(void *cb);
29 static int setting_storage_main_cleanup(void *cb);
31 static void __setting_storage_main_click_softkey_back_cb(void *data, Evas_Object *obj,
34 setting_view setting_view_storage_main = {
35 .create = setting_storage_main_create,
36 .destroy = setting_storage_main_destroy,
37 .update = setting_storage_main_update,
38 .cleanup = setting_storage_main_cleanup,
41 static Evas_Object *__setting_storage_main_image_add(Evas *evas, char *icon_path, int width, int height)
43 Evas_Object *image = NULL;
44 image = evas_object_image_add(evas);
45 evas_object_size_hint_weight_set(image, 0.0, EVAS_HINT_EXPAND);
46 evas_object_image_load_size_set(image, width, height);
47 evas_object_image_file_set(image, icon_path, NULL);
48 evas_object_image_fill_set(image, 0, 0, width, height);
49 evas_object_size_hint_min_set(image, width, height);
50 evas_object_show(image);
55 static char *__gl_text_get(void *data, Evas_Object *obj, const char *part)
58 Setting_GenGroupItem_Data *item_data = data;
60 if (!safeStrCmp(part, "elm.text.1")) {
61 return (char *)g_strdup(item_data->keyStr);
66 static Evas_Object *__gl_content_get(void *data, Evas_Object *obj, const char *part)
69 Setting_GenGroupItem_Data *item_data = data;
70 SettingStorageUG *ad = (SettingStorageUG *) item_data->userdata;
72 int width = SETTING_STORAGE_ICON_WIDTH;
73 int height = SETTING_STORAGE_ICON_HEIGHT;
75 app_device_orientation_e m = elm_win_rotation_get(ad->win_get);
76 if(APP_DEVICE_ORIENTATION_90 == m || APP_DEVICE_ORIENTATION_270 == m) {
77 width = SETTING_STORAGE_ICON_LANDSCAPE_WIDTH;
79 width = SETTING_STORAGE_ICON_WIDTH;
81 float temp_size = 0.0;
83 if (!safeStrCmp(part, "elm.icon")){
84 Evas_Object *status_box = NULL;
85 status_box = elm_box_add(obj);
86 retvm_if(status_box == NULL, NULL, "Cannot get box");
87 item_data->eo_check = status_box;
88 elm_box_horizontal_set(status_box, 1);
89 evas_object_size_hint_align_set(status_box, 0.0, EVAS_HINT_FILL);
90 evas_object_show(status_box);
92 Evas *evas = evas_object_evas_get(obj);
95 unsigned int apps_size = 0;
96 temp_size = ((float)ad->apps_status.dTotal / ad->internal_status.dTotal) * width;
97 if (temp_size < 1 && temp_size > 0) {
100 apps_size = (unsigned int)temp_size;
103 Evas_Object *apps = __setting_storage_main_image_add(evas, SETTING_STORAGE_APPS_ICON_PATH, apps_size, height);
104 elm_box_pack_end(status_box, apps);
107 /* pictures, videos */
108 unsigned int pics_videos_size = 0;
109 temp_size = ((float)ad->pics_videos_status.dTotal / ad->internal_status.dTotal) * width;
110 if (temp_size < 1 && temp_size > 0) {
111 pics_videos_size = 1;
113 pics_videos_size = (unsigned int)temp_size;
115 if (pics_videos_size > 0) {
116 Evas_Object *pics = __setting_storage_main_image_add(evas, SETTING_STORAGE_PICS_ICON_PATH, pics_videos_size, height);
117 elm_box_pack_end(status_box, pics);
121 unsigned int downloads_size = 0;
122 temp_size = ((float)ad->downloads_status.dTotal / ad->internal_status.dTotal) * width;
123 if (temp_size < 1 && temp_size > 0) {
126 downloads_size = (unsigned int)temp_size;
128 if (downloads_size > 0) {
129 Evas_Object *downs = __setting_storage_main_image_add(evas, SETTING_STORAGE_DOWNS_ICON_PATH, downloads_size, height);
130 elm_box_pack_end(status_box, downs);
134 unsigned int audio_size = 0;
135 temp_size = ((float)ad->audio_status.dTotal / ad->internal_status.dTotal) * width;
136 if (temp_size < 1 && temp_size > 0) {
139 audio_size = (unsigned int)temp_size;
141 if (audio_size > 0) {
142 Evas_Object *audio = __setting_storage_main_image_add(evas, SETTING_STORAGE_AUDIO_ICON_PATH, audio_size, height);
143 elm_box_pack_end(status_box, audio);
146 /* Miscellaneous files */
147 unsigned int others_size = 0;
148 temp_size = ((float)ad->others_status.dTotal / ad->internal_status.dTotal) * width;
149 if (temp_size < 1 && temp_size > 0) {
152 others_size = (unsigned int)temp_size;
154 if (others_size > 0) {
155 Evas_Object *misc = __setting_storage_main_image_add(evas, SETTING_STORAGE_MISCES_ICON_PATH, others_size, height);
156 elm_box_pack_end(status_box, misc);
160 unsigned int avail_size = 0;
161 temp_size = ((float)ad->internal_status.dAvail / ad->internal_status.dTotal) * width;
162 if (temp_size < 1 && temp_size > 0) {
165 avail_size = (unsigned int)temp_size;
167 if (avail_size > 0) {
168 Evas_Object *avail = __setting_storage_main_image_add(evas, SETTING_STORAGE_AVAIL_ICON_PATH, avail_size, height);
169 elm_box_pack_end(status_box, avail);
177 static void __gl_del(void *data, Evas_Object *obj)
179 /* SETTING_TRACE_BEGIN; */
180 Setting_GenGroupItem_Data *item_data = (Setting_GenGroupItem_Data *) data;
182 G_FREE(item_data->keyStr);
187 static int __setting_storage_main_fs_stat(double *total, double *avail, const char *path)
190 setting_retvm_if(NULL == total || NULL == avail, SETTING_RETURN_FAIL, "Null output parameters");
194 if (!statvfs(path, &s)) {
195 SETTING_TRACE("f_bsize = %ld f_blocks = %ld f_bavail = %ld f_frsize = %ld",
196 s.f_bsize, s.f_blocks, s.f_bavail, s.f_frsize);
197 *total = (double)s.f_frsize * s.f_blocks;
198 *avail = (double)s.f_bsize * s.f_bavail;
200 return SETTING_RETURN_FAIL;
203 return SETTING_RETURN_SUCCESS;
206 static long long __setting_storage_main_folder_size_get(char *path)
208 //SETTING_TRACE_BEGIN;
209 setting_retvm_if(NULL == path, SETTING_RETURN_FAIL, "path is NULL");
211 unsigned long long size = 0;
212 Eina_List *file_list = NULL;
213 Eina_List *dir_list = NULL;
215 if (ecore_file_is_dir(path)) {
216 int ret = SETTING_RETURN_FAIL;
217 ret = setting_storage_file_list_get(path, &dir_list, &file_list);
219 if (ret == SETTING_RETURN_SUCCESS) {
221 int dir_list_len = setting_storage_list_len_get(dir_list);
222 int file_list_len = setting_storage_list_len_get(file_list);
223 //SETTING_TRACE("dir_list_len is [%d] file_list_len is [%d]", dir_list_len, file_list_len);
224 for (i = 0; i < file_list_len; i++) {
225 Node_Info *pNode = NULL;
226 pNode = (Node_Info *)eina_list_nth(file_list, i);
231 for (i = 0; i < dir_list_len; i++) {
232 Node_Info *pNode = NULL;
233 char *full_path = NULL;
234 pNode = (Node_Info *)eina_list_nth(dir_list, i);
237 full_path = g_strconcat(pNode->path, "/", pNode->name, NULL);
238 //SETTING_TRACE("full_path is [%s]", full_path);
239 size += (__setting_storage_main_folder_size_get(full_path));
247 Node_Info *node = NULL;
248 EINA_LIST_FOREACH(file_list, l, node)
252 eina_list_free(file_list);
258 Node_Info *node = NULL;
259 EINA_LIST_FOREACH(dir_list, l, node)
263 eina_list_free(dir_list);
270 static int __setting_storage_status_size_transition(double size, char *size_desc)
272 //SETTING_TRACE_BEGIN;
273 //SETTING_TRACE("size = %f", size);
274 double tmp_size = 0.0;
276 if (size < SETTING_STORAGE_MEGABYTE_VALUE) { // size < 1MB: show x.xKB
277 tmp_size = size / SETTING_STORAGE_KILOBYTE_VALUE;
278 ret = snprintf(size_desc, SETTING_STORAGE_MAX_STR_LEN, "%4.2lf%s", tmp_size, "KB");
279 retv_if(ret < 0, SETTING_RETURN_FAIL);
280 } else if (size < SETTING_STORAGE_GIGABYTE_VALUE) { // size < 1GB: show x.xMB
281 tmp_size = size / SETTING_STORAGE_MEGABYTE_VALUE;
282 ret = snprintf(size_desc, SETTING_STORAGE_MAX_STR_LEN, "%4.2lf%s", tmp_size, "MB");
283 retv_if(ret < 0, SETTING_RETURN_FAIL);
284 } else { // 1G <= size: show x.xGB
285 tmp_size = size / SETTING_STORAGE_GIGABYTE_VALUE;
286 ret = snprintf(size_desc, SETTING_STORAGE_MAX_STR_LEN, "%4.2lf%s", tmp_size, "GB");
287 retv_if(ret < 0, SETTING_RETURN_FAIL);
290 return SETTING_RETURN_SUCCESS;
294 static void __setting_storage_main_internal_storage_status_get(void *data)
297 setting_retm_if(data == NULL, "Data parameter is NULL");
298 SettingStorageUG *ad = (SettingStorageUG *) data;
302 int ret = SETTING_RETURN_SUCCESS;
303 Setting_Storage_Status internal_status;
305 ret = __setting_storage_main_fs_stat(&dTotal, &dAvail, SETTING_STORAGE_OPT_PATH);
306 setting_retm_if(ret == SETTING_RETURN_FAIL, "get opt status failed");
307 internal_status.dTotal = dTotal;
308 internal_status.dAvail = dAvail;
312 ret = __setting_storage_main_fs_stat(&dTotal, &dAvail, SETTING_STORAGE_MEDIA_PATH);
313 setting_retm_if(ret == SETTING_RETURN_FAIL, "get media status failed");
315 internal_status.dTotal += dTotal;
316 internal_status.dAvail += dAvail;
318 ad->internal_status = internal_status;
321 static bool __setting_storage_main_media_item_cb(media_info_h media, void *data)
323 //SETTING_TRACE_BEGIN;
324 setting_retvm_if(media == NULL, true, "media is NULL");
325 setting_retvm_if(data == NULL, true, "Data parameter is NULL");
326 double *total_size = (double *) data;
328 media_content_type_e media_type = 0;
329 unsigned long long size = 0;
331 media_info_get_media_type(media, &media_type);
332 //SETTING_TRACE("media_type : [%d]", media_type);
334 media_info_get_size(media, &size);
335 //SETTING_TRACE("size : [%lld]", size);
341 static double __setting_storage_main_pictures_videos_status_get()
344 double total_size = 0.0;
346 int ret = MEDIA_CONTENT_ERROR_NONE;
347 filter_h filter = NULL;
350 char *condition = "(MEDIA_TYPE=0 OR MEDIA_TYPE=1) and MEDIA_PATH LIKE \'/opt/media/%%\'"; /*0-image, 1-video, 2-sound, 3-music, 4-other*/
352 ret = media_filter_create(&filter);
353 if(ret != MEDIA_CONTENT_ERROR_NONE) {
354 SETTING_TRACE_ERROR("Fail to create filter");
358 ret = media_filter_set_condition(filter, condition, MEDIA_CONTENT_COLLATE_DEFAULT);
359 if(ret != MEDIA_CONTENT_ERROR_NONE) {
360 media_filter_destroy(filter);
361 SETTING_TRACE_ERROR("Fail to set condition");
365 ret = media_info_foreach_media_from_db(filter, __setting_storage_main_media_item_cb, &total_size);
366 if(ret != MEDIA_CONTENT_ERROR_NONE) {
367 media_filter_destroy(filter);
368 SETTING_TRACE_ERROR("Fail to get media");
372 ret = media_filter_destroy(filter);
373 if (ret != MEDIA_CONTENT_ERROR_NONE) {
374 SETTING_TRACE_ERROR("destroy filter failed\n\n");
381 static double __setting_storage_main_downloads_status_get()
385 double total_size = 0.0;
387 int ret = MEDIA_CONTENT_ERROR_NONE;
388 filter_h filter = NULL;
391 char *condition = "MEDIA_PATH LIKE \'/opt/media/Downloads/%%\'";
393 ret = media_filter_create(&filter);
394 if(ret != MEDIA_CONTENT_ERROR_NONE) {
395 SETTING_TRACE("Fail to create filter");
399 ret = media_filter_set_condition(filter, condition, MEDIA_CONTENT_COLLATE_DEFAULT);
400 if(ret != MEDIA_CONTENT_ERROR_NONE) {
401 media_filter_destroy(filter);
402 SETTING_TRACE("Fail to set condition");
406 ret = media_info_foreach_media_from_db(filter, __setting_storage_main_media_item_cb, &total_size);
407 if(ret != MEDIA_CONTENT_ERROR_NONE) {
408 media_filter_destroy(filter);
409 SETTING_TRACE("Fail to get media");
413 ret = media_filter_destroy(filter);
414 if (ret != MEDIA_CONTENT_ERROR_NONE) {
415 SETTING_TRACE_ERROR("destroy filter failed\n\n");
422 static double __setting_storage_main_audio_status_get()
426 double total_size = 0.0;
428 int ret = MEDIA_CONTENT_ERROR_NONE;
429 filter_h filter = NULL;
432 char *condition = "MEDIA_TYPE=3 and MEDIA_PATH LIKE \'/opt/media/%%\'"; /*0-image, 1-video, 2-sound, 3-music, 4-other*/
434 ret = media_filter_create(&filter);
435 if(ret != MEDIA_CONTENT_ERROR_NONE) {
436 SETTING_TRACE("Fail to create filter");
440 ret = media_filter_set_condition(filter, condition, MEDIA_CONTENT_COLLATE_DEFAULT);
441 if(ret != MEDIA_CONTENT_ERROR_NONE) {
442 media_filter_destroy(filter);
443 SETTING_TRACE("Fail to set condition");
447 ret = media_info_foreach_media_from_db(filter, __setting_storage_main_media_item_cb, &total_size);
448 if(ret != MEDIA_CONTENT_ERROR_NONE) {
449 media_filter_destroy(filter);
450 SETTING_TRACE("Fail to get media");
454 ret = media_filter_destroy(filter);
455 if (ret != MEDIA_CONTENT_ERROR_NONE) {
456 SETTING_TRACE_ERROR("destroy filter failed\n\n");
463 static int __setting_storage_main_miscellaneous_list_get(char *path, Eina_List **dir_list, Eina_List **file_list)
466 setting_retvm_if(NULL == path, SETTING_RETURN_FAIL, "path is NULL");
469 struct dirent *ent = NULL;
470 char childpath[SETTING_STORAGE_CHILDPATH_LEN] = {0,};
472 pDir = opendir(path);
473 setting_retvm_if(NULL == pDir, SETTING_RETURN_FAIL, "pDir is NULL");
475 while ((ent = readdir(pDir)) != NULL) {
476 if (safeStrCmp(ent->d_name, ".") == 0
477 || safeStrCmp(ent->d_name, "..") == 0
478 || safeStrCmp(ent->d_name, ".tmp_download") == 0
479 || safeStrCmp(ent->d_name, ".video-hub") == 0
480 || safeStrCmp(ent->d_name, "Camera") == 0
481 || safeStrCmp(ent->d_name, "Downloads") == 0
482 || safeStrCmp(ent->d_name, "Images") == 0
483 || safeStrCmp(ent->d_name, "Others") == 0
484 || safeStrCmp(ent->d_name, "Sounds") == 0
485 || safeStrCmp(ent->d_name, "Videos") == 0
486 || safeStrCmp(ent->d_name, "lost+found") == 0) {
489 /*only deal with dirs and regular files*/
490 if ((ent->d_type & DT_DIR) == 0 && (ent->d_type & DT_REG) == 0) {
494 Node_Info *pNode = (Node_Info *)malloc(sizeof(Node_Info));
500 memset(pNode, 0, sizeof(Node_Info));
502 g_strlcpy(pNode->path, path, (gsize) sizeof(pNode->path));
505 g_strlcpy(pNode->name, ent->d_name, (gsize) sizeof(pNode->name));
508 int copiednum = g_sprintf(childpath, "%s/%s", path, ent->d_name);
513 if (setting_storage_file_stat_get(childpath, &pNode) == SETTING_RETURN_FAIL) {
518 if (ent->d_type & DT_DIR) {
519 *dir_list = eina_list_append(*dir_list, pNode);
521 *file_list = eina_list_append(*file_list, pNode);
526 return SETTING_RETURN_SUCCESS;
530 * Miscellaneous files is all directories files under /opt/media/ except below default directories:
531 * ++++++++++++++++++++++++++++++++++++++++++++++++
534 * drwxrwxrwx 11 app app 4096 Jan 4 12:42 .
535 * drwxr-xr-x 20 root root 4096 Jan 7 10:09 ..
536 * drwxr-xr-x 2 root root 4096 Jan 4 08:46 .tmp_download
537 * drwxr-xr-x 2 app app 4096 Jan 4 08:47 .video-hub
538 * drwxrwxrwx 2 app app 4096 Oct 5 2012 Camera
539 * drwxrwxrwx 3 app app 4096 Jan 4 08:46 Downloads
540 * drwxrwxrwx 2 app app 4096 Oct 5 2012 Images
541 * drwxrwxrwx 2 app app 4096 Oct 5 2012 Others
542 * drwxrwxrwx 3 app app 4096 Oct 5 2012 Sounds
543 * drwxrwxrwx 2 app app 4096 Oct 5 2012 Videos
544 * drwxrwxrwx 2 app app 16384 Oct 5 2012 lost+found
545 * ++++++++++++++++++++++++++++++++++++++++++++++++
547 static double __setting_storage_main_miscellaneous_size_get()
551 unsigned long long size = 0;
552 Eina_List *file_list = NULL;
553 Eina_List *dir_list = NULL;
555 char *path = SETTING_STORAGE_MEDIA_PATH;
557 if (ecore_file_is_dir(path)) {
558 int ret = SETTING_RETURN_FAIL;
559 ret = __setting_storage_main_miscellaneous_list_get(path, &dir_list, &file_list);
561 if (ret == SETTING_RETURN_SUCCESS) {
563 int dir_list_len = setting_storage_list_len_get(dir_list);
564 int file_list_len = setting_storage_list_len_get(file_list);
565 //SETTING_TRACE("dir_list_len is [%d] file_list_len is [%d]", dir_list_len, file_list_len);
566 for (i = 0; i < file_list_len; i++) {
567 Node_Info *pNode = NULL;
568 pNode = (Node_Info *)eina_list_nth(file_list, i);
572 //SETTING_TRACE("path is [%s], name is [%s]", pNode->path, pNode->name);
574 for (i = 0; i < dir_list_len; i++) {
575 Node_Info *pNode = NULL;
576 char *full_path = NULL;
577 pNode = (Node_Info *)eina_list_nth(dir_list, i);
580 full_path = g_strconcat(pNode->path, "/", pNode->name, NULL);
581 //SETTING_TRACE("full_path is [%s]", full_path);
582 size += (__setting_storage_main_folder_size_get(full_path));
590 Node_Info *node = NULL;
591 EINA_LIST_FOREACH(file_list, l, node)
595 eina_list_free(file_list);
601 Node_Info *node = NULL;
602 EINA_LIST_FOREACH(dir_list, l, node)
606 eina_list_free(dir_list);
613 static void __setting_storage_main_launch_ug_destroy_cb(ui_gadget_h ug, void *priv)
616 /* restore the '<-' button on the navigate bar */
617 retm_if(priv == NULL, "priv is NULL");
618 SettingStorageUG *ad = (SettingStorageUG *) priv;
622 Elm_Object_Item *navi_it = elm_naviframe_top_item_get(ad->navibar);
623 retm_if(navi_it == NULL, "navi_it is NULL");
624 Evas_Object *back_btn = elm_object_item_part_content_get(navi_it, "prev_btn");
626 if (back_btn != NULL) {
627 elm_object_style_set(back_btn, NAVI_BACK_BUTTON_STYLE); /* take into effect */
630 setting_view_update(&setting_view_storage_main, ad);
633 static void __setting_storage_main_launch_ug_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
636 retm_if(priv == NULL, "priv is NULL");
637 SettingStorageUG *ad = (SettingStorageUG *) priv;
638 Evas_Object *base = NULL;
639 base = (Evas_Object *) ug_get_layout(ug);
640 retm_if(base == NULL, "base is NULL");
643 case UG_MODE_FULLVIEW:
644 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
645 elm_win_resize_object_add(ad->win_get, base);
646 evas_object_show(base);
654 static void __setting_storage_main_launch_manage_app_ug(void *data)
658 retm_if(data == NULL, "Data parameter is NULL");
660 SettingStorageUG *ad = (SettingStorageUG *) data;
663 if (service_create(&svc)) {
667 service_add_extra_data(svc, "viewtype", "manage-applications");
669 struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
671 SETTING_TRACE_ERROR("calloc failed");
672 service_destroy(svc);
675 cbs->layout_cb = __setting_storage_main_launch_ug_layout_cb;
676 cbs->result_cb = NULL;
677 cbs->destroy_cb = __setting_storage_main_launch_ug_destroy_cb;
678 cbs->priv = (void *)ad;
680 ui_gadget_h ug = ug_create(ad->ug, "setting-manage-applications-efl", UG_MODE_FULLVIEW, svc, cbs);
681 if (NULL == ug) { /* error handling */
682 SETTING_TRACE_ERROR("NULL == ug");
686 service_destroy(svc);
690 static void __setting_storage_main_app_launch(char *app_name)
693 setting_retm_if(app_name == NULL, "app_name is NULL");
695 app_launcher(app_name);
698 static void __setting_storage_main_Gendial_mouse_up_cb(void *data, Evas_Object *obj, void *event_info)
702 setting_retm_if(data == NULL, "Data parameter is NULL");
703 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
704 elm_genlist_item_selected_set(item, 0);
705 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
707 SettingStorageUG *ad = (SettingStorageUG *) data;
709 SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
712 if (!safeStrCmp(SETTING_STORAGE_DEFAULT_STORAGE_STR, list_item->keyStr)) {
713 setting_view_change(&setting_view_storage_main,
714 &setting_view_storage_default_storage, ad);
715 } else if (!safeStrCmp(SETTING_STORAGE_MISCES_STR, list_item->keyStr)) {
716 setting_view_change(&setting_view_storage_main,
717 &setting_view_storage_miscellaneous_files, ad);
722 if (!safeStrCmp("IDS_ST_BODY_APPLICATIONS", list_item->keyStr)) {
723 __setting_storage_main_launch_manage_app_ug(ad);
724 } else if (!safeStrCmp(SETTING_STORAGE_DEFAULT_STORAGE_STR, list_item->keyStr)) {
725 setting_view_change(&setting_view_storage_main,
726 &setting_view_storage_default_storage, ad);
727 } else if (!safeStrCmp(SETTING_STORAGE_PICS_STR, list_item->keyStr)) {
728 __setting_storage_main_app_launch("org.tizen.gallery");
729 } else if (!safeStrCmp(SETTING_STORAGE_DOWNS_STR, list_item->keyStr)) {
730 __setting_storage_main_app_launch("org.tizen.download-manager");
731 } else if (!safeStrCmp(SETTING_STORAGE_AUDIO_STR, list_item->keyStr)) {
732 __setting_storage_main_app_launch("org.tizen.music-player");
733 } else if (!safeStrCmp(SETTING_STORAGE_MISCES_STR, list_item->keyStr)) {
734 setting_view_change(&setting_view_storage_main,
735 &setting_view_storage_miscellaneous_files, ad);
742 static int __setting_storage_main_check_mmc_status()
745 struct stat parent_stat, mount_stat;
747 ret = stat(SETTING_STORAGE_MMC_PATH, &mount_stat);
748 setting_retvm_if(ret != 0, -1, "get stat error : /opt/storage/sdcard");
750 ret = stat(SETTING_STORAGE_MMC_PARENT_PATH, &parent_stat);
751 setting_retvm_if(ret != 0, -1, "get stat error : /opt/storage/sdcard/..");
753 /* Does not mounted, same st_dev */
754 if(mount_stat.st_dev == parent_stat.st_dev) {
756 } else { /* MMC mounted, diff st_dev */
761 static void __setting_storage_main_sd_card_info_get(char* szTotal, char* szAvail)
763 int mmc_status = __setting_storage_main_check_mmc_status();
764 setting_retm_if(mmc_status == -1, "check mmc status failed");
766 /* Does not mounted, same st_dev */
767 if (mmc_status == 0) {
768 snprintf(szTotal, SETTING_STORAGE_MAX_STR_LEN, "%s", _("IDS_ST_HEADER_UNAVAILABLE"));
769 snprintf(szAvail, SETTING_STORAGE_MAX_STR_LEN, "%s", _("IDS_ST_HEADER_UNAVAILABLE"));
771 /* MMC mounted, diff st_dev */
776 int ret = SETTING_RETURN_SUCCESS;
777 ret = __setting_storage_main_fs_stat(&dTotal, &dAvail, SETTING_STORAGE_MMC_PATH);
778 setting_retm_if(ret == SETTING_RETURN_FAIL, "get sd card size detail failed");
780 ret = __setting_storage_status_size_transition(dTotal, szTotal);
781 setting_retm_if(ret == SETTING_RETURN_FAIL, "__setting_storage_status_size_transition failed");
783 ret = __setting_storage_status_size_transition(dAvail, szAvail);
784 setting_retm_if(ret == SETTING_RETURN_FAIL, "__setting_storage_status_size_transition failed");
786 SETTING_TRACE("Total[%s], Avail[%s]", szTotal, szAvail);
790 static int __setting_storage_main_mmc_content_init(void *data, setting_storage_mmc_cb cb)
793 setting_retvm_if(NULL == data, SETTING_RETURN_FAIL, "data is NULL");
794 setting_retvm_if(NULL == cb, SETTING_RETURN_FAIL, "cb is NULL");
795 SettingStorageUG *ad = (SettingStorageUG *)data;
796 if (ad->mmc_content == NULL) {
797 ad->mmc_content = (struct mmc_contents *)calloc(1, sizeof(struct mmc_contents *));
798 if (ad->mmc_content == NULL ) {
799 SETTING_TRACE_ERROR("calloc failed");
800 return SETTING_RETURN_FAIL;
803 ad->mmc_content->mmc_cb = cb;
804 ad->mmc_content->user_data = ad;
805 return SETTING_RETURN_SUCCESS;
808 static void __setting_storage_status_sd_card_popup_format_response_cb(void *data,
809 Evas_Object *obj, void *event_info)
812 setting_retm_if(data == NULL, "Data parameter is NULL");
813 SettingStorageUG *ad = (SettingStorageUG *)data;
816 evas_object_del(ad->popup);
820 char sd_total[SETTING_STORAGE_MAX_STR_LEN] = { 0, };
821 char sd_available[SETTING_STORAGE_MAX_STR_LEN] = { 0, };
822 __setting_storage_main_sd_card_info_get(sd_total, sd_available);
825 G_FREE(ad->sd_total->sub_desc);
826 ad->sd_total->sub_desc = (char *)g_strdup(sd_total);
827 elm_object_item_data_set(ad->sd_total->item, ad->sd_total);
828 elm_genlist_item_update(ad->sd_total->item);
830 if (ad->sd_available) {
831 G_FREE(ad->sd_available->sub_desc);
832 ad->sd_available->sub_desc = (char *)g_strdup(sd_available);
833 elm_object_item_data_set(ad->sd_available->item, ad->sd_available);
834 elm_genlist_item_update(ad->sd_available->item);
838 static void __setting_storage_status_sd_card_popup_response_cb(void *data,
839 Evas_Object *obj, void *event_info)
842 setting_retm_if(data == NULL, "Data parameter is NULL");
843 SettingStorageUG *ad = (SettingStorageUG *)data;
846 evas_object_del(ad->popup);
851 static void __setting_storage_main_sd_card_mount_cb(int val, void *data)
854 setting_retm_if(data == NULL, "Data parameter is NULL");
855 SettingStorageUG *ad = (SettingStorageUG *) data;
858 evas_object_del(ad->popup);
863 if (val == SETTING_STORAGE_SYSMAN_REQUEST_SUCCESS) {
865 SETTING_TRACE("mount success");
867 } else if (val == SETTING_STORAGE_SYSMAN_REQUEST_MOUNT_ALREADY) {
868 desc = _(SETTING_STORAGE_SD_CARD_MOUNT_ALREADY_DESC);
870 desc = _("IDS_COM_POP_FAILED");
873 ad->popup = setting_create_popup_without_btn(ad, ad->win_get, NULL, desc,
874 __setting_storage_status_sd_card_popup_response_cb,
875 SETTING_STORAGE_POPUP_TIMER, FALSE, FALSE);
878 static void __setting_storage_main_sd_card_unmount_cb(int val, void *data)
881 setting_retm_if(data == NULL, "Data parameter is NULL");
882 SettingStorageUG *ad = (SettingStorageUG *) data;
885 evas_object_del(ad->popup);
889 if (val == SETTING_STORAGE_SYSMAN_REQUEST_SUCCESS) {
891 SETTING_TRACE("unmount success");
894 ad->popup = setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
895 __setting_storage_status_sd_card_popup_response_cb,
896 SETTING_STORAGE_POPUP_TIMER, FALSE, FALSE);
900 static void __setting_storage_main_sd_card_mount_unmount(void *data)
903 setting_retm_if(data == NULL, "Data parameter is NULL");
904 SettingStorageUG *ad = (SettingStorageUG *)data;
906 int mmc_status = __setting_storage_main_check_mmc_status();
907 setting_retm_if(mmc_status == -1, "check mmc status failed");
910 evas_object_del(ad->popup);
914 /* Show progressbar popup */
915 ad->popup = setting_create_popup_with_progressbar(ad, ad->win_get,
916 "pending_list", NULL, NULL,
917 __setting_storage_status_sd_card_popup_response_cb,
918 SETTING_STORAGE_PROGRESSBAR_TIMEOUT, TRUE, TRUE);
921 /* Does not mounted, same st_dev */
922 if (mmc_status == 0) {
923 ret = __setting_storage_main_mmc_content_init(ad, __setting_storage_main_sd_card_mount_cb);
924 if (ret == SETTING_RETURN_FAIL) {
925 SETTING_TRACE_ERROR("__setting_storage_main_mmc_content_init fail");
927 evas_object_del(ad->popup);
930 ad->popup = setting_create_popup_without_btn(ad, ad->win_get,
931 NULL, _("IDS_COM_POP_FAILED"),
932 __setting_storage_status_sd_card_popup_response_cb,
933 SETTING_STORAGE_POPUP_TIMER, FALSE, FALSE);
936 ret = sysman_request_mount_mmc(ad->mmc_content);
938 SETTING_TRACE_ERROR("fail to call sysman_request_mount_mmc");
941 /* MMC mounted, diff st_dev */
943 ret = __setting_storage_main_mmc_content_init(ad, __setting_storage_main_sd_card_unmount_cb);
944 if (ret == SETTING_RETURN_FAIL) {
945 SETTING_TRACE_ERROR("__setting_storage_main_sd_card_unmount_cb fail");
947 evas_object_del(ad->popup);
950 ad->popup = setting_create_popup_without_btn(ad, ad->win_get,
951 NULL, _("IDS_COM_POP_FAILED"),
952 __setting_storage_status_sd_card_popup_response_cb,
953 SETTING_STORAGE_POPUP_TIMER, FALSE, FALSE);
957 ret = sysman_request_unmount_mmc(ad->mmc_content,
958 MNT_FORCE); /* 1 = MNT_FORCE */
960 SETTING_TRACE_ERROR("fail to call sysman_request_unmount_mmc");
964 /* if fail, popup failed info */
967 evas_object_del(ad->popup);
970 ad->popup = setting_create_popup_without_btn(ad, ad->win_get,
971 NULL, _("IDS_COM_POP_FAILED"),
972 __setting_storage_status_sd_card_popup_response_cb,
973 SETTING_STORAGE_POPUP_TIMER, FALSE, FALSE);
978 static void __setting_storage_main_sd_card_format_cb(int val, void *data)
981 setting_retm_if(data == NULL, "Data parameter is NULL");
982 SettingStorageUG *ad = (SettingStorageUG *) data;
985 evas_object_del(ad->popup);
989 if (val == SETTING_STORAGE_SYSMAN_REQUEST_SUCCESS) {
990 ad->popup = setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_SUCCESS"),
991 __setting_storage_status_sd_card_popup_format_response_cb,
992 SETTING_STORAGE_POPUP_TIMER, FALSE, FALSE);
995 ad->popup = setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
996 __setting_storage_status_sd_card_popup_response_cb,
997 SETTING_STORAGE_POPUP_TIMER, FALSE, FALSE);
1001 static void __setting_storage_main_sd_card_format_popup_yes(void *data)
1003 SETTING_TRACE_BEGIN;
1004 setting_retm_if(data == NULL, "Data parameter is NULL");
1005 SettingStorageUG *ad = (SettingStorageUG *) data;
1008 evas_object_del(ad->popup);
1012 /* Show Formatting..... popup */
1013 ad->popup = setting_create_popup_with_progressbar(ad, ad->win_get,
1014 "list_process", _("IDS_ST_POP_MSG_FORMATTING"),
1015 NULL, __setting_storage_status_sd_card_popup_response_cb,
1016 SETTING_STORAGE_PROGRESSBAR_TIMEOUT, TRUE, TRUE);
1018 int ret = __setting_storage_main_mmc_content_init(ad, __setting_storage_main_sd_card_format_cb);
1019 if (ret == SETTING_RETURN_FAIL) {
1020 SETTING_TRACE_ERROR("__setting_storage_main_mmc_content_init fail");
1022 evas_object_del(ad->popup);
1025 ad->popup = setting_create_popup_without_btn(ad, ad->win_get,
1026 NULL, _("IDS_COM_POP_FAILED"),
1027 __setting_storage_status_sd_card_popup_response_cb,
1028 SETTING_STORAGE_POPUP_TIMER, FALSE, FALSE);
1032 ret = sysman_request_format_mmc(ad->mmc_content);
1033 /* if fail, destory popup */
1035 SETTING_TRACE_ERROR("fail to call sysman_request_format_mmc");
1037 evas_object_del(ad->popup);
1040 ad->popup = setting_create_popup_without_btn(ad, ad->win_get,
1041 NULL, _("IDS_COM_POP_FAILED"),
1042 __setting_storage_status_sd_card_popup_response_cb,
1043 SETTING_STORAGE_POPUP_TIMER, FALSE, FALSE);
1047 static void __setting_storage_main_sd_card_format_popup_no(void *data)
1049 SETTING_TRACE_BEGIN;
1050 setting_retm_if(data == NULL, "Data parameter is NULL");
1051 SettingStorageUG *ad = (SettingStorageUG *) data;
1054 evas_object_del(ad->popup);
1059 static void __setting_storage_main_sd_card_ask_format_resp_cb(void *data, Evas_Object *obj, void *event_info)
1061 SETTING_TRACE_BEGIN;
1062 setting_retm_if(data == NULL, "Data parameter is NULL");
1063 int response_type = btn_type(obj);
1064 if (POPUP_RESPONSE_OK == response_type) {
1065 __setting_storage_main_sd_card_format_popup_yes(data);
1066 } else if (POPUP_RESPONSE_CANCEL == response_type) {
1067 __setting_storage_main_sd_card_format_popup_no(data);
1071 static void __setting_storage_main_sd_card_format_popup_create(void *data)
1073 SETTING_TRACE_BEGIN;
1074 setting_retm_if(data == NULL, "Data parameter is NULL");
1075 SettingStorageUG *ad = (SettingStorageUG *) data;
1078 evas_object_del(ad->popup);
1082 ad->popup = setting_create_popup_with_btn(ad, ad->win_get, NULL,
1083 _(SETTING_STORAGE_FORMAT_ASK_MSG),
1084 __setting_storage_main_sd_card_ask_format_resp_cb, 0,
1085 2, _("IDS_COM_SK_YES"),_("IDS_COM_SK_NO"));
1088 static void __setting_storage_main_mouse_up_Gendial_list_cb(void *data, Evas_Object *obj,
1091 SETTING_TRACE_BEGIN;
1092 setting_retm_if(data == NULL, "Data parameter is NULL");
1093 setting_retm_if(event_info == NULL, "Invalid argument: event info is NULL");
1095 SettingStorageUG *ad = (SettingStorageUG *) data;
1096 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
1097 elm_genlist_item_selected_set(item, 0);
1098 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
1100 SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
1101 if (list_item == ad->sd_mount) {
1102 __setting_storage_main_sd_card_mount_unmount(ad);
1103 } else if (list_item == ad->sd_format) {
1104 __setting_storage_main_sd_card_format_popup_create(ad);
1108 static void __setting_storage_main_sd_card_info_append(void* data)
1110 SETTING_TRACE_BEGIN;
1111 setting_retm_if(data == NULL, "Data parameter is NULL");
1112 SettingStorageUG *ad = (SettingStorageUG *) data;
1114 /* remove the sd info items */
1116 elm_object_item_del(ad->sd_mount->item);
1117 ad->sd_mount = NULL;
1120 elm_object_item_del(ad->sd_total->item);
1121 ad->sd_total = NULL;
1123 if (ad->sd_available) {
1124 elm_object_item_del(ad->sd_available->item);
1125 ad->sd_available = NULL;
1127 if (ad->sd_format) {
1128 elm_object_item_del(ad->sd_format->item);
1129 ad->sd_format = NULL;
1132 int mmc_mode = VCONFKEY_SYSMAN_MMC_REMOVED;
1133 int ret = vconf_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &mmc_mode);
1134 setting_retm_if(ret != 0, "Get vconf failed");
1136 if (mmc_mode == VCONFKEY_SYSMAN_MMC_REMOVED) {
1137 ad->sd_mount = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_2), NULL,
1138 ad, SWALLOW_Type_INVALID, NULL,
1139 NULL, 0, SETTING_STORAGE_MOUNT_STR,
1140 _(SETTING_STORAGE_INSERT_STR),
1143 setting_disable_genlist_item(ad->sd_mount->item);
1145 } else if (mmc_mode == VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED) {
1146 ad->sd_mount = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_2),
1147 __setting_storage_main_mouse_up_Gendial_list_cb,
1148 ad, SWALLOW_Type_INVALID, NULL,
1149 NULL, 0, SETTING_STORAGE_MOUNT_STR,
1150 _(SETTING_STORAGE_INSERT_STR),
1152 } else if (mmc_mode == VCONFKEY_SYSMAN_MMC_MOUNTED) {
1153 char sd_total[SETTING_STORAGE_MAX_STR_LEN] = { 0, };
1154 char sd_available[SETTING_STORAGE_MAX_STR_LEN] = { 0, };
1155 __setting_storage_main_sd_card_info_get(sd_total, sd_available);
1157 ad->sd_total = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_2), NULL,
1158 ad, SWALLOW_Type_INVALID, NULL,
1159 NULL, 0, "IDS_ST_BODY_TOTAL_SPACE",
1163 ad->sd_total->userdata = ad;
1164 elm_genlist_item_select_mode_set(ad->sd_total->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1166 SETTING_TRACE_ERROR("ad->sd_total is NULL");
1169 ad->sd_available = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_2), NULL,
1170 ad, SWALLOW_Type_INVALID, NULL,
1171 NULL, 0, "IDS_ST_BODY_AVAILABLE_SPACE",
1174 if (ad->sd_available) {
1175 ad->sd_available->userdata = ad;
1176 elm_genlist_item_select_mode_set(ad->sd_available->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1178 SETTING_TRACE_ERROR("ad->sd_available is NULL");
1181 ad->sd_mount = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_1text),
1182 __setting_storage_main_mouse_up_Gendial_list_cb,
1183 ad, SWALLOW_Type_INVALID, NULL,
1184 NULL, 0, "IDS_ST_BODY_UNMOUNT_SD_CARD", NULL,
1187 ad->sd_mount->userdata = ad;
1189 SETTING_TRACE_ERROR("ad->sd_mount is NULL");
1192 ad->sd_format = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_1text),
1193 __setting_storage_main_mouse_up_Gendial_list_cb,
1194 ad, SWALLOW_Type_INVALID, NULL,
1196 "IDS_ST_BODY_FORMAT_SD_CARD",
1198 if (ad->sd_format) {
1199 ad->sd_format->userdata = ad;
1201 SETTING_TRACE_ERROR("ad->sd_format is NULL");
1204 SETTING_TRACE_ERROR("error status of sd card");
1207 Elm_Object_Item *item = NULL;
1208 item = elm_genlist_item_append(ad->genlist, &itc_bottom_seperator, NULL, NULL,
1209 ELM_GENLIST_ITEM_NONE, NULL, NULL);
1210 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1213 static void __setting_storage_vconf_change_cb(keynode_t *key, void *data)
1215 SETTING_TRACE_BEGIN;
1216 setting_retm_if(NULL == key, "key is NULL");
1217 setting_retm_if(NULL == data, "data is NULL");
1218 SettingStorageUG *ad = (SettingStorageUG *)data;
1219 int status = vconf_keynode_get_int(key);
1220 char *vconf_name = vconf_keynode_get_name(key);
1222 if (!safeStrCmp(vconf_name, VCONFKEY_SYSMAN_MMC_STATUS)) {
1223 SETTING_TRACE("status:%d", status);
1224 /* remove last item -> seperator */
1225 Elm_Object_Item *last_item = NULL;
1226 last_item = elm_genlist_last_item_get(ad->genlist);
1228 elm_object_item_del(last_item);
1230 __setting_storage_main_sd_card_info_append(ad);
1234 static void __setting_storage_main_genlist_update(Setting_GenGroupItem_Data *data, Setting_Storage_Status status)
1236 //SETTING_TRACE_BEGIN;
1237 setting_retm_if(data == NULL, "Data parameter is NULL");
1238 Setting_GenGroupItem_Data *item_data = (Setting_GenGroupItem_Data *) data;
1240 char desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
1241 int ret = __setting_storage_status_size_transition(status.dTotal, desc);
1242 setting_retm_if(ret == SETTING_RETURN_FAIL, "failed to transform")
1244 G_FREE(item_data->sub_desc);
1245 item_data->sub_desc = (char *)g_strdup(desc);
1246 elm_object_item_data_set(item_data->item, item_data);
1247 elm_genlist_item_update(item_data->item);
1250 static ail_cb_ret_e __setting_storage_main_appinfo_func_cb(const ail_appinfo_h ail_info, void *data)
1252 Eina_List **apps_list = (Eina_List **) data;
1254 char *pkg_name = NULL;
1255 char *pkg_type = NULL;
1257 ail_appinfo_get_str(ail_info, AIL_PROP_PACKAGE_STR, &pkg_name);
1258 setting_retvm_if(pkg_name == NULL, AIL_CB_RET_CONTINUE, "get pkg_name failed");
1260 ail_appinfo_get_str(ail_info, AIL_PROP_X_SLP_PACKAGETYPE_STR, &pkg_type);
1261 setting_retvm_if(pkg_type == NULL, AIL_CB_RET_CONTINUE, "get pkg_type failed");
1263 App_Info *app_info = (App_Info*)calloc(1, sizeof(App_Info));
1264 setting_retvm_if(app_info == NULL, AIL_CB_RET_CONTINUE, "failed to calloc");
1266 app_info->pkg_name = (char *)g_strdup(pkg_name);
1267 app_info->pkg_type = (char *)g_strdup(pkg_type);
1268 *apps_list = eina_list_append(*apps_list, app_info);
1269 return AIL_CB_RET_CONTINUE;
1272 static void __setting_storage_main_applications_list_get(Eina_List **apps_list)
1274 SETTING_TRACE_BEGIN;
1275 /* get app_info from AIL */
1276 ail_filter_h filter_rpm = NULL;
1277 ail_filter_h filter_wrt = NULL;
1278 ail_filter_h filter_tpk = NULL;
1280 ail_filter_new(&filter_rpm);
1281 ail_filter_new(&filter_wrt);
1282 ail_filter_new(&filter_tpk);
1284 ail_filter_add_str(filter_rpm, AIL_PROP_X_SLP_PACKAGETYPE_STR, RPM_PREFIX);
1285 ail_filter_add_str(filter_wrt, AIL_PROP_X_SLP_PACKAGETYPE_STR, WRT_PREFIX);
1286 ail_filter_add_str(filter_tpk, AIL_PROP_X_SLP_PACKAGETYPE_STR, TPK_PREFIX);
1288 ail_filter_list_appinfo_foreach(filter_rpm, __setting_storage_main_appinfo_func_cb, (void*)apps_list);
1289 ail_filter_list_appinfo_foreach(filter_wrt, __setting_storage_main_appinfo_func_cb, (void*)apps_list);
1290 ail_filter_list_appinfo_foreach(filter_tpk, __setting_storage_main_appinfo_func_cb, (void*)apps_list);
1292 ail_filter_destroy(filter_rpm);
1293 ail_filter_destroy(filter_wrt);
1294 ail_filter_destroy(filter_tpk);
1297 static double __setting_storage_main_applications_status_get(void *data)
1299 SETTING_TRACE_BEGIN;
1300 setting_retvm_if(data == NULL, 0.0, "Data parameter is NULL");
1301 SettingStorageUG *ad = (SettingStorageUG *)data;
1303 Eina_List *apps_list = NULL;
1304 __setting_storage_main_applications_list_get(&apps_list);
1306 SETTING_TRACE("count = %d", eina_list_count(apps_list));
1308 double total_size = 0.0;
1310 Eina_List *l = NULL;
1311 App_Info *app_info = NULL;
1312 EINA_LIST_FOREACH (apps_list, l, app_info)
1315 pthread_mutex_lock(&ad->exit_mutex);
1316 exit_flag = ad->exit_flag;
1317 pthread_mutex_unlock(&ad->exit_mutex);
1319 if (exit_flag == 1) {
1320 SETTING_TRACE("exit_flag is 1");
1324 //SETTING_TRACE("pkg_name: %s ", app_info->pkg_name);
1325 //SETTING_TRACE("pkg_type: %s", app_info->pkg_type);
1326 pkgmgr_info *pkg_info = pkgmgr_info_new(app_info->pkg_type, app_info->pkg_name);
1328 SETTING_TRACE("pkg_info is null, couldn't get the sizes");
1329 app_info->total_size = 0;
1332 buf = pkgmgr_info_get_string(pkg_info, STR_INSTALLED_SIZE);
1334 //SETTING_TRACE("size : %s", buf);
1335 app_info->total_size = atoi(buf);
1338 app_info->total_size = 0;
1340 pkgmgr_info_free(pkg_info);
1343 total_size += app_info->total_size;
1347 Eina_List *tmp = NULL;
1349 EINA_LIST_FOREACH(apps_list, tmp, app_info)
1351 G_FREE(app_info->pkg_name);
1352 G_FREE(app_info->pkg_type);
1355 eina_list_free(apps_list);
1361 void __setting_storage_main_pipe_cb(void *data, void *buffer, unsigned int nbyte)
1363 SETTING_TRACE_BEGIN;
1364 setting_retm_if(data == NULL, "Data parameter is NULL");
1365 setting_retm_if(buffer == NULL, "buffer parameter is NULL");
1366 SettingStorageUG *ad = (SettingStorageUG *)data;
1368 Update_Info *update_info = (Update_Info *) buffer;
1370 SETTING_TRACE("update_info : %d", update_info->type);
1372 switch (update_info->type) {
1373 case SETTING_STORAGE_APPLICATIONS:
1375 ad->apps_status.dTotal = update_info->total_size;
1376 __setting_storage_main_genlist_update(ad->apps, ad->apps_status);
1379 case SETTING_STORAGE_PICTURES_VIDEO:
1381 ad->pics_videos_status.dTotal = update_info->total_size;
1382 __setting_storage_main_genlist_update(ad->pics_videos, ad->pics_videos_status);
1385 case SETTING_STORAGE_DOWNLOADS:
1387 ad->downloads_status.dTotal = update_info->total_size;
1388 __setting_storage_main_genlist_update(ad->downloads, ad->downloads_status);
1391 case SETTING_STORAGE_AUDIO:
1393 ad->audio_status.dTotal = update_info->total_size;
1394 __setting_storage_main_genlist_update(ad->audio, ad->audio_status);
1397 case SETTING_STORAGE_MISCELLANEOUS:
1399 ad->others_status.dTotal = update_info->total_size;
1400 __setting_storage_main_genlist_update(ad->others, ad->others_status);
1405 SETTING_TRACE_ERROR("wrong update type");
1409 __setting_storage_main_genlist_update(ad->internal, ad->internal_status);
1414 static void *__setting_storage_main_thread_start_routine(void *data)
1416 SETTING_TRACE("==== sub thread id = %d =====", (int)pthread_self());
1417 SETTING_TRACE_BEGIN;
1418 setting_retvm_if(data == NULL, NULL, "Data parameter is NULL");
1419 SettingStorageUG *ad = (SettingStorageUG *)data;
1421 Ecore_Pipe *pipe = ad->pipe;
1422 update_type type = SETTING_STORAGE_PICTURES_VIDEO;
1424 pthread_mutex_lock(&ad->update_mutex);
1425 while (ad->type == SETTING_STORAGE_SLEEP) {
1426 /* wait to be waked up*/
1427 pthread_cond_wait(&ad->wait_cond, &ad->update_mutex);
1430 pthread_mutex_unlock(&ad->update_mutex);
1432 SETTING_TRACE("thread start to work, update type = %d", type);
1436 pthread_mutex_lock(&ad->exit_mutex);
1437 exit_flag = ad->exit_flag;
1438 pthread_mutex_unlock(&ad->exit_mutex);
1440 if (exit_flag == 1) {
1441 SETTING_TRACE("exit_flag is 1");
1445 if (type >= SETTING_STORAGE_MAX) {
1446 SETTING_TRACE("work is done, thread will sleep");
1447 pthread_mutex_lock(&ad->update_mutex);
1448 ad->type = SETTING_STORAGE_SLEEP;
1449 pthread_mutex_unlock(&ad->update_mutex);
1454 case SETTING_STORAGE_PICTURES_VIDEO:
1456 /* get pictures and videos info */
1457 double pics_videos_size = __setting_storage_main_pictures_videos_status_get();
1458 SETTING_TRACE("pics_videos_size = %f", pics_videos_size);
1460 Update_Info pics_videos_info;
1461 memset(&pics_videos_info, 0, sizeof(Update_Info));
1462 pics_videos_info.type = SETTING_STORAGE_PICTURES_VIDEO;
1463 pics_videos_info.total_size = pics_videos_size;
1465 ecore_pipe_write(pipe, &pics_videos_info, sizeof(pics_videos_info));
1468 case SETTING_STORAGE_DOWNLOADS:
1470 /* get downloads info */
1471 double downloads_size = __setting_storage_main_downloads_status_get();
1472 SETTING_TRACE("downloads_size = %f", downloads_size);
1474 Update_Info downloads_info;
1475 memset(&downloads_info, 0, sizeof(Update_Info));
1476 downloads_info.type = SETTING_STORAGE_DOWNLOADS;
1477 downloads_info.total_size = downloads_size;
1479 ecore_pipe_write(pipe, &downloads_info, sizeof(downloads_info));
1482 case SETTING_STORAGE_AUDIO:
1484 /* get audio info */
1485 double audio_size = __setting_storage_main_audio_status_get();
1486 SETTING_TRACE("audio_size = %f", audio_size);
1488 Update_Info audio_info;
1489 memset(&audio_info, 0, sizeof(Update_Info));
1490 audio_info.type = SETTING_STORAGE_AUDIO;
1491 audio_info.total_size = audio_size;
1493 ecore_pipe_write(pipe, &audio_info, sizeof(audio_info));
1496 case SETTING_STORAGE_MISCELLANEOUS:
1498 /* get miscellaneous files info */
1499 double misc_size = __setting_storage_main_miscellaneous_size_get();
1500 SETTING_TRACE("misc_size = %f", misc_size);
1502 Update_Info misc_info;
1503 memset(&misc_info, 0, sizeof(Update_Info));
1504 misc_info.type = SETTING_STORAGE_MISCELLANEOUS;
1505 misc_info.total_size = misc_size;
1507 ecore_pipe_write(pipe, &misc_info, sizeof(misc_info));
1510 case SETTING_STORAGE_APPLICATIONS:
1513 double apps_size = __setting_storage_main_applications_status_get(ad);
1514 SETTING_TRACE("apps_size = %f", apps_size);
1516 Update_Info apps_info;
1517 memset(&apps_info, 0, sizeof(Update_Info));
1518 apps_info.type = SETTING_STORAGE_APPLICATIONS;
1519 apps_info.total_size = apps_size;
1521 ecore_pipe_write(pipe, &apps_info, sizeof(apps_info));
1526 SETTING_TRACE("type = %d", type);
1531 pthread_mutex_lock(&ad->update_mutex);
1533 SETTING_TRACE("ad->type = %d", ad->type);
1534 pthread_mutex_unlock(&ad->update_mutex);
1537 pthread_exit((void *) 0);
1540 static void __setting_storage_main_init(void *data)
1542 SETTING_TRACE_BEGIN;
1543 setting_retm_if(data == NULL, "Data parameter is NULL");
1544 SettingStorageUG *ad = (SettingStorageUG *)data;
1546 pthread_mutex_init(&ad->exit_mutex, NULL);
1547 pthread_mutex_init(&ad->update_mutex, NULL);
1548 pthread_cond_init(&ad->wait_cond, NULL);
1550 ad->exit_flag = EINA_FALSE;
1551 ad->type = SETTING_STORAGE_PICTURES_VIDEO;
1553 ad->internal_status.dAvail = 0.0;
1554 ad->internal_status.dTotal= 0.0;
1556 ad->apps_status.dAvail = 0.0;
1557 ad->apps_status.dTotal= 0.0;
1559 ad->pics_videos_status.dAvail = 0.0;
1560 ad->pics_videos_status.dTotal= 0.0;
1562 ad->downloads_status.dAvail = 0.0;
1563 ad->downloads_status.dTotal= 0.0;
1565 ad->audio_status.dAvail = 0.0;
1566 ad->audio_status.dTotal= 0.0;
1568 ad->others_status.dAvail = 0.0;
1569 ad->others_status.dTotal= 0.0;
1572 /* ***************************************************
1576 ***************************************************/
1577 static int setting_storage_main_create(void *cb)
1579 SETTING_TRACE_BEGIN;
1581 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1583 SettingStorageUG *ad = (SettingStorageUG *) cb;
1585 __setting_storage_main_init(ad);
1587 int ret = SETTING_RETURN_SUCCESS;
1589 retvm_if(ad->win_main_layout == NULL, SETTING_DRAW_ERR_FAIL_LOAD_EDJ,
1590 "win_main_layout is NULL");
1593 setting_create_layout_navi_bar_genlist(ad->win_main_layout,
1596 _("IDS_COM_BODY_BACK"),
1598 __setting_storage_main_click_softkey_back_cb,
1600 ad, &ad->genlist, &ad->navibar);
1602 ad->itc_2text_1icon_4.item_style = "dialogue/2text.1icon.4";
1603 ad->itc_2text_1icon_4.func.text_get = __gl_text_get;
1604 ad->itc_2text_1icon_4.func.content_get = __gl_content_get;
1605 ad->itc_2text_1icon_4.func.state_get = NULL;
1606 ad->itc_2text_1icon_4.func.del = __gl_del;
1608 __setting_storage_main_internal_storage_status_get(ad);
1610 Elm_Object_Item *item = NULL;
1612 bool is_emulator = isEmulBin();
1615 item = elm_genlist_item_append(ad->genlist, &itc_seperator, NULL, NULL,
1616 ELM_GENLIST_ITEM_NONE, NULL, NULL);
1617 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1619 /* Default storage */
1620 setting_create_Gendial_field_def(ad->genlist, &(ad->itc_1text),
1621 __setting_storage_main_Gendial_mouse_up_cb,
1622 ad, SWALLOW_Type_INVALID, NULL, NULL,
1623 0, SETTING_STORAGE_DEFAULT_STORAGE_STR,
1627 setting_create_Gendial_field_titleItem(ad->genlist, &(ad->itc_group_item),
1628 SETTING_STORAGE_INTERNAL_STORAGE_STR,
1632 char total_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
1633 ret = __setting_storage_status_size_transition(ad->internal_status.dTotal, total_desc);
1634 setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform")
1637 ad->internal = (Setting_GenGroupItem_Data *) calloc(1, sizeof(Setting_GenGroupItem_Data));
1638 setting_retvm_if(!ad->internal, SETTING_RETURN_FAIL, "calloc failed");
1641 ad->internal->userdata = ad;
1642 ad->internal->keyStr = (char *)g_strdup(total_desc);
1643 ad->internal->item = elm_genlist_item_append(ad->genlist, &(ad->itc_2text_1icon_4), ad->internal, NULL,
1644 ELM_GENLIST_ITEM_NONE, NULL, NULL);
1645 elm_genlist_item_select_mode_set(ad->internal->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1647 SETTING_TRACE_ERROR("ad->internal is NULL");
1648 return SETTING_RETURN_FAIL;
1652 ad->apps = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3),
1653 __setting_storage_main_Gendial_mouse_up_cb,
1654 ad, SWALLOW_Type_INVALID, SETTING_STORAGE_APPS_ICON_PATH,
1655 NULL, 0, "IDS_ST_BODY_APPLICATIONS",
1656 _("IDS_ST_HEADER_PLEASE_WAIT"), NULL);
1658 ad->apps->userdata = ad;
1660 elm_genlist_item_select_mode_set(ad->apps->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1663 SETTING_TRACE_ERROR("ad->apps is NULL");
1664 return SETTING_RETURN_FAIL;
1667 /* Pictures, Videos */
1668 ad->pics_videos = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3),
1669 __setting_storage_main_Gendial_mouse_up_cb,
1670 ad, SWALLOW_Type_INVALID, SETTING_STORAGE_PICS_ICON_PATH,
1671 NULL, 0, SETTING_STORAGE_PICS_STR,
1672 _("IDS_ST_HEADER_PLEASE_WAIT"), NULL);
1673 if (ad->pics_videos) {
1674 ad->pics_videos->userdata = ad;
1676 elm_genlist_item_select_mode_set(ad->pics_videos->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1679 SETTING_TRACE_ERROR("ad->pics_videos is NULL");
1680 return SETTING_RETURN_FAIL;
1684 ad->downloads = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3),
1685 __setting_storage_main_Gendial_mouse_up_cb,
1686 ad, SWALLOW_Type_INVALID, SETTING_STORAGE_DOWNS_ICON_PATH,
1687 NULL, 0, SETTING_STORAGE_DOWNS_STR,
1688 _("IDS_ST_HEADER_PLEASE_WAIT"), NULL);
1689 if (ad->downloads) {
1690 ad->downloads->userdata = ad;
1692 elm_genlist_item_select_mode_set(ad->downloads->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1695 SETTING_TRACE_ERROR("ad->downloads is NULL");
1696 return SETTING_RETURN_FAIL;
1700 ad->audio = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3),
1701 __setting_storage_main_Gendial_mouse_up_cb,
1702 ad, SWALLOW_Type_INVALID, SETTING_STORAGE_AUDIO_ICON_PATH,
1703 NULL, 0, SETTING_STORAGE_AUDIO_STR,
1704 _("IDS_ST_HEADER_PLEASE_WAIT"), NULL);
1706 ad->audio->userdata = ad;
1709 elm_genlist_item_select_mode_set(ad->audio->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1712 SETTING_TRACE_ERROR("ad->audio is NULL");
1713 return SETTING_RETURN_FAIL;
1716 /* Miscellaneous files */
1717 ad->others = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3),
1718 __setting_storage_main_Gendial_mouse_up_cb,
1719 ad, SWALLOW_Type_INVALID, SETTING_STORAGE_MISCES_ICON_PATH,
1720 NULL, 0, SETTING_STORAGE_MISCES_STR,
1721 _("IDS_ST_HEADER_PLEASE_WAIT"), NULL);
1723 ad->others->userdata = ad;
1725 SETTING_TRACE_ERROR("ad->others is NULL");
1726 return SETTING_RETURN_FAIL;
1730 char avail_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
1731 ret = __setting_storage_status_size_transition(ad->internal_status.dAvail, avail_desc);
1732 setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform")
1734 ad->avail = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3), NULL,
1735 ad, SWALLOW_Type_INVALID, SETTING_STORAGE_AVAIL_ICON_PATH,
1736 NULL, 0, SETTING_STORAGE_AVAIL_STR,
1739 ad->avail->userdata = ad;
1740 elm_genlist_item_select_mode_set(ad->avail->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1742 SETTING_TRACE_ERROR("ad->avail is NULL");
1743 return SETTING_RETURN_FAIL;
1748 /* Format USB storage */
1749 setting_create_Gendial_field_def(ad->genlist, &(ad->itc_1text), NULL,
1750 ad, SWALLOW_Type_INVALID, NULL,
1752 SETTING_STORAGE_FORMAT_STR,
1755 setting_create_Gendial_field_def(ad->genlist, &(ad->itc_bg_1icon), NULL,
1756 ad, SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
1757 NULL, NULL, 0, SETTING_STORAGE_FORMAT_DESC_STR, NULL,
1762 setting_create_Gendial_field_titleItem(ad->genlist, &(ad->itc_group_item),
1763 "IDS_ST_BODY_SD_CARD", NULL);
1764 __setting_storage_main_sd_card_info_append(ad);
1766 ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_MMC_STATUS,
1767 __setting_storage_vconf_change_cb, ad);
1769 SETTING_TRACE_ERROR("call vconf_notify_key_changed failed");
1772 item = elm_genlist_item_append(ad->genlist, &itc_bottom_seperator, NULL, NULL,
1773 ELM_GENLIST_ITEM_NONE, NULL, NULL);
1774 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1777 setting_view_storage_main.is_create = 1;
1780 ecore_pipe_del(ad->pipe);
1783 ad->pipe = ecore_pipe_add(__setting_storage_main_pipe_cb, ad);
1784 ret = pthread_create(&ad->tid, NULL, __setting_storage_main_thread_start_routine, ad);
1786 SETTING_TRACE_ERROR("fail to create thread");
1788 SETTING_TRACE("thread id = %d", ad->tid);
1790 return SETTING_RETURN_SUCCESS;
1793 static int setting_storage_main_destroy(void *cb)
1796 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1798 SettingStorageUG *ad = (SettingStorageUG *) cb;
1802 pthread_mutex_lock(&ad->exit_mutex);
1804 pthread_mutex_unlock(&ad->exit_mutex);
1806 /* wake up thread */
1807 pthread_mutex_lock(&ad->update_mutex);
1808 ad->type = SETTING_STORAGE_REUPDATE;
1809 pthread_cond_signal(&ad->wait_cond);
1810 pthread_mutex_unlock(&ad->update_mutex);
1812 void *thread_ret = NULL;
1813 ret = pthread_join(ad->tid, &thread_ret);
1815 SETTING_TRACE_ERROR("fail to join with thread");
1817 SETTING_TRACE("thread exit code %d", (int)thread_ret);
1819 pthread_mutex_destroy(&ad->exit_mutex);
1820 pthread_mutex_destroy(&ad->update_mutex);
1821 pthread_cond_destroy(&ad->wait_cond);
1824 ecore_pipe_del(ad->pipe);
1829 ret = vconf_ignore_key_changed(VCONFKEY_SYSMAN_MMC_STATUS,
1830 __setting_storage_vconf_change_cb);
1832 SETTING_TRACE_ERROR("call vconf_ignore_key_changed failed");
1837 evas_object_del(ad->popup);
1841 if (ad->ly_main != NULL) {
1842 evas_object_del(ad->ly_main);
1843 setting_view_storage_main.is_create = 0;
1846 return SETTING_RETURN_SUCCESS;
1849 static int setting_storage_main_update(void *cb)
1851 SETTING_TRACE_BEGIN;
1853 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1854 SettingStorageUG *ad = (SettingStorageUG *) cb;
1858 __setting_storage_main_internal_storage_status_get(ad);
1860 /* update internal total size */
1861 char total_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
1862 ret = __setting_storage_status_size_transition(ad->internal_status.dTotal, total_desc);
1863 setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform")
1865 G_FREE(ad->internal->keyStr);
1866 ad->internal->keyStr = (char *)g_strdup(total_desc);
1867 elm_object_item_data_set(ad->internal->item, ad->internal);
1868 elm_genlist_item_update(ad->internal->item);
1870 /* update internal available size */
1871 char avail_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
1872 ret = __setting_storage_status_size_transition(ad->internal_status.dAvail, avail_desc);
1873 setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform")
1875 G_FREE(ad->avail->sub_desc);
1876 ad->avail->sub_desc = (char *)g_strdup(avail_desc);
1877 elm_object_item_data_set(ad->avail->item, ad->avail);
1878 elm_genlist_item_update(ad->avail->item);
1880 /* wake up thread */
1881 pthread_mutex_lock(&ad->update_mutex);
1882 ad->type = SETTING_STORAGE_REUPDATE;
1883 pthread_cond_signal(&ad->wait_cond);
1884 pthread_mutex_unlock(&ad->update_mutex);
1886 if (ad->ly_main != NULL) {
1887 evas_object_show(ad->ly_main);
1890 return SETTING_RETURN_SUCCESS;
1893 static int setting_storage_main_cleanup(void *cb)
1896 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1898 SettingStorageUG *ad = (SettingStorageUG *) cb;
1900 if (ad->ly_main != NULL) {
1901 evas_object_hide(ad->ly_main);
1904 return SETTING_RETURN_SUCCESS;
1907 /* ***************************************************
1911 ***************************************************/
1913 static void __setting_storage_main_click_softkey_back_cb(void *data, Evas_Object *obj,
1917 ret_if(data == NULL);
1919 SettingStorageUG *ad = (SettingStorageUG *) data;
1920 /* Send destroy request */
1921 ug_destroy_me(ad->ug);