tizen 2.3.1 release
[apps/home/settings.git] / setting-storage / src / setting-storage-miscellaneous.c
1 /*
2  * setting
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
5  *
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  */
19 #include <media_content.h>
20
21 #include "setting-storage-utils.h"
22 #include "setting-storage-async-worker.h"
23 #include "setting-storage-miscellaneous.h"
24
25 #define STR_DELETE_ITEMS        "IDS_ST_HEADER_DELETE_ITEMS_ABB2"
26 typedef struct {
27         char *id;
28         char *path;
29         char *name;
30         Setting_GenGroupItem_Data *data;
31         SettingStorageUG *ad;
32 } Node_Info;
33
34 static setting_view setting_view_storage_misc;
35
36 static Eina_Bool storageUg_misces_back_cb(void *data, Elm_Object_Item *it)
37 {
38         SettingStorageUG *ad = data;
39
40         retv_if(data == NULL, EINA_TRUE);
41         retv_if(NULL != ad->del_worker, EINA_FALSE);
42
43         setting_view_change(ad->misces_view, ad->main_view, ad);
44
45         return EINA_TRUE;
46 }
47
48 static bool storageUg_misces_media_item_cb(media_info_h media, void *data)
49 {
50         Node_Info *node;
51         char *media_id = NULL;
52         char *file_path = NULL;
53         char *display_name = NULL;
54         SettingStorageUG *ad = data;
55
56         retv_if(NULL == media, true);
57         retv_if(NULL == data, false);
58
59         media_info_get_file_path(media, &file_path);
60         if (!ecore_file_exists(file_path)) {
61                 FREE(file_path);
62                 return true;
63         }
64
65         media_info_get_media_id(media, &media_id);
66         media_info_get_display_name(media, &display_name);
67
68         node = calloc(1, sizeof(Node_Info));
69         if (node) {
70                 node->id = media_id;
71                 node->path = file_path;
72                 node->name = display_name;
73                 ad->misces_list = eina_list_append(ad->misces_list, node);
74         }
75
76         return true;
77 }
78
79 static void storageUg_misces_clear_list(Eina_List *list)
80 {
81         Eina_List *l = NULL;
82         Node_Info *node = NULL;
83
84         EINA_LIST_FOREACH(list, l, node) {
85                 free(node->id);
86                 free(node->path);
87                 free(node->name);
88                 free(node);
89         }
90         eina_list_free(list);
91 }
92
93 static inline void storageUg_meisces_get_list(SettingStorageUG *ad)
94 {
95         int ret;
96         char *condition;
97         filter_h filter = NULL;
98
99         ret_if(NULL == ad);
100
101         if (ad->misces_list) {
102                 storageUg_misces_clear_list(ad->misces_list);
103                 ad->misces_list = NULL;
104         }
105
106         /*Set Filter*/
107         condition = "(MEDIA_TYPE=4) and MEDIA_PATH LIKE \'/opt/usr/media/%%\'";
108         /*
109            condition = "(MEDIA_TYPE=4) and (MEDIA_PATH LIKE \'/opt/usr/media/.tmp_download/%%\'"
110            "or MEDIA_PATH LIKE \'/opt/usr/media/.video-hub/%%\'"
111            "or MEDIA_PATH LIKE \'/opt/usr/media/Camera/%%\'"
112            "or MEDIA_PATH LIKE \'/opt/usr/media/Downloads/%%\'"
113            "or MEDIA_PATH LIKE \'/opt/usr/media/Images/%%\'"
114            "or MEDIA_PATH LIKE \'/opt/usr/media/Others/%%\'"
115            "or MEDIA_PATH LIKE \'/opt/usr/media/Sounds/%%\'"
116            "or MEDIA_PATH LIKE \'/opt/usr/media/Videos/%%\'"
117            "or MEDIA_PATH LIKE \'/opt/usr/media/lost+found/%%\')";
118            */
119
120         /*Set Filter*/
121         ret = media_filter_create(&filter);
122         if (ret != MEDIA_CONTENT_ERROR_NONE) {
123                 SETTING_TRACE_ERROR("media_filter_create() Fail(%d)", ret);
124                 return;
125         }
126         ret = media_filter_set_condition(filter, condition, MEDIA_CONTENT_COLLATE_DEFAULT);
127         if (ret != MEDIA_CONTENT_ERROR_NONE) {
128                 media_filter_destroy(filter);
129                 SETTING_TRACE_ERROR("media_filter_set_condition() Fail(%d)", ret);
130                 return;
131         }
132
133         ret = media_info_foreach_media_from_db(filter, storageUg_misces_media_item_cb, ad);
134         if (ret != MEDIA_CONTENT_ERROR_NONE) {
135                 media_filter_destroy(filter);
136                 SETTING_TRACE_ERROR("media_info_foreach_media_from_db() Fail(%d)", ret);
137                 return;
138         }
139
140         ret = media_filter_destroy(filter);
141         if (ret != MEDIA_CONTENT_ERROR_NONE) {
142                 SETTING_TRACE_ERROR("media_filter_destroy() Fail(%d)", ret);
143                 return;
144         }
145
146         ad->misces_sz_all = eina_list_count(ad->misces_list);;
147 }
148
149 static void storageUg_misces_handle_selecting(SettingStorageUG *ad)
150 {
151         Evas_Object *toolbar;
152
153         ret_if(NULL == ad);
154
155         if (ad->misces_checked == ad->misces_sz_all)
156                 ad->misces_is_select_all = EINA_TRUE;
157         else
158                 ad->misces_is_select_all = EINA_FALSE;
159
160         /*  text set and timeout set */
161         if (0 < ad->misces_checked) {
162                 char text[MAX_DISPLAY_NAME_LEN_ON_UI] = {0};
163
164                 snprintf(text, sizeof(text), _(STORAGEUG_STR_N_SELECTED), ad->misces_checked);
165                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", text);
166
167                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
168                 elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_FALSE);
169         } else {
170                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", "");
171                 elm_object_item_signal_emit(ad->misces_navi_it, "elm,state,subtitle,hide", "elm");
172
173                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
174                 elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_TRUE);
175         }
176 }
177
178 static int storageUg_compare_str(const void *data1, const void *data2)
179 {
180         return safeStrCmp(data1, data2);
181 }
182
183 static void storageUg_misces_handle_sel_list(SettingStorageUG *ad, char *id,
184                                              int checked)
185 {
186         if (checked) {
187                 ad->misces_checked++;
188                 ad->misces_sel_list = eina_list_append(ad->misces_sel_list, strdup(id));
189         } else {
190                 Eina_List *found;
191
192                 ad->misces_checked--;
193                 found = eina_list_search_unsorted_list(ad->misces_sel_list, storageUg_compare_str,
194                                                        id);
195                 free(eina_list_data_get(found));
196                 ad->misces_sel_list = eina_list_remove_list(ad->misces_sel_list, found);
197         }
198
199         /*update select all check state*/
200         Evas_Object *check = elm_object_part_content_get(ad->select_all_layout, "elm.icon");
201         if (ad->misces_checked >= ad->misces_sz_all) {
202                 elm_check_state_set(check, EINA_TRUE);
203         } else {
204                 elm_check_state_set(check, EINA_FALSE);
205         }
206         /*update delete item buttons*/
207         if (ad->misces_checked > 0) {
208                 if (ad->misces_navi_it && elm_object_item_part_content_get(ad->misces_navi_it, "title_left_btn") == NULL) {
209                         elm_object_item_part_content_set(ad->misces_navi_it, "title_left_btn", ad->title_left_btn);
210                 }
211                 if (ad->misces_navi_it && elm_object_item_part_content_get(ad->misces_navi_it, "title_right_btn") == NULL) {
212                         elm_object_item_part_content_set(ad->misces_navi_it, "title_right_btn", ad->title_right_btn);
213                 }
214         } else {
215                 if (ad->misces_navi_it && elm_object_item_part_content_get(ad->misces_navi_it, "title_left_btn") != NULL) {
216                         elm_object_item_part_content_unset(ad->misces_navi_it, "title_left_btn");
217                         evas_object_hide(ad->title_left_btn);
218                 }
219                 if (ad->misces_navi_it && elm_object_item_part_content_get(ad->misces_navi_it, "title_right_btn") != NULL) {
220                         elm_object_item_part_content_unset(ad->misces_navi_it, "title_right_btn");
221                         evas_object_hide(ad->title_right_btn);
222                 }
223         }
224 }
225
226 static void storageUg_misces_genlist_sel(void *data, Evas_Object *obj,
227                                          void *event_info)
228 {
229         Node_Info *node;
230         SettingStorageUG *ad = data;
231         Elm_Object_Item *item = event_info;
232         Setting_GenGroupItem_Data *d_item;
233
234         ret_if(data == NULL);
235
236         elm_genlist_item_selected_set(item, 0);
237         d_item = elm_object_item_data_get(item);
238         node = d_item->userdata;
239
240         setting_update_gl_item_chk_status(d_item, !(d_item->chk_status));
241
242         storageUg_misces_handle_sel_list(ad, node->id, d_item->chk_status);
243         storageUg_misces_handle_selecting(ad);
244 }
245
246 static void storageUg_misces_genlist_chk_cb(void *data, Evas_Object *obj,
247                                             void *event_info)
248 {
249         Node_Info *node;
250         SettingStorageUG *ad;
251         Setting_GenGroupItem_Data *d_item = data;
252
253         ret_if(data == NULL);
254
255         node = d_item->userdata;
256         ad = node->ad;
257         d_item->chk_status = elm_check_state_get(obj);
258
259         storageUg_misces_handle_sel_list(ad, node->id, d_item->chk_status);
260         storageUg_misces_handle_selecting(ad);
261 }
262
263 static inline Evas_Object *storageUg_misces_no_item(Evas_Object *parent)
264 {
265         Evas_Object *layout, *icon;
266
267         layout = elm_layout_add(parent);
268         elm_layout_theme_set(layout, "layout", "nocontents", "default");
269         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
270         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
271
272         icon = elm_image_add(layout);
273         elm_image_file_set(icon, SETTING_ICON_PATH_CFG "/00_nocontents_text.png", NULL);
274         elm_object_part_content_set(layout, "nocontents.image", icon);
275
276         elm_object_domain_translatable_part_text_set(layout, "elm.text", SYSTEM_PACKAGE,
277                                                      STORAGEUG_STR_NO_FILES);
278         elm_layout_signal_emit(layout, "text,disabled", "");
279
280         return layout;
281 }
282
283 static inline void storageUg_misces_clear_sel_list(Eina_List *list)
284 {
285         Eina_List *l = NULL;
286         char *node = NULL;
287
288         EINA_LIST_FOREACH(list, l, node)
289         free(node);
290         eina_list_free(list);
291 }
292
293 static inline void storageUg_misces_gl_append_items(SettingStorageUG *ad)
294 {
295         int checked;
296         Node_Info *node;
297         Eina_List *found, *cur, *tmp_sel_list;
298         Setting_GenGroupItem_Data *item_data = NULL;
299
300         tmp_sel_list = ad->misces_sel_list;
301         ad->misces_sel_list = NULL;
302
303         EINA_LIST_FOREACH(ad->misces_list, cur, node) {
304                 if (NULL == node)
305                         continue;
306
307                 found = eina_list_search_unsorted_list(tmp_sel_list, storageUg_compare_str,
308                                                        node->id);
309                 if (found) {
310                         checked = 1;
311                         storageUg_misces_handle_sel_list(ad, node->id, 1);
312                 } else {
313                         checked = 0;
314                 }
315
316                 item_data = setting_create_Gendial_field_def(ad->gl_misces,
317                                                              &(itc_1text_1icon), storageUg_misces_genlist_sel, ad,
318                                                              SWALLOW_Type_1CHECK_RIGHT, NULL, NULL, checked, node->name, node->path,
319                                                              storageUg_misces_genlist_chk_cb);
320
321                 if (item_data) {
322                         item_data->userdata = node;
323                         node->data = item_data;
324                         node->ad = ad;
325                 } else {
326                         SETTING_TRACE_ERROR("item_data is NULL");
327                 }
328         }
329         storageUg_misces_handle_selecting(ad);
330         storageUg_misces_clear_sel_list(tmp_sel_list);
331 }
332
333 static inline Evas_Object *storageUg_misces_genlist(Evas_Object *parent)
334 {
335         Evas_Object *genlist;
336
337         genlist = elm_genlist_add(parent);
338         if (NULL == genlist) {
339                 SETTING_TRACE_ERROR("elm_genlist_add() Fail");
340                 return NULL;
341         }
342
343         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
344         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
345         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
346         elm_scroller_policy_set(genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
347         evas_object_show(genlist);
348
349         evas_object_smart_callback_add(genlist, "realized", __gl_realized_cb, NULL);
350
351         return genlist;
352 }
353
354 static void storageUg_misces_delete_list(SettingStorageUG *ad)
355 {
356         SETTING_TRACE("Entering storageUg_misces_delete_list");
357
358         ret_if(NULL == ad);
359
360         ad->misces_checked = 0;
361         Setting_GenGroupItem_Data *item_data = NULL;
362         Elm_Object_Item *it = elm_genlist_first_item_get(ad->gl_misces);
363
364         while (it) {
365                 item_data = elm_object_item_data_get(it);
366                 it = elm_genlist_item_next_get(it);
367                 if (item_data != NULL) {
368                         SETTING_TRACE("chk_status: %d", item_data->chk_status);
369                         if (item_data->chk_status) {
370                                 elm_object_item_del(item_data->item);
371                                 Node_Info *node = item_data->userdata;
372                                 ad->misces_list = eina_list_remove(ad->misces_list, node);
373                                 FREE(node->id);
374                                 FREE(node->path);
375                                 FREE(node->name);
376                                 FREE(node);
377                         }
378                 }
379         }
380
381         ad->misces_sz_all = eina_list_count(ad->misces_list);
382
383         SETTING_TRACE("ad->misces_sz_all - %d", ad->misces_sz_all);
384         if (0 == ad->misces_sz_all) {
385
386                 if (elm_object_item_part_content_get(ad->misces_navi_it, "title_right_btn")) {
387                         Evas_Object *btn_done = elm_object_item_part_content_unset(ad->misces_navi_it, "title_right_btn");
388                         evas_object_hide(btn_done);
389                 }
390
391                 if (elm_object_item_part_content_get(ad->misces_navi_it, "title_left_btn")) {
392                         Evas_Object *btn_cancel = elm_object_item_part_content_unset(ad->misces_navi_it, "title_left_btn");
393                         evas_object_hide(btn_cancel);
394                 }
395                 if (NULL == ad->misces_lo_noitem) {
396                         ad->misces_lo_noitem = storageUg_misces_no_item(ad->navi);
397                 }
398
399
400                 ad->gl_misces = NULL;
401
402                 if (ad->misces_lo_noitem) {
403                         elm_object_item_part_content_set(ad->misces_navi_it, "elm.swallow.content", ad->misces_lo_noitem);
404                 }
405
406         }
407 }
408
409 static void storageUg_misces_add_list(SettingStorageUG *ad)
410 {
411         Evas_Object *toolbar, *btn;
412         Evas_Object *lo_new = NULL;
413
414         ret_if(NULL == ad);
415
416         ad->misces_checked = 0;
417         ad->misces_is_select_all = EINA_FALSE;
418
419         if (0 == ad->misces_sz_all) {
420                 if (NULL == ad->misces_lo_noitem) {
421                         lo_new = ad->misces_lo_noitem = storageUg_misces_no_item(ad->navi);
422
423                         btn = elm_object_item_part_content_get(ad->misces_navi_it, "title_right_btn");
424                         elm_object_disabled_set(btn, EINA_TRUE);
425                         ad->gl_misces = NULL;
426                 }
427         } else {
428                 if (ad->gl_misces)
429                         elm_genlist_clear(ad->gl_misces);
430                 else
431                         lo_new = ad->gl_misces = storageUg_misces_genlist(ad->navi);
432
433                 storageUg_misces_gl_append_items(ad);
434                 ad->misces_lo_noitem = NULL;
435         }
436
437         if (lo_new) {
438                 elm_object_item_part_content_set(ad->misces_navi_it, "elm.swallow.content",
439                                                  lo_new);
440         }
441
442         if (0 == ad->misces_checked) {
443                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
444                 elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_TRUE);
445         }
446 }
447
448 void storageUg_misces_delete_files_cb(int fn_result, SettingStorageUG *ad)
449 {
450         ret_if(NULL == ad);
451
452         ad->del_worker = NULL;
453
454         /* update genlist */
455         SETTING_TRACE("After deleting, updating the file list");
456         /*      storageUg_misces_add_list(ad); */
457         storageUg_misces_delete_list(ad);
458
459         if (SETTING_RETURN_SUCCESS != fn_result) {
460                 SETTING_TRACE_ERROR("storageUg_misces_delete_files() Fail(%d)", fn_result);
461                 storageUg_fail_popup(ad);
462                 return;
463         }
464
465         if (ad->popup) {
466                 evas_object_del(ad->popup);
467                 ad->popup = NULL;
468         }
469
470         if (ad->misces_navi_it) {
471                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", "");
472                 elm_object_item_signal_emit(ad->misces_navi_it, "elm,state,subtitle,hide", "elm");
473         }
474 }
475
476 static int storageUg_misces_delete_files(SettingStorageUG *ad)
477 {
478         Eina_List *l = NULL;
479         Node_Info *node = NULL;
480         Setting_GenGroupItem_Data *item_data = NULL;
481
482         retv_if(NULL == ad, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
483
484         EINA_LIST_FOREACH(ad->misces_list, l, node) {
485                 if (node) {
486                         item_data = node->data;
487
488                         if (!item_data->chk_status)
489                                 continue;
490
491                         if (EINA_TRUE == ecore_file_remove(node->path)) {
492                                 media_content_scan_file(node->path);
493                         } else {
494                                 SETTING_TRACE_ERROR("failed to ecore_file_remove");
495                                 return SETTING_RETURN_FAIL;
496                         }
497                 }
498                 storageUG_STOP_POINT;
499         }
500
501         return SETTING_RETURN_SUCCESS;
502 }
503
504 static void storageUg_misces_delete_resp(void *data, Evas_Object *obj,
505                                          void *event_info)
506 {
507         int response_type;
508         SettingStorageUG *ad = data;
509
510         ret_if(NULL == data);
511         ret_if(NULL == obj);
512
513         response_type = btn_type(obj);
514
515         if (ad->popup) {
516                 evas_object_del(ad->popup);
517                 ad->popup = NULL;
518         }
519
520         if (POPUP_RESPONSE_OK != response_type) {
521                 SETTING_TRACE("CANCEL");
522                 return;
523         }
524
525         if (ad->misces_checked) {
526                 ad->popup = setting_create_popup_with_progressbar(ad, ad->win, PROGRESSBAR_STYLE,
527                                                                   NULL, NULL, storageUg_popup_del, 0, TRUE, TRUE);
528
529                 if (ad->del_worker)
530                         storageUg_stop_async_worker(ad->del_worker);
531                 ad->del_worker = storageUg_start_async_worker(storageUg_misces_delete_files,
532                                                               storageUg_misces_delete_files_cb, ad);
533         } else {
534                 ad->popup = setting_create_popup_without_btn(ad, ad->win, NULL,
535                                                              STORAGEUG_STR_NO_SELECTED, storageUg_popup_del,
536                                                              SETTING_STORAGE_POPUP_TIMER, FALSE, FALSE);
537         }
538 }
539
540 static void storageUg_misces_delete_cb(void *data, Evas_Object *obj,
541                                        void *event_info)
542 {
543         SettingStorageUG *ad = (SettingStorageUG *) data;
544
545         ret_if(NULL == data);
546
547         ad->popup = setting_create_popup_with_btn(ad, ad->win, NULL,
548                                                   STORAGEUG_STR_DELETE_Q, storageUg_misces_delete_resp, 0,
549                                                   2, STORAGEUG_STR_DELETE, STORAGEUG_STR_CANCEL);
550 }
551
552 static void storageUg_misces_sel_all_clicked(void *data, Evas_Object *obj,
553                                              void *event_info)
554 {
555         Eina_List *l = NULL;
556         Evas_Object *toolbar;
557         Node_Info *node = NULL;
558         SettingStorageUG *ad = data;
559         Setting_GenGroupItem_Data *item_data = NULL;
560
561         ret_if(data == NULL);
562
563         ad->misces_is_select_all = elm_check_state_get(obj);
564
565         EINA_LIST_FOREACH(ad->misces_list, l, node) {
566                 if (node && node->data) {
567                         item_data = node->data;
568                         if (item_data) {
569                                 item_data->chk_status = ad->misces_is_select_all;
570                                 elm_object_item_data_set(item_data->item, item_data);
571                                 storageUg_misces_handle_sel_list(ad, node->id, item_data->chk_status);
572                         }
573                 }
574         }
575
576         elm_genlist_realized_items_update(ad->gl_misces);
577
578         if (ad->misces_is_select_all) {
579                 char text[MAX_DISPLAY_NAME_LEN_ON_UI] = {0};
580
581                 snprintf(text, sizeof(text), _(STORAGEUG_STR_N_SELECTED), ad->misces_sz_all);
582                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", text);
583
584                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
585                 elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_FALSE);
586                 ad->misces_checked = ad->misces_sz_all;
587         } else {
588                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", "");
589                 elm_object_item_signal_emit(ad->misces_navi_it, "elm,state,subtitle,hide", "elm");
590
591                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
592                 elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_TRUE);
593                 ad->misces_checked = 0;
594         }
595 }
596
597 static inline Evas_Object *storageUg_misces_create_sel_all(Evas_Object *parent,
598                                                            SettingStorageUG *ad)
599 {
600         Evas_Object *btn, *icon;
601
602         btn = elm_button_add(parent);
603         elm_object_style_set(btn, "naviframe/title_icon");
604
605         icon = elm_icon_add(btn);
606         elm_image_file_set(icon, SETTING_ICON_PATH_CFG"select_all.png", NULL);
607
608         evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_BOTH, 1 , 1);
609         elm_image_resizable_set(icon, EINA_TRUE, EINA_TRUE);
610
611         elm_object_part_content_set(btn, "icon", icon);
612         evas_object_smart_callback_add(btn, "clicked", storageUg_misces_sel_all_clicked, ad);
613
614         evas_object_show(btn);
615
616         return btn;
617 }
618 static void
619 storageUg_misces_cancel_cb(void *data, Evas_Object *obj, void *event_info)
620 {
621         SETTING_TRACE_BEGIN;
622         setting_retm_if(data == NULL, "data is NULL");
623         SettingStorageUG *ad = data;
624         elm_naviframe_item_pop(ad->navi);
625         SETTING_TRACE_END;
626 }
627 static void
628 layout_select_all_down_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
629 {
630         Evas_Object *layout = obj;
631         SettingStorageUG *ad = data;
632         Evas_Object *check = elm_object_part_content_get(ad->select_all_layout, "elm.icon");
633         Eina_Bool state = elm_check_state_get(check);
634         elm_check_state_set(check, !state);
635         storageUg_misces_sel_all_clicked(ad, check, NULL);
636 }
637
638 static int storageUg_misces_create(void *data)
639 {
640         SettingStorageUG *ad = data;
641         Evas_Object *sel_all = NULL;
642
643         retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
644
645         /*first get misc file count*/
646         storageUg_meisces_get_list(ad);
647
648         if (ad->misces_sz_all > 0) {
649                 Evas_Object *box = elm_box_add(ad->navi);
650                 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
651                 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
652
653                 /*select all layout*/
654                 Evas_Object *layout = elm_layout_add(box);
655                 elm_layout_theme_set(layout, "genlist", "item", "select_all/default");
656                 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
657                 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
658                 evas_object_show(layout);
659                 ad->select_all_layout = layout;
660
661                 Evas_Object *check = elm_check_add(layout);
662                 evas_object_propagate_events_set(check, EINA_FALSE);
663                 elm_object_part_content_set(layout, "elm.icon", check);
664                 elm_object_part_text_set(layout, "elm.text.main", "Select All");
665                 evas_object_smart_callback_add(check, "changed", storageUg_misces_sel_all_clicked, ad);
666                 evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_DOWN, layout_select_all_down_cb, ad);
667                 evas_object_show(layout);
668                 elm_box_pack_end(box, layout);
669
670                 /*misc file list*/
671                 storageUg_misces_add_list(ad);
672                 elm_object_focus_set(ad->gl_misces, EINA_TRUE);
673                 evas_object_show(ad->gl_misces);
674                 elm_box_pack_end(box, ad->gl_misces);
675                 evas_object_show(box);
676
677                 ad->misces_navi_it = setting_push_layout_navi_bar(_(STR_DELETE_ITEMS),
678                                                                   STORAGEUG_STR_BACK, NULL, NULL,
679                                                                   (setting_call_back_func)storageUg_misces_back_cb, storageUg_misces_delete_cb,
680                                                                   NULL, ad, box, ad->navi, NULL);
681
682
683                 /* Title Cancel Button */
684                 ad->title_left_btn = elm_button_add(ad->navi);
685                 elm_object_style_set(ad->title_left_btn, "naviframe/title_cancel");
686                 evas_object_smart_callback_add(ad->title_left_btn, "clicked", storageUg_misces_cancel_cb, ad);
687
688                 /* Title Done Button */
689                 ad->title_right_btn = elm_button_add(ad->navi);
690                 elm_object_style_set(ad->title_right_btn, "naviframe/title_done");
691                 evas_object_smart_callback_add(ad->title_right_btn, "clicked", storageUg_misces_delete_cb, ad);
692         } else {
693                 ad->misces_navi_it = setting_push_layout_navi_bar(_(STR_DELETE_ITEMS),
694                                                                   STORAGEUG_STR_BACK, NULL, NULL,
695                                                                   (setting_call_back_func)storageUg_misces_back_cb, NULL,
696                                                                   NULL, ad, NULL, ad->navi, NULL);
697                 if (NULL == ad->misces_lo_noitem) {
698                         ad->misces_lo_noitem = storageUg_misces_no_item(ad->navi);
699
700                         Evas_Object *btn = elm_object_item_part_content_get(ad->misces_navi_it, "title_right_btn");
701                         elm_object_disabled_set(btn, EINA_TRUE);
702                         ad->gl_misces = NULL;
703
704                         if (ad->misces_lo_noitem) {
705                                 elm_object_item_part_content_set(ad->misces_navi_it, "elm.swallow.content", ad->misces_lo_noitem);
706                         }
707                 }
708         }
709
710         setting_view_storage_misc.is_create = 1;
711
712         return SETTING_RETURN_SUCCESS;
713 }
714
715 static int storageUg_misces_destroy(void *data)
716 {
717         SettingStorageUG *ad = data;
718
719         retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
720
721         if (ad->popup) {
722                 evas_object_del(ad->popup);
723                 ad->popup = NULL;
724         }
725
726         if (ad->del_worker) {
727                 storageUg_stop_async_worker(ad->del_worker);
728                 ad->del_worker = NULL;
729         }
730
731         if (ad->misces_list) {
732                 storageUg_misces_clear_list(ad->misces_list);
733                 ad->misces_list = NULL;
734         }
735
736         if (ad->misces_sel_list) {
737                 storageUg_misces_clear_sel_list(ad->misces_sel_list);
738                 ad->misces_sel_list = NULL;
739         }
740
741         ad->misces_navi_it = NULL;
742         ad->gl_misces = NULL;
743         ad->misces_lo_noitem = NULL;
744         ad->misces_checked = 0;
745
746         setting_view_storage_misc.is_create = 0;
747
748         return SETTING_RETURN_SUCCESS;
749 }
750
751 static int storageUg_misces_update(void *data)
752 {
753         SettingStorageUG *ad = data;
754
755         retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
756
757         storageUg_misces_add_list(ad);
758
759         return SETTING_RETURN_SUCCESS;
760 }
761
762 static int storageUg_misces_cleanup(void *data)
763 {
764         return storageUg_misces_destroy(data);
765 }
766
767
768 void storageUg_misc_init(SettingStorageUG *ad)
769 {
770         ret_if(NULL == ad);
771         ret_if(ad->misces_view);
772
773         setting_view_storage_misc.create = storageUg_misces_create;
774         setting_view_storage_misc.destroy = storageUg_misces_destroy;
775         setting_view_storage_misc.update = storageUg_misces_update;
776         setting_view_storage_misc.cleanup = storageUg_misces_cleanup;
777
778         ad->misces_view = &setting_view_storage_misc;
779 }
780