4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
6 * Contact: MyoungJune Park <mj2004.park@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
21 #include <setting-storage-miscellaneous-files.h>
23 static int setting_storage_miscellaneous_files_create(void *cb);
24 static int setting_storage_miscellaneous_files_destroy(void *cb);
25 static int setting_storage_miscellaneous_files_update(void *cb);
26 static int setting_storage_miscellaneous_files_cleanup(void *cb);
28 setting_view setting_view_storage_miscellaneous_files = {
29 .create = setting_storage_miscellaneous_files_create,
30 .destroy = setting_storage_miscellaneous_files_destroy,
31 .update = setting_storage_miscellaneous_files_update,
32 .cleanup = setting_storage_miscellaneous_files_cleanup,
35 static bool __setting_storage_miscellaneous_files_other_item_cb(media_info_h media, void *data)
37 //SETTING_TRACE_BEGIN;
38 setting_retvm_if(media == NULL, true, "media is NULL");
39 setting_retvm_if(data == NULL, true, "Data parameter is NULL");
40 SettingStorageUG *ad = (SettingStorageUG *)data;
42 char *file_path = NULL;
43 media_info_get_file_path(media, &file_path);
44 SETTING_TRACE("file_path : [%s]", file_path);
46 if (!ecore_file_exists(file_path)) {
51 if (!safeStrNCmp(file_path, PATH1, sizeof(PATH1)) ||
52 !safeStrNCmp(file_path, PATH2, sizeof(PATH2)) ||
53 !safeStrNCmp(file_path, PATH3, sizeof(PATH3)) ||
54 !safeStrNCmp(file_path, PATH4, sizeof(PATH4)) ||
55 !safeStrNCmp(file_path, PATH5, sizeof(PATH5)) ||
56 !safeStrNCmp(file_path, PATH6, sizeof(PATH6)) ||
57 !safeStrNCmp(file_path, PATH7, sizeof(PATH7)) ||
58 !safeStrNCmp(file_path, PATH8, sizeof(PATH8)) ||
59 !safeStrNCmp(file_path, PATH9, sizeof(PATH9)))
65 char *display_name = NULL;
66 media_info_get_display_name(media, &display_name);
68 Node_Info *pNode = (Node_Info *)calloc(1, sizeof(Node_Info));
69 pNode->path = (char *)g_strdup(file_path);
70 pNode->name = (char *)g_strdup(display_name);
71 ad->files_list = eina_list_append(ad->files_list, pNode);
78 static void __setting_storage_miscellaneous_files_list_get(void *data)
81 setting_retm_if(data == NULL, "Data parameter is NULL");
82 SettingStorageUG *ad = (SettingStorageUG *)data;
84 int ret = MEDIA_CONTENT_ERROR_NONE;
85 filter_h filter = NULL;
88 char *condition = "(MEDIA_TYPE=4) and MEDIA_PATH LIKE \'/opt/usr/media/%%\'";
90 ret = media_filter_create(&filter);
91 if(ret != MEDIA_CONTENT_ERROR_NONE) {
92 SETTING_TRACE_ERROR("Fail to create filter");
96 ret = media_filter_set_condition(filter, condition, MEDIA_CONTENT_COLLATE_DEFAULT);
97 if(ret != MEDIA_CONTENT_ERROR_NONE) {
98 media_filter_destroy(filter);
99 SETTING_TRACE_ERROR("Fail to set condition");
103 ret = media_info_foreach_media_from_db(filter, __setting_storage_miscellaneous_files_other_item_cb, ad);
104 if(ret != MEDIA_CONTENT_ERROR_NONE) {
105 media_filter_destroy(filter);
106 SETTING_TRACE_ERROR("Fail to get media");
110 ret = media_filter_destroy(filter);
111 if (ret != MEDIA_CONTENT_ERROR_NONE) {
112 SETTING_TRACE_ERROR("destroy filter failed");
117 static bool __setting_done_list_is_some_item_selected(Setting_Done_List_Data *list_data)
120 bool isFound = FALSE; /* wether can found some item checked */
124 Node_Info *node = NULL;
125 Setting_GenGroupItem_Data *item_data = NULL;
126 EINA_LIST_FOREACH(list_data->list, l, node)
129 item_data = (Setting_GenGroupItem_Data *)node->data;
131 state = elm_check_state_get(item_data->eo_check);
142 static void __setting_select_all_done(void *data)
145 retm_if(data == NULL, "data == NULL");
146 Setting_Done_List_Data *list_data = (Setting_Done_List_Data *)data;
150 setting_create_sel_info_popup(list_data->ly_parent,
151 &(list_data->selInfoPop_layout),
152 &(list_data->selInfoPop));
154 if (list_data->select_all_checked) {
155 /* set all other checks state to be 1 */
156 SETTING_TRACE_DEBUG("Select All checked");
158 Node_Info *node = NULL;
159 Setting_GenGroupItem_Data *item_data = NULL;
160 EINA_LIST_FOREACH(list_data->list, l, node)
163 item_data = (Setting_GenGroupItem_Data *)node->data;
164 item_data->chk_status = 1;
165 elm_object_item_data_set(item_data->item, item_data);
166 elm_genlist_item_update(item_data->item);
169 sel_num = list_data->cur_item_num;
171 SETTING_TRACE_DEBUG("Select All unchecked");
172 /* set all other checks state to be 0 */
174 Node_Info *node = NULL;
175 Setting_GenGroupItem_Data *item_data = NULL;
176 EINA_LIST_FOREACH(list_data->list, l, node)
179 item_data = (Setting_GenGroupItem_Data *)node->data;
180 item_data->chk_status = 0;
181 elm_object_item_data_set(item_data->item, item_data);
182 elm_genlist_item_update(item_data->item);
188 /* SETTING_TRACE("sel_num:%d", sel_num); */
190 if (list_data->navi_it) {
191 Evas_Object *button = elm_object_item_part_content_get(list_data->navi_it, "toolbar_button1");
192 elm_object_disabled_set(button, EINA_TRUE);
195 evas_object_hide(list_data->selInfoPop);
198 char text[MAX_DISPLAY_NAME_LEN_ON_UI +1] = {0, };
199 snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s (%d)", _("IDS_ST_OPT_SELECTED"), sel_num);
201 /* text set and timeout set */
202 edje_object_part_text_set(_EDJ(list_data->selInfoPop_layout), "elm.text", text);
204 if (list_data->navi_it) {
205 Evas_Object *button = elm_object_item_part_content_get(list_data->navi_it, "toolbar_button1");
206 elm_object_disabled_set(button, EINA_FALSE);
210 static void __setting_select_all_layout_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
213 retm_if(data == NULL, "data == NULL");
214 Setting_Done_List_Data *list_data = (Setting_Done_List_Data *)data;
216 list_data->select_all_checked = !list_data->select_all_checked;
217 elm_check_state_pointer_set(list_data->select_all_checkbox, &list_data->select_all_checked);
219 __setting_select_all_done(list_data);
222 static void __setting_select_all_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
225 retm_if(data == NULL, "data == NULL");
226 Setting_Done_List_Data *list_data = (Setting_Done_List_Data *)data;
228 list_data->select_all_checked = elm_check_state_get(list_data->select_all_checkbox);
229 elm_check_state_pointer_set(list_data->select_all_checkbox, &list_data->select_all_checked);
230 __setting_select_all_done(data);
233 static void __setting_done_list_item_sel(void *data)
236 retm_if(data == NULL, "data == NULL");
237 Setting_Done_List_Data *list_data = (Setting_Done_List_Data *)data;
241 setting_create_sel_info_popup(list_data->ly_parent,
242 &(list_data->selInfoPop_layout),
243 &(list_data->selInfoPop));
245 /* else for other checks, do rotinue checking */
246 bool isFound = FALSE; /* wether found the item not checked */
249 Node_Info *node = NULL;
250 Setting_GenGroupItem_Data *item_data = NULL;
251 EINA_LIST_FOREACH(list_data->list, l, node)
254 item_data = (Setting_GenGroupItem_Data *)node->data;
255 if (!item_data->chk_status) {
256 /* SETTING_TRACE("%s not select", _(list_data->chk_items[idx].item_name)); */
260 /* SETTING_TRACE("%s select", _(list_data->chk_items[idx].item_name)); */
266 if (isFound) { /* reset state of chk_sel_all */
267 list_data->select_all_checked = 0;
268 elm_check_state_pointer_set(list_data->select_all_checkbox, &list_data->select_all_checked);
270 list_data->select_all_checked = 1;
271 elm_check_state_pointer_set(list_data->select_all_checkbox, &list_data->select_all_checked);
274 /* SETTING_TRACE("sel_num:%d", sel_num); */
276 if (list_data->navi_it) {
277 Evas_Object *button = elm_object_item_part_content_get(list_data->navi_it, "toolbar_button1");
278 elm_object_disabled_set(button, EINA_TRUE);
280 evas_object_hide(list_data->selInfoPop);
284 char text[MAX_DISPLAY_NAME_LEN_ON_UI +1] = {0, };
285 snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s (%d)", _("IDS_ST_OPT_SELECTED"), sel_num);
287 /* text set and timeout set */
288 edje_object_part_text_set(_EDJ(list_data->selInfoPop_layout), "elm.text", text);
290 if (list_data->navi_it) {
291 Evas_Object *button = elm_object_item_part_content_get(list_data->navi_it, "toolbar_button1");
292 elm_object_disabled_set(button, EINA_FALSE);
296 static void __setting_done_list_Gendial_mouse_up_cb(void *data, Evas_Object *obj,
300 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
301 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
302 elm_genlist_item_selected_set(item, 0);
303 Setting_GenGroupItem_Data *list_item =
304 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
306 int old_status = elm_check_state_get(list_item->eo_check);
308 list_item->chk_status = !old_status;
309 elm_check_state_set(list_item->eo_check, list_item->chk_status);
311 /* other process.. */
312 Setting_Done_List_Data *list_data = list_item->userdata;
313 __setting_done_list_item_sel(list_data);
316 static void __setting_done_list_Gendial_chk_btn_cb(void *data, Evas_Object *obj,
321 retm_if(data == NULL, "Data parameter is NULL");
322 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
325 list_item->chk_status = elm_check_state_get(list_item->eo_check);
327 Setting_Done_List_Data *list_data = list_item->userdata;
328 __setting_done_list_item_sel(list_data);
331 static Evas_Object *__setting_create_done_list(void *data)
334 setting_retvm_if(data == NULL, NULL, "Data parameter is NULL");
335 SettingStorageUG *ad = (SettingStorageUG *) data;
337 Evas_Object *sub_layout = elm_layout_add(ad->win_main_layout);
338 elm_layout_file_set(sub_layout, SETTING_THEME_EDJ_NAME, "search_layout");
339 evas_object_size_hint_weight_set(sub_layout, EVAS_HINT_EXPAND, 0.0);
340 evas_object_show(sub_layout);
342 Evas_Object *select_all_layout = elm_layout_add(sub_layout);
343 retvm_if(select_all_layout == NULL, NULL, "select_all_layout == NULL");
344 elm_layout_theme_set(select_all_layout, "genlist", "item", "select_all/default"); //select_all/default
345 evas_object_size_hint_weight_set(select_all_layout, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
346 evas_object_size_hint_align_set(select_all_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
347 evas_object_event_callback_add(select_all_layout, EVAS_CALLBACK_MOUSE_DOWN, __setting_select_all_layout_mouse_down_cb, &ad->miscellaneous_list);
349 Eina_Bool select_all_checked = ad->miscellaneous_list.select_all_checked;
350 Evas_Object *select_all_checkbox = elm_check_add(select_all_layout);
351 elm_check_state_pointer_set(select_all_checkbox, &select_all_checked);
352 evas_object_smart_callback_add(select_all_checkbox, "changed", __setting_select_all_check_changed_cb, &ad->miscellaneous_list);
353 evas_object_propagate_events_set(select_all_checkbox, EINA_FALSE);
354 elm_object_part_content_set(select_all_layout, "elm.icon", select_all_checkbox);
356 ad->miscellaneous_list.select_all_checkbox = select_all_checkbox;
357 elm_object_part_text_set(select_all_layout, "elm.text", _(KeyStr_Select_All));
359 Evas_Object *scroller = elm_genlist_add(ad->win_main_layout);
360 retvm_if(scroller == NULL, NULL, "scroller == NULL");
361 elm_genlist_clear(scroller); /* first to clear list */
363 elm_object_part_content_set(sub_layout, "search_list", scroller);
364 elm_object_part_content_set(sub_layout, "search_bar", select_all_layout);
367 Node_Info *node = NULL;
368 Setting_GenGroupItem_Data *item_data = NULL;
369 EINA_LIST_FOREACH(ad->files_list, l, node)
372 item_data = setting_create_Gendial_field_def(scroller, &(ad->itc_1text_1icon),
373 __setting_done_list_Gendial_mouse_up_cb,
374 &ad->miscellaneous_list, SWALLOW_Type_1CHECK, NULL,
376 node->name, node->path,
377 __setting_done_list_Gendial_chk_btn_cb);
380 item_data->userdata = &ad->miscellaneous_list;
381 node->data = item_data;
383 SETTING_TRACE_ERROR("item_data is NULL");
391 static int setting_storage_miscellaneous_files_create(void *cb)
395 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
397 SettingStorageUG *ad = (SettingStorageUG *) cb;
398 Evas_Object *scroller = NULL;
400 Evas_Object *view_layout = elm_layout_add(ad->win_main_layout);
401 elm_layout_file_set(view_layout, SETTING_THEME_EDJ_NAME, "selinfo_bottom");
402 evas_object_size_hint_weight_set(view_layout, EVAS_HINT_EXPAND, 0.0);
404 /* Evas_Object * win_layout, Evas_Object * win_obj */
405 Elm_Object_Item *navi_it = setting_push_layout_navi_bar(_(SETTING_STORAGE_MISCES_STR),
406 _("IDS_COM_SK_DELETE"),
407 _("IDS_COM_SK_CANCEL"), NULL,
408 __setting_storage_miscellaneous_files_delete_cb,
409 __setting_storage_miscellaneous_files_cancel_cb,
410 NULL, ad, view_layout, ad->navibar,
413 Setting_Done_List_Data *list_data = &(ad->miscellaneous_list);
415 list_data->win_main = ad->win_main_layout;
416 list_data->UG_data = ad;
417 list_data->ly_parent = view_layout;
418 list_data->select_all_checked = EINA_FALSE;
419 list_data->navi_it = navi_it;
421 __setting_storage_miscellaneous_files_list_get(ad);
423 list_data->list = ad->files_list;
425 int count = eina_list_count(ad->files_list);
427 list_data->cur_item_num = count;
428 SETTING_TRACE("list_data->cur_item_num:%d", list_data->cur_item_num);
429 scroller = __setting_create_done_list(ad);
430 elm_object_part_content_set(view_layout, "elm.swallow.contents", scroller);
432 if(count == 0 || !__setting_done_list_is_some_item_selected(&ad->miscellaneous_list)) {
433 /* disable "Delete" button */
434 Evas_Object *delete_button = elm_object_item_part_content_get(navi_it, "toolbar_button1");
435 elm_object_disabled_set(delete_button, EINA_TRUE);
438 setting_view_storage_miscellaneous_files.is_create = 1;
439 return SETTING_RETURN_SUCCESS;
442 static int setting_storage_miscellaneous_files_destroy(void *cb)
445 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
446 SettingStorageUG *ad = (SettingStorageUG *)cb;
448 if (ad->popup_progressbar) {
449 evas_object_del(ad->popup_progressbar);
450 ad->popup_progressbar = NULL;
454 ecore_timer_del(ad->timer);
458 if (ad->files_list) {
460 Node_Info *node = NULL;
461 EINA_LIST_FOREACH(ad->files_list, l, node)
467 eina_list_free(ad->files_list);
468 ad->files_list = NULL;
472 for (; i < MAX_RESET_MENU_NUM; i++) {
473 G_FREE(ad->miscellaneous_list.chk_items[i].item_name);
476 if (ad->miscellaneous_list.selInfoPop) {
477 evas_object_del(ad->miscellaneous_list.selInfoPop);
478 ad->miscellaneous_list.selInfoPop = NULL;
482 evas_object_del(ad->popup);
486 ad->back_from_misc = EINA_TRUE;
488 elm_naviframe_item_pop(ad->navibar);
489 setting_view_storage_miscellaneous_files.is_create = 0;
490 return SETTING_RETURN_SUCCESS;
493 static int setting_storage_miscellaneous_files_update(void *cb)
497 return SETTING_RETURN_SUCCESS;
500 static int setting_storage_miscellaneous_files_cleanup(void *cb)
503 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
504 setting_storage_miscellaneous_files_destroy(cb);
505 return SETTING_RETURN_SUCCESS;
508 static void __setting_storage_miscellaneous_files_cancel_cb(void *data,
509 Evas_Object *obj, void *event_info)
512 retm_if(data == NULL, "Data parameter is NULL");
513 SettingStorageUG *ad = (SettingStorageUG *) data;
515 setting_view_change(&setting_view_storage_miscellaneous_files, &setting_view_storage_main, ad);
518 static void __setting_storage_miscellaneous_files_genlist_update(void *data)
521 setting_retm_if(data == NULL, "Data parameter is NULL");
522 SettingStorageUG *ad = (SettingStorageUG *) data;
524 Evas_Object *view_layout = ad->miscellaneous_list.ly_parent;
526 Evas_Object *scroller = NULL;
527 scroller = elm_object_part_content_get(view_layout, "elm.swallow.contents");
528 setting_retm_if(NULL == scroller, "scroller is NULL");
529 elm_genlist_clear(scroller);
531 elm_object_part_content_unset(view_layout, "elm.swallow.contents");
532 evas_object_del(scroller);
535 if (ad->files_list) {
537 Node_Info *node = NULL;
538 EINA_LIST_FOREACH(ad->files_list, l, node)
544 eina_list_free(ad->files_list);
545 ad->files_list = NULL;
548 __setting_storage_miscellaneous_files_list_get(ad);
550 ad->miscellaneous_list.list = ad->files_list;
552 int count = eina_list_count(ad->files_list);
554 ad->miscellaneous_list.cur_item_num = count;
555 SETTING_TRACE("list_data->cur_item_num:%d", ad->miscellaneous_list.cur_item_num);
556 scroller = __setting_create_done_list(ad);
557 elm_object_part_content_set(view_layout, "elm.swallow.contents", scroller);
559 if(count == 0 || !__setting_done_list_is_some_item_selected(&ad->miscellaneous_list)) {
560 /* disable "Delete" button */
561 if (ad->miscellaneous_list.navi_it) {
562 Evas_Object *delete_button = elm_object_item_part_content_get(ad->miscellaneous_list.navi_it, "toolbar_button1");
563 elm_object_disabled_set(delete_button, EINA_FALSE);
568 static Eina_Bool __setting_storage_miscellaneous_files_idler_cb(void *data)
571 setting_retvm_if(data == NULL, EINA_FALSE, "Data parameter is NULL");
572 SettingStorageUG *ad = (SettingStorageUG *) data;
573 if (ad->popup_progressbar) {
574 evas_object_del(ad->popup_progressbar);
575 ad->popup_progressbar = NULL;
580 static Eina_Bool __setting_storage_miscellaneous_files_timer_cb(void *data)
583 setting_retvm_if(data == NULL, ECORE_CALLBACK_CANCEL, "Data parameter is NULL");
584 SettingStorageUG *ad = (SettingStorageUG *) data;
587 Node_Info *node = NULL;
588 Setting_GenGroupItem_Data *item_data = NULL;
589 EINA_LIST_FOREACH(ad->miscellaneous_list.list, l, node)
592 item_data = (Setting_GenGroupItem_Data *)node->data;
594 if (!item_data->chk_status) {
598 //SETTING_TRACE("path = %s", node->path);
600 elm_check_state_set(item_data->eo_check, 0);
601 item_data->chk_status = 0;
603 int ret = ecore_file_remove(node->path);
605 SETTING_TRACE_ERROR("failed to ecore_file_remove");
607 evas_object_del(ad->popup);
610 ad->popup = setting_create_popup_without_btn(ad, ad->win_get,
611 _("IDS_COM_POP_FAILED"),
612 NULL, NULL, POPUP_INTERVAL, FALSE, FALSE);
613 return ECORE_CALLBACK_CANCEL;
619 __setting_storage_miscellaneous_files_genlist_update(ad);
621 /* reset sel_all item */
622 elm_check_state_set(ad->miscellaneous_list.select_all_checkbox, 0);
623 ad->miscellaneous_list.select_all_checked = EINA_FALSE;
625 ecore_idler_add((Ecore_Task_Cb)__setting_storage_miscellaneous_files_idler_cb, ad);
627 return ECORE_CALLBACK_CANCEL;
630 static void __setting_storage_miscellaneous_files_delete_cb(void *data,
631 Evas_Object *obj, void *event_info)
634 retm_if(data == NULL, "Data parameter is NULL");
635 SettingStorageUG *ad = (SettingStorageUG *) data;
637 if (ad->miscellaneous_list.selInfoPop) {
638 evas_object_del(ad->miscellaneous_list.selInfoPop);
639 ad->miscellaneous_list.selInfoPop = NULL;
642 if (!__setting_done_list_is_some_item_selected(&ad->miscellaneous_list)) {
643 setting_create_simple_popup(NULL, ad->win_get, NULL, "No item selected");
645 if (ad->popup_progressbar) {
646 evas_object_del(ad->popup_progressbar);
647 ad->popup_progressbar = NULL;
649 ad->popup_progressbar = setting_create_popup_with_progressbar(ad, ad->win_get,
651 NULL, NULL, NULL, 0, TRUE, TRUE);
654 ecore_timer_del(ad->timer);
657 ad->timer = ecore_timer_add(1, (Ecore_Task_Cb)__setting_storage_miscellaneous_files_timer_cb, ad);