tizen 2.4 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 "setting-storage-utils.h"
20 #include "setting-storage-async-worker.h"
21 #include "setting-storage-miscellaneous.h"
22
23
24 #include <media_content.h>
25 #include <efl_extension.h>
26
27 #define STR_DELETE_ITEMS        "IDS_ST_HEADER_DELETE_ITEMS_ABB2"
28 typedef struct {
29         char *id;
30         char *path;
31         char *name;
32         Setting_GenGroupItem_Data *data;
33         SettingStorageUG *ad;
34 } Node_Info;
35
36
37 static void storageUg_misces_sel_all_clicked(void *data, Evas_Object *obj, void *event_info);
38 static inline void storageUg_misces_gl_append_select_all_item(SettingStorageUG *ad);
39 static inline void storageUg_misces_gl_remove_select_all_item(SettingStorageUG *ad);
40
41 static setting_view setting_view_storage_misc;
42
43
44
45 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
46 static Evas_Object* ctxpopup;
47
48 static void
49 ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
50 {
51         SETTING_TRACE_BEGIN;
52         evas_object_del(ctxpopup);
53         ctxpopup = NULL;
54 }
55
56 static void
57 move_more_ctxpopup(Evas_Object *ctxpopup)
58 {
59         SETTING_TRACE_BEGIN;
60         Evas_Object *win;
61         Evas_Coord w, h;
62         int pos = -1;
63
64         /* We convince the top widget is a window */
65         win = elm_object_top_widget_get(ctxpopup);
66         elm_win_screen_size_get(win, NULL, NULL, &w, &h);
67         pos = elm_win_rotation_get(win);
68
69         switch (pos) {
70                 case 0:
71                 case 180:
72                         evas_object_move(ctxpopup, (w / 2), h);
73                         break;
74                 case 90:
75                         evas_object_move(ctxpopup,  (h / 2), w);
76                         break;
77                 case 270:
78                         evas_object_move(ctxpopup, (h / 2), w);
79                         break;
80         }
81 }
82
83 static void
84 naviframe_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
85 {
86         SETTING_TRACE_BEGIN;
87         Evas_Object *ctxpopup = data;
88         move_more_ctxpopup(ctxpopup);
89 }
90
91 static void
92 more_ctxpopup_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
93 {
94         SETTING_TRACE_BEGIN;
95         Evas_Object *nf = data;
96         evas_object_event_callback_del_full(nf, EVAS_CALLBACK_RESIZE, naviframe_resize_cb, ctxpopup);
97 }
98
99 static void
100 win_rotation_changed_cb(void *data, Evas_Object *obj, void *event_info)
101 {
102         SETTING_TRACE_BEGIN;
103         Evas_Object *ctxpopup = data;
104         move_more_ctxpopup(ctxpopup);
105 }
106
107 //static inline void storageUg_misces_gl_remove_select_all_item(SettingStorageUG *ad);
108 static void _genlist_check_hide(SettingStorageUG *ad, bool hide)
109 {
110         SETTING_TRACE_BEGIN;
111         int count = 0;
112         Evas_Object *gl = ad->gl_misces;
113         Elm_Object_Item *it = elm_genlist_first_item_get(gl);
114         while (it)
115         {
116                 Setting_GenGroupItem_Data *sel = (Setting_GenGroupItem_Data *)elm_object_item_data_get(it);
117                 //sel->isItemHideFlag = 0;
118                 sel->isItemHideFlag = hide;
119
120                 // reset if check boxs get hidden
121                 if (hide == true) {
122                         sel->chk_status = 0; 
123                 }
124                 SETTING_TRACE(" item_update %d ", count++);
125                 elm_genlist_item_fields_update(it, "elm.swallow.end", ELM_GENLIST_ITEM_FIELD_CONTENT);
126                 it = elm_genlist_item_next_get(it);
127         }
128 }
129
130 /**
131  * [UI-CALLBACK] 'Delete' button handler on ctxpopup
132  */
133 static void
134 setting_storage_ctx_click_softkey_cb(void *data,
135                                                  Evas_Object *obj,
136                                                  void *event_info)
137 {
138         SETTING_TRACE_BEGIN;
139         /* error check */
140         retm_if(data == NULL, "Data parameter is NULL");
141
142         SettingStorageUG  *ad = (SettingStorageUG*) data;
143
144         //-------------------------------------------------------------------------------------------
145         // check genlist check box show/hide
146         //-------------------------------------------------------------------------------------------
147         ad->misces_ctx_popup_selected = true;
148
149 #if 0
150         int count = 0;
151         Eina_List *l = elm_genlist_realized_items_get(ad->gl_misces);
152         Elm_Object_Item *it;
153         EINA_LIST_FREE(l, it)
154         {
155                 Setting_GenGroupItem_Data *sel = (Setting_GenGroupItem_Data *)elm_object_item_data_get(it);
156
157                 sel->isItemHideFlag = 0;
158
159                 SETTING_TRACE(" item_update %d ", count++);
160                 elm_genlist_item_fields_update(it, "elm.swallow.end", ELM_GENLIST_ITEM_FIELD_CONTENT);
161
162         }
163 #else
164         storageUg_misces_gl_append_select_all_item(ad);
165         _genlist_check_hide(ad, false);
166 #endif
167
168         if (ctxpopup != NULL) {
169                 evas_object_del(ctxpopup);
170                 ctxpopup = NULL;
171         }
172 }
173
174
175
176 /* Icon + Text (More button style : Naviframe Toolbar) */
177 static void create_ctxpopup_more_button_cb(void *data, Evas_Object *obj, void *event_info)
178 {
179         SETTING_TRACE_BEGIN;
180         SettingStorageUG  *ad = (SettingStorageUG*) data;
181         Evas_Object *it_obj;
182         Evas_Object *nf = ad->navi;
183         Evas_Object *win;
184         Elm_Object_Item *it;
185
186         if (ctxpopup != NULL) {
187                 evas_object_del(ctxpopup);
188         }
189
190         ctxpopup = elm_ctxpopup_add(nf);
191         elm_ctxpopup_auto_hide_disabled_set(ctxpopup, EINA_TRUE);
192         elm_object_style_set(ctxpopup, "more/default");
193         eext_object_event_callback_add(ctxpopup, EEXT_CALLBACK_BACK, eext_ctxpopup_back_cb, NULL);
194         eext_object_event_callback_add(ctxpopup, EEXT_CALLBACK_MORE, eext_ctxpopup_back_cb, NULL);
195         evas_object_smart_callback_add(ctxpopup, "dismissed", ctxpopup_dismissed_cb, NULL);
196         evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL, more_ctxpopup_del_cb, nf);
197         evas_object_event_callback_add(nf, EVAS_CALLBACK_RESIZE, naviframe_resize_cb, ctxpopup);
198
199         /* We convince the top widget is a window */
200 //      win = elm_object_top_widget_get(nf);
201 //      evas_object_smart_callback_add(win, "rotation,changed", win_rotation_changed_cb, ctxpopup);
202
203         //---------------------------------------------------------------------------------------------
204         elm_ctxpopup_item_append(ctxpopup, _("IDS_ST_BODY_DELETE"), NULL, setting_storage_ctx_click_softkey_cb, ad);
205         //---------------------------------------------------------------------------------------------
206
207
208
209
210         elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UNKNOWN, ELM_CTXPOPUP_DIRECTION_UNKNOWN, ELM_CTXPOPUP_DIRECTION_UNKNOWN);
211         move_more_ctxpopup(ctxpopup);
212         evas_object_show(ctxpopup);
213 }
214 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
215
216
217 /**
218  * back button handler
219  *
220  * 1. "default" -> delete : back to default
221  */
222 static Eina_Bool storageUg_misces_back_cb(void *data, Elm_Object_Item *it)
223 {
224         SettingStorageUG *ad = data;
225
226         retv_if(data == NULL, EINA_TRUE);
227         retv_if(NULL != ad->del_worker, EINA_FALSE);
228
229         setting_view_change(ad->misces_view, ad->main_view, ad);
230
231         return EINA_TRUE;
232 }
233
234 static inline Evas_Object *_create_ly_misces_no_item(Evas_Object *parent)
235 {
236         Evas_Object *layout, *icon;
237
238         layout = elm_layout_add(parent);
239         elm_layout_theme_set(layout, "layout", "nocontents", "default");
240         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
241         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
242
243         icon = elm_image_add(layout);
244         elm_image_file_set(icon, SETTING_ICON_PATH_CFG "/00_nocontents_text.png", NULL);
245         elm_object_part_content_set(layout, "nocontents.image", icon);
246
247         elm_object_domain_translatable_part_text_set(layout, "elm.text", SETTING_PACKAGE,
248                                                      STORAGEUG_STR_NO_FILES);
249         elm_layout_signal_emit(layout, "text,disabled", "");
250
251         return layout;
252 }
253
254 static inline Evas_Object *_create_ly_app_default(Evas_Object *parent)
255 {
256         Evas_Object *layout;
257
258         layout = elm_layout_add(parent);
259         elm_layout_theme_set(layout, "layout", "application", "default");
260         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
261         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
262
263         return layout;
264 }
265
266 static inline void _update_navibar_buttons(SettingStorageUG *ad)
267 {
268         /*update delete item buttons*/
269         if (ad->misces_checked > 0) {
270                 if (ad->misces_navi_it && elm_object_item_part_content_get(ad->misces_navi_it, "title_left_btn") == NULL) {
271                         elm_object_item_part_content_set(ad->misces_navi_it, "title_left_btn", ad->title_left_btn);
272                 }
273                 if (ad->misces_navi_it && elm_object_item_part_content_get(ad->misces_navi_it, "title_right_btn") == NULL) {
274                         elm_object_item_part_content_set(ad->misces_navi_it, "title_right_btn", ad->title_right_btn);
275                 }
276         } else {
277                 if (ad->misces_navi_it && elm_object_item_part_content_get(ad->misces_navi_it, "title_left_btn") != NULL) {
278                         elm_object_item_part_content_unset(ad->misces_navi_it, "title_left_btn");
279                         evas_object_hide(ad->title_left_btn);
280                 }
281                 if (ad->misces_navi_it && elm_object_item_part_content_get(ad->misces_navi_it, "title_right_btn") != NULL) {
282                         elm_object_item_part_content_unset(ad->misces_navi_it, "title_right_btn");
283                         evas_object_hide(ad->title_right_btn);
284                 }
285         }
286 }
287
288 static bool storageUg_misces_media_item_cb(media_info_h media, void *data)
289 {
290         Node_Info *node;
291         char *media_id = NULL;
292         char *file_path = NULL;
293         char *display_name = NULL;
294         SettingStorageUG *ad = data;
295
296         retv_if(NULL == media, true);
297         retv_if(NULL == data, false);
298
299         media_info_get_file_path(media, &file_path);
300         if (!ecore_file_exists(file_path)) {
301                 FREE(file_path);
302                 return true;
303         }
304
305         media_info_get_media_id(media, &media_id);
306         media_info_get_display_name(media, &display_name);
307
308         node = calloc(1, sizeof(Node_Info));
309         if (node) {
310                 node->id = strdup(media_id);
311                 node->path = strdup(file_path);
312                 node->name = strdup(display_name);
313                 ad->misces_list = eina_list_append(ad->misces_list, node);
314         }
315         FREE(media_id);
316         FREE(file_path);
317         FREE(display_name);
318
319         return true;
320 }
321
322 static void storageUg_misces_clear_list(Eina_List *list)
323 {
324         Eina_List *l = NULL;
325         Node_Info *node = NULL;
326
327         EINA_LIST_FOREACH(list, l, node) {
328                 free(node->id);
329                 free(node->path);
330                 free(node->name);
331                 free(node);
332         }
333         eina_list_free(list);
334 }
335
336 static inline void storageUg_meisces_get_list(SettingStorageUG *ad)
337 {
338         int ret;
339         char *condition;
340         filter_h filter = NULL;
341
342         ret_if(NULL == ad);
343
344         if (ad->misces_list) {
345                 storageUg_misces_clear_list(ad->misces_list);
346                 ad->misces_list = NULL;
347         }
348
349         /*Set Filter*/
350         condition = "(MEDIA_TYPE=4) and MEDIA_PATH LIKE \'/opt/usr/media/%%\'";
351         /*
352            condition = "(MEDIA_TYPE=4) and (MEDIA_PATH LIKE \'/opt/usr/media/.tmp_download/%%\'"
353            "or MEDIA_PATH LIKE \'/opt/usr/media/.video-hub/%%\'"
354            "or MEDIA_PATH LIKE \'/opt/usr/media/Camera/%%\'"
355            "or MEDIA_PATH LIKE \'/opt/usr/media/Downloads/%%\'"
356            "or MEDIA_PATH LIKE \'/opt/usr/media/Images/%%\'"
357            "or MEDIA_PATH LIKE \'/opt/usr/media/Others/%%\'"
358            "or MEDIA_PATH LIKE \'/opt/usr/media/Sounds/%%\'"
359            "or MEDIA_PATH LIKE \'/opt/usr/media/Videos/%%\'"
360            "or MEDIA_PATH LIKE \'/opt/usr/media/lost+found/%%\')";
361            */
362
363         /*Set Filter*/
364         ret = media_filter_create(&filter);
365         if (ret != MEDIA_CONTENT_ERROR_NONE) {
366                 SETTING_TRACE_ERROR("media_filter_create() Fail(%d)", ret);
367                 return;
368         }
369         ret = media_filter_set_condition(filter, condition, MEDIA_CONTENT_COLLATE_DEFAULT);
370         if (ret != MEDIA_CONTENT_ERROR_NONE) {
371                 media_filter_destroy(filter);
372                 SETTING_TRACE_ERROR("media_filter_set_condition() Fail(%d)", ret);
373                 return;
374         }
375
376         ret = media_info_foreach_media_from_db(filter, storageUg_misces_media_item_cb, ad);
377         if (ret != MEDIA_CONTENT_ERROR_NONE) {
378                 media_filter_destroy(filter);
379                 SETTING_TRACE_ERROR("media_info_foreach_media_from_db() Fail(%d)", ret);
380                 return;
381         }
382
383         ret = media_filter_destroy(filter);
384         if (ret != MEDIA_CONTENT_ERROR_NONE) {
385                 SETTING_TRACE_ERROR("media_filter_destroy() Fail(%d)", ret);
386                 return;
387         }
388
389         ad->misces_sz_all = eina_list_count(ad->misces_list);
390 }
391
392 static void storageUg_misces_handle_selecting(SettingStorageUG *ad)
393 {
394         Evas_Object *toolbar;
395
396         ret_if(NULL == ad);
397
398         if (ad->misces_checked == ad->misces_sz_all)
399                 ad->misces_is_select_all = EINA_TRUE;
400         else
401                 ad->misces_is_select_all = EINA_FALSE;
402
403         /*  text set and timeout set */
404         if (0 < ad->misces_checked) {
405                 char text[MAX_DISPLAY_NAME_LEN_ON_UI] = {0};
406
407                 snprintf(text, sizeof(text), _(STORAGEUG_STR_N_SELECTED), ad->misces_checked);
408                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", text);
409
410                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
411                 elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_FALSE);
412         } else {
413                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", "");
414                 elm_object_item_signal_emit(ad->misces_navi_it, "elm,state,subtitle,hide", "elm");
415
416                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
417                 elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_TRUE);
418         }
419 }
420
421 static int storageUg_compare_str(const void *data1, const void *data2)
422 {
423         return safeStrCmp(data1, data2);
424 }
425
426 static void storageUg_misces_handle_sel_list(SettingStorageUG *ad, char *id,
427                                              int checked)
428 {
429         SETTING_TRACE_BEGIN;
430
431         if (checked) {
432                 SETTING_TRACE("----- checked : %d ", ad->misces_checked);
433                 ad->misces_checked++;
434                 ad->misces_sel_list = eina_list_append(ad->misces_sel_list, strdup(id));
435         } else {
436                 SETTING_TRACE("----- un-checked : %d", ad->misces_checked);
437                 Eina_List *found;
438
439                 ad->misces_checked--;
440                 found = eina_list_search_unsorted_list(ad->misces_sel_list, storageUg_compare_str,
441                                                        id);
442                 free(eina_list_data_get(found));
443                 ad->misces_sel_list = eina_list_remove_list(ad->misces_sel_list, found);
444         }
445
446         /*update delete item buttons*/
447         _update_navibar_buttons(ad);
448 }
449
450 static void storageUg_misces_genlist_sel(void *data, Evas_Object *obj,
451                                          void *event_info)
452 {
453         SETTING_TRACE_BEGIN;
454         Node_Info *node;
455         SettingStorageUG *ad = data;
456         Elm_Object_Item *item = event_info;
457         Setting_GenGroupItem_Data *d_item = NULL;
458
459         ret_if(data == NULL);
460
461         elm_genlist_item_selected_set(item, 0);
462         d_item = elm_object_item_data_get(item);
463         if (d_item) {
464                 node = d_item->userdata;
465
466                 setting_update_gl_item_chk_status(d_item, !(d_item->chk_status));
467
468                 storageUg_misces_handle_sel_list(ad, node->id, d_item->chk_status);
469                 storageUg_misces_handle_selecting(ad);
470         }
471
472 #if 0
473         if (NULL == ad->misces_lo_noitem) {
474                 ad->misces_lo_noitem = _create_ly_misces_no_item(ad->navi);
475
476                 Evas_Object *btn = elm_object_item_part_content_get(ad->misces_navi_it, "title_right_btn");
477                 elm_object_disabled_set(btn, EINA_TRUE);
478                 ad->gl_misces = NULL;
479
480                 if (ad->misces_lo_noitem) {
481                         elm_object_item_part_content_set(ad->misces_navi_it, "elm.swallow.content", ad->misces_lo_noitem);
482                 }
483         }
484 #endif
485
486
487 }
488
489 static void storageUg_misces_genlist_chk_cb(void *data, Evas_Object *obj,
490                                             void *event_info)
491 {
492         SETTING_TRACE_BEGIN;
493
494         Node_Info *node;
495         SettingStorageUG *ad;
496         Setting_GenGroupItem_Data *d_item = data;
497
498         ret_if(data == NULL);
499
500         node = d_item->userdata;
501         if (node)
502         {
503                 ad = node->ad;
504                 d_item->chk_status = elm_check_state_get(obj);
505
506                 storageUg_misces_handle_sel_list(ad, node->id, d_item->chk_status);
507                 storageUg_misces_handle_selecting(ad);
508         } else {
509                 SETTING_TRACE_ERROR(">>>>>>>>> node is NULL");
510         }
511 }
512
513
514
515 static inline void storageUg_misces_clear_sel_list(Eina_List *list)
516 {
517         Eina_List *l = NULL;
518         char *node = NULL;
519
520         EINA_LIST_FOREACH(list, l, node)
521         free(node);
522         eina_list_free(list);
523 }
524
525
526
527 /**
528  * "Select All" - check button handler
529  */
530 static inline void setting_storage_select_all_chk_btn_cb(void *data, Evas_Object *obj, void *event_info)
531 {
532         SETTING_TRACE_BEGIN;
533         /* error check */
534         retm_if(data == NULL, "Data parameter is NULL");
535         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
536         SettingStorageUG *ad = (SettingStorageUG *)list_item->userdata;
537
538         list_item->chk_status = elm_check_state_get(obj);       /*  for genlist update status */
539         ad->misces_is_select_all = elm_check_state_get(obj);
540
541         SETTING_TRACE_ERROR("1");
542
543
544
545         Eina_List *l = NULL;
546         Evas_Object *toolbar;
547         Node_Info *node = NULL;
548         Setting_GenGroupItem_Data *item_data = NULL;
549
550
551         SETTING_TRACE_ERROR("2 : ad->misces_is_select_all--->%d", ad->misces_is_select_all);
552         SETTING_TRACE_ERROR("ad->misces_list--->%x", ad->misces_list);
553         EINA_LIST_FOREACH(ad->misces_list, l, node) {
554                 if (node && node->data) {
555                         item_data = node->data;
556                         SETTING_TRACE_ERROR("2.1");
557                         if (item_data) {
558                                 item_data->chk_status = ad->misces_is_select_all;
559                                 SETTING_TRACE_ERROR("2.2");
560                                 elm_object_item_data_set(item_data->item, item_data);
561                                 SETTING_TRACE_ERROR("2.3");
562                                 storageUg_misces_handle_sel_list(ad, node->id, item_data->chk_status);
563                                 SETTING_TRACE_ERROR("2.4");
564                         }
565                 }
566         }
567
568         SETTING_TRACE_ERROR("3");
569         elm_genlist_realized_items_update(ad->gl_misces);
570
571         SETTING_TRACE_ERROR("4");
572         bool select_all_state = ad->misces_is_select_all;
573         if (select_all_state) {
574                 char text[MAX_DISPLAY_NAME_LEN_ON_UI] = {0};
575
576                 snprintf(text, sizeof(text), _(STORAGEUG_STR_N_SELECTED), ad->misces_sz_all);
577                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", text);
578
579                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
580                 elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_FALSE);
581                 ad->misces_checked = ad->misces_sz_all;
582         } else {
583                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", "");
584                 elm_object_item_signal_emit(ad->misces_navi_it, "elm,state,subtitle,hide", "elm");
585
586                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
587                 elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_TRUE);
588                 ad->misces_checked = 0;
589                 SETTING_TRACE_ERROR("********** SET TO ZERO ad->misces_checked = 0");
590         }
591         SETTING_TRACE_ERROR("5");
592 }
593
594 /**
595  * Delete 'Select All' item in genlist
596  */
597 static inline void storageUg_misces_gl_remove_select_all_item(SettingStorageUG *ad)
598 {
599         SETTING_TRACE_BEGIN;
600         Evas_Object *gl = ad->gl_misces;
601
602         Elm_Object_Item *it = elm_genlist_first_item_get(gl);
603         if (it) {
604                 elm_object_item_del     (it);
605         }
606 }
607
608
609
610 /**
611  * "Select All" check button
612  */
613 static inline void storageUg_misces_gl_append_select_all_item(SettingStorageUG *ad)
614 {
615         SETTING_TRACE_BEGIN;
616         int checked = 0;
617         Setting_GenGroupItem_Data *item_data = NULL;
618         //ad->gl_misces
619
620         evas_object_data_set(ad->gl_misces, "InsertType", "Prepend");
621
622         item_data = setting_create_Gendial_field_def(ad->gl_misces,
623                                                              &(itc_1text_1icon), storageUg_misces_sel_all_clicked, ad,
624                                                                  SWALLOW_Type_1ICON_1RADIO, NULL, NULL, checked, _("IDS_ST_BODY_SELECT_ALL"), NULL,
625                                                              setting_storage_select_all_chk_btn_cb);
626
627         if (item_data) {
628                 item_data->userdata = ad;
629                 item_data->isItemHideFlag = TRUE;
630         } else {
631                 SETTING_TRACE_ERROR("item_data is NULL");
632         }
633
634         evas_object_data_set(ad->gl_misces, "InsertType", "");
635 }
636
637
638
639 static inline void storageUg_misces_gl_append_items(SettingStorageUG *ad)
640 {
641         SETTING_TRACE_BEGIN;
642         int checked;
643         Node_Info *node;
644         Eina_List *found, *cur, *tmp_sel_list;
645         Setting_GenGroupItem_Data *item_data = NULL;
646
647         tmp_sel_list = ad->misces_sel_list;
648         ad->misces_sel_list = NULL;
649
650         EINA_LIST_FOREACH(ad->misces_list, cur, node) {
651                 if (NULL == node)
652                         continue;
653
654                 found = eina_list_search_unsorted_list(tmp_sel_list, storageUg_compare_str,
655                                                        node->id);
656                 if (found) {
657                         checked = 1;
658                         storageUg_misces_handle_sel_list(ad, node->id, 1);
659                 } else {
660                         checked = 0;
661                 }
662
663                 item_data = setting_create_Gendial_field_def(ad->gl_misces,
664                                                              &(itc_1text_1icon), storageUg_misces_genlist_sel, ad,
665                                                                  SWALLOW_Type_1CHECK_RIGHT_INVISIBLE, NULL, NULL, checked, node->name, node->path,
666                                                              storageUg_misces_genlist_chk_cb);
667
668                 if (item_data) {
669                         item_data->userdata = node;
670                         node->data = item_data;
671                         node->ad = ad;
672                         item_data->isItemHideFlag = TRUE;
673                 } else {
674                         SETTING_TRACE_ERROR("item_data is NULL");
675                 }
676         }
677         storageUg_misces_handle_selecting(ad);
678         storageUg_misces_clear_sel_list(tmp_sel_list);
679 }
680
681 static inline Evas_Object *storageUg_misces_genlist(Evas_Object *parent)
682 {
683         Evas_Object *genlist;
684
685         genlist = elm_genlist_add(parent);
686         if (NULL == genlist) {
687                 SETTING_TRACE_ERROR("elm_genlist_add() Fail");
688                 return NULL;
689         }
690         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
691         elm_genlist_homogeneous_set(genlist, EINA_TRUE);
692         elm_genlist_block_count_set(genlist, 2);
693         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
694         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
695         evas_object_show(genlist);
696
697         return genlist;
698 }
699
700 static void storageUg_misces_delete_list(SettingStorageUG *ad)
701 {
702         SETTING_TRACE("Entering storageUg_misces_delete_list");
703
704         ret_if(NULL == ad);
705
706         ad->misces_checked = 0;
707         Setting_GenGroupItem_Data *item_data = NULL;
708
709         /* Elm_Object_Item *it = elm_genlist_first_item_get(ad->gl_misces); */
710         Elm_Object_Item *it = elm_genlist_nth_item_get(ad->gl_misces, 1); /* second */
711
712         while (it) {
713                 item_data = elm_object_item_data_get(it);
714                 it = elm_genlist_item_next_get(it);
715                 if (item_data != NULL) {
716                         SETTING_TRACE("chk_status: %d", item_data->chk_status);
717                         if (item_data->chk_status) {
718                                 elm_object_item_del(item_data->item);
719                                 Node_Info *node = item_data->userdata;
720                                 if (node)
721                                 {
722                                         ad->misces_list = eina_list_remove(ad->misces_list, node);
723                                         FREE(node->id);
724                                         FREE(node->path);
725                                         FREE(node->name);
726                                         FREE(node);
727                                 }
728                         }
729                 }
730         }
731
732         ad->misces_sz_all = eina_list_count(ad->misces_list);
733
734         SETTING_TRACE("ad->misces_sz_all - %d", ad->misces_sz_all);
735         if (0 == ad->misces_sz_all) {
736
737                 if (elm_object_item_part_content_get(ad->misces_navi_it, "title_right_btn")) {
738                         Evas_Object *btn_done = elm_object_item_part_content_unset(ad->misces_navi_it, "title_right_btn");
739                         evas_object_hide(btn_done);
740                 }
741
742                 if (elm_object_item_part_content_get(ad->misces_navi_it, "title_left_btn")) {
743                         Evas_Object *btn_cancel = elm_object_item_part_content_unset(ad->misces_navi_it, "title_left_btn");
744                         evas_object_hide(btn_cancel);
745                 }
746                 if (NULL == ad->misces_lo_noitem) {
747                         ad->misces_lo_noitem = _create_ly_misces_no_item(ad->navi);
748                 }
749
750                 ad->gl_misces = NULL;
751
752                 if (ad->misces_lo_noitem) {
753                         elm_object_item_part_content_set(ad->misces_navi_it, "elm.swallow.content", ad->misces_lo_noitem);
754                 }
755         }
756 }
757
758 /**
759  *
760  * int misces_sz_all
761  */
762 static void storageUg_misces_add_list(SettingStorageUG *ad)
763 {
764         Evas_Object *toolbar, *btn;
765         Evas_Object *lo_new = NULL;
766
767         SETTING_TRACE("Entering storageUg_misces_add_list");
768
769         ret_if(NULL == ad);
770
771         ad->misces_checked = 0;
772         ad->misces_is_select_all = EINA_FALSE;
773
774         if (0 == ad->misces_sz_all) {
775                 if (NULL == ad->misces_lo_noitem) {
776                         lo_new = ad->misces_lo_noitem = _create_ly_misces_no_item(ad->navi);
777
778                         btn = elm_object_item_part_content_get(ad->misces_navi_it, "title_right_btn");
779                         if (NULL != btn)
780                                 elm_object_disabled_set(btn, EINA_TRUE);
781                         ad->gl_misces = NULL;
782                 }
783         } else {
784                 if (ad->gl_misces)
785                         elm_genlist_clear(ad->gl_misces);
786                 else
787                         lo_new = ad->gl_misces = storageUg_misces_genlist(ad->navi);
788
789                 storageUg_misces_gl_append_items(ad);
790
791                 ad->misces_lo_noitem = NULL;
792         }
793
794         if (lo_new) {
795                 elm_object_item_part_content_set(ad->misces_navi_it, "elm.swallow.content", lo_new);
796         }
797
798         /* disable toolbar object */
799         if (0 == ad->misces_checked) {
800                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
801                 if (NULL != toolbar)
802                         elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_TRUE);
803         }
804 }
805
806 void storageUg_misces_delete_files_cb(int fn_result, SettingStorageUG *ad)
807 {
808         ret_if(NULL == ad);
809
810         ad->del_worker = NULL;
811
812         /* update genlist */
813         SETTING_TRACE("After deleting, updating the file list");
814
815         storageUg_misces_delete_list(ad);
816
817         if (SETTING_RETURN_SUCCESS != fn_result) {
818                 SETTING_TRACE_ERROR("storageUg_misces_delete_files() Fail(%d)", fn_result);
819                 storageUg_fail_popup(ad);
820                 return;
821         }
822
823         if (ad->popup) {
824                 evas_object_del(ad->popup);
825                 ad->popup = NULL;
826         }
827
828         if (ad->misces_navi_it) {
829                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", "");
830                 elm_object_item_signal_emit(ad->misces_navi_it, "elm,state,subtitle,hide", "elm");
831         }
832 }
833
834
835 /**
836  * [controller] delete actual files with ad->misces_list
837  * 
838  */
839 static int storageUg_misces_delete_files(SettingStorageUG *ad)
840 {
841         Eina_List *l = NULL;
842         Node_Info *node = NULL;
843         Setting_GenGroupItem_Data *item_data = NULL;
844
845         retv_if(NULL == ad, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
846
847         EINA_LIST_FOREACH(ad->misces_list, l, node) {
848                 if (node) {
849                         item_data = node->data;
850
851                         if (!item_data->chk_status)
852                                 continue;
853
854                         if (EINA_TRUE == ecore_file_remove(node->path)) {
855                                 media_content_scan_file(node->path);
856                         } else {
857                                 SETTING_TRACE_ERROR("failed to ecore_file_remove");
858                                 return SETTING_RETURN_FAIL;
859                         }
860                 }
861                 storageUG_STOP_POINT;
862         }
863
864         return SETTING_RETURN_SUCCESS;
865 }
866
867
868 /**
869  * [UI] Done button -> create popup -> button handler
870  */
871 static void storageUg_misces_delete_resp(void *data, Evas_Object *obj,
872                                          void *event_info)
873 {
874         int response_type;
875         SettingStorageUG *ad = data;
876
877         ret_if(NULL == data);
878         ret_if(NULL == obj);
879
880         response_type = btn_type(obj);
881
882         if (ad->popup) {
883                 evas_object_del(ad->popup);
884                 ad->popup = NULL;
885         }
886
887         if (POPUP_RESPONSE_OK != response_type) {
888                 SETTING_TRACE("CANCEL");
889                 return;
890         }
891
892         SETTING_TRACE(">>>>> checked : %d before deletion ", ad->misces_checked);
893
894         if (ad->misces_checked) {
895                 ad->popup = setting_create_popup_with_progressbar(ad, ad->win, PROGRESSBAR_STYLE,
896                                                                   NULL, NULL, storageUg_popup_del, 0, TRUE, TRUE, 0);
897
898                 if (ad->del_worker)
899                         storageUg_stop_async_worker(ad->del_worker);
900                 ad->del_worker = storageUg_start_async_worker(storageUg_misces_delete_files,
901                                                               storageUg_misces_delete_files_cb, ad);
902         } else {
903                 ad->popup = setting_create_popup(ad, ad->win, NULL,
904                                                                                  STORAGEUG_STR_NO_SELECTED, storageUg_popup_del,
905                                                                                  SETTING_STORAGE_POPUP_TIMER, FALSE, FALSE, 0);
906         }
907 }
908
909
910 /**
911  * Done button handler for 'delete'
912  */
913 static void storageUg_misces_delete_cb(void *data, Evas_Object *obj, void *event_info)
914 {
915         SettingStorageUG *ad = (SettingStorageUG *) data;
916
917         ret_if(NULL == data);
918
919         ad->popup = setting_create_popup(ad, ad->win, NULL,
920                                                                          STORAGEUG_STR_DELETE_Q, storageUg_misces_delete_resp,
921                                                                          0, FALSE, FALSE,
922                                                                          2, STORAGEUG_STR_DELETE, STORAGEUG_STR_CANCEL);
923 }
924
925
926 /**
927  * Genlist Touch handler
928  * @todo setting_storage_select_all_chk_btn_cb is similar to this function
929  */
930 static void storageUg_misces_sel_all_clicked(void *data, Evas_Object *obj, void *event_info)
931 {
932         SETTING_TRACE_BEGIN;
933         Eina_List *l = NULL;
934         Evas_Object *toolbar;
935         Node_Info *node = NULL;
936         SettingStorageUG *ad = data;
937         //Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
938
939         Setting_GenGroupItem_Data *item_data = NULL;
940
941         SETTING_TRACE_ERROR("1");
942
943         ret_if(data == NULL);
944
945         ad->misces_is_select_all = elm_check_state_get(obj);
946
947         SETTING_TRACE_ERROR("2 : ad->misces_is_select_all--->%d", ad->misces_is_select_all);
948         SETTING_TRACE_ERROR("ad->misces_list--->%x", ad->misces_list);
949         EINA_LIST_FOREACH(ad->misces_list, l, node) {
950                 if (node && node->data) {
951                         item_data = node->data;
952                         SETTING_TRACE_ERROR("2.1");
953                         if (item_data) {
954                                 item_data->chk_status = (ad->misces_is_select_all == 1) ? 0 : 1;
955                                 SETTING_TRACE_ERROR("2.2");
956                                 elm_object_item_data_set(item_data->item, item_data);
957                                 SETTING_TRACE_ERROR("2.3");
958                                 storageUg_misces_handle_sel_list(ad, node->id, item_data->chk_status);
959                                 SETTING_TRACE_ERROR("2.4");
960                         }
961                 }
962         }
963
964         SETTING_TRACE_ERROR("3");
965         elm_genlist_realized_items_update(ad->gl_misces);
966
967         SETTING_TRACE_ERROR("4");
968         bool select_all_state = (ad->misces_is_select_all == 1) ? 0 : 1;
969
970         if (select_all_state) {
971                 char text[MAX_DISPLAY_NAME_LEN_ON_UI] = {0};
972
973                 snprintf(text, sizeof(text), _(STORAGEUG_STR_N_SELECTED), ad->misces_sz_all);
974                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", text);
975
976                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
977                 elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_FALSE);
978                 ad->misces_checked = ad->misces_sz_all;
979         } else {
980                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", "");
981                 elm_object_item_signal_emit(ad->misces_navi_it, "elm,state,subtitle,hide", "elm");
982
983                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
984                 elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_TRUE);
985                 ad->misces_checked = 0;
986                 SETTING_TRACE_ERROR("********** SET TO ZERO ad->misces_checked = 0");
987         }
988         SETTING_TRACE_ERROR("5");
989 }
990
991 /**
992  * Naviframe 'cancel' button handler
993  */
994 static void
995 storageUg_misces_cancel_cb(void *data, Evas_Object *obj, void *event_info)
996 {
997         SETTING_TRACE_BEGIN;
998         setting_retm_if(data == NULL, "data is NULL");
999         SettingStorageUG *ad = data;
1000
1001         //ad->misces_ctx_popup_selected = true;
1002         if (ad->misces_ctx_popup_selected) {
1003
1004                 SETTING_TRACE_ERROR("ad->misces_ctx_popup_selected == true");
1005
1006                 // change UI style
1007                 ad->misces_ctx_popup_selected = false;
1008
1009                 // 1. remove 1st item of genlist
1010                 storageUg_misces_gl_remove_select_all_item(ad);
1011                 // 2. remove all 'toggle' from all list
1012                 _genlist_check_hide(ad, true);
1013
1014                 // remove sub text of naviframe title
1015                 elm_object_item_part_text_set(ad->misces_navi_it, "subtitle", "");
1016                 elm_object_item_signal_emit(ad->misces_navi_it, "elm,state,subtitle,hide", "elm");
1017
1018                 Evas_Object *toolbar = NULL;
1019                 toolbar = elm_object_item_part_content_get(ad->misces_navi_it, "toolbar");
1020                 elm_object_item_disabled_set(elm_toolbar_last_item_get(toolbar), EINA_TRUE);
1021                 ad->misces_checked = 0;
1022
1023                 #if 0
1024                 // delete all items
1025                 if (ad->misces_list) {
1026                         storageUg_misces_clear_list(ad->misces_list);
1027                         ad->misces_list = NULL;
1028                 }
1029                 #endif
1030
1031                 // change button style
1032                 _update_navibar_buttons(ad);
1033
1034                 SETTING_TRACE_ERROR("********** SET TO ZERO ad->misces_checked = 0");
1035
1036         } else {
1037                 SETTING_TRACE_ERROR("ad->misces_ctx_popup_selected == false, go naviframe_back");
1038                 elm_naviframe_item_pop(ad->navi);
1039         }
1040
1041         SETTING_TRACE_END;
1042 }
1043
1044 static void
1045 setting_storage_click_softkey_delete_cb(void *data, Evas_Object *obj, void *event_info)
1046 {
1047         SETTING_TRACE_BEGIN;
1048         /* error check */
1049         retm_if(data == NULL, "Data parameter is NULL");
1050
1051         SettingStorageUG *ad = (SettingStorageUG *) data;
1052
1053         return;
1054 }
1055
1056 //--------------------------------------------------
1057 //      name: "storageview_layout";
1058 //--------------------------------------------------
1059 static int storageUg_misces_create(void *data)
1060 {
1061         SettingStorageUG *ad = data;
1062         Evas_Object *sel_all = NULL;
1063
1064         retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1065
1066         /*first get misc file count*/
1067         storageUg_meisces_get_list(ad);
1068
1069         if (ad->misces_sz_all > 0) {
1070
1071                 /*misc file list*/
1072                 storageUg_misces_add_list(ad);
1073                 // focus a list
1074                 elm_object_focus_set(ad->gl_misces, EINA_TRUE);
1075
1076                 // IDS_ST_BODY_MISCELLANEOUS_FILES
1077                 // STR_DELETE_ITEMS
1078                 ad->misces_navi_it = setting_push_layout_navi_bar(_(IDS_ST_BODY_MISCELLANEOUS_FILES),
1079                                                                                                                         NULL, NULL, NULL,
1080                                                                                                                         (setting_call_back_func)storageUg_misces_back_cb,
1081                                                                                                                         NULL,
1082                                                                                                                         NULL,
1083                                                                                                                         ad, NULL, ad->navi, NULL);
1084
1085                 elm_object_item_part_content_set(ad->misces_navi_it, "elm.swallow.content", ad->gl_misces);
1086
1087                 /* Title Cancel Button */
1088                 ad->title_left_btn = elm_button_add(ad->navi);
1089                 elm_object_style_set(ad->title_left_btn, "naviframe/title_cancel");
1090                 evas_object_smart_callback_add(ad->title_left_btn, "clicked", storageUg_misces_cancel_cb, ad);
1091
1092                 /* Title Done Button */
1093                 ad->title_right_btn = elm_button_add(ad->navi);
1094                 elm_object_style_set(ad->title_right_btn, "naviframe/title_done");
1095                 evas_object_smart_callback_add(ad->title_right_btn, "clicked", storageUg_misces_delete_cb, ad);
1096         } else {
1097
1098                 ad->misces_navi_it = setting_push_layout_navi_bar(_(IDS_ST_BODY_MISCELLANEOUS_FILES),
1099                                                                                                                         NULL,
1100                                                                                                                         NULL,
1101                                                                                                                         NULL,
1102                                                                                                                         (setting_call_back_func)storageUg_misces_back_cb,
1103                                                                                                                         NULL,
1104                                                                                                                         NULL,
1105                                                                                                                         ad, NULL, ad->navi, NULL);
1106
1107                 if (NULL == ad->misces_lo_noitem) {
1108                         ad->misces_lo_noitem = _create_ly_misces_no_item(ad->navi);
1109
1110                         Evas_Object *btn = elm_object_item_part_content_get(ad->misces_navi_it, "title_right_btn");
1111                         elm_object_disabled_set(btn, EINA_TRUE);
1112                         ad->gl_misces = NULL;
1113
1114                         if (ad->misces_lo_noitem) {
1115                                 elm_object_item_part_content_set(ad->misces_navi_it, "elm.swallow.content", ad->misces_lo_noitem);
1116                         }
1117                 }
1118         }
1119         elm_naviframe_item_pop_cb_set(ad->misces_navi_it, storageUg_misces_back_cb, ad);
1120
1121         // Add ctx popup handler
1122         Evas_Object* btn = elm_button_add(ad->navi);
1123         elm_object_style_set(btn, "naviframe/more/default");
1124         evas_object_smart_callback_add(btn, "clicked", create_ctxpopup_more_button_cb, ad);
1125         elm_object_item_part_content_set(ad->misces_navi_it, "toolbar_more_btn", btn);
1126
1127         setting_view_storage_misc.is_create = 1;
1128
1129         return SETTING_RETURN_SUCCESS;
1130 }
1131
1132 static int storageUg_misces_destroy(void *data)
1133 {
1134         SettingStorageUG *ad = data;
1135
1136         retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1137
1138         if (ad->popup) {
1139                 evas_object_del(ad->popup);
1140                 ad->popup = NULL;
1141         }
1142
1143         if (ad->del_worker) {
1144                 storageUg_stop_async_worker(ad->del_worker);
1145                 ad->del_worker = NULL;
1146         }
1147
1148         if (ad->misces_list) {
1149                 storageUg_misces_clear_list(ad->misces_list);
1150                 ad->misces_list = NULL;
1151         }
1152
1153         if (ad->misces_sel_list) {
1154                 storageUg_misces_clear_sel_list(ad->misces_sel_list);
1155                 ad->misces_sel_list = NULL;
1156         }
1157
1158         ad->misces_navi_it = NULL;
1159         ad->gl_misces = NULL;
1160         ad->misces_lo_noitem = NULL;
1161         ad->misces_checked = 0;
1162
1163         setting_view_storage_misc.is_create = 0;
1164         elm_naviframe_item_pop(ad->navi);
1165
1166         return SETTING_RETURN_SUCCESS;
1167 }
1168
1169 static int storageUg_misces_update(void *data)
1170 {
1171         SettingStorageUG *ad = data;
1172
1173         retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1174
1175         storageUg_misces_add_list(ad);
1176         return SETTING_RETURN_SUCCESS;
1177 }
1178
1179 static int storageUg_misces_cleanup(void *data)
1180 {
1181         return storageUg_misces_destroy(data);
1182 }
1183
1184
1185 void storageUg_misc_init(SettingStorageUG *ad)
1186 {
1187         ret_if(NULL == ad);
1188         ret_if(ad->misces_view);
1189
1190         setting_view_storage_misc.create = storageUg_misces_create;
1191         setting_view_storage_misc.destroy = storageUg_misces_destroy;
1192         setting_view_storage_misc.update = storageUg_misces_update;
1193         setting_view_storage_misc.cleanup = storageUg_misces_cleanup;
1194
1195         ad->misces_view = &setting_view_storage_misc;
1196 }
1197