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