4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 #include <media_content.h>
23 #include "setting-common-general-func.h"
24 #include "setting-storage-SD.h"
25 #include "setting-storage-USB.h"
26 #include "setting-storage-utils.h"
27 #include "setting-storage-async-worker.h"
28 #include "setting-storage-main.h"
30 #define SETTING_STORAGE_PIE_RECT_WIDTH (300 * WIDGET_SCALE_FACTOR)
31 #define SETTING_STORAGE_PIE_RECT_SIZE (300 * WIDGET_SCALE_FACTOR)
32 //#define SETTING_STORAGE_PIE_CYCLE_SIZE (294 * WIDGET_SCALE_FACTOR)
33 #define SETTING_STORAGE_PIE_CYCLE_SIZE (123 * WIDGET_SCALE_FACTOR)
34 #define SETTING_STORAGE_ITEM_LIST_SIZE (180 * WIDGET_SCALE_FACTOR)
36 #define SETTING_STORAGE_APPS_ICON_PATH SETTING_ICON_PATH"/A01-1_icon_color_applications.png"
37 #define SETTING_STORAGE_PICS_ICON_PATH SETTING_ICON_PATH"/A01-1_icon_color_pictures.png"
38 #define SETTING_STORAGE_AUDIO_ICON_PATH SETTING_ICON_PATH"/A01-1_icon_color_Audio.png"
39 #define SETTING_STORAGE_MISCES_ICON_PATH SETTING_ICON_PATH"/A01-1_icon_color_miscellaneous_files.png"
40 #define SETTING_STORAGE_AVAIL_ICON_PATH SETTING_ICON_PATH"/A01-1_icon_color_available.png"
41 #define SETTING_STORAGE_SYS_ICON_PATH SETTING_ICON_PATH"/A01-1_icon_color_system.png"
43 const char *storageUg_MMC_stat = VCONFKEY_SYSMAN_MMC_STATUS;
44 const char *storageUg_ENCRYPT_stat = VCONFKEY_SDE_CRYPTO_STATE;
46 static setting_view setting_view_storage_main;
48 static inline void storageUg_main_pie_graph_cairo( Evas_Object *pie_image,
54 double account_size = 0.0;
55 cairo_surface_t *cairo_surface;
56 double apps_sz = 0, pics_sz = 0, audio_size = 0, misces_sz = 0, internal_sz = 0, system_sz = 0;
60 cairo_h = cairo_w = SETTING_STORAGE_PIE_CYCLE_SIZE;
62 total_size = ad->sz_inter_total;
75 system_sz = ad->sz_sys / total_size;
76 if (system_sz > 1 || system_sz < 0)
80 apps_sz = ad->sz_apps / total_size;
81 if (apps_sz > 1 || apps_sz < 0)
85 pics_sz = ad->sz_pics_videos / total_size;
86 if (pics_sz > 1 || pics_sz < 0)
90 audio_size = ad->sz_audio / total_size;
91 if (audio_size > 1 || audio_size < 0)
94 /* Miscellaneous Files */
95 misces_sz = ad->sz_misces / total_size;
96 if (misces_sz > 1 || misces_sz < 0)
100 internal_sz = ad->sz_inter_avail / total_size;
101 if (internal_sz > 1 || internal_sz < 0)
107 cairo_destroy(ad->cr);
111 cairo_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, cairo_w, cairo_h);
112 if (NULL == cairo_surface)
114 SETTING_TRACE_ERROR("cairo_image_surface_create() Fail");
118 cr = cairo_create(cairo_surface);
119 cairo_surface_destroy(cairo_surface);
121 //all, use avaliable color
122 cairo_set_line_width(cr, 4);
123 cairo_arc(cr, cairo_w/2, cairo_h/2, cairo_w/2, 0, 2*M_PI);
124 cairo_set_source_rgba(cr, 235/255., 235/255., 235/255., 1);
129 cairo_line_to(cr, cairo_w/2, cairo_h/2);
130 cairo_arc_negative(cr, cairo_w/2, cairo_h/2, cairo_w/2, account_size*2*M_PI,
131 (account_size-system_sz)*2*M_PI);
132 cairo_set_source_rgba(cr, 153/255., 66/255., 194/255., 1);
134 account_size -= system_sz;
137 cairo_line_to(cr, cairo_w/2, cairo_h/2);
138 cairo_arc_negative(cr, cairo_w/2, cairo_h/2, cairo_w/2, account_size*2*M_PI,
139 (account_size-apps_sz)*2*M_PI);
140 cairo_set_source_rgba(cr, 255/255., 189/255., 8/255., 1);
142 account_size -= apps_sz;
145 cairo_line_to(cr, cairo_w/2, cairo_h/2);
146 cairo_arc_negative(cr, cairo_w/2, cairo_h/2, cairo_w/2, account_size*2*M_PI,
147 (account_size-pics_sz)*2*M_PI);
148 cairo_set_source_rgba(cr, 119/255., 222/255., 60/255., 1);
150 account_size -= pics_sz;
153 cairo_line_to(cr, cairo_w/2, cairo_h/2);
154 cairo_arc_negative(cr, cairo_w/2, cairo_h/2, cairo_w/2, account_size*2*M_PI,
155 (account_size-audio_size)*2*M_PI);
156 cairo_set_source_rgba(cr, 28/255., 140/255., 252/255., 1);
158 account_size -= audio_size;
160 //miscellaneous files
161 cairo_line_to(cr, cairo_w/2, cairo_h/2);
162 cairo_arc_negative(cr, cairo_w/2, cairo_h/2, cairo_w/2, account_size*2*M_PI,
163 (account_size-misces_sz)*2*M_PI);
164 cairo_set_source_rgba(cr, 52/255., 220/255., 250/255., 1);
166 account_size -= misces_sz;
168 evas_object_image_size_set(pie_image, cairo_w, cairo_h);
169 evas_object_image_data_set(pie_image, cairo_image_surface_get_data(cairo_surface));
170 evas_object_image_fill_set(pie_image, 0, 0, cairo_w, cairo_h);
171 evas_object_resize(pie_image, cairo_w, cairo_h);
175 static inline void storageUg_main_part_pie_graph_set(Evas_Object *parent,
176 const char* part, void *data)
179 int cairo_w, cairo_h;
181 Evas_Object *pie_image;
182 SettingStorageUG *ad = data;
184 ret_if(parent == NULL);
185 ret_if(data == NULL);
187 cairo_h = cairo_w = SETTING_STORAGE_PIE_CYCLE_SIZE;
189 evas = evas_object_evas_get(parent);
192 SETTING_TRACE_ERROR("evas_object_evas_get() Fail");
196 clip = evas_object_rectangle_add(evas);
197 evas_object_color_set(clip, 255, 255, 255, 255);
198 setting_resize_object(clip, cairo_w, cairo_h);
200 pie_image = evas_object_image_add(evas);
201 evas_object_color_set(pie_image, 255, 255, 255, 250);
202 evas_object_clip_set(pie_image, clip);
203 evas_object_show(pie_image);
204 elm_object_part_content_set(parent, part, pie_image);
206 storageUg_main_pie_graph_cairo(pie_image, ad);
209 Evas_Object* storageUg_main_pie_item_get_icon(void *data, Evas_Object *obj,
212 int layout_w, layout_h;
215 SettingStorageUG *ad = data;
216 char size_str[STORAGEUG_MAX_STR_LEN] = {0};
217 char final_str[STORAGEUG_MAX_STR_LEN] = {0};
219 retv_if(NULL == obj, NULL);
220 retv_if(NULL == data, NULL);
221 retvm_if(safeStrCmp(part, "elm.icon"), NULL, "part(%s) Invaild", part);
224 layout_h = SETTING_STORAGE_PIE_RECT_SIZE;
226 layout = elm_layout_add(obj);
227 elm_layout_file_set(layout, SETTING_THEME_EDJ_NAME, "storage_pie");
229 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 0.0);
232 elm_object_part_text_set(layout, "storage_title.text",
233 _(STORAGEUG_STR_INTERNAL_STORAGE));
235 storageUg_size_to_str(ad->sz_inter_avail, size_str, sizeof(size_str));
236 snprintf(final_str, sizeof(final_str), "%s %s", size_str,
237 _(STORAGEUG_STR_AVAIL));
238 elm_object_part_text_set(layout, "storage_total.text", final_str);
240 used_size = ad->sz_inter_total - ad->sz_inter_avail;
241 storageUg_size_to_str(used_size, size_str, sizeof(size_str));
242 snprintf(final_str, sizeof(final_str), "%s %s", size_str,
243 _(STORAGEUG_STR_USED));
244 elm_object_part_text_set(layout, "storage_used.text", final_str);
247 storageUg_main_part_pie_graph_set(layout, "pie_rect", ad);
248 setting_resize_object(layout, layout_w, layout_h);
249 evas_object_show(layout);
254 Evas_Object* storageUg_color_item_content_get(void *data, Evas_Object *obj,
257 ret_if(data == NULL);
258 Setting_GenGroupItem_Data *list_item = data;
259 int color = list_item->color;
260 if (!strcmp(part, "elm.icon.1")) {
261 Evas_Object *layout = elm_layout_add(obj);
262 elm_layout_file_set(layout, SETTING_THEME_EDJ_NAME, "storage_elem");
268 elm_object_signal_emit(layout, "elm,state,show,app", "elm");
271 elm_object_signal_emit(layout, "elm,state,show,pic", "elm");
274 elm_object_signal_emit(layout, "elm,state,show,audio", "elm");
277 elm_object_signal_emit(layout, "elm,state,show,misc", "elm");
280 elm_object_signal_emit(layout, "elm,state,show,avail", "elm");
285 evas_object_show(layout);
292 static void storageUg_main_sel(void *data, Evas_Object *obj, void *event_info)
294 SettingStorageUG *ad = data;
295 Elm_Object_Item *item = event_info;
297 ret_if(data == NULL);
299 elm_genlist_item_selected_set(item, 0);
300 Setting_GenGroupItem_Data *list_item = elm_object_item_data_get(item);
302 SETTING_TRACE("clicking item[%s]", list_item->keyStr);
304 if (!safeStrCmp(STORAGEUG_STR_APPS, list_item->keyStr))
305 storageUg_manage_app_ug(ad);
306 else if (!safeStrCmp(STORAGEUG_STR_DEF_STORAGE, list_item->keyStr))
307 setting_view_change(ad->main_view, ad->default_view, ad);
308 else if (!safeStrCmp(STORAGEUG_STR_PICS, list_item->keyStr))
309 app_launcher("org.tizen.gallery");
310 else if (!safeStrCmp(STORAGEUG_STR_AUDIO, list_item->keyStr))
311 app_launcher("org.tizen.music-player-lite");
312 else if (!safeStrCmp(STORAGEUG_STR_MISCES, list_item->keyStr))
313 setting_view_change(ad->main_view, ad->misces_view, ad);
316 static Setting_GenGroupItem_Data* storageUg_main_append_group_mid_item(
317 SettingStorageUG *ad, int color, const char *key_str, const char *sub_str)
319 Setting_GenGroupItem_Data *item_data = NULL;
320 item_data = (Setting_GenGroupItem_Data *) calloc(1, sizeof(Setting_GenGroupItem_Data));
322 item_data->userdata = ad;
323 item_data->keyStr = (char *)g_strdup(key_str);
324 item_data->sub_desc = (char *)g_strdup(sub_str);
325 item_data->color = color;
326 item_data->item = elm_genlist_item_append(ad->gl_main, &(ad->itc_color_item), item_data, NULL,
327 ELM_GENLIST_ITEM_NONE, storageUg_main_sel, ad);
329 SETTING_TRACE_ERROR("item_data is NULL");
335 static inline void storageUg_main_dev_memory_detail(SettingStorageUG *ad)
337 char avail_desc[STORAGEUG_MAX_STR_LEN] = {0};
338 char total_desc[STORAGEUG_MAX_STR_LEN] = {0};
341 storageUg_size_to_str(ad->sz_inter_total, total_desc, sizeof(total_desc));
342 ad->total_space = setting_create_Gendial_field_def(ad->gl_main, &itc_2text_2,
343 NULL, ad, SWALLOW_Type_INVALID, NULL, NULL, 0, STORAGEUG_STR_TOTAL,
345 ret_if(NULL == ad->total_space);
346 ad->total_space->userdata = ad;
347 ad->total_space->group_style = SETTING_GROUP_STYLE_TOP;
348 elm_genlist_item_select_mode_set(ad->total_space->item,
349 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
352 ad->sys_mem = storageUg_main_append_group_mid_item(ad,
353 1, STORAGEUG_STR_SYS_MEM, STORAGEUG_STR_WAIT);
354 ret_if(NULL == ad->sys_mem);
355 elm_genlist_item_select_mode_set(ad->sys_mem->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
358 ad->apps = storageUg_main_append_group_mid_item(ad,
359 2, STORAGEUG_STR_APPS, STORAGEUG_STR_WAIT);
360 ret_if(NULL == ad->apps);
362 /* Pictures, Videos */
363 ad->pics_videos = storageUg_main_append_group_mid_item(ad,
364 3, STORAGEUG_STR_PICS, STORAGEUG_STR_WAIT);
365 ret_if(NULL == ad->pics_videos);
368 ad->audio = storageUg_main_append_group_mid_item(ad,
369 4, STORAGEUG_STR_AUDIO, STORAGEUG_STR_WAIT);
370 ret_if(NULL == ad->audio);
372 /* Miscellaneous files */
373 ad->misces = storageUg_main_append_group_mid_item(ad,
374 5, STORAGEUG_STR_MISCES, STORAGEUG_STR_WAIT);
375 ret_if(NULL == ad->misces);
378 storageUg_size_to_str(ad->sz_inter_avail, avail_desc, sizeof(avail_desc));
379 ad->avail = storageUg_main_append_group_mid_item(ad,
380 6, STORAGEUG_STR_AVAIL, avail_desc);
381 ret_if(NULL == ad->avail);
382 elm_genlist_item_select_mode_set(ad->avail->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
385 static void storageUg_encrypt_change_cb(keynode_t *node, void *user_data)
388 SettingStorageUG *ad = user_data;
390 ret_if(NULL == user_data);
392 str = vconf_keynode_get_str(node);
393 if(!safeStrCmp(str, "encryption_start") || !safeStrCmp(str, "decryption_start"))
395 if (ad->sd_mount) setting_disable_genlist_item(ad->sd_mount->item);
396 if (ad->sd_format) setting_disable_genlist_item(ad->sd_format->item);
400 if (ad->sd_mount) setting_enable_genlist_item(ad->sd_mount->item);
401 if (ad->sd_format) setting_enable_genlist_item(ad->sd_format->item);
405 static void storageUg_main_dev_memory_update(SettingStorageUG *ad)
407 char desc[STORAGEUG_MAX_STR_LEN] = {0};
411 storageUg_get_internal_storage_status(&ad->sz_inter_total, &ad->sz_inter_avail);
413 /* update internal total size */
414 storageUg_size_to_str(ad->sz_inter_total, desc, sizeof(desc));
415 G_FREE(ad->total_space->sub_desc);
416 ad->total_space->sub_desc = (char *)g_strdup(desc);
417 elm_genlist_item_fields_update(ad->total_space->item, "elm.text.sub.left.bottom",
418 ELM_GENLIST_ITEM_FIELD_TEXT);
420 /* update internal available size */
421 storageUg_size_to_str(ad->sz_inter_avail, desc, sizeof(desc));
422 G_FREE(ad->avail->sub_desc);
423 ad->avail->sub_desc = (char *)g_strdup(desc);
424 elm_genlist_item_fields_update(ad->avail->item, "elm.text.sub.left.bottom",
425 ELM_GENLIST_ITEM_FIELD_TEXT);
429 static Eina_Bool storageUg_update_timer(void *data)
432 SettingStorageUG *ad = data;
434 retv_if(NULL == data, ECORE_CALLBACK_CANCEL);
436 storageUg_main_dev_memory_update(ad);
437 SETTING_TRACE_DEBUG("ad->misces_view->is_create:%d",ad->misces_view->is_create);
438 if (ad->misces_view->is_create){
439 setting_view_update(ad->misces_view, ad);
442 storageUg_stop_async_worker(ad->size_worker);
443 ad->size_worker = storageUg_start_async_worker(storageUg_get_internal_detail,
444 storageUg_get_internal_detail_cb, ad);
447 ad->update_timer = NULL;
449 return ECORE_CALLBACK_CANCEL;
452 static void storageUg_main_update_media_data(SettingStorageUG *ad)
456 if (ad->update_timer){
457 ecore_timer_del(ad->update_timer);
458 ad->update_timer = NULL;
461 ad->update_timer = ecore_timer_add(0.5,storageUg_update_timer, ad);
464 static void storageUg_media_filesys_changed_cb(
465 media_content_error_e error,
467 media_content_db_update_item_type_e update_item,
468 media_content_db_update_type_e update_type,
469 media_content_type_e media_type,
476 SettingStorageUG *ad = user_data;
478 ret_if(user_data == NULL);
480 storageUg_main_update_media_data(ad);
485 static Eina_Bool storageUg_main_back_cb(void *data, Elm_Object_Item *it)
488 SettingStorageUG *ad = data;
490 retv_if(data == NULL, EINA_TRUE);
492 if (ad->update_timer) {
493 ecore_timer_del(ad->update_timer);
494 ad->update_timer = NULL;
499 if (storageUg_worker_is_running(ad->size_worker))
501 SETTING_TRACE("DO NOT Close Storage UI!!!!! <<------------");
505 SETTING_TRACE("ad->size_worker is NULL <<--------");
508 ug_destroy_me(ad->ug);
513 static inline Evas_Object* storageUg_main_genlist(Evas_Object *parent)
515 Evas_Object *genlist;
517 genlist = elm_genlist_add(parent);
520 SETTING_TRACE_ERROR("elm_genlist_add() Fail");
524 //elm_object_style_set(genlist, "dialogue");
525 elm_genlist_block_count_set(genlist, 3);
526 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
527 evas_object_show(genlist);
529 evas_object_smart_callback_add(genlist, "realized", __gl_realized_cb, NULL);
534 static int storageUg_main_create(void *data)
537 Elm_Object_Item *pie_item;
538 SettingStorageUG *ad = data;
540 bindtextdomain(SETTING_PACKAGE, SETTING_LOCALEDIR);
542 retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
543 retv_if(NULL == ad->lo_parent, SETTING_DRAW_ERR_FAIL_LOAD_EDJ);
545 ad->gl_main = storageUg_main_genlist(ad->navi);
546 setting_create_navi_bar_buttons(STORAGEUG_STR_STORAGE, STORAGEUG_STR_BACK, NULL,
547 NULL, (setting_call_back_func)storageUg_main_back_cb, NULL, NULL, ad,
548 ad->gl_main, ad->navi, NULL);
550 storageUg_get_internal_storage_status(&ad->sz_inter_total, &ad->sz_inter_avail);
552 /* storage pie view */
553 pie_item = elm_genlist_item_append(ad->gl_main, &(ad->itc_pie),
554 ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
555 elm_genlist_item_select_mode_set(pie_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
556 ad->pie_it = pie_item;
558 storageUg_main_dev_memory_detail(ad);
561 storageUg_stop_async_worker(ad->size_worker);
562 ad->size_worker = storageUg_start_async_worker(storageUg_get_internal_detail,
563 storageUg_get_internal_detail_cb, ad);
565 storageUG_update_apps_info(ad);
567 storageUg_append_separator(ad->gl_main, ad);
570 ret = vconf_get_int(storageUg_MMC_stat, &ad->mmc_status);
571 retvm_if(ret, SETTING_RETURN_FAIL, "vconf_get_int(%s) Fail", storageUg_MMC_stat);
573 storageUg_append_separator(ad->gl_main, ad);
575 /* Default storage */
576 setting_create_Gendial_field_def(ad->gl_main, &itc_1text,
577 storageUg_main_sel, ad, SWALLOW_Type_INVALID, NULL, NULL, 0,
578 STORAGEUG_STR_DEF_STORAGE, NULL, NULL);
580 storageUg_append_separator(ad->gl_main, ad);
583 ad->sd_card = setting_create_Gendial_field_titleItem(ad->gl_main,
584 &itc_group_item, STORAGEUG_STR_SD_CARD, NULL);
585 storageUg_main_append_SD_info(ad);
587 storageUg_append_separator(ad->gl_main, ad);
589 ret = vconf_notify_key_changed(storageUg_MMC_stat, storageUg_SD_change_cb, ad);
590 warn_if(ret != 0, "vconf_notify_key_changed(%s) Fail", storageUg_MMC_stat);
592 ret = vconf_notify_key_changed(storageUg_ENCRYPT_stat,
593 storageUg_encrypt_change_cb, ad);
594 warn_if(ret != 0, "vconf_notify_key_changed(%s) Fail", storageUg_ENCRYPT_stat);
598 ad->usb_otg_status = SETTING_STORAGE_USB_OTG_REMOVE;
600 storageUg_init_USB(ad);
602 setting_view_storage_main.is_create = 1;
604 media_content_set_db_updated_cb(storageUg_media_filesys_changed_cb, ad);
605 SETTING_TRACE("-----------------------------------------------");
606 SETTING_TRACE(" WIDGET_SCALE_FACTOR : %f",WIDGET_SCALE_FACTOR);
607 SETTING_TRACE("-----------------------------------------------");
609 return SETTING_RETURN_SUCCESS;
612 static int storageUg_main_destroy(void *data)
615 SettingStorageUG *ad = data;
617 retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
619 setting_view_destroy(ad->misces_view, ad);
621 media_content_unset_db_updated_cb();
623 storageUg_deinit_USB();
625 ret = vconf_ignore_key_changed(storageUg_MMC_stat, storageUg_SD_change_cb);
626 warn_if(ret, "vconf_ignore_key_changed(%s) Fail(%d)", storageUg_MMC_stat, ret);
627 ret = vconf_ignore_key_changed(storageUg_ENCRYPT_stat, storageUg_encrypt_change_cb);
628 warn_if(ret, "vconf_ignore_key_changed(%s) Fail(%d)", storageUg_ENCRYPT_stat, ret);
630 storageUg_stop_async_worker_all();
632 if (ad->update_idler)
634 ecore_idler_del(ad->update_idler);
635 ad->update_idler = NULL;
638 if (ad->update_timer){
639 ecore_timer_del(ad->update_timer);
640 ad->update_timer = NULL;
645 evas_object_del(ad->popup);
650 cairo_destroy(ad->cr);
655 pkgmgr_client_free(ad->pc);
659 setting_view_storage_main.is_create = 0;
661 return SETTING_RETURN_SUCCESS;
664 static int storageUg_main_update(void *data)
666 SettingStorageUG *ad = data;
668 retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
670 storageUg_main_update_media_data(ad);
671 storageUG_update_apps_info(ad);
674 setting_view_update(ad->misces_view, ad);
676 evas_object_show(ad->lo_main);
678 return SETTING_RETURN_SUCCESS;
681 static int storageUg_main_cleanup(void *data)
683 return SETTING_RETURN_SUCCESS;
686 void storageUg_main_init(SettingStorageUG *ad)
689 ret_if(ad->main_view);
691 setting_view_storage_main.create = storageUg_main_create;
692 setting_view_storage_main.destroy = storageUg_main_destroy;
693 setting_view_storage_main.update = storageUg_main_update;
694 setting_view_storage_main.cleanup = storageUg_main_cleanup;
696 ad->main_view = &setting_view_storage_main;