3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Flora License, Version 1.1 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://floralicense.org/license/
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 #include <setting-storage-miscellaneous-files.h>
19 static int setting_storage_miscellaneous_files_create(void *cb);
20 static int setting_storage_miscellaneous_files_destroy(void *cb);
21 static int setting_storage_miscellaneous_files_update(void *cb);
22 static int setting_storage_miscellaneous_files_cleanup(void *cb);
24 setting_view setting_view_storage_miscellaneous_files = {
25 .create = setting_storage_miscellaneous_files_create,
26 .destroy = setting_storage_miscellaneous_files_destroy,
27 .update = setting_storage_miscellaneous_files_update,
28 .cleanup = setting_storage_miscellaneous_files_cleanup,
31 static bool __setting_storage_miscellaneous_files_other_item_cb(media_info_h media, void *data)
33 //SETTING_TRACE_BEGIN;
34 setting_retvm_if(media == NULL, true, "media is NULL");
35 setting_retvm_if(data == NULL, true, "Data parameter is NULL");
36 SettingStorageUG *ad = (SettingStorageUG *)data;
38 char *file_path = NULL;
39 media_info_get_file_path(media, &file_path);
40 SETTING_TRACE("file_path : [%s]", file_path);
42 if (!ecore_file_exists(file_path)) {
47 if (!safeStrNCmp(file_path, PATH1, sizeof(PATH1)) ||
48 !safeStrNCmp(file_path, PATH2, sizeof(PATH2)) ||
49 !safeStrNCmp(file_path, PATH3, sizeof(PATH3)) ||
50 !safeStrNCmp(file_path, PATH4, sizeof(PATH4)) ||
51 !safeStrNCmp(file_path, PATH5, sizeof(PATH5)) ||
52 !safeStrNCmp(file_path, PATH6, sizeof(PATH6)) ||
53 !safeStrNCmp(file_path, PATH7, sizeof(PATH7)) ||
54 !safeStrNCmp(file_path, PATH8, sizeof(PATH8)) ||
55 !safeStrNCmp(file_path, PATH9, sizeof(PATH9)))
61 char *display_name = NULL;
62 media_info_get_display_name(media, &display_name);
64 Node_Info *pNode = (Node_Info *)calloc(1, sizeof(Node_Info));
65 pNode->path = (char *)g_strdup(file_path);
66 pNode->name = (char *)g_strdup(display_name);
67 ad->files_list = eina_list_append(ad->files_list, pNode);
74 static void __setting_storage_miscellaneous_files_list_get(void *data)
77 setting_retm_if(data == NULL, "Data parameter is NULL");
78 SettingStorageUG *ad = (SettingStorageUG *)data;
80 int ret = MEDIA_CONTENT_ERROR_NONE;
81 filter_h filter = NULL;
84 char *condition = "(MEDIA_TYPE=4) and MEDIA_PATH LIKE \'/opt/usr/media/%%\'";
86 ret = media_filter_create(&filter);
87 if(ret != MEDIA_CONTENT_ERROR_NONE) {
88 SETTING_TRACE_ERROR("Fail to create filter");
92 ret = media_filter_set_condition(filter, condition, MEDIA_CONTENT_COLLATE_DEFAULT);
93 if(ret != MEDIA_CONTENT_ERROR_NONE) {
94 media_filter_destroy(filter);
95 SETTING_TRACE_ERROR("Fail to set condition");
99 ret = media_info_foreach_media_from_db(filter, __setting_storage_miscellaneous_files_other_item_cb, ad);
100 if(ret != MEDIA_CONTENT_ERROR_NONE) {
101 media_filter_destroy(filter);
102 SETTING_TRACE_ERROR("Fail to get media");
106 ret = media_filter_destroy(filter);
107 if (ret != MEDIA_CONTENT_ERROR_NONE) {
108 SETTING_TRACE_ERROR("destroy filter failed");
113 static bool __setting_done_list_is_some_item_selected(Setting_Done_List_Data *list_data)
116 bool isFound = FALSE; /* wether can found some item checked */
120 Node_Info *node = NULL;
121 Setting_GenGroupItem_Data *item_data = NULL;
122 EINA_LIST_FOREACH(list_data->list, l, node)
125 item_data = (Setting_GenGroupItem_Data *)node->data;
127 if (item_data->chk_status) {
136 static void __setting_select_all_done(void *data)
139 retm_if(data == NULL, "data == NULL");
140 Setting_Done_List_Data *list_data = (Setting_Done_List_Data *)data;
144 setting_create_sel_info_popup(list_data->ly_parent,
145 &(list_data->selInfoPop_layout),
146 &(list_data->selInfoPop));
148 if (list_data->select_all_checked) {
149 /* set all other checks state to be 1 */
150 SETTING_TRACE_DEBUG("Select All checked");
152 Node_Info *node = NULL;
153 Setting_GenGroupItem_Data *item_data = NULL;
154 EINA_LIST_FOREACH(list_data->list, l, node)
157 item_data = (Setting_GenGroupItem_Data *)node->data;
158 item_data->chk_status = 1;
159 elm_object_item_data_set(item_data->item, item_data);
160 elm_genlist_item_update(item_data->item);
163 sel_num = list_data->cur_item_num;
165 SETTING_TRACE_DEBUG("Select All unchecked");
166 /* set all other checks state to be 0 */
168 Node_Info *node = NULL;
169 Setting_GenGroupItem_Data *item_data = NULL;
170 EINA_LIST_FOREACH(list_data->list, l, node)
173 item_data = (Setting_GenGroupItem_Data *)node->data;
174 item_data->chk_status = 0;
175 elm_object_item_data_set(item_data->item, item_data);
176 elm_genlist_item_update(item_data->item);
182 /* SETTING_TRACE("sel_num:%d", sel_num); */
184 if (list_data->navi_it) {
185 Evas_Object *button = elm_object_item_part_content_get(list_data->navi_it, "toolbar_button1");
186 elm_object_disabled_set(button, EINA_TRUE);
189 evas_object_hide(list_data->selInfoPop);
192 char text[MAX_DISPLAY_NAME_LEN_ON_UI +1] = {0, };
193 snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s (%d)", _("IDS_ST_OPT_SELECTED"), sel_num);
195 /* text set and timeout set */
196 edje_object_part_text_set(_EDJ(list_data->selInfoPop_layout), "elm.text", text);
198 if (list_data->navi_it) {
199 Evas_Object *button = elm_object_item_part_content_get(list_data->navi_it, "toolbar_button1");
200 elm_object_disabled_set(button, EINA_FALSE);
204 static void __setting_select_all_layout_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
207 retm_if(data == NULL, "data == NULL");
208 Setting_Done_List_Data *list_data = (Setting_Done_List_Data *)data;
210 list_data->select_all_checked = !list_data->select_all_checked;
211 elm_check_state_pointer_set(list_data->select_all_checkbox, &list_data->select_all_checked);
213 __setting_select_all_done(list_data);
216 static void __setting_select_all_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
219 retm_if(data == NULL, "data == NULL");
220 Setting_Done_List_Data *list_data = (Setting_Done_List_Data *)data;
222 list_data->select_all_checked = elm_check_state_get(list_data->select_all_checkbox);
223 elm_check_state_pointer_set(list_data->select_all_checkbox, &list_data->select_all_checked);
224 __setting_select_all_done(data);
227 static void __setting_done_list_item_sel(void *data)
230 retm_if(data == NULL, "data == NULL");
231 Setting_Done_List_Data *list_data = (Setting_Done_List_Data *)data;
235 setting_create_sel_info_popup(list_data->ly_parent,
236 &(list_data->selInfoPop_layout),
237 &(list_data->selInfoPop));
239 /* else for other checks, do rotinue checking */
240 bool isFound = FALSE; /* wether found the item not checked */
243 Node_Info *node = NULL;
244 Setting_GenGroupItem_Data *item_data = NULL;
245 EINA_LIST_FOREACH(list_data->list, l, node)
248 item_data = (Setting_GenGroupItem_Data *)node->data;
249 if (!item_data->chk_status) {
250 /* SETTING_TRACE("%s not select", _(list_data->chk_items[idx].item_name)); */
254 /* SETTING_TRACE("%s select", _(list_data->chk_items[idx].item_name)); */
260 if (isFound) { /* reset state of chk_sel_all */
261 list_data->select_all_checked = 0;
262 elm_check_state_pointer_set(list_data->select_all_checkbox, &list_data->select_all_checked);
264 list_data->select_all_checked = 1;
265 elm_check_state_pointer_set(list_data->select_all_checkbox, &list_data->select_all_checked);
268 /* SETTING_TRACE("sel_num:%d", sel_num); */
270 if (list_data->navi_it) {
271 Evas_Object *button = elm_object_item_part_content_get(list_data->navi_it, "toolbar_button1");
272 elm_object_disabled_set(button, EINA_TRUE);
274 evas_object_hide(list_data->selInfoPop);
278 char text[MAX_DISPLAY_NAME_LEN_ON_UI +1] = {0, };
279 snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s (%d)", _("IDS_ST_OPT_SELECTED"), sel_num);
281 /* text set and timeout set */
282 edje_object_part_text_set(_EDJ(list_data->selInfoPop_layout), "elm.text", text);
284 if (list_data->navi_it) {
285 Evas_Object *button = elm_object_item_part_content_get(list_data->navi_it, "toolbar_button1");
286 elm_object_disabled_set(button, EINA_FALSE);
290 static void __setting_done_list_Gendial_mouse_up_cb(void *data, Evas_Object *obj,
294 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
295 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
296 elm_genlist_item_selected_set(item, 0);
297 Setting_GenGroupItem_Data *list_item =
298 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
300 int old_status = elm_check_state_get(list_item->eo_check);
302 list_item->chk_status = !old_status;
303 elm_check_state_set(list_item->eo_check, list_item->chk_status);
305 /* other process.. */
306 Setting_Done_List_Data *list_data = list_item->userdata;
307 __setting_done_list_item_sel(list_data);
310 static void __setting_done_list_Gendial_chk_btn_cb(void *data, Evas_Object *obj,
315 retm_if(data == NULL, "Data parameter is NULL");
316 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
319 list_item->chk_status = elm_check_state_get(list_item->eo_check);
321 Setting_Done_List_Data *list_data = list_item->userdata;
322 __setting_done_list_item_sel(list_data);
325 static Evas_Object *__setting_create_done_list(void *data)
328 setting_retvm_if(data == NULL, NULL, "Data parameter is NULL");
329 SettingStorageUG *ad = (SettingStorageUG *) data;
331 int count = eina_list_count(ad->files_list);
333 Evas_Object *sub_layout = elm_layout_add(ad->win_main_layout);
334 elm_layout_file_set(sub_layout, SETTING_THEME_EDJ_NAME, "search_layout");
335 evas_object_size_hint_weight_set(sub_layout, EVAS_HINT_EXPAND, 0.0);
336 evas_object_show(sub_layout);
338 Evas_Object *select_all_layout = elm_layout_add(sub_layout);
339 retvm_if(select_all_layout == NULL, NULL, "select_all_layout == NULL");
340 elm_layout_theme_set(select_all_layout, "genlist", "item", "select_all/default"); //select_all/default
341 evas_object_size_hint_weight_set(select_all_layout, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
342 evas_object_size_hint_align_set(select_all_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
345 evas_object_event_callback_add(select_all_layout, EVAS_CALLBACK_MOUSE_DOWN, __setting_select_all_layout_mouse_down_cb, &ad->miscellaneous_list);
348 Eina_Bool select_all_checked = ad->miscellaneous_list.select_all_checked;
349 Evas_Object *select_all_checkbox = elm_check_add(select_all_layout);
350 elm_check_state_pointer_set(select_all_checkbox, &select_all_checked);
351 evas_object_smart_callback_add(select_all_checkbox, "changed", __setting_select_all_check_changed_cb, &ad->miscellaneous_list);
352 evas_object_propagate_events_set(select_all_checkbox, EINA_FALSE);
353 elm_object_part_content_set(select_all_layout, "elm.icon", select_all_checkbox);
356 elm_object_disabled_set(select_all_checkbox, EINA_TRUE);
359 ad->miscellaneous_list.select_all_checkbox = select_all_checkbox;
360 elm_object_part_text_set(select_all_layout, "elm.text", _(KeyStr_Select_All));
362 Evas_Object *scroller = elm_genlist_add(ad->win_main_layout);
363 retvm_if(scroller == NULL, NULL, "scroller == NULL");
364 elm_genlist_clear(scroller); /* first to clear list */
366 elm_object_part_content_set(sub_layout, "search_list", scroller);
367 elm_object_part_content_set(sub_layout, "search_bar", select_all_layout);
370 Node_Info *node = NULL;
371 Setting_GenGroupItem_Data *item_data = NULL;
372 EINA_LIST_FOREACH(ad->files_list, l, node)
375 item_data = setting_create_Gendial_field_def(scroller, &(ad->itc_1text_1icon),
376 __setting_done_list_Gendial_mouse_up_cb,
377 &ad->miscellaneous_list, SWALLOW_Type_1CHECK, NULL,
379 node->name, node->path,
380 __setting_done_list_Gendial_chk_btn_cb);
383 item_data->userdata = &ad->miscellaneous_list;
384 node->data = item_data;
386 SETTING_TRACE_ERROR("item_data is NULL");
394 static int setting_storage_miscellaneous_files_create(void *cb)
398 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
400 SettingStorageUG *ad = (SettingStorageUG *) cb;
401 Evas_Object *scroller = NULL;
403 Evas_Object *view_layout = elm_layout_add(ad->win_main_layout);
404 elm_layout_file_set(view_layout, SETTING_THEME_EDJ_NAME, "selinfo_bottom");
405 evas_object_size_hint_weight_set(view_layout, EVAS_HINT_EXPAND, 0.0);
407 /* Evas_Object * win_layout, Evas_Object * win_obj */
408 Elm_Object_Item *navi_it = setting_push_layout_navi_bar(_(SETTING_STORAGE_MISCES_STR),
409 _("IDS_COM_SK_DELETE"),
410 _("IDS_COM_SK_CANCEL"), NULL,
411 __setting_storage_miscellaneous_files_delete_cb,
412 __setting_storage_miscellaneous_files_cancel_cb,
413 NULL, ad, view_layout, ad->navibar,
416 Setting_Done_List_Data *list_data = &(ad->miscellaneous_list);
418 list_data->win_main = ad->win_main_layout;
419 list_data->UG_data = ad;
420 list_data->ly_parent = view_layout;
421 list_data->select_all_checked = EINA_FALSE;
422 list_data->navi_it = navi_it;
424 __setting_storage_miscellaneous_files_list_get(ad);
426 list_data->list = ad->files_list;
428 int count = eina_list_count(ad->files_list);
430 list_data->cur_item_num = count;
431 SETTING_TRACE("list_data->cur_item_num:%d", list_data->cur_item_num);
432 scroller = __setting_create_done_list(ad);
433 elm_object_part_content_set(view_layout, "elm.swallow.contents", scroller);
435 if(count == 0 || !__setting_done_list_is_some_item_selected(&ad->miscellaneous_list)) {
436 /* disable "Delete" button */
437 Evas_Object *delete_button = elm_object_item_part_content_get(navi_it, "toolbar_button1");
438 elm_object_disabled_set(delete_button, EINA_TRUE);
441 setting_view_storage_miscellaneous_files.is_create = 1;
442 return SETTING_RETURN_SUCCESS;
445 static int setting_storage_miscellaneous_files_destroy(void *cb)
448 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
449 SettingStorageUG *ad = (SettingStorageUG *)cb;
451 if (ad->popup_progressbar) {
452 evas_object_del(ad->popup_progressbar);
453 ad->popup_progressbar = NULL;
457 ecore_timer_del(ad->timer);
461 if (ad->files_list) {
463 Node_Info *node = NULL;
464 EINA_LIST_FOREACH(ad->files_list, l, node)
470 eina_list_free(ad->files_list);
471 ad->files_list = NULL;
475 for (; i < MAX_RESET_MENU_NUM; i++) {
476 G_FREE(ad->miscellaneous_list.chk_items[i].item_name);
479 if (ad->miscellaneous_list.selInfoPop) {
480 evas_object_del(ad->miscellaneous_list.selInfoPop);
481 ad->miscellaneous_list.selInfoPop = NULL;
485 evas_object_del(ad->popup);
489 ad->back_from_misc = EINA_TRUE;
491 elm_naviframe_item_pop(ad->navibar);
492 setting_view_storage_miscellaneous_files.is_create = 0;
493 return SETTING_RETURN_SUCCESS;
496 static int setting_storage_miscellaneous_files_update(void *cb)
500 return SETTING_RETURN_SUCCESS;
503 static int setting_storage_miscellaneous_files_cleanup(void *cb)
506 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
507 setting_storage_miscellaneous_files_destroy(cb);
508 return SETTING_RETURN_SUCCESS;
511 static void __setting_storage_miscellaneous_files_cancel_cb(void *data,
512 Evas_Object *obj, void *event_info)
515 retm_if(data == NULL, "Data parameter is NULL");
516 SettingStorageUG *ad = (SettingStorageUG *) data;
518 setting_view_change(&setting_view_storage_miscellaneous_files, &setting_view_storage_main, ad);
521 static void __setting_storage_miscellaneous_files_genlist_update(void *data)
524 setting_retm_if(data == NULL, "Data parameter is NULL");
525 SettingStorageUG *ad = (SettingStorageUG *) data;
527 Evas_Object *view_layout = ad->miscellaneous_list.ly_parent;
529 Evas_Object *scroller = NULL;
530 scroller = elm_object_part_content_get(view_layout, "elm.swallow.contents");
531 setting_retm_if(NULL == scroller, "scroller is NULL");
532 elm_genlist_clear(scroller);
534 elm_object_part_content_unset(view_layout, "elm.swallow.contents");
535 evas_object_del(scroller);
538 if (ad->files_list) {
540 Node_Info *node = NULL;
541 EINA_LIST_FOREACH(ad->files_list, l, node)
547 eina_list_free(ad->files_list);
548 ad->files_list = NULL;
551 __setting_storage_miscellaneous_files_list_get(ad);
553 ad->miscellaneous_list.list = ad->files_list;
555 int count = eina_list_count(ad->files_list);
557 ad->miscellaneous_list.cur_item_num = count;
558 SETTING_TRACE("list_data->cur_item_num:%d", ad->miscellaneous_list.cur_item_num);
559 scroller = __setting_create_done_list(ad);
560 elm_object_part_content_set(view_layout, "elm.swallow.contents", scroller);
562 if(count == 0 || !__setting_done_list_is_some_item_selected(&ad->miscellaneous_list)) {
563 /* disable "Delete" button */
564 if (ad->miscellaneous_list.navi_it) {
565 Evas_Object *delete_button = elm_object_item_part_content_get(ad->miscellaneous_list.navi_it, "toolbar_button1");
566 elm_object_disabled_set(delete_button, EINA_FALSE);
571 static Eina_Bool __setting_storage_miscellaneous_files_idler_cb(void *data)
574 setting_retvm_if(data == NULL, EINA_FALSE, "Data parameter is NULL");
575 SettingStorageUG *ad = (SettingStorageUG *) data;
576 if (ad->popup_progressbar) {
577 evas_object_del(ad->popup_progressbar);
578 ad->popup_progressbar = NULL;
583 static Eina_Bool __setting_storage_miscellaneous_files_timer_cb(void *data)
586 setting_retvm_if(data == NULL, ECORE_CALLBACK_CANCEL, "Data parameter is NULL");
587 SettingStorageUG *ad = (SettingStorageUG *) data;
590 Node_Info *node = NULL;
591 Setting_GenGroupItem_Data *item_data = NULL;
592 EINA_LIST_FOREACH(ad->miscellaneous_list.list, l, node)
595 item_data = (Setting_GenGroupItem_Data *)node->data;
597 if (!item_data->chk_status) {
601 //SETTING_TRACE("path = %s", node->path);
603 elm_check_state_set(item_data->eo_check, 0);
604 item_data->chk_status = 0;
606 int ret = ecore_file_remove(node->path);
608 SETTING_TRACE_ERROR("failed to ecore_file_remove");
610 evas_object_del(ad->popup);
613 ad->popup = setting_create_popup_without_btn(ad, ad->win_get,
614 _("IDS_COM_POP_FAILED"),
615 NULL, NULL, POPUP_INTERVAL, FALSE, FALSE);
616 return ECORE_CALLBACK_CANCEL;
622 __setting_storage_miscellaneous_files_genlist_update(ad);
624 /* reset sel_all item */
625 elm_check_state_set(ad->miscellaneous_list.select_all_checkbox, 0);
626 ad->miscellaneous_list.select_all_checked = EINA_FALSE;
628 ecore_idler_add((Ecore_Task_Cb)__setting_storage_miscellaneous_files_idler_cb, ad);
630 return ECORE_CALLBACK_CANCEL;
633 static void __setting_storage_miscellaneous_files_delete_cb(void *data,
634 Evas_Object *obj, void *event_info)
637 retm_if(data == NULL, "Data parameter is NULL");
638 SettingStorageUG *ad = (SettingStorageUG *) data;
640 if (ad->miscellaneous_list.selInfoPop) {
641 evas_object_del(ad->miscellaneous_list.selInfoPop);
642 ad->miscellaneous_list.selInfoPop = NULL;
645 if (!__setting_done_list_is_some_item_selected(&ad->miscellaneous_list)) {
646 setting_create_simple_popup(NULL, ad->win_get, NULL, "No item selected");
648 if (ad->popup_progressbar) {
649 evas_object_del(ad->popup_progressbar);
650 ad->popup_progressbar = NULL;
652 ad->popup_progressbar = setting_create_popup_with_progressbar(ad, ad->win_get,
654 NULL, NULL, NULL, 0, TRUE, TRUE);
657 ecore_timer_del(ad->timer);
660 ad->timer = ecore_timer_add(1, (Ecore_Task_Cb)__setting_storage_miscellaneous_files_timer_cb, ad);